1/* 2* Copyright (c) 2007, Novell, Inc. 3* Author: Matthias Koenig <mkoenig@suse.de> 4* 5* All rights reserved. 6* 7* Redistribution and use in source and binary forms, with or without 8* modification, are permitted provided that the following conditions are met: 9* 10* * Redistributions of source code must retain the above copyright notice, this 11* list of conditions and the following disclaimer. 12* 13* * Redistributions in binary form must reproduce the above copyright notice, 14* this list of conditions and the following disclaimer in the documentation 15* and/or other materials provided with the distribution. 16* 17* * Neither the name of the Novell nor the names of its contributors may be used 18* to endorse or promote products derived from this software without specific 19* prior written permission. 20* 21* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 25* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31* POSSIBILITY OF SUCH DAMAGE. 32*/ 33 34/* openssl diffie-hellman test code 35 * works with openssl-0.9.8e 36 * primes with 3072 and 6144 bits as specified in RFC3526 37 * fail since openssl-0.9.8f 38 */ 39 40#include <config.h> 41 42#include <stdio.h> 43#include <ctype.h> 44 45#include <roken.h> 46#include <getarg.h> 47 48#include <dh.h> 49#include <evp.h> 50 51/* 52 * 53 */ 54 55static char *id_string; 56static int verbose; 57static int version_flag; 58static int help_flag; 59 60static struct getargs args[] = { 61 { "id", 0, arg_string, &id_string, 62 "type of ENGINE", NULL }, 63 { "verbose", 0, arg_flag, &verbose, 64 "verbose output from tests", NULL }, 65 { "version", 0, arg_flag, &version_flag, 66 "print version", NULL }, 67 { "help", 0, arg_flag, &help_flag, 68 NULL, NULL } 69}; 70 71/* 72 * 73 */ 74 75#define OAKLEY_PRIME_MODP768 \ 76 "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ 77 "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ 78 "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ 79 "E485B576 625E7EC6 F44C42E9 A63A3620 FFFFFFFF FFFFFFFF" 80 81#define OAKLEY_PRIME_MODP1024 \ 82 "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ 83 "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ 84 "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ 85 "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ 86 "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381" \ 87 "FFFFFFFF FFFFFFFF" 88 89#define OAKLEY_PRIME_MODP1536 \ 90 "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ 91 "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ 92 "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ 93 "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ 94 "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ 95 "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ 96 "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ 97 "670C354E 4ABC9804 F1746C08 CA237327 FFFFFFFF FFFFFFFF" 98 99/* RFC 3526 */ 100#define OAKLEY_PRIME_MODP2048 \ 101 "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ 102 "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ 103 "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ 104 "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ 105 "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ 106 "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ 107 "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ 108 "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \ 109 "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \ 110 "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \ 111 "15728E5A 8AACAA68 FFFFFFFF FFFFFFFF" 112 113#define OAKLEY_PRIME_MODP3072 \ 114 "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ 115 "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ 116 "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ 117 "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ 118 "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ 119 "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ 120 "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ 121 "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \ 122 "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \ 123 "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \ 124 "15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \ 125 "ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \ 126 "ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \ 127 "F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \ 128 "BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \ 129 "43DB5BFC E0FD108E 4B82D120 A93AD2CA FFFFFFFF FFFFFFFF" 130 131#define OAKLEY_PRIME_MODP4096 \ 132 "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ 133 "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ 134 "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ 135 "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ 136 "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ 137 "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ 138 "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ 139 "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \ 140 "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \ 141 "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \ 142 "15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \ 143 "ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \ 144 "ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \ 145 "F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \ 146 "BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \ 147 "43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7" \ 148 "88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA" \ 149 "2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6" \ 150 "287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED" \ 151 "1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9" \ 152 "93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34063199" \ 153 "FFFFFFFF FFFFFFFF" 154 155#define OAKLEY_PRIME_MODP6144 \ 156 "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ 157 "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ 158 "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ 159 "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ 160 "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ 161 "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ 162 "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ 163 "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \ 164 "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \ 165 "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \ 166 "15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \ 167 "ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \ 168 "ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \ 169 "F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \ 170 "BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \ 171 "43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7" \ 172 "88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA" \ 173 "2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6" \ 174 "287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED" \ 175 "1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9" \ 176 "93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492" \ 177 "36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD" \ 178 "F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831" \ 179 "179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B" \ 180 "DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF" \ 181 "5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6" \ 182 "D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3" \ 183 "23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA" \ 184 "CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328" \ 185 "06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C" \ 186 "DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE" \ 187 "12BF2D5B 0B7474D6 E694F91E 6DCC4024 FFFFFFFF FFFFFFFF" 188 189#define OAKLEY_PRIME_MODP8192 \ 190 "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ 191 "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ 192 "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ 193 "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ 194 "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ 195 "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ 196 "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ 197 "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \ 198 "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \ 199 "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \ 200 "15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \ 201 "ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \ 202 "ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \ 203 "F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \ 204 "BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \ 205 "43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7" \ 206 "88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA" \ 207 "2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6" \ 208 "287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED" \ 209 "1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9" \ 210 "93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492" \ 211 "36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD" \ 212 "F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831" \ 213 "179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B" \ 214 "DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF" \ 215 "5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6" \ 216 "D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3" \ 217 "23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA" \ 218 "CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328" \ 219 "06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C" \ 220 "DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE" \ 221 "12BF2D5B 0B7474D6 E694F91E 6DBE1159 74A3926F 12FEE5E4" \ 222 "38777CB6 A932DF8C D8BEC4D0 73B931BA 3BC832B6 8D9DD300" \ 223 "741FA7BF 8AFC47ED 2576F693 6BA42466 3AAB639C 5AE4F568" \ 224 "3423B474 2BF1C978 238F16CB E39D652D E3FDB8BE FC848AD9" \ 225 "22222E04 A4037C07 13EB57A8 1A23F0C7 3473FC64 6CEA306B" \ 226 "4BCBC886 2F8385DD FA9D4B7F A2C087E8 79683303 ED5BDD3A" \ 227 "062B3CF5 B3A278A6 6D2A13F8 3F44F82D DF310EE0 74AB6A36" \ 228 "4597E899 A0255DC1 64F31CC5 0846851D F9AB4819 5DED7EA1" \ 229 "B1D510BD 7EE74D73 FAF36BC3 1ECFA268 359046F4 EB879F92" \ 230 "4009438B 481C6CD7 889A002E D5EE382B C9190DA6 FC026E47" \ 231 "9558E447 5677E9AA 9E3050E2 765694DF C81F56E8 80B96E71" \ 232 "60C980DD 98EDD3DF FFFFFFFF FFFFFFFF" 233 234struct prime { 235 char *name; 236 char *value; 237} primes[] = { 238 { "modp768", OAKLEY_PRIME_MODP768 }, 239 { "modp1024", OAKLEY_PRIME_MODP1024 }, 240 { "modp1536", OAKLEY_PRIME_MODP1536 }, 241 { "modp2048", OAKLEY_PRIME_MODP2048 }, 242 { "modp3072", OAKLEY_PRIME_MODP3072 }, 243 { "modp4096", OAKLEY_PRIME_MODP4096 }, 244 { "modp6144", OAKLEY_PRIME_MODP6144 }, 245 { "modp8192", OAKLEY_PRIME_MODP8192 }, 246 { NULL, NULL } 247}; 248 249/* 250 * exchange a string based "base" to a value. 251 * 252 */ 253static char * 254str2val(const char *str, int base, size_t *len) 255{ 256 int f; 257 size_t i; 258 char *dst; 259 char *rp; 260 const char *p; 261 char b[3]; 262 263 i = 0; 264 for (p = str; *p != '\0'; p++) { 265 if (isxdigit((int)*p)) 266 i++; 267 else if (isspace((int)*p)) 268 ; 269 else 270 return NULL; 271 } 272 if (i == 0 || (i % 2) != 0) 273 return NULL; 274 i /= 2; 275 276 if ((dst = malloc(i)) == NULL) 277 return NULL; 278 279 i = 0; 280 f = 0; 281 for (rp = dst, p = str; *p != '\0'; p++) { 282 if (isxdigit((int)*p)) { 283 if (!f) { 284 b[0] = *p; 285 f = 1; 286 } else { 287 b[1] = *p; 288 b[2] = '\0'; 289 *rp++ = (char)strtol(b, NULL, base); 290 i++; 291 f = 0; 292 } 293 } 294 } 295 296 *len = i; 297 298 return(dst); 299} 300 301static void set_prime(BIGNUM *p, char *str) 302{ 303 size_t len = 0; 304 unsigned char *prime; 305 306 prime = (unsigned char *)str2val(str, 16, &len); 307 if (prime == NULL) 308 errx(1, "failed to parse %s", str); 309 BN_bin2bn(prime, len, p); 310} 311 312static void set_generator(BIGNUM *g) 313{ 314 BN_set_word(g, 2); 315} 316 317static void print_secret(unsigned char *sec, size_t len) 318{ 319 size_t i; 320 321 for (i = 0; i < len; ++i) 322 printf("%x", sec[i]); 323 324 printf("\n"); 325} 326 327static int check_prime(ENGINE *engine, struct prime *pr) 328{ 329 DH *dh1, *dh2; 330 BIGNUM *p, *g; 331 unsigned char *sec1, *sec2; 332 size_t size; 333 int ret; 334 335 if (verbose) 336 printf("Testing %s\n", pr->name); 337 338 p = BN_new(); 339 g = BN_new(); 340 dh1 = DH_new_method(engine); 341 dh2 = DH_new_method(engine); 342 343 /* 1. set shared parameter */ 344 set_prime(p, pr->value); 345 set_generator(g); 346 dh1->p = BN_dup(p); 347 dh1->g = BN_dup(g); 348 dh2->p = BN_dup(p); 349 dh2->g = BN_dup(g); 350 351 /* 2. set keys */ 352 ret = DH_generate_key(dh1); 353 if (ret == 0) { 354 fprintf(stderr, "DH_generate_key\n"); 355 exit(EXIT_FAILURE); 356 } 357 ret = DH_generate_key(dh2); 358 if (ret == 0) { 359 fprintf(stderr, "DH_generate_key\n"); 360 exit(EXIT_FAILURE); 361 } 362 363 /* 3. compute shared secret */ 364 size = DH_size(dh1); 365 if (size != DH_size(dh2)) { 366 fprintf(stderr, "size does not match!\n"); 367 exit(EXIT_FAILURE); 368 } 369 sec1 = malloc(size); 370 sec2 = malloc(size); 371 if (!sec1 || !sec2) { 372 perror("malloc"); 373 exit(EXIT_FAILURE); 374 } 375 ret = DH_compute_key(sec1, dh2->pub_key, dh1); 376 if (ret <= 0) { 377 fprintf(stderr, "DH_compute_key"); 378 exit(EXIT_FAILURE); 379 } 380 if (ret > size) { 381 fprintf(stderr, "DH_compute_key res too large"); 382 exit(EXIT_FAILURE); 383 } 384 385 ret2 = DH_compute_key(sec2, dh1->pub_key, dh2); 386 if (ret2 <= 0) { 387 fprintf(stderr, "DH_compute_key"); 388 exit(EXIT_FAILURE); 389 } 390 if (ret2 > size) { 391 fprintf(stderr, "DH_compute_key res too large"); 392 exit(EXIT_FAILURE); 393 } 394 395 if (ret != res2) { 396 fprintf(stderr, "DH_compute_key have two difference sizes"); 397 exit(EXIT_FAILURE); 398 } 399 400 /* 4. check that length make sense */ 401 if (ret < size / 2) { 402 fprintf(stderr, "DH_compute_key computed a key way too small"); 403 exit(EXIT_FAILURE); 404 } 405 406 /* 5. compare shared secret */ 407 if (verbose) { 408 printf("shared secret 1\n"); 409 print_secret(sec1, ret); 410 printf("shared secret 2\n"); 411 print_secret(sec2, ret); 412 } 413 414 if (memcmp(sec1, sec2, ret) == 0) 415 ret = 1; 416 else 417 ret = 0; 418 419 free(sec2); 420 free(sec1); 421 DH_free(dh2); 422 DH_free(dh1); 423 BN_free(g); 424 BN_free(p); 425 426 return ret; 427} 428 429/* 430 * 431 */ 432 433static void 434usage (int ret) 435{ 436 arg_printusage (args, 437 sizeof(args)/sizeof(*args), 438 NULL, 439 ""); 440 exit (ret); 441} 442 443int 444main(int argc, char **argv) 445{ 446 ENGINE *engine = NULL; 447 int idx = 0; 448 449 setprogname(argv[0]); 450 451 if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx)) 452 usage(1); 453 454 if (help_flag) 455 usage(0); 456 457 if(version_flag){ 458 print_version(NULL); 459 exit(0); 460 } 461 462 argc -= idx; 463 argv += idx; 464 465 OpenSSL_add_all_algorithms(); 466#ifdef OPENSSL 467 ENGINE_load_openssl(); 468#endif 469 ENGINE_load_builtin_engines(); 470 471 if (id_string) { 472 engine = ENGINE_by_id(id_string); 473 if (engine == NULL) 474 engine = ENGINE_by_dso(id_string, id_string); 475 } else { 476 engine = ENGINE_by_id("builtin"); 477 } 478 if (engine == NULL) 479 errx(1, "ENGINE_by_dso failed"); 480 481 printf("dh %s\n", ENGINE_get_DH(engine)->name); 482 483 { 484 struct prime *p = primes; 485 486 for (; p->name; ++p) 487 if (check_prime(engine, p)) 488 printf("%s: shared secret OK\n", p->name); 489 else 490 printf("%s: shared secret FAILURE\n", p->name); 491 492 return 0; 493 } 494 495 return 0; 496} 497