xref: /netbsd-src/crypto/external/bsd/heimdal/dist/lib/hcrypto/test_engine_dso.c (revision d3273b5b76f5afaafe308cead5511dbb8df8c5e9)
1*d3273b5bSchristos /*	$NetBSD: test_engine_dso.c,v 1.2 2017/01/28 21:31:47 christos Exp $	*/
2ca1c9b0cSelric 
3ca1c9b0cSelric /*
4ca1c9b0cSelric  * Copyright (c) 2006 Kungliga Tekniska Högskolan
5ca1c9b0cSelric  * (Royal Institute of Technology, Stockholm, Sweden).
6ca1c9b0cSelric  * All rights reserved.
7ca1c9b0cSelric  *
8ca1c9b0cSelric  * Redistribution and use in source and binary forms, with or without
9ca1c9b0cSelric  * modification, are permitted provided that the following conditions
10ca1c9b0cSelric  * are met:
11ca1c9b0cSelric  *
12ca1c9b0cSelric  * 1. Redistributions of source code must retain the above copyright
13ca1c9b0cSelric  *    notice, this list of conditions and the following disclaimer.
14ca1c9b0cSelric  *
15ca1c9b0cSelric  * 2. Redistributions in binary form must reproduce the above copyright
16ca1c9b0cSelric  *    notice, this list of conditions and the following disclaimer in the
17ca1c9b0cSelric  *    documentation and/or other materials provided with the distribution.
18ca1c9b0cSelric  *
19ca1c9b0cSelric  * 3. Neither the name of the Institute nor the names of its contributors
20ca1c9b0cSelric  *    may be used to endorse or promote products derived from this software
21ca1c9b0cSelric  *    without specific prior written permission.
22ca1c9b0cSelric  *
23ca1c9b0cSelric  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24ca1c9b0cSelric  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25ca1c9b0cSelric  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26ca1c9b0cSelric  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27ca1c9b0cSelric  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28ca1c9b0cSelric  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29ca1c9b0cSelric  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30ca1c9b0cSelric  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31ca1c9b0cSelric  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32ca1c9b0cSelric  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33ca1c9b0cSelric  * SUCH DAMAGE.
34ca1c9b0cSelric  */
35ca1c9b0cSelric 
36ca1c9b0cSelric #include <config.h>
37ca1c9b0cSelric #include <krb5/roken.h>
38ca1c9b0cSelric #include <krb5/getarg.h>
39ca1c9b0cSelric 
40ca1c9b0cSelric #include <engine.h>
41ca1c9b0cSelric #include <evp.h>
42ca1c9b0cSelric 
43ca1c9b0cSelric struct {
44ca1c9b0cSelric     const char *cpriv;
45ca1c9b0cSelric     const char *cpub;
46ca1c9b0cSelric     const char *spriv;
47ca1c9b0cSelric     const char *spub;
48ca1c9b0cSelric } dhtests[] = {
49ca1c9b0cSelric     {
50ca1c9b0cSelric 	"5C0946275D07223AEAF04301D964498F3285946057B4C50D13B4FE12C88DFD8D499DD3CC00C1BC17C0D343F2FE053C9F53389110551715B1EDF261A0314485C4835D01F7B8894027D534A2D81D63619D2F58C9864AC9816086B3FF75C01B3FAFF355425AB7369A6ABDC8B633F0A0DC4D29B50F364E7594B297183D14E5CDC05D",
51ca1c9b0cSelric 	"2D66DC5998B7AEE3332DC1061C6E6F6CF0FCCD74534187E2CDC9ACBCADF0FC9D5900451F44832A762F01E9CEEF1CBD7D69D020AC524D09FAD087DFADEAC36C845157B83937B51C8DB7F500C3C54FB2A05E074E40BA982186E7FEB2534EDDB387D5480AAA355B398CCAD0886F3952C3718490B7884FA67BD8B6943CDDA20134C6",
52ca1c9b0cSelric 	"42644BA7CF74689E18BA72BF80FCA674D1A2ADF81795EB3828E67C30E42ABD07A8E90E27F046189FAC122D915276870B72427388EAAB5D06994FC38885BBACCEA1CFC45951B730D73C1A8F83208CD1351746601648C11D70BC95B817C86E4A5C40D633654615041C7934BB3CAF4E02754D542033DB024E94C7E561A29ED0C6EC",
53ca1c9b0cSelric 	"C233633AB116E2DB20B4E08DA42DE8766293E6D9042F7A2C2A2F34F18FE66010B074CCF3C9B03EF27B14F0746B738AF22776224161D767D96AEC230A1DFA6DECFFCE9FED23B96F50CCB0093E59817AD0CEAEB7993AB5764679948BFB1293C9560B07AA3DFA229E341EB17C9FAE0B1D483082461D2DDBCEEE6FE7C0A34D96F66D"
54ca1c9b0cSelric     },
55ca1c9b0cSelric     {
56ca1c9b0cSelric 	"76295C1280B890970F0F7EB01BBD9C5DF9BB8F590EB384A39EBF85CD141451407F955FD1D39012AA1F8BA53FD6A5A37CB2835CEDB27D1EBF1FE8AC9F2FFD628BD9BF7B8DD77CB80C8DC0A75F4567C7700442B26972833EB9738A8728A1FC274C59CED5E3ADA224B46711112AAA1CB831D2D6125E183ADA4F805A05024C9C6DDB",
57ca1c9b0cSelric 	"1E0AB5EBAAC7985FE67A574447FAE58AE4CB95416278D4C239A789D4532FA8E6F82BA10BE411D8A0A06B9E1DECE704466B3523496A8A4165B97FBCFB9CE9C4FF2DEEE786BA046E8C270FA8A9055D2F6E42EDDB32C73CF7875551A56EB69C0F14A3745745845B81C347401B27D074C60C5177BA9C14BBB1C8C219B78E15126EF8",
58ca1c9b0cSelric 	"68D84A8F92082F113542CFD990DEEFAD9C7EFA545268F8B3EBDF4CCBAF2865CF03EF60044EB4AF4154E6804CC2BDD673B801507446CEFC692DA577B6DC6E0272B7B081A1BEFDC2A4FAC83DB8845E3DA0D1B64DB33AA2164FEDB08A01E815336BD58F4E6DE6A265468E61C8C988B8AEC0D52DB714448DDC007E7C3382C07357DB",
59ca1c9b0cSelric 	"393815D507A2EF80DE2D0F2A55AAB1C25B870ACA3FC97438B4336CBF979BF9A4F8DA1B61C667129F9123045E07E24976040EC5E2368DD4EF70690102D74E900B260D3826256FD473733A7569BF514652AB78C48C334FDCA26C44ABF322643AF15BFF693A37BB2C19CA9FE5F1537FCFE2B24CF74D4E57060D35ABF115B4B6CD21"
60ca1c9b0cSelric     },
61ca1c9b0cSelric     {
62ca1c9b0cSelric 	"7307D6C3CB874327A95F7A6A91C336CEAA086736525DF3F8EC49497CF444C68D264EB70CD6904FE56E240EEF34E6C5177911C478A7F250A0F54183BCBE64B42BAB5D019E73E2F17C095C211E4815E6BA5FDD72786AF987ABBC9109ECEEF439AF9E2141D5222CE7DC0152D8E9A6CCCE301D21A7D1D6ACB9B91B5E28379C91890D",
63ca1c9b0cSelric 	"83FBD7BFFDF415BBB7E21D399CB2F36A61AFDBAFC542E428E444C66AA03617C0C55C639FE2428905B57035892AE1BD2C4060E807D9E003B0C204FFC8FDD69CC8ADE7A8E18DCBFFF64E3EF9DA2C117390374241466E48A020A1B2F575AE42C233F8BD357B8331CC203E0345DFC19C73E6F1F70B6C2786E681D73BF48B15FE9992",
64ca1c9b0cSelric 	"61BCF748BB05A48861578B8CB1855200B2E62A40E126BD7323E5B714645A54A2C8761EE39EE39BA6D2FE19B688168EDEA6DC5056400B5315ED299E7926176B887012E58634D78F05D7BCF0E1B81B1B41F5F8EF0B0711D3A64F9A317DD183AE039A4D3BE02A515892362F8C7BB6EB6434BB25418A438ED33D50C475122CBBE862",
65ca1c9b0cSelric 	"7DB8D69D1605D9812B7F2F3E92BCEEB3426FEEE3265A174D71B2B6E16B332B43DF0B3C2FA152E48DE2FAC110D8CECE122C3398558E7987B27CACE12722C0032AC7E7766A9BCC881BA35B9DB9E751BD4E51F7683DE092F6C1D4DD937CDCE9C16E6F7D77CC6AAD806E4082E8E22E28592C4D78256354393FE831E811E03ED0A81A"
66ca1c9b0cSelric     },
67ca1c9b0cSelric     {
68ca1c9b0cSelric 	"60C18B62F786DE6A4A8B13EB6DA2380B4C6731F861C715D9496DCF4A9F01CD33DDB52F1AB4D1F820FAF7AD4EFEB66586F7F08135714B13D77FE652B9EEAB2C543596A9ED307C1629CF535DD14AB22F081AE4ADF7A3E0BC7B33E0EC7A7306F9A737F55807974B5E1B7B6394BD0373917128B43A17757B34BAE1B600763E957F75",
69ca1c9b0cSelric 	"0DEDA337C38EA005D5B8567EAB681CE91892C2C62C9D42BF748FBFE681E11F25D98280E42E1539A10EEE9177EF2F40216987936AF19D9B5EBE22EEAC27242D77CE3A5061F2E5CFACF15CD0F80E736AE8642252FE91E129DE3C78CFB85A0B1BB87B059CBB24483444F8A07244F4E89370BA78D58BD409DFBB3D41921B8879B9C7",
70ca1c9b0cSelric 	"462C0707CF3366C2242A808CFDB79B77E8B3AF9D796583EB9CCD7BF4E8792AB0A818E49FFE53CA241F56988F825B366BF1E78481F8086A123259B9D83AC643E85845BF6B2C5412FFDDFAA8C9ED203CA4B3C1BFD777286099976472FA15B3CCC8418CF162F03C0C3E85D7EFC5CF5ACB9B2C039CCF3A1A9C6BB6B9C09C18D86CBD",
71ca1c9b0cSelric 	"56DB382EDB8C2D95934D20261CE1A37090B0802D451E647DB1DA3B73CDB5A878EAD598A8817302449370F9D45E34F5C45F73D02BF4EB2B3712A8665F446F5D2B774039E5444AB74807859FA58DF9EBA4B12BA4545ACED827E4ED64CC71F937D64A1033BC43403F2490C1B715A74822B8D50A72A102213F0CF7A1B98B771B34C4"
72ca1c9b0cSelric     },
73ca1c9b0cSelric     {
74ca1c9b0cSelric 	"61B7321207F4A73646E43E99221F902D2F38095E84CE7346A1510FE71BA7B9B34DCB6609E4DDDA8C82426E82D1C23F1E761130ECE4638D77554A7618E1608625049328FCC1F8845CA9A88E847106B01BD31EF6500E3C7EE81A048924BEAA3EDF367E5F4575341206C7A76427571898294B07BD918D4C2642854CC89D439042E5",
75ca1c9b0cSelric 	"29AA38E63E4DD7C651E25DEC7A5A53E48114F52813793D36A9DBDD4F7C06FC38406E330764E0B2AFD811C39D857EA5F904105360E06856DC0780C7D61C53165833F0AEA15CB54732DE113F44C8FCFB86F4A876DD42D7A55356D91C0173F2B012680FB54C13EF54B65DF4AEDE2E13419B1316435187CEF07D44DB3DF57C4703FD",
76ca1c9b0cSelric 	"5ED5AFB04CBFEE43EF3D9B60A57080831563648A2380D98F1EA4A96CF153903A40A2E564DED87E7254DF3270568AB952BF6F400681DD6AD919C9B06AC0F45F0646BCF37B217191AA0B7B7BED226B61F48B46DEA2E5A09E41F316583823A38A60FFD79085F43F60D98871ECA1A0F667701425094E88885A81DE9DA6C293E95060",
77ca1c9b0cSelric 	"4DE4F24EAA3E2790FBCB1B13C2ED0EFD846EC33154DBEBBEFD895E1399B3617D55EC2CE8D71CF380B55D93636FEF741328D6B1E224D46F8A8B60A41D08DD86E88DE806AA781791364E6D88BF68571BF5D8C35CB04BA302227B7E4CB6A67AB7510ACBCDBF2F8A95EB5DEE693CCA5CC425A0F1CA2D18C369A767906A2477E32704"
78ca1c9b0cSelric     }
79ca1c9b0cSelric };
80ca1c9b0cSelric 
81ca1c9b0cSelric static void
dh_test(DH * server,DH * client)82ca1c9b0cSelric dh_test(DH *server, DH *client)
83ca1c9b0cSelric {
84ca1c9b0cSelric     void *skey, *ckey;
85ca1c9b0cSelric     int ssize, csize;
86ca1c9b0cSelric 
87ca1c9b0cSelric     skey = emalloc(DH_size(server));
88ca1c9b0cSelric     ckey = emalloc(DH_size(client));
89ca1c9b0cSelric 
90ca1c9b0cSelric     ssize = DH_compute_key(skey, client->pub_key, server);
91ca1c9b0cSelric     if (ssize == -1)
92ca1c9b0cSelric 	errx(1, "DH_compute_key failed for server");
93ca1c9b0cSelric     csize = DH_compute_key(ckey, server->pub_key, client);
94ca1c9b0cSelric     if (csize == -1)
95ca1c9b0cSelric 	errx(1, "DH_compute_key failed for client");
96ca1c9b0cSelric 
97ca1c9b0cSelric     if (ssize != csize)
98ca1c9b0cSelric 	errx(1, "DH_compute_key size mismatch");
99ca1c9b0cSelric 
100ca1c9b0cSelric     if (memcmp(skey, ckey, csize) != 0)
101ca1c9b0cSelric 	errx(1, "DH_compute_key key mismatch");
102ca1c9b0cSelric 
103ca1c9b0cSelric     free(skey);
104ca1c9b0cSelric     free(ckey);
105ca1c9b0cSelric }
106ca1c9b0cSelric 
107ca1c9b0cSelric 
108ca1c9b0cSelric static int version_flag;
109ca1c9b0cSelric static int help_flag;
110ca1c9b0cSelric static char *id_flag;
111ca1c9b0cSelric static char *rsa_flag;
112ca1c9b0cSelric static int dh_flag = 1;
113ca1c9b0cSelric static int test_random_flag;
114ca1c9b0cSelric 
115ca1c9b0cSelric static struct getargs args[] = {
116ca1c9b0cSelric     { "id",		0,	arg_string,	&id_flag,
117ca1c9b0cSelric       "selects the engine id", 	"engine-id" },
118ca1c9b0cSelric     { "rsa",		0,	arg_string,	&rsa_flag,
119ca1c9b0cSelric       "tests RSA modes", 	"private-rsa-der-file" },
120ca1c9b0cSelric     { "dh",		0,	arg_negative_flag,	&dh_flag,
121ca1c9b0cSelric       "test dh", NULL },
122ca1c9b0cSelric     { "test-random",	0,	arg_flag,	&test_random_flag,
123ca1c9b0cSelric       "test if there is a random device", NULL },
124ca1c9b0cSelric     { "version",	0,	arg_flag,	&version_flag,
125ca1c9b0cSelric       "print version", NULL },
126ca1c9b0cSelric     { "help",		0,	arg_flag,	&help_flag,
127ca1c9b0cSelric       NULL, 	NULL }
128ca1c9b0cSelric };
129ca1c9b0cSelric 
130ca1c9b0cSelric static void
usage(int ret)131ca1c9b0cSelric usage (int ret)
132ca1c9b0cSelric {
133ca1c9b0cSelric     arg_printusage (args,
134ca1c9b0cSelric 		    sizeof(args)/sizeof(*args),
135ca1c9b0cSelric 		    NULL,
136ca1c9b0cSelric 		    "filename.so");
137ca1c9b0cSelric     exit (ret);
138ca1c9b0cSelric }
139ca1c9b0cSelric 
140ca1c9b0cSelric int
main(int argc,char ** argv)141ca1c9b0cSelric main(int argc, char **argv)
142ca1c9b0cSelric {
143ca1c9b0cSelric     ENGINE *engine = NULL;
144ca1c9b0cSelric     int idx = 0;
145ca1c9b0cSelric     int have_rsa, have_dh;
146ca1c9b0cSelric 
147ca1c9b0cSelric     setprogname(argv[0]);
148ca1c9b0cSelric 
149ca1c9b0cSelric     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx))
150ca1c9b0cSelric 	usage(1);
151ca1c9b0cSelric 
152ca1c9b0cSelric     if (help_flag)
153ca1c9b0cSelric 	usage(0);
154ca1c9b0cSelric 
155ca1c9b0cSelric     if(version_flag){
156ca1c9b0cSelric 	print_version(NULL);
157ca1c9b0cSelric 	exit(0);
158ca1c9b0cSelric     }
159ca1c9b0cSelric 
160ca1c9b0cSelric     argc -= idx;
161ca1c9b0cSelric     argv += idx;
162ca1c9b0cSelric 
163ca1c9b0cSelric     OpenSSL_add_all_algorithms();
164ca1c9b0cSelric 
165ca1c9b0cSelric     if (argc == 0) {
166ca1c9b0cSelric 	OpenSSL_add_all_algorithms();
167ca1c9b0cSelric 	ENGINE_load_builtin_engines();
168ca1c9b0cSelric 	engine = ENGINE_by_id("builtin");
169ca1c9b0cSelric     } else {
170ca1c9b0cSelric 	engine = ENGINE_by_dso(argv[0], id_flag);
171ca1c9b0cSelric     }
172ca1c9b0cSelric     if (engine == NULL)
173ca1c9b0cSelric 	errx(1, "ENGINE_by_dso failed");
174ca1c9b0cSelric 
175ca1c9b0cSelric     printf("name: %s\n", ENGINE_get_name(engine));
176ca1c9b0cSelric     printf("id: %s\n", ENGINE_get_id(engine));
177ca1c9b0cSelric     have_rsa = ENGINE_get_RSA(engine) != NULL;
178ca1c9b0cSelric     have_dh = ENGINE_get_DH(engine) != NULL;
179ca1c9b0cSelric     printf("RSA: %s", have_rsa ? "yes," : "no");
180ca1c9b0cSelric     if (have_rsa)
181ca1c9b0cSelric 	printf(" %s", ENGINE_get_RSA(engine)->name);
182ca1c9b0cSelric     printf("\n");
183ca1c9b0cSelric     printf("DH: %s", have_dh ? "yes," : "no");
184ca1c9b0cSelric     if (have_dh)
185ca1c9b0cSelric 	printf(" %s", ENGINE_get_DH(engine)->name);
186ca1c9b0cSelric     printf("\n");
187ca1c9b0cSelric 
188ca1c9b0cSelric     if (RAND_status() != 1)
189ca1c9b0cSelric 	errx(77, "no functional random device, can't execute tests");
190ca1c9b0cSelric     if (test_random_flag)
191ca1c9b0cSelric 	exit(0);
192ca1c9b0cSelric 
193ca1c9b0cSelric     if (rsa_flag && have_rsa) {
194ca1c9b0cSelric 	unsigned char buf[1024 * 4];
195ca1c9b0cSelric 	const unsigned char *p;
196ca1c9b0cSelric 	size_t size;
197ca1c9b0cSelric 	int keylen;
198ca1c9b0cSelric 	RSA *rsa;
199ca1c9b0cSelric 	FILE *f;
200ca1c9b0cSelric 
201ca1c9b0cSelric 	f = fopen(rsa_flag, "rb");
202ca1c9b0cSelric 	if (f == NULL)
203ca1c9b0cSelric 	    err(1, "could not open file %s", rsa_flag);
204ca1c9b0cSelric 
205ca1c9b0cSelric 	size = fread(buf, 1, sizeof(buf), f);
206ca1c9b0cSelric 	if (size == 0)
207ca1c9b0cSelric 	    err(1, "failed to read file %s", rsa_flag);
208ca1c9b0cSelric 	if (size == sizeof(buf))
209ca1c9b0cSelric 	    err(1, "key too long in file %s!", rsa_flag);
210ca1c9b0cSelric 	fclose(f);
211ca1c9b0cSelric 
212ca1c9b0cSelric 	p = buf;
213ca1c9b0cSelric 	rsa = d2i_RSAPrivateKey(NULL, &p, size);
214ca1c9b0cSelric 	if (rsa == NULL)
215ca1c9b0cSelric 	    err(1, "failed to parse key in file %s", rsa_flag);
216ca1c9b0cSelric 
217ca1c9b0cSelric 	RSA_set_method(rsa, ENGINE_get_RSA(engine));
218ca1c9b0cSelric 
219ca1c9b0cSelric 	/*
220ca1c9b0cSelric 	 * try rsa signing
221ca1c9b0cSelric 	 */
222ca1c9b0cSelric 
223ca1c9b0cSelric 	memcpy(buf, "hejsan", 7);
224ca1c9b0cSelric 	keylen = RSA_private_encrypt(7, buf, buf, rsa, RSA_PKCS1_PADDING);
225ca1c9b0cSelric 	if (keylen <= 0)
226ca1c9b0cSelric 	    errx(1, "failed to private encrypt");
227ca1c9b0cSelric 
228ca1c9b0cSelric 	keylen = RSA_public_decrypt(keylen, buf, buf, rsa, RSA_PKCS1_PADDING);
229ca1c9b0cSelric 	if (keylen <= 0)
230ca1c9b0cSelric 	    errx(1, "failed to public decrypt");
231ca1c9b0cSelric 
232ca1c9b0cSelric 	if (keylen != 7)
233ca1c9b0cSelric 	    errx(1, "output buffer not same length: %d", (int)keylen);
234ca1c9b0cSelric 
235ca1c9b0cSelric 	if (memcmp(buf, "hejsan", 7) != 0)
236ca1c9b0cSelric 	    errx(1, "string not the same after decryption");
237ca1c9b0cSelric 
238ca1c9b0cSelric 	/*
239ca1c9b0cSelric 	 * try rsa encryption
240ca1c9b0cSelric 	 */
241ca1c9b0cSelric 
242ca1c9b0cSelric 	memcpy(buf, "hejsan", 7);
243ca1c9b0cSelric 	keylen = RSA_public_encrypt(7, buf, buf, rsa, RSA_PKCS1_PADDING);
244ca1c9b0cSelric 	if (keylen <= 0)
245ca1c9b0cSelric 	    errx(1, "failed to public encrypt");
246ca1c9b0cSelric 
247ca1c9b0cSelric 	keylen = RSA_private_decrypt(keylen, buf, buf, rsa, RSA_PKCS1_PADDING);
248ca1c9b0cSelric 	if (keylen <= 0)
249ca1c9b0cSelric 	    errx(1, "failed to private decrypt");
250ca1c9b0cSelric 
251ca1c9b0cSelric 	if (keylen != 7)
252ca1c9b0cSelric 	    errx(1, "output buffer not same length: %d", (int)keylen);
253ca1c9b0cSelric 
254ca1c9b0cSelric 	if (memcmp(buf, "hejsan", 7) != 0)
255ca1c9b0cSelric 	    errx(1, "string not the same after decryption");
256ca1c9b0cSelric 
257ca1c9b0cSelric 	RSA_free(rsa);
258ca1c9b0cSelric 
259ca1c9b0cSelric 	printf("rsa test passed\n");
260ca1c9b0cSelric 
261ca1c9b0cSelric     }
262ca1c9b0cSelric 
263ca1c9b0cSelric     if (dh_flag) {
264ca1c9b0cSelric 	DH *server, *client;
265ca1c9b0cSelric 	int i;
266ca1c9b0cSelric 
267ca1c9b0cSelric 	/* RFC2412-MODP-group2 */
268ca1c9b0cSelric 	const char *p =
269ca1c9b0cSelric 	    "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
270ca1c9b0cSelric 	    "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
271ca1c9b0cSelric 	    "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
272ca1c9b0cSelric 	    "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
273ca1c9b0cSelric 	    "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE65381"
274ca1c9b0cSelric 	    "FFFFFFFF" "FFFFFFFF";
275ca1c9b0cSelric 	const char *g = "02";
276ca1c9b0cSelric 
277ca1c9b0cSelric 	/*
278ca1c9b0cSelric 	 * Try generated keys
279ca1c9b0cSelric 	 */
280ca1c9b0cSelric 
281ca1c9b0cSelric 	for (i = 0; i < 10; i++) {
282ca1c9b0cSelric 	    server = DH_new_method(engine);
283ca1c9b0cSelric 	    client = DH_new_method(engine);
284ca1c9b0cSelric 
285ca1c9b0cSelric 	    BN_hex2bn(&server->p, p);
286ca1c9b0cSelric 	    BN_hex2bn(&client->p, p);
287ca1c9b0cSelric 	    BN_hex2bn(&server->g, g);
288ca1c9b0cSelric 	    BN_hex2bn(&client->g, g);
289ca1c9b0cSelric 
290ca1c9b0cSelric 	    if (!DH_generate_key(server))
291ca1c9b0cSelric 		errx(1, "DH_generate_key failed for server");
292ca1c9b0cSelric 	    if (!DH_generate_key(client))
293ca1c9b0cSelric 		errx(1, "DH_generate_key failed for client");
294ca1c9b0cSelric 
295ca1c9b0cSelric 	    dh_test(server, client);
296ca1c9b0cSelric 
297ca1c9b0cSelric 	    DH_free(server);
298ca1c9b0cSelric 	    DH_free(client);
299ca1c9b0cSelric 	}
300ca1c9b0cSelric 	/*
301ca1c9b0cSelric 	 * Try known result
302ca1c9b0cSelric 	 */
303ca1c9b0cSelric 
304ca1c9b0cSelric 	for (i = 0; i < sizeof(dhtests)/sizeof(dhtests[0]); i++) {
305ca1c9b0cSelric 
306ca1c9b0cSelric 	    server = DH_new_method(engine);
307ca1c9b0cSelric 	    client = DH_new_method(engine);
308ca1c9b0cSelric 
309ca1c9b0cSelric 	    BN_hex2bn(&server->p, p);
310ca1c9b0cSelric 	    BN_hex2bn(&client->p, p);
311ca1c9b0cSelric 	    BN_hex2bn(&server->g, g);
312ca1c9b0cSelric 	    BN_hex2bn(&client->g, g);
313ca1c9b0cSelric 
314ca1c9b0cSelric 	    BN_hex2bn(&client->priv_key, dhtests[i].cpriv);
315ca1c9b0cSelric 	    BN_hex2bn(&client->pub_key, dhtests[i].cpub);
316ca1c9b0cSelric 	    BN_hex2bn(&server->priv_key, dhtests[i].spriv);
317ca1c9b0cSelric 	    BN_hex2bn(&server->pub_key, dhtests[i].spub);
318ca1c9b0cSelric 
319ca1c9b0cSelric 	    dh_test(server, client);
320ca1c9b0cSelric 
321ca1c9b0cSelric 	    DH_free(server);
322ca1c9b0cSelric 	    DH_free(client);
323ca1c9b0cSelric 	}
324ca1c9b0cSelric 
325ca1c9b0cSelric 	printf("DH test passed\n");
326ca1c9b0cSelric     }
327ca1c9b0cSelric 
328ca1c9b0cSelric     ENGINE_finish(engine);
329ca1c9b0cSelric 
330ca1c9b0cSelric     return 0;
331ca1c9b0cSelric }
332