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, 0xC8, 0xE1, 0x86, 0xD0, 0x1F, 0x94, 0x17, 0xA6, 0x99, 0xF0, 0xC6,
76         0x1F, 0x0D, 0xAC, 0xB6, 0x25, 0x3E, 0x06, 0x39, 0xCA, 0x72, 0x04, 0xB0,
77         0x6E, 0xDA, 0xC0, 0x61, 0xE6, 0x7A, 0x77, 0x25, 0xE8, 0x3B, 0xB9, 0x5F,
78         0x9A, 0xB6, 0xB5, 0xFE, 0x99, 0x0B, 0xA1, 0x93, 0x4E, 0x35, 0x33, 0xB8,
79         0xE1, 0xF1, 0x13, 0x4F, 0x59, 0x1A, 0xD2, 0x57, 0xC0, 0x26, 0x21, 0x33,
80         0x02, 0xC5, 0xAE, 0x23,
81     };
82     static unsigned char dh512_g[] = {
83         0x02,
84     };
85 
86     return get_dh_from_pg(libctx, "DH", dh512_p, sizeof(dh512_p),
87                           dh512_g, sizeof(dh512_g), NULL, 0);
88 }
89 
get_dhx512(OSSL_LIB_CTX * libctx)90 EVP_PKEY *get_dhx512(OSSL_LIB_CTX *libctx)
91 {
92     static unsigned char dhx512_p[] = {
93         0x00, 0xe8, 0x1a, 0xb7, 0x9a, 0x02, 0x65, 0x64, 0x94, 0x7b, 0xba, 0x09,
94         0x1c, 0x12, 0x27, 0x1e, 0xea, 0x89, 0x32, 0x64, 0x78, 0xf8, 0x1c, 0x78,
95         0x8e, 0x96, 0xc3, 0xc6, 0x9f, 0x41, 0x05, 0x41, 0x65, 0xae, 0xe3, 0x05,
96         0xea, 0x66, 0x21, 0xf7, 0x38, 0xb7, 0x2b, 0x32, 0x40, 0x5a, 0x14, 0x86,
97         0x51, 0x94, 0xb1, 0xcf, 0x01, 0xe3, 0x27, 0x28, 0xf6, 0x75, 0xa3, 0x15,
98         0xbb, 0x12, 0x4d, 0x99, 0xe7,
99     };
100     static unsigned char dhx512_g[] = {
101         0x00, 0x91, 0xc1, 0x43, 0x6d, 0x0d, 0xb0, 0xa4, 0xde, 0x41, 0xb7, 0x93,
102         0xad, 0x51, 0x94, 0x1b, 0x43, 0xd8, 0x42, 0xf1, 0x5e, 0x46, 0x83, 0x5d,
103         0xf1, 0xd1, 0xf0, 0x41, 0x10, 0xd1, 0x1c, 0x5e, 0xad, 0x9b, 0x68, 0xb1,
104         0x6f, 0xf5, 0x8e, 0xaa, 0x6d, 0x71, 0x88, 0x37, 0xdf, 0x05, 0xf7, 0x6e,
105         0x7a, 0xb4, 0x25, 0x10, 0x6c, 0x7f, 0x38, 0xb4, 0xc8, 0xfc, 0xcc, 0x0c,
106         0x6a, 0x02, 0x08, 0x61, 0xf6,
107     };
108     static unsigned char dhx512_q[] = {
109         0x00, 0xdd, 0xf6, 0x35, 0xad, 0xfa, 0x70, 0xc7, 0xe7, 0xa8, 0xf0, 0xe3,
110         0xda, 0x79, 0x34, 0x3f, 0x5b, 0xcf, 0x73, 0x82, 0x91,
111     };
112 
113     return get_dh_from_pg(libctx, "X9.42 DH",
114                           dhx512_p, sizeof(dhx512_p),
115                           dhx512_g, sizeof(dhx512_g),
116                           dhx512_q, sizeof(dhx512_q));
117 }
118 
get_dh1024dsa(OSSL_LIB_CTX * libctx)119 EVP_PKEY *get_dh1024dsa(OSSL_LIB_CTX *libctx)
120 {
121     static unsigned char dh1024_p[] = {
122         0xC8, 0x00, 0xF7, 0x08, 0x07, 0x89, 0x4D, 0x90, 0x53, 0xF3, 0xD5, 0x00,
123         0x21, 0x1B, 0xF7, 0x31, 0xA6, 0xA2, 0xDA, 0x23, 0x9A, 0xC7, 0x87, 0x19,
124         0x3B, 0x47, 0xB6, 0x8C, 0x04, 0x6F, 0xFF, 0xC6, 0x9B, 0xB8, 0x65, 0xD2,
125         0xC2, 0x5F, 0x31, 0x83, 0x4A, 0xA7, 0x5F, 0x2F, 0x88, 0x38, 0xB6, 0x55,
126         0xCF, 0xD9, 0x87, 0x6D, 0x6F, 0x9F, 0xDA, 0xAC, 0xA6, 0x48, 0xAF, 0xFC,
127         0x33, 0x84, 0x37, 0x5B, 0x82, 0x4A, 0x31, 0x5D, 0xE7, 0xBD, 0x52, 0x97,
128         0xA1, 0x77, 0xBF, 0x10, 0x9E, 0x37, 0xEA, 0x64, 0xFA, 0xCA, 0x28, 0x8D,
129         0x9D, 0x3B, 0xD2, 0x6E, 0x09, 0x5C, 0x68, 0xC7, 0x45, 0x90, 0xFD, 0xBB,
130         0x70, 0xC9, 0x3A, 0xBB, 0xDF, 0xD4, 0x21, 0x0F, 0xC4, 0x6A, 0x3C, 0xF6,
131         0x61, 0xCF, 0x3F, 0xD6, 0x13, 0xF1, 0x5F, 0xBC, 0xCF, 0xBC, 0x26, 0x9E,
132         0xBC, 0x0B, 0xBD, 0xAB, 0x5D, 0xC9, 0x54, 0x39,
133     };
134     static unsigned char dh1024_g[] = {
135         0x3B, 0x40, 0x86, 0xE7, 0xF3, 0x6C, 0xDE, 0x67, 0x1C, 0xCC, 0x80, 0x05,
136         0x5A, 0xDF, 0xFE, 0xBD, 0x20, 0x27, 0x74, 0x6C, 0x24, 0xC9, 0x03, 0xF3,
137         0xE1, 0x8D, 0xC3, 0x7D, 0x98, 0x27, 0x40, 0x08, 0xB8, 0x8C, 0x6A, 0xE9,
138         0xBB, 0x1A, 0x3A, 0xD6, 0x86, 0x83, 0x5E, 0x72, 0x41, 0xCE, 0x85, 0x3C,
139         0xD2, 0xB3, 0xFC, 0x13, 0xCE, 0x37, 0x81, 0x9E, 0x4C, 0x1C, 0x7B, 0x65,
140         0xD3, 0xE6, 0xA6, 0x00, 0xF5, 0x5A, 0x95, 0x43, 0x5E, 0x81, 0xCF, 0x60,
141         0xA2, 0x23, 0xFC, 0x36, 0xA7, 0x5D, 0x7A, 0x4C, 0x06, 0x91, 0x6E, 0xF6,
142         0x57, 0xEE, 0x36, 0xCB, 0x06, 0xEA, 0xF5, 0x3D, 0x95, 0x49, 0xCB, 0xA7,
143         0xDD, 0x81, 0xDF, 0x80, 0x09, 0x4A, 0x97, 0x4D, 0xA8, 0x22, 0x72, 0xA1,
144         0x7F, 0xC4, 0x70, 0x56, 0x70, 0xE8, 0x20, 0x10, 0x18, 0x8F, 0x2E, 0x60,
145         0x07, 0xE7, 0x68, 0x1A, 0x82, 0x5D, 0x32, 0xA2,
146     };
147 
148     return get_dh_from_pg(libctx, "DH", dh1024_p, sizeof(dh1024_p),
149                           dh1024_g, sizeof(dh1024_g), NULL, 0);
150 }
151 
get_dh2048(OSSL_LIB_CTX * libctx)152 EVP_PKEY *get_dh2048(OSSL_LIB_CTX *libctx)
153 {
154     BIGNUM *p = NULL, *g = NULL;
155     EVP_PKEY *dhpkey = NULL;
156 
157     g = BN_new();
158     if (g == NULL || !BN_set_word(g, 2))
159         goto err;
160 
161     p = BN_get_rfc3526_prime_2048(NULL);
162     if (p == NULL)
163         goto err;
164 
165     dhpkey = get_dh_from_pg_bn(libctx, "DH", p, g, NULL);
166 
167  err:
168     BN_free(p);
169     BN_free(g);
170     return dhpkey;
171 }
172 
get_dh4096(OSSL_LIB_CTX * libctx)173 EVP_PKEY *get_dh4096(OSSL_LIB_CTX *libctx)
174 {
175     BIGNUM *p = NULL, *g = NULL;
176     EVP_PKEY *dhpkey = NULL;
177 
178     g = BN_new();
179     if (g == NULL || !BN_set_word(g, 2))
180         goto err;
181 
182     p = BN_get_rfc3526_prime_4096(NULL);
183     if (p == NULL)
184         goto err;
185 
186     dhpkey = get_dh_from_pg_bn(libctx, "DH", p, g, NULL);
187 
188  err:
189     BN_free(p);
190     BN_free(g);
191     return dhpkey;
192 }
193 
194 #endif
195