]> git.ipfire.org Git - thirdparty/openssl.git/blob - test/helpers/predefined_dhparams.c
test cleanup: move helper .c and .h files to test/helpers/
[thirdparty/openssl.git] / test / helpers / predefined_dhparams.c
1 /*
2 * Copyright 1995-2020 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
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_key_fromdata_init(pctx))
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 || !EVP_PKEY_fromdata(pctx, &dhpkey, params))
38 goto err;
39
40 err:
41 EVP_PKEY_CTX_free(pctx);
42 OSSL_PARAM_BLD_free_params(params);
43 OSSL_PARAM_BLD_free(tmpl);
44 return dhpkey;
45 }
46
47 static EVP_PKEY *get_dh_from_pg(OSSL_LIB_CTX *libctx, const char *type,
48 unsigned char *pdata, size_t plen,
49 unsigned char *gdata, size_t glen,
50 unsigned char *qdata, size_t qlen)
51 {
52 EVP_PKEY *dhpkey = NULL;
53 BIGNUM *p = NULL, *g = NULL, *q = NULL;
54
55 p = BN_bin2bn(pdata, plen, NULL);
56 g = BN_bin2bn(gdata, glen, NULL);
57 if (p == NULL || g == NULL)
58 goto err;
59 if (qdata != NULL && (q = BN_bin2bn(qdata, qlen, NULL)) == NULL)
60 goto err;
61
62 dhpkey = get_dh_from_pg_bn(libctx, type, p, g, q);
63
64 err:
65 BN_free(p);
66 BN_free(g);
67 BN_free(q);
68 return dhpkey;
69 }
70
71 EVP_PKEY *get_dh512(OSSL_LIB_CTX *libctx)
72 {
73 static unsigned char dh512_p[] = {
74 0xCB, 0xC8, 0xE1, 0x86, 0xD0, 0x1F, 0x94, 0x17, 0xA6, 0x99, 0xF0, 0xC6,
75 0x1F, 0x0D, 0xAC, 0xB6, 0x25, 0x3E, 0x06, 0x39, 0xCA, 0x72, 0x04, 0xB0,
76 0x6E, 0xDA, 0xC0, 0x61, 0xE6, 0x7A, 0x77, 0x25, 0xE8, 0x3B, 0xB9, 0x5F,
77 0x9A, 0xB6, 0xB5, 0xFE, 0x99, 0x0B, 0xA1, 0x93, 0x4E, 0x35, 0x33, 0xB8,
78 0xE1, 0xF1, 0x13, 0x4F, 0x59, 0x1A, 0xD2, 0x57, 0xC0, 0x26, 0x21, 0x33,
79 0x02, 0xC5, 0xAE, 0x23,
80 };
81 static unsigned char dh512_g[] = {
82 0x02,
83 };
84
85 return get_dh_from_pg(libctx, "DH", dh512_p, sizeof(dh512_p),
86 dh512_g, sizeof(dh512_g), NULL, 0);
87 }
88
89 EVP_PKEY *get_dhx512(OSSL_LIB_CTX *libctx)
90 {
91 static unsigned char dhx512_p[] = {
92 0x00, 0xe8, 0x1a, 0xb7, 0x9a, 0x02, 0x65, 0x64, 0x94, 0x7b, 0xba, 0x09,
93 0x1c, 0x12, 0x27, 0x1e, 0xea, 0x89, 0x32, 0x64, 0x78, 0xf8, 0x1c, 0x78,
94 0x8e, 0x96, 0xc3, 0xc6, 0x9f, 0x41, 0x05, 0x41, 0x65, 0xae, 0xe3, 0x05,
95 0xea, 0x66, 0x21, 0xf7, 0x38, 0xb7, 0x2b, 0x32, 0x40, 0x5a, 0x14, 0x86,
96 0x51, 0x94, 0xb1, 0xcf, 0x01, 0xe3, 0x27, 0x28, 0xf6, 0x75, 0xa3, 0x15,
97 0xbb, 0x12, 0x4d, 0x99, 0xe7,
98 };
99 static unsigned char dhx512_g[] = {
100 0x00, 0x91, 0xc1, 0x43, 0x6d, 0x0d, 0xb0, 0xa4, 0xde, 0x41, 0xb7, 0x93,
101 0xad, 0x51, 0x94, 0x1b, 0x43, 0xd8, 0x42, 0xf1, 0x5e, 0x46, 0x83, 0x5d,
102 0xf1, 0xd1, 0xf0, 0x41, 0x10, 0xd1, 0x1c, 0x5e, 0xad, 0x9b, 0x68, 0xb1,
103 0x6f, 0xf5, 0x8e, 0xaa, 0x6d, 0x71, 0x88, 0x37, 0xdf, 0x05, 0xf7, 0x6e,
104 0x7a, 0xb4, 0x25, 0x10, 0x6c, 0x7f, 0x38, 0xb4, 0xc8, 0xfc, 0xcc, 0x0c,
105 0x6a, 0x02, 0x08, 0x61, 0xf6,
106 };
107 static unsigned char dhx512_q[] = {
108 0x00, 0xdd, 0xf6, 0x35, 0xad, 0xfa, 0x70, 0xc7, 0xe7, 0xa8, 0xf0, 0xe3,
109 0xda, 0x79, 0x34, 0x3f, 0x5b, 0xcf, 0x73, 0x82, 0x91,
110 };
111
112 return get_dh_from_pg(libctx, "X9.42 DH",
113 dhx512_p, sizeof(dhx512_p),
114 dhx512_g, sizeof(dhx512_g),
115 dhx512_q, sizeof(dhx512_q));
116 }
117
118 EVP_PKEY *get_dh1024dsa(OSSL_LIB_CTX *libctx)
119 {
120 static unsigned char dh1024_p[] = {
121 0xC8, 0x00, 0xF7, 0x08, 0x07, 0x89, 0x4D, 0x90, 0x53, 0xF3, 0xD5, 0x00,
122 0x21, 0x1B, 0xF7, 0x31, 0xA6, 0xA2, 0xDA, 0x23, 0x9A, 0xC7, 0x87, 0x19,
123 0x3B, 0x47, 0xB6, 0x8C, 0x04, 0x6F, 0xFF, 0xC6, 0x9B, 0xB8, 0x65, 0xD2,
124 0xC2, 0x5F, 0x31, 0x83, 0x4A, 0xA7, 0x5F, 0x2F, 0x88, 0x38, 0xB6, 0x55,
125 0xCF, 0xD9, 0x87, 0x6D, 0x6F, 0x9F, 0xDA, 0xAC, 0xA6, 0x48, 0xAF, 0xFC,
126 0x33, 0x84, 0x37, 0x5B, 0x82, 0x4A, 0x31, 0x5D, 0xE7, 0xBD, 0x52, 0x97,
127 0xA1, 0x77, 0xBF, 0x10, 0x9E, 0x37, 0xEA, 0x64, 0xFA, 0xCA, 0x28, 0x8D,
128 0x9D, 0x3B, 0xD2, 0x6E, 0x09, 0x5C, 0x68, 0xC7, 0x45, 0x90, 0xFD, 0xBB,
129 0x70, 0xC9, 0x3A, 0xBB, 0xDF, 0xD4, 0x21, 0x0F, 0xC4, 0x6A, 0x3C, 0xF6,
130 0x61, 0xCF, 0x3F, 0xD6, 0x13, 0xF1, 0x5F, 0xBC, 0xCF, 0xBC, 0x26, 0x9E,
131 0xBC, 0x0B, 0xBD, 0xAB, 0x5D, 0xC9, 0x54, 0x39,
132 };
133 static unsigned char dh1024_g[] = {
134 0x3B, 0x40, 0x86, 0xE7, 0xF3, 0x6C, 0xDE, 0x67, 0x1C, 0xCC, 0x80, 0x05,
135 0x5A, 0xDF, 0xFE, 0xBD, 0x20, 0x27, 0x74, 0x6C, 0x24, 0xC9, 0x03, 0xF3,
136 0xE1, 0x8D, 0xC3, 0x7D, 0x98, 0x27, 0x40, 0x08, 0xB8, 0x8C, 0x6A, 0xE9,
137 0xBB, 0x1A, 0x3A, 0xD6, 0x86, 0x83, 0x5E, 0x72, 0x41, 0xCE, 0x85, 0x3C,
138 0xD2, 0xB3, 0xFC, 0x13, 0xCE, 0x37, 0x81, 0x9E, 0x4C, 0x1C, 0x7B, 0x65,
139 0xD3, 0xE6, 0xA6, 0x00, 0xF5, 0x5A, 0x95, 0x43, 0x5E, 0x81, 0xCF, 0x60,
140 0xA2, 0x23, 0xFC, 0x36, 0xA7, 0x5D, 0x7A, 0x4C, 0x06, 0x91, 0x6E, 0xF6,
141 0x57, 0xEE, 0x36, 0xCB, 0x06, 0xEA, 0xF5, 0x3D, 0x95, 0x49, 0xCB, 0xA7,
142 0xDD, 0x81, 0xDF, 0x80, 0x09, 0x4A, 0x97, 0x4D, 0xA8, 0x22, 0x72, 0xA1,
143 0x7F, 0xC4, 0x70, 0x56, 0x70, 0xE8, 0x20, 0x10, 0x18, 0x8F, 0x2E, 0x60,
144 0x07, 0xE7, 0x68, 0x1A, 0x82, 0x5D, 0x32, 0xA2,
145 };
146
147 return get_dh_from_pg(libctx, "DH", dh1024_p, sizeof(dh1024_p),
148 dh1024_g, sizeof(dh1024_g), NULL, 0);
149 }
150
151 EVP_PKEY *get_dh2048(OSSL_LIB_CTX *libctx)
152 {
153 BIGNUM *p = NULL, *g = NULL;
154 EVP_PKEY *dhpkey = NULL;
155
156 g = BN_new();
157 if (g == NULL || !BN_set_word(g, 2))
158 goto err;
159
160 p = BN_get_rfc3526_prime_2048(NULL);
161 if (p == NULL)
162 goto err;
163
164 dhpkey = get_dh_from_pg_bn(libctx, "DH", p, g, NULL);
165
166 err:
167 BN_free(p);
168 BN_free(g);
169 return dhpkey;
170 }
171
172 #endif