1 /*
2 * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 #include <openssl/evp.h>
11 #include <openssl/core_names.h>
12 #include <openssl/param_build.h>
13
14 #include "predefined_dhparams.h"
15
16 #ifndef OPENSSL_NO_DH
17
get_dh_from_pg_bn(OSSL_LIB_CTX * libctx,const char * type,BIGNUM * p,BIGNUM * g,BIGNUM * q)18 static EVP_PKEY *get_dh_from_pg_bn(OSSL_LIB_CTX *libctx, const char *type,
19 BIGNUM *p, BIGNUM *g, BIGNUM *q)
20 {
21 EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_from_name(libctx, type, NULL);
22 OSSL_PARAM_BLD *tmpl = NULL;
23 OSSL_PARAM *params = NULL;
24 EVP_PKEY *dhpkey = NULL;
25
26 if (pctx == NULL || EVP_PKEY_fromdata_init(pctx) <= 0)
27 goto err;
28
29 if ((tmpl = OSSL_PARAM_BLD_new()) == NULL
30 || !OSSL_PARAM_BLD_push_BN(tmpl, OSSL_PKEY_PARAM_FFC_P, p)
31 || !OSSL_PARAM_BLD_push_BN(tmpl, OSSL_PKEY_PARAM_FFC_G, g)
32 || (q != NULL
33 && !OSSL_PARAM_BLD_push_BN(tmpl, OSSL_PKEY_PARAM_FFC_Q, q)))
34 goto err;
35
36 params = OSSL_PARAM_BLD_to_param(tmpl);
37 if (params == NULL
38 || EVP_PKEY_fromdata(pctx, &dhpkey, EVP_PKEY_KEY_PARAMETERS, params) <= 0)
39 goto err;
40
41 err:
42 EVP_PKEY_CTX_free(pctx);
43 OSSL_PARAM_free(params);
44 OSSL_PARAM_BLD_free(tmpl);
45 return dhpkey;
46 }
47
get_dh_from_pg(OSSL_LIB_CTX * libctx,const char * type,unsigned char * pdata,size_t plen,unsigned char * gdata,size_t glen,unsigned char * qdata,size_t qlen)48 static EVP_PKEY *get_dh_from_pg(OSSL_LIB_CTX *libctx, const char *type,
49 unsigned char *pdata, size_t plen,
50 unsigned char *gdata, size_t glen,
51 unsigned char *qdata, size_t qlen)
52 {
53 EVP_PKEY *dhpkey = NULL;
54 BIGNUM *p = NULL, *g = NULL, *q = NULL;
55
56 p = BN_bin2bn(pdata, plen, NULL);
57 g = BN_bin2bn(gdata, glen, NULL);
58 if (p == NULL || g == NULL)
59 goto err;
60 if (qdata != NULL && (q = BN_bin2bn(qdata, qlen, NULL)) == NULL)
61 goto err;
62
63 dhpkey = get_dh_from_pg_bn(libctx, type, p, g, q);
64
65 err:
66 BN_free(p);
67 BN_free(g);
68 BN_free(q);
69 return dhpkey;
70 }
71
get_dh512(OSSL_LIB_CTX * libctx)72 EVP_PKEY *get_dh512(OSSL_LIB_CTX *libctx)
73 {
74 static unsigned char dh512_p[] = {
75 0xCB,
76 0xC8,
77 0xE1,
78 0x86,
79 0xD0,
80 0x1F,
81 0x94,
82 0x17,
83 0xA6,
84 0x99,
85 0xF0,
86 0xC6,
87 0x1F,
88 0x0D,
89 0xAC,
90 0xB6,
91 0x25,
92 0x3E,
93 0x06,
94 0x39,
95 0xCA,
96 0x72,
97 0x04,
98 0xB0,
99 0x6E,
100 0xDA,
101 0xC0,
102 0x61,
103 0xE6,
104 0x7A,
105 0x77,
106 0x25,
107 0xE8,
108 0x3B,
109 0xB9,
110 0x5F,
111 0x9A,
112 0xB6,
113 0xB5,
114 0xFE,
115 0x99,
116 0x0B,
117 0xA1,
118 0x93,
119 0x4E,
120 0x35,
121 0x33,
122 0xB8,
123 0xE1,
124 0xF1,
125 0x13,
126 0x4F,
127 0x59,
128 0x1A,
129 0xD2,
130 0x57,
131 0xC0,
132 0x26,
133 0x21,
134 0x33,
135 0x02,
136 0xC5,
137 0xAE,
138 0x23,
139 };
140 static unsigned char dh512_g[] = {
141 0x02,
142 };
143
144 return get_dh_from_pg(libctx, "DH", dh512_p, sizeof(dh512_p),
145 dh512_g, sizeof(dh512_g), NULL, 0);
146 }
147
get_dhx512(OSSL_LIB_CTX * libctx)148 EVP_PKEY *get_dhx512(OSSL_LIB_CTX *libctx)
149 {
150 static unsigned char dhx512_p[] = {
151 0x00,
152 0xe8,
153 0x1a,
154 0xb7,
155 0x9a,
156 0x02,
157 0x65,
158 0x64,
159 0x94,
160 0x7b,
161 0xba,
162 0x09,
163 0x1c,
164 0x12,
165 0x27,
166 0x1e,
167 0xea,
168 0x89,
169 0x32,
170 0x64,
171 0x78,
172 0xf8,
173 0x1c,
174 0x78,
175 0x8e,
176 0x96,
177 0xc3,
178 0xc6,
179 0x9f,
180 0x41,
181 0x05,
182 0x41,
183 0x65,
184 0xae,
185 0xe3,
186 0x05,
187 0xea,
188 0x66,
189 0x21,
190 0xf7,
191 0x38,
192 0xb7,
193 0x2b,
194 0x32,
195 0x40,
196 0x5a,
197 0x14,
198 0x86,
199 0x51,
200 0x94,
201 0xb1,
202 0xcf,
203 0x01,
204 0xe3,
205 0x27,
206 0x28,
207 0xf6,
208 0x75,
209 0xa3,
210 0x15,
211 0xbb,
212 0x12,
213 0x4d,
214 0x99,
215 0xe7,
216 };
217 static unsigned char dhx512_g[] = {
218 0x00,
219 0x91,
220 0xc1,
221 0x43,
222 0x6d,
223 0x0d,
224 0xb0,
225 0xa4,
226 0xde,
227 0x41,
228 0xb7,
229 0x93,
230 0xad,
231 0x51,
232 0x94,
233 0x1b,
234 0x43,
235 0xd8,
236 0x42,
237 0xf1,
238 0x5e,
239 0x46,
240 0x83,
241 0x5d,
242 0xf1,
243 0xd1,
244 0xf0,
245 0x41,
246 0x10,
247 0xd1,
248 0x1c,
249 0x5e,
250 0xad,
251 0x9b,
252 0x68,
253 0xb1,
254 0x6f,
255 0xf5,
256 0x8e,
257 0xaa,
258 0x6d,
259 0x71,
260 0x88,
261 0x37,
262 0xdf,
263 0x05,
264 0xf7,
265 0x6e,
266 0x7a,
267 0xb4,
268 0x25,
269 0x10,
270 0x6c,
271 0x7f,
272 0x38,
273 0xb4,
274 0xc8,
275 0xfc,
276 0xcc,
277 0x0c,
278 0x6a,
279 0x02,
280 0x08,
281 0x61,
282 0xf6,
283 };
284 static unsigned char dhx512_q[] = {
285 0x00,
286 0xdd,
287 0xf6,
288 0x35,
289 0xad,
290 0xfa,
291 0x70,
292 0xc7,
293 0xe7,
294 0xa8,
295 0xf0,
296 0xe3,
297 0xda,
298 0x79,
299 0x34,
300 0x3f,
301 0x5b,
302 0xcf,
303 0x73,
304 0x82,
305 0x91,
306 };
307
308 return get_dh_from_pg(libctx, "X9.42 DH",
309 dhx512_p, sizeof(dhx512_p),
310 dhx512_g, sizeof(dhx512_g),
311 dhx512_q, sizeof(dhx512_q));
312 }
313
get_dh1024dsa(OSSL_LIB_CTX * libctx)314 EVP_PKEY *get_dh1024dsa(OSSL_LIB_CTX *libctx)
315 {
316 static unsigned char dh1024_p[] = {
317 0xC8,
318 0x00,
319 0xF7,
320 0x08,
321 0x07,
322 0x89,
323 0x4D,
324 0x90,
325 0x53,
326 0xF3,
327 0xD5,
328 0x00,
329 0x21,
330 0x1B,
331 0xF7,
332 0x31,
333 0xA6,
334 0xA2,
335 0xDA,
336 0x23,
337 0x9A,
338 0xC7,
339 0x87,
340 0x19,
341 0x3B,
342 0x47,
343 0xB6,
344 0x8C,
345 0x04,
346 0x6F,
347 0xFF,
348 0xC6,
349 0x9B,
350 0xB8,
351 0x65,
352 0xD2,
353 0xC2,
354 0x5F,
355 0x31,
356 0x83,
357 0x4A,
358 0xA7,
359 0x5F,
360 0x2F,
361 0x88,
362 0x38,
363 0xB6,
364 0x55,
365 0xCF,
366 0xD9,
367 0x87,
368 0x6D,
369 0x6F,
370 0x9F,
371 0xDA,
372 0xAC,
373 0xA6,
374 0x48,
375 0xAF,
376 0xFC,
377 0x33,
378 0x84,
379 0x37,
380 0x5B,
381 0x82,
382 0x4A,
383 0x31,
384 0x5D,
385 0xE7,
386 0xBD,
387 0x52,
388 0x97,
389 0xA1,
390 0x77,
391 0xBF,
392 0x10,
393 0x9E,
394 0x37,
395 0xEA,
396 0x64,
397 0xFA,
398 0xCA,
399 0x28,
400 0x8D,
401 0x9D,
402 0x3B,
403 0xD2,
404 0x6E,
405 0x09,
406 0x5C,
407 0x68,
408 0xC7,
409 0x45,
410 0x90,
411 0xFD,
412 0xBB,
413 0x70,
414 0xC9,
415 0x3A,
416 0xBB,
417 0xDF,
418 0xD4,
419 0x21,
420 0x0F,
421 0xC4,
422 0x6A,
423 0x3C,
424 0xF6,
425 0x61,
426 0xCF,
427 0x3F,
428 0xD6,
429 0x13,
430 0xF1,
431 0x5F,
432 0xBC,
433 0xCF,
434 0xBC,
435 0x26,
436 0x9E,
437 0xBC,
438 0x0B,
439 0xBD,
440 0xAB,
441 0x5D,
442 0xC9,
443 0x54,
444 0x39,
445 };
446 static unsigned char dh1024_g[] = {
447 0x3B,
448 0x40,
449 0x86,
450 0xE7,
451 0xF3,
452 0x6C,
453 0xDE,
454 0x67,
455 0x1C,
456 0xCC,
457 0x80,
458 0x05,
459 0x5A,
460 0xDF,
461 0xFE,
462 0xBD,
463 0x20,
464 0x27,
465 0x74,
466 0x6C,
467 0x24,
468 0xC9,
469 0x03,
470 0xF3,
471 0xE1,
472 0x8D,
473 0xC3,
474 0x7D,
475 0x98,
476 0x27,
477 0x40,
478 0x08,
479 0xB8,
480 0x8C,
481 0x6A,
482 0xE9,
483 0xBB,
484 0x1A,
485 0x3A,
486 0xD6,
487 0x86,
488 0x83,
489 0x5E,
490 0x72,
491 0x41,
492 0xCE,
493 0x85,
494 0x3C,
495 0xD2,
496 0xB3,
497 0xFC,
498 0x13,
499 0xCE,
500 0x37,
501 0x81,
502 0x9E,
503 0x4C,
504 0x1C,
505 0x7B,
506 0x65,
507 0xD3,
508 0xE6,
509 0xA6,
510 0x00,
511 0xF5,
512 0x5A,
513 0x95,
514 0x43,
515 0x5E,
516 0x81,
517 0xCF,
518 0x60,
519 0xA2,
520 0x23,
521 0xFC,
522 0x36,
523 0xA7,
524 0x5D,
525 0x7A,
526 0x4C,
527 0x06,
528 0x91,
529 0x6E,
530 0xF6,
531 0x57,
532 0xEE,
533 0x36,
534 0xCB,
535 0x06,
536 0xEA,
537 0xF5,
538 0x3D,
539 0x95,
540 0x49,
541 0xCB,
542 0xA7,
543 0xDD,
544 0x81,
545 0xDF,
546 0x80,
547 0x09,
548 0x4A,
549 0x97,
550 0x4D,
551 0xA8,
552 0x22,
553 0x72,
554 0xA1,
555 0x7F,
556 0xC4,
557 0x70,
558 0x56,
559 0x70,
560 0xE8,
561 0x20,
562 0x10,
563 0x18,
564 0x8F,
565 0x2E,
566 0x60,
567 0x07,
568 0xE7,
569 0x68,
570 0x1A,
571 0x82,
572 0x5D,
573 0x32,
574 0xA2,
575 };
576
577 return get_dh_from_pg(libctx, "DH", dh1024_p, sizeof(dh1024_p),
578 dh1024_g, sizeof(dh1024_g), NULL, 0);
579 }
580
get_dh2048(OSSL_LIB_CTX * libctx)581 EVP_PKEY *get_dh2048(OSSL_LIB_CTX *libctx)
582 {
583 BIGNUM *p = NULL, *g = NULL;
584 EVP_PKEY *dhpkey = NULL;
585
586 g = BN_new();
587 if (g == NULL || !BN_set_word(g, 2))
588 goto err;
589
590 p = BN_get_rfc3526_prime_2048(NULL);
591 if (p == NULL)
592 goto err;
593
594 dhpkey = get_dh_from_pg_bn(libctx, "DH", p, g, NULL);
595
596 err:
597 BN_free(p);
598 BN_free(g);
599 return dhpkey;
600 }
601
get_dh4096(OSSL_LIB_CTX * libctx)602 EVP_PKEY *get_dh4096(OSSL_LIB_CTX *libctx)
603 {
604 BIGNUM *p = NULL, *g = NULL;
605 EVP_PKEY *dhpkey = NULL;
606
607 g = BN_new();
608 if (g == NULL || !BN_set_word(g, 2))
609 goto err;
610
611 p = BN_get_rfc3526_prime_4096(NULL);
612 if (p == NULL)
613 goto err;
614
615 dhpkey = get_dh_from_pg_bn(libctx, "DH", p, g, NULL);
616
617 err:
618 BN_free(p);
619 BN_free(g);
620 return dhpkey;
621 }
622
623 #endif
624