a357d0262f15be2012858346fd2aaa6f1facfbee
[openssl.git] / test / dhtest.c
1 /*
2  * Copyright 1995-2019 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 <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13
14 #include "internal/nelem.h"
15 #include <openssl/crypto.h>
16 #include <openssl/bio.h>
17 #include <openssl/bn.h>
18 #include <openssl/rand.h>
19 #include <openssl/err.h>
20 #include <openssl/obj_mac.h>
21 #include "testutil.h"
22
23 #ifndef OPENSSL_NO_DH
24 # include <openssl/dh.h>
25
26 static int cb(int p, int n, BN_GENCB *arg);
27
28 static int dh_test(void)
29 {
30     DH *dh = NULL;
31     BIGNUM *p = NULL, *q = NULL, *g = NULL;
32     const BIGNUM *p2, *q2, *g2;
33     BIGNUM *priv_key = NULL;
34     const BIGNUM *pub_key2, *priv_key2;
35     BN_GENCB *_cb = NULL;
36     DH *a = NULL;
37     DH *b = NULL;
38     DH *c = NULL;
39     const BIGNUM *ap = NULL, *ag = NULL, *apub_key = NULL;
40     const BIGNUM *bpub_key = NULL, *bpriv_key = NULL;
41     BIGNUM *bp = NULL, *bg = NULL, *cpriv_key = NULL;
42     unsigned char *abuf = NULL;
43     unsigned char *bbuf = NULL;
44     unsigned char *cbuf = NULL;
45     int i, alen, blen, clen, aout, bout, cout;
46     int ret = 0;
47
48     if (!TEST_ptr(dh = DH_new())
49         || !TEST_ptr(p = BN_new())
50         || !TEST_ptr(q = BN_new())
51         || !TEST_ptr(g = BN_new())
52         || !TEST_ptr(priv_key = BN_new()))
53         goto err1;
54
55     /*
56      * I) basic tests
57      */
58
59     /* using a small predefined Sophie Germain DH group with generator 3 */
60     if (!TEST_true(BN_set_word(p, 4079L))
61         || !TEST_true(BN_set_word(q, 2039L))
62         || !TEST_true(BN_set_word(g, 3L))
63         || !TEST_true(DH_set0_pqg(dh, p, q, g)))
64         goto err1;
65
66     /* check fails, because p is way too small */
67     if (!DH_check(dh, &i))
68         goto err2;
69     i ^= DH_MODULUS_TOO_SMALL;
70     if (!TEST_false(i & DH_CHECK_P_NOT_PRIME)
71             || !TEST_false(i & DH_CHECK_P_NOT_SAFE_PRIME)
72             || !TEST_false(i & DH_UNABLE_TO_CHECK_GENERATOR)
73             || !TEST_false(i & DH_NOT_SUITABLE_GENERATOR)
74             || !TEST_false(i & DH_CHECK_Q_NOT_PRIME)
75             || !TEST_false(i & DH_CHECK_INVALID_Q_VALUE)
76             || !TEST_false(i & DH_CHECK_INVALID_J_VALUE)
77             || !TEST_false(i & DH_MODULUS_TOO_SMALL)
78             || !TEST_false(i & DH_MODULUS_TOO_LARGE)
79             || !TEST_false(i))
80         goto err2;
81
82     /* test the combined getter for p, q, and g */
83     DH_get0_pqg(dh, &p2, &q2, &g2);
84     if (!TEST_ptr_eq(p2, p)
85         || !TEST_ptr_eq(q2, q)
86         || !TEST_ptr_eq(g2, g))
87         goto err2;
88
89     /* test the simple getters for p, q, and g */
90     if (!TEST_ptr_eq(DH_get0_p(dh), p2)
91         || !TEST_ptr_eq(DH_get0_q(dh), q2)
92         || !TEST_ptr_eq(DH_get0_g(dh), g2))
93         goto err2;
94
95     /* set the private key only*/
96     if (!TEST_true(BN_set_word(priv_key, 1234L))
97         || !TEST_true(DH_set0_key(dh, NULL, priv_key)))
98         goto err2;
99
100     /* test the combined getter for pub_key and priv_key */
101     DH_get0_key(dh, &pub_key2, &priv_key2);
102     if (!TEST_ptr_eq(pub_key2, NULL)
103         || !TEST_ptr_eq(priv_key2, priv_key))
104         goto err3;
105
106     /* test the simple getters for pub_key and priv_key */
107     if (!TEST_ptr_eq(DH_get0_pub_key(dh), pub_key2)
108         || !TEST_ptr_eq(DH_get0_priv_key(dh), priv_key2))
109         goto err3;
110
111     /* now generate a key pair (expect failure since modulus is too small) */
112     if (!TEST_false(DH_generate_key(dh)))
113         goto err3;
114
115     /* We'll have a stale error on the queue from the above test so clear it */
116     ERR_clear_error();
117
118     /*
119      * II) key generation
120      */
121
122     /* generate a DH group ... */
123     if (!TEST_ptr(_cb = BN_GENCB_new()))
124         goto err3;
125     BN_GENCB_set(_cb, &cb, NULL);
126     if (!TEST_ptr(a = DH_new())
127             || !TEST_true(DH_generate_parameters_ex(a, 512,
128                                                     DH_GENERATOR_5, _cb)))
129         goto err3;
130
131     /* ... and check whether it is valid */
132     if (!DH_check(a, &i))
133         goto err3;
134     if (!TEST_false(i & DH_CHECK_P_NOT_PRIME)
135             || !TEST_false(i & DH_CHECK_P_NOT_SAFE_PRIME)
136             || !TEST_false(i & DH_UNABLE_TO_CHECK_GENERATOR)
137             || !TEST_false(i & DH_NOT_SUITABLE_GENERATOR)
138             || !TEST_false(i & DH_CHECK_Q_NOT_PRIME)
139             || !TEST_false(i & DH_CHECK_INVALID_Q_VALUE)
140             || !TEST_false(i & DH_CHECK_INVALID_J_VALUE)
141             || !TEST_false(i & DH_MODULUS_TOO_SMALL)
142             || !TEST_false(i & DH_MODULUS_TOO_LARGE)
143             || !TEST_false(i))
144         goto err3;
145
146     DH_get0_pqg(a, &ap, NULL, &ag);
147
148     /* now create another copy of the DH group for the peer */
149     if (!TEST_ptr(b = DH_new()))
150         goto err3;
151
152     if (!TEST_ptr(bp = BN_dup(ap))
153             || !TEST_ptr(bg = BN_dup(ag))
154             || !TEST_true(DH_set0_pqg(b, bp, NULL, bg)))
155         goto err3;
156     bp = bg = NULL;
157
158     /*
159      * III) simulate a key exchange
160      */
161
162     if (!DH_generate_key(a))
163         goto err3;
164     DH_get0_key(a, &apub_key, NULL);
165
166     if (!DH_generate_key(b))
167         goto err3;
168     DH_get0_key(b, &bpub_key, &bpriv_key);
169
170     /* Also test with a private-key-only copy of |b|. */
171     if (!TEST_ptr(c = DHparams_dup(b))
172             || !TEST_ptr(cpriv_key = BN_dup(bpriv_key))
173             || !TEST_true(DH_set0_key(c, NULL, cpriv_key)))
174         goto err3;
175     cpriv_key = NULL;
176
177     alen = DH_size(a);
178     if (!TEST_ptr(abuf = OPENSSL_malloc(alen))
179             || !TEST_true((aout = DH_compute_key(abuf, bpub_key, a)) != -1))
180         goto err3;
181
182     blen = DH_size(b);
183     if (!TEST_ptr(bbuf = OPENSSL_malloc(blen))
184             || !TEST_true((bout = DH_compute_key(bbuf, apub_key, b)) != -1))
185         goto err3;
186
187     clen = DH_size(c);
188     if (!TEST_ptr(cbuf = OPENSSL_malloc(clen))
189             || !TEST_true((cout = DH_compute_key(cbuf, apub_key, c)) != -1))
190         goto err3;
191
192     if (!TEST_true(aout >= 20)
193             || !TEST_mem_eq(abuf, aout, bbuf, bout)
194             || !TEST_mem_eq(abuf, aout, cbuf, cout))
195         goto err3;
196
197     ret = 1;
198     goto success;
199
200  err1:
201     /* an error occurred before p,q,g were assigned to dh */
202     BN_free(p);
203     BN_free(q);
204     BN_free(g);
205  err2:
206     /* an error occurred before priv_key was assigned to dh */
207     BN_free(priv_key);
208  err3:
209  success:
210     OPENSSL_free(abuf);
211     OPENSSL_free(bbuf);
212     OPENSSL_free(cbuf);
213     DH_free(b);
214     DH_free(a);
215     DH_free(c);
216     BN_free(bp);
217     BN_free(bg);
218     BN_free(cpriv_key);
219     BN_GENCB_free(_cb);
220     DH_free(dh);
221
222     return ret;
223 }
224
225 static int cb(int p, int n, BN_GENCB *arg)
226 {
227     return 1;
228 }
229
230 /* Test data from RFC 5114 */
231
232 static const unsigned char dhtest_1024_160_xA[] = {
233     0xB9, 0xA3, 0xB3, 0xAE, 0x8F, 0xEF, 0xC1, 0xA2, 0x93, 0x04, 0x96, 0x50,
234     0x70, 0x86, 0xF8, 0x45, 0x5D, 0x48, 0x94, 0x3E
235 };
236
237 static const unsigned char dhtest_1024_160_yA[] = {
238     0x2A, 0x85, 0x3B, 0x3D, 0x92, 0x19, 0x75, 0x01, 0xB9, 0x01, 0x5B, 0x2D,
239     0xEB, 0x3E, 0xD8, 0x4F, 0x5E, 0x02, 0x1D, 0xCC, 0x3E, 0x52, 0xF1, 0x09,
240     0xD3, 0x27, 0x3D, 0x2B, 0x75, 0x21, 0x28, 0x1C, 0xBA, 0xBE, 0x0E, 0x76,
241     0xFF, 0x57, 0x27, 0xFA, 0x8A, 0xCC, 0xE2, 0x69, 0x56, 0xBA, 0x9A, 0x1F,
242     0xCA, 0x26, 0xF2, 0x02, 0x28, 0xD8, 0x69, 0x3F, 0xEB, 0x10, 0x84, 0x1D,
243     0x84, 0xA7, 0x36, 0x00, 0x54, 0xEC, 0xE5, 0xA7, 0xF5, 0xB7, 0xA6, 0x1A,
244     0xD3, 0xDF, 0xB3, 0xC6, 0x0D, 0x2E, 0x43, 0x10, 0x6D, 0x87, 0x27, 0xDA,
245     0x37, 0xDF, 0x9C, 0xCE, 0x95, 0xB4, 0x78, 0x75, 0x5D, 0x06, 0xBC, 0xEA,
246     0x8F, 0x9D, 0x45, 0x96, 0x5F, 0x75, 0xA5, 0xF3, 0xD1, 0xDF, 0x37, 0x01,
247     0x16, 0x5F, 0xC9, 0xE5, 0x0C, 0x42, 0x79, 0xCE, 0xB0, 0x7F, 0x98, 0x95,
248     0x40, 0xAE, 0x96, 0xD5, 0xD8, 0x8E, 0xD7, 0x76
249 };
250
251 static const unsigned char dhtest_1024_160_xB[] = {
252     0x93, 0x92, 0xC9, 0xF9, 0xEB, 0x6A, 0x7A, 0x6A, 0x90, 0x22, 0xF7, 0xD8,
253     0x3E, 0x72, 0x23, 0xC6, 0x83, 0x5B, 0xBD, 0xDA
254 };
255
256 static const unsigned char dhtest_1024_160_yB[] = {
257     0x71, 0x7A, 0x6C, 0xB0, 0x53, 0x37, 0x1F, 0xF4, 0xA3, 0xB9, 0x32, 0x94,
258     0x1C, 0x1E, 0x56, 0x63, 0xF8, 0x61, 0xA1, 0xD6, 0xAD, 0x34, 0xAE, 0x66,
259     0x57, 0x6D, 0xFB, 0x98, 0xF6, 0xC6, 0xCB, 0xF9, 0xDD, 0xD5, 0xA5, 0x6C,
260     0x78, 0x33, 0xF6, 0xBC, 0xFD, 0xFF, 0x09, 0x55, 0x82, 0xAD, 0x86, 0x8E,
261     0x44, 0x0E, 0x8D, 0x09, 0xFD, 0x76, 0x9E, 0x3C, 0xEC, 0xCD, 0xC3, 0xD3,
262     0xB1, 0xE4, 0xCF, 0xA0, 0x57, 0x77, 0x6C, 0xAA, 0xF9, 0x73, 0x9B, 0x6A,
263     0x9F, 0xEE, 0x8E, 0x74, 0x11, 0xF8, 0xD6, 0xDA, 0xC0, 0x9D, 0x6A, 0x4E,
264     0xDB, 0x46, 0xCC, 0x2B, 0x5D, 0x52, 0x03, 0x09, 0x0E, 0xAE, 0x61, 0x26,
265     0x31, 0x1E, 0x53, 0xFD, 0x2C, 0x14, 0xB5, 0x74, 0xE6, 0xA3, 0x10, 0x9A,
266     0x3D, 0xA1, 0xBE, 0x41, 0xBD, 0xCE, 0xAA, 0x18, 0x6F, 0x5C, 0xE0, 0x67,
267     0x16, 0xA2, 0xB6, 0xA0, 0x7B, 0x3C, 0x33, 0xFE
268 };
269
270 static const unsigned char dhtest_1024_160_Z[] = {
271     0x5C, 0x80, 0x4F, 0x45, 0x4D, 0x30, 0xD9, 0xC4, 0xDF, 0x85, 0x27, 0x1F,
272     0x93, 0x52, 0x8C, 0x91, 0xDF, 0x6B, 0x48, 0xAB, 0x5F, 0x80, 0xB3, 0xB5,
273     0x9C, 0xAA, 0xC1, 0xB2, 0x8F, 0x8A, 0xCB, 0xA9, 0xCD, 0x3E, 0x39, 0xF3,
274     0xCB, 0x61, 0x45, 0x25, 0xD9, 0x52, 0x1D, 0x2E, 0x64, 0x4C, 0x53, 0xB8,
275     0x07, 0xB8, 0x10, 0xF3, 0x40, 0x06, 0x2F, 0x25, 0x7D, 0x7D, 0x6F, 0xBF,
276     0xE8, 0xD5, 0xE8, 0xF0, 0x72, 0xE9, 0xB6, 0xE9, 0xAF, 0xDA, 0x94, 0x13,
277     0xEA, 0xFB, 0x2E, 0x8B, 0x06, 0x99, 0xB1, 0xFB, 0x5A, 0x0C, 0xAC, 0xED,
278     0xDE, 0xAE, 0xAD, 0x7E, 0x9C, 0xFB, 0xB3, 0x6A, 0xE2, 0xB4, 0x20, 0x83,
279     0x5B, 0xD8, 0x3A, 0x19, 0xFB, 0x0B, 0x5E, 0x96, 0xBF, 0x8F, 0xA4, 0xD0,
280     0x9E, 0x34, 0x55, 0x25, 0x16, 0x7E, 0xCD, 0x91, 0x55, 0x41, 0x6F, 0x46,
281     0xF4, 0x08, 0xED, 0x31, 0xB6, 0x3C, 0x6E, 0x6D
282 };
283
284 static const unsigned char dhtest_2048_224_xA[] = {
285     0x22, 0xE6, 0x26, 0x01, 0xDB, 0xFF, 0xD0, 0x67, 0x08, 0xA6, 0x80, 0xF7,
286     0x47, 0xF3, 0x61, 0xF7, 0x6D, 0x8F, 0x4F, 0x72, 0x1A, 0x05, 0x48, 0xE4,
287     0x83, 0x29, 0x4B, 0x0C
288 };
289
290 static const unsigned char dhtest_2048_224_yA[] = {
291     0x1B, 0x3A, 0x63, 0x45, 0x1B, 0xD8, 0x86, 0xE6, 0x99, 0xE6, 0x7B, 0x49,
292     0x4E, 0x28, 0x8B, 0xD7, 0xF8, 0xE0, 0xD3, 0x70, 0xBA, 0xDD, 0xA7, 0xA0,
293     0xEF, 0xD2, 0xFD, 0xE7, 0xD8, 0xF6, 0x61, 0x45, 0xCC, 0x9F, 0x28, 0x04,
294     0x19, 0x97, 0x5E, 0xB8, 0x08, 0x87, 0x7C, 0x8A, 0x4C, 0x0C, 0x8E, 0x0B,
295     0xD4, 0x8D, 0x4A, 0x54, 0x01, 0xEB, 0x1E, 0x87, 0x76, 0xBF, 0xEE, 0xE1,
296     0x34, 0xC0, 0x38, 0x31, 0xAC, 0x27, 0x3C, 0xD9, 0xD6, 0x35, 0xAB, 0x0C,
297     0xE0, 0x06, 0xA4, 0x2A, 0x88, 0x7E, 0x3F, 0x52, 0xFB, 0x87, 0x66, 0xB6,
298     0x50, 0xF3, 0x80, 0x78, 0xBC, 0x8E, 0xE8, 0x58, 0x0C, 0xEF, 0xE2, 0x43,
299     0x96, 0x8C, 0xFC, 0x4F, 0x8D, 0xC3, 0xDB, 0x08, 0x45, 0x54, 0x17, 0x1D,
300     0x41, 0xBF, 0x2E, 0x86, 0x1B, 0x7B, 0xB4, 0xD6, 0x9D, 0xD0, 0xE0, 0x1E,
301     0xA3, 0x87, 0xCB, 0xAA, 0x5C, 0xA6, 0x72, 0xAF, 0xCB, 0xE8, 0xBD, 0xB9,
302     0xD6, 0x2D, 0x4C, 0xE1, 0x5F, 0x17, 0xDD, 0x36, 0xF9, 0x1E, 0xD1, 0xEE,
303     0xDD, 0x65, 0xCA, 0x4A, 0x06, 0x45, 0x5C, 0xB9, 0x4C, 0xD4, 0x0A, 0x52,
304     0xEC, 0x36, 0x0E, 0x84, 0xB3, 0xC9, 0x26, 0xE2, 0x2C, 0x43, 0x80, 0xA3,
305     0xBF, 0x30, 0x9D, 0x56, 0x84, 0x97, 0x68, 0xB7, 0xF5, 0x2C, 0xFD, 0xF6,
306     0x55, 0xFD, 0x05, 0x3A, 0x7E, 0xF7, 0x06, 0x97, 0x9E, 0x7E, 0x58, 0x06,
307     0xB1, 0x7D, 0xFA, 0xE5, 0x3A, 0xD2, 0xA5, 0xBC, 0x56, 0x8E, 0xBB, 0x52,
308     0x9A, 0x7A, 0x61, 0xD6, 0x8D, 0x25, 0x6F, 0x8F, 0xC9, 0x7C, 0x07, 0x4A,
309     0x86, 0x1D, 0x82, 0x7E, 0x2E, 0xBC, 0x8C, 0x61, 0x34, 0x55, 0x31, 0x15,
310     0xB7, 0x0E, 0x71, 0x03, 0x92, 0x0A, 0xA1, 0x6D, 0x85, 0xE5, 0x2B, 0xCB,
311     0xAB, 0x8D, 0x78, 0x6A, 0x68, 0x17, 0x8F, 0xA8, 0xFF, 0x7C, 0x2F, 0x5C,
312     0x71, 0x64, 0x8D, 0x6F
313 };
314
315 static const unsigned char dhtest_2048_224_xB[] = {
316     0x4F, 0xF3, 0xBC, 0x96, 0xC7, 0xFC, 0x6A, 0x6D, 0x71, 0xD3, 0xB3, 0x63,
317     0x80, 0x0A, 0x7C, 0xDF, 0xEF, 0x6F, 0xC4, 0x1B, 0x44, 0x17, 0xEA, 0x15,
318     0x35, 0x3B, 0x75, 0x90
319 };
320
321 static const unsigned char dhtest_2048_224_yB[] = {
322     0x4D, 0xCE, 0xE9, 0x92, 0xA9, 0x76, 0x2A, 0x13, 0xF2, 0xF8, 0x38, 0x44,
323     0xAD, 0x3D, 0x77, 0xEE, 0x0E, 0x31, 0xC9, 0x71, 0x8B, 0x3D, 0xB6, 0xC2,
324     0x03, 0x5D, 0x39, 0x61, 0x18, 0x2C, 0x3E, 0x0B, 0xA2, 0x47, 0xEC, 0x41,
325     0x82, 0xD7, 0x60, 0xCD, 0x48, 0xD9, 0x95, 0x99, 0x97, 0x06, 0x22, 0xA1,
326     0x88, 0x1B, 0xBA, 0x2D, 0xC8, 0x22, 0x93, 0x9C, 0x78, 0xC3, 0x91, 0x2C,
327     0x66, 0x61, 0xFA, 0x54, 0x38, 0xB2, 0x07, 0x66, 0x22, 0x2B, 0x75, 0xE2,
328     0x4C, 0x2E, 0x3A, 0xD0, 0xC7, 0x28, 0x72, 0x36, 0x12, 0x95, 0x25, 0xEE,
329     0x15, 0xB5, 0xDD, 0x79, 0x98, 0xAA, 0x04, 0xC4, 0xA9, 0x69, 0x6C, 0xAC,
330     0xD7, 0x17, 0x20, 0x83, 0xA9, 0x7A, 0x81, 0x66, 0x4E, 0xAD, 0x2C, 0x47,
331     0x9E, 0x44, 0x4E, 0x4C, 0x06, 0x54, 0xCC, 0x19, 0xE2, 0x8D, 0x77, 0x03,
332     0xCE, 0xE8, 0xDA, 0xCD, 0x61, 0x26, 0xF5, 0xD6, 0x65, 0xEC, 0x52, 0xC6,
333     0x72, 0x55, 0xDB, 0x92, 0x01, 0x4B, 0x03, 0x7E, 0xB6, 0x21, 0xA2, 0xAC,
334     0x8E, 0x36, 0x5D, 0xE0, 0x71, 0xFF, 0xC1, 0x40, 0x0A, 0xCF, 0x07, 0x7A,
335     0x12, 0x91, 0x3D, 0xD8, 0xDE, 0x89, 0x47, 0x34, 0x37, 0xAB, 0x7B, 0xA3,
336     0x46, 0x74, 0x3C, 0x1B, 0x21, 0x5D, 0xD9, 0xC1, 0x21, 0x64, 0xA7, 0xE4,
337     0x05, 0x31, 0x18, 0xD1, 0x99, 0xBE, 0xC8, 0xEF, 0x6F, 0xC5, 0x61, 0x17,
338     0x0C, 0x84, 0xC8, 0x7D, 0x10, 0xEE, 0x9A, 0x67, 0x4A, 0x1F, 0xA8, 0xFF,
339     0xE1, 0x3B, 0xDF, 0xBA, 0x1D, 0x44, 0xDE, 0x48, 0x94, 0x6D, 0x68, 0xDC,
340     0x0C, 0xDD, 0x77, 0x76, 0x35, 0xA7, 0xAB, 0x5B, 0xFB, 0x1E, 0x4B, 0xB7,
341     0xB8, 0x56, 0xF9, 0x68, 0x27, 0x73, 0x4C, 0x18, 0x41, 0x38, 0xE9, 0x15,
342     0xD9, 0xC3, 0x00, 0x2E, 0xBC, 0xE5, 0x31, 0x20, 0x54, 0x6A, 0x7E, 0x20,
343     0x02, 0x14, 0x2B, 0x6C
344 };
345
346 static const unsigned char dhtest_2048_224_Z[] = {
347     0x34, 0xD9, 0xBD, 0xDC, 0x1B, 0x42, 0x17, 0x6C, 0x31, 0x3F, 0xEA, 0x03,
348     0x4C, 0x21, 0x03, 0x4D, 0x07, 0x4A, 0x63, 0x13, 0xBB, 0x4E, 0xCD, 0xB3,
349     0x70, 0x3F, 0xFF, 0x42, 0x45, 0x67, 0xA4, 0x6B, 0xDF, 0x75, 0x53, 0x0E,
350     0xDE, 0x0A, 0x9D, 0xA5, 0x22, 0x9D, 0xE7, 0xD7, 0x67, 0x32, 0x28, 0x6C,
351     0xBC, 0x0F, 0x91, 0xDA, 0x4C, 0x3C, 0x85, 0x2F, 0xC0, 0x99, 0xC6, 0x79,
352     0x53, 0x1D, 0x94, 0xC7, 0x8A, 0xB0, 0x3D, 0x9D, 0xEC, 0xB0, 0xA4, 0xE4,
353     0xCA, 0x8B, 0x2B, 0xB4, 0x59, 0x1C, 0x40, 0x21, 0xCF, 0x8C, 0xE3, 0xA2,
354     0x0A, 0x54, 0x1D, 0x33, 0x99, 0x40, 0x17, 0xD0, 0x20, 0x0A, 0xE2, 0xC9,
355     0x51, 0x6E, 0x2F, 0xF5, 0x14, 0x57, 0x79, 0x26, 0x9E, 0x86, 0x2B, 0x0F,
356     0xB4, 0x74, 0xA2, 0xD5, 0x6D, 0xC3, 0x1E, 0xD5, 0x69, 0xA7, 0x70, 0x0B,
357     0x4C, 0x4A, 0xB1, 0x6B, 0x22, 0xA4, 0x55, 0x13, 0x53, 0x1E, 0xF5, 0x23,
358     0xD7, 0x12, 0x12, 0x07, 0x7B, 0x5A, 0x16, 0x9B, 0xDE, 0xFF, 0xAD, 0x7A,
359     0xD9, 0x60, 0x82, 0x84, 0xC7, 0x79, 0x5B, 0x6D, 0x5A, 0x51, 0x83, 0xB8,
360     0x70, 0x66, 0xDE, 0x17, 0xD8, 0xD6, 0x71, 0xC9, 0xEB, 0xD8, 0xEC, 0x89,
361     0x54, 0x4D, 0x45, 0xEC, 0x06, 0x15, 0x93, 0xD4, 0x42, 0xC6, 0x2A, 0xB9,
362     0xCE, 0x3B, 0x1C, 0xB9, 0x94, 0x3A, 0x1D, 0x23, 0xA5, 0xEA, 0x3B, 0xCF,
363     0x21, 0xA0, 0x14, 0x71, 0xE6, 0x7E, 0x00, 0x3E, 0x7F, 0x8A, 0x69, 0xC7,
364     0x28, 0xBE, 0x49, 0x0B, 0x2F, 0xC8, 0x8C, 0xFE, 0xB9, 0x2D, 0xB6, 0xA2,
365     0x15, 0xE5, 0xD0, 0x3C, 0x17, 0xC4, 0x64, 0xC9, 0xAC, 0x1A, 0x46, 0xE2,
366     0x03, 0xE1, 0x3F, 0x95, 0x29, 0x95, 0xFB, 0x03, 0xC6, 0x9D, 0x3C, 0xC4,
367     0x7F, 0xCB, 0x51, 0x0B, 0x69, 0x98, 0xFF, 0xD3, 0xAA, 0x6D, 0xE7, 0x3C,
368     0xF9, 0xF6, 0x38, 0x69
369 };
370
371 static const unsigned char dhtest_2048_256_xA[] = {
372     0x08, 0x81, 0x38, 0x2C, 0xDB, 0x87, 0x66, 0x0C, 0x6D, 0xC1, 0x3E, 0x61,
373     0x49, 0x38, 0xD5, 0xB9, 0xC8, 0xB2, 0xF2, 0x48, 0x58, 0x1C, 0xC5, 0xE3,
374     0x1B, 0x35, 0x45, 0x43, 0x97, 0xFC, 0xE5, 0x0E
375 };
376
377 static const unsigned char dhtest_2048_256_yA[] = {
378     0x2E, 0x93, 0x80, 0xC8, 0x32, 0x3A, 0xF9, 0x75, 0x45, 0xBC, 0x49, 0x41,
379     0xDE, 0xB0, 0xEC, 0x37, 0x42, 0xC6, 0x2F, 0xE0, 0xEC, 0xE8, 0x24, 0xA6,
380     0xAB, 0xDB, 0xE6, 0x6C, 0x59, 0xBE, 0xE0, 0x24, 0x29, 0x11, 0xBF, 0xB9,
381     0x67, 0x23, 0x5C, 0xEB, 0xA3, 0x5A, 0xE1, 0x3E, 0x4E, 0xC7, 0x52, 0xBE,
382     0x63, 0x0B, 0x92, 0xDC, 0x4B, 0xDE, 0x28, 0x47, 0xA9, 0xC6, 0x2C, 0xB8,
383     0x15, 0x27, 0x45, 0x42, 0x1F, 0xB7, 0xEB, 0x60, 0xA6, 0x3C, 0x0F, 0xE9,
384     0x15, 0x9F, 0xCC, 0xE7, 0x26, 0xCE, 0x7C, 0xD8, 0x52, 0x3D, 0x74, 0x50,
385     0x66, 0x7E, 0xF8, 0x40, 0xE4, 0x91, 0x91, 0x21, 0xEB, 0x5F, 0x01, 0xC8,
386     0xC9, 0xB0, 0xD3, 0xD6, 0x48, 0xA9, 0x3B, 0xFB, 0x75, 0x68, 0x9E, 0x82,
387     0x44, 0xAC, 0x13, 0x4A, 0xF5, 0x44, 0x71, 0x1C, 0xE7, 0x9A, 0x02, 0xDC,
388     0xC3, 0x42, 0x26, 0x68, 0x47, 0x80, 0xDD, 0xDC, 0xB4, 0x98, 0x59, 0x41,
389     0x06, 0xC3, 0x7F, 0x5B, 0xC7, 0x98, 0x56, 0x48, 0x7A, 0xF5, 0xAB, 0x02,
390     0x2A, 0x2E, 0x5E, 0x42, 0xF0, 0x98, 0x97, 0xC1, 0xA8, 0x5A, 0x11, 0xEA,
391     0x02, 0x12, 0xAF, 0x04, 0xD9, 0xB4, 0xCE, 0xBC, 0x93, 0x7C, 0x3C, 0x1A,
392     0x3E, 0x15, 0xA8, 0xA0, 0x34, 0x2E, 0x33, 0x76, 0x15, 0xC8, 0x4E, 0x7F,
393     0xE3, 0xB8, 0xB9, 0xB8, 0x7F, 0xB1, 0xE7, 0x3A, 0x15, 0xAF, 0x12, 0xA3,
394     0x0D, 0x74, 0x6E, 0x06, 0xDF, 0xC3, 0x4F, 0x29, 0x0D, 0x79, 0x7C, 0xE5,
395     0x1A, 0xA1, 0x3A, 0xA7, 0x85, 0xBF, 0x66, 0x58, 0xAF, 0xF5, 0xE4, 0xB0,
396     0x93, 0x00, 0x3C, 0xBE, 0xAF, 0x66, 0x5B, 0x3C, 0x2E, 0x11, 0x3A, 0x3A,
397     0x4E, 0x90, 0x52, 0x69, 0x34, 0x1D, 0xC0, 0x71, 0x14, 0x26, 0x68, 0x5F,
398     0x4E, 0xF3, 0x7E, 0x86, 0x8A, 0x81, 0x26, 0xFF, 0x3F, 0x22, 0x79, 0xB5,
399     0x7C, 0xA6, 0x7E, 0x29
400 };
401
402 static const unsigned char dhtest_2048_256_xB[] = {
403     0x7D, 0x62, 0xA7, 0xE3, 0xEF, 0x36, 0xDE, 0x61, 0x7B, 0x13, 0xD1, 0xAF,
404     0xB8, 0x2C, 0x78, 0x0D, 0x83, 0xA2, 0x3B, 0xD4, 0xEE, 0x67, 0x05, 0x64,
405     0x51, 0x21, 0xF3, 0x71, 0xF5, 0x46, 0xA5, 0x3D
406 };
407
408 static const unsigned char dhtest_2048_256_yB[] = {
409     0x57, 0x5F, 0x03, 0x51, 0xBD, 0x2B, 0x1B, 0x81, 0x74, 0x48, 0xBD, 0xF8,
410     0x7A, 0x6C, 0x36, 0x2C, 0x1E, 0x28, 0x9D, 0x39, 0x03, 0xA3, 0x0B, 0x98,
411     0x32, 0xC5, 0x74, 0x1F, 0xA2, 0x50, 0x36, 0x3E, 0x7A, 0xCB, 0xC7, 0xF7,
412     0x7F, 0x3D, 0xAC, 0xBC, 0x1F, 0x13, 0x1A, 0xDD, 0x8E, 0x03, 0x36, 0x7E,
413     0xFF, 0x8F, 0xBB, 0xB3, 0xE1, 0xC5, 0x78, 0x44, 0x24, 0x80, 0x9B, 0x25,
414     0xAF, 0xE4, 0xD2, 0x26, 0x2A, 0x1A, 0x6F, 0xD2, 0xFA, 0xB6, 0x41, 0x05,
415     0xCA, 0x30, 0xA6, 0x74, 0xE0, 0x7F, 0x78, 0x09, 0x85, 0x20, 0x88, 0x63,
416     0x2F, 0xC0, 0x49, 0x23, 0x37, 0x91, 0xAD, 0x4E, 0xDD, 0x08, 0x3A, 0x97,
417     0x8B, 0x88, 0x3E, 0xE6, 0x18, 0xBC, 0x5E, 0x0D, 0xD0, 0x47, 0x41, 0x5F,
418     0x2D, 0x95, 0xE6, 0x83, 0xCF, 0x14, 0x82, 0x6B, 0x5F, 0xBE, 0x10, 0xD3,
419     0xCE, 0x41, 0xC6, 0xC1, 0x20, 0xC7, 0x8A, 0xB2, 0x00, 0x08, 0xC6, 0x98,
420     0xBF, 0x7F, 0x0B, 0xCA, 0xB9, 0xD7, 0xF4, 0x07, 0xBE, 0xD0, 0xF4, 0x3A,
421     0xFB, 0x29, 0x70, 0xF5, 0x7F, 0x8D, 0x12, 0x04, 0x39, 0x63, 0xE6, 0x6D,
422     0xDD, 0x32, 0x0D, 0x59, 0x9A, 0xD9, 0x93, 0x6C, 0x8F, 0x44, 0x13, 0x7C,
423     0x08, 0xB1, 0x80, 0xEC, 0x5E, 0x98, 0x5C, 0xEB, 0xE1, 0x86, 0xF3, 0xD5,
424     0x49, 0x67, 0x7E, 0x80, 0x60, 0x73, 0x31, 0xEE, 0x17, 0xAF, 0x33, 0x80,
425     0xA7, 0x25, 0xB0, 0x78, 0x23, 0x17, 0xD7, 0xDD, 0x43, 0xF5, 0x9D, 0x7A,
426     0xF9, 0x56, 0x8A, 0x9B, 0xB6, 0x3A, 0x84, 0xD3, 0x65, 0xF9, 0x22, 0x44,
427     0xED, 0x12, 0x09, 0x88, 0x21, 0x93, 0x02, 0xF4, 0x29, 0x24, 0xC7, 0xCA,
428     0x90, 0xB8, 0x9D, 0x24, 0xF7, 0x1B, 0x0A, 0xB6, 0x97, 0x82, 0x3D, 0x7D,
429     0xEB, 0x1A, 0xFF, 0x5B, 0x0E, 0x8E, 0x4A, 0x45, 0xD4, 0x9F, 0x7F, 0x53,
430     0x75, 0x7E, 0x19, 0x13
431 };
432
433 static const unsigned char dhtest_2048_256_Z[] = {
434     0x86, 0xC7, 0x0B, 0xF8, 0xD0, 0xBB, 0x81, 0xBB, 0x01, 0x07, 0x8A, 0x17,
435     0x21, 0x9C, 0xB7, 0xD2, 0x72, 0x03, 0xDB, 0x2A, 0x19, 0xC8, 0x77, 0xF1,
436     0xD1, 0xF1, 0x9F, 0xD7, 0xD7, 0x7E, 0xF2, 0x25, 0x46, 0xA6, 0x8F, 0x00,
437     0x5A, 0xD5, 0x2D, 0xC8, 0x45, 0x53, 0xB7, 0x8F, 0xC6, 0x03, 0x30, 0xBE,
438     0x51, 0xEA, 0x7C, 0x06, 0x72, 0xCA, 0xC1, 0x51, 0x5E, 0x4B, 0x35, 0xC0,
439     0x47, 0xB9, 0xA5, 0x51, 0xB8, 0x8F, 0x39, 0xDC, 0x26, 0xDA, 0x14, 0xA0,
440     0x9E, 0xF7, 0x47, 0x74, 0xD4, 0x7C, 0x76, 0x2D, 0xD1, 0x77, 0xF9, 0xED,
441     0x5B, 0xC2, 0xF1, 0x1E, 0x52, 0xC8, 0x79, 0xBD, 0x95, 0x09, 0x85, 0x04,
442     0xCD, 0x9E, 0xEC, 0xD8, 0xA8, 0xF9, 0xB3, 0xEF, 0xBD, 0x1F, 0x00, 0x8A,
443     0xC5, 0x85, 0x30, 0x97, 0xD9, 0xD1, 0x83, 0x7F, 0x2B, 0x18, 0xF7, 0x7C,
444     0xD7, 0xBE, 0x01, 0xAF, 0x80, 0xA7, 0xC7, 0xB5, 0xEA, 0x3C, 0xA5, 0x4C,
445     0xC0, 0x2D, 0x0C, 0x11, 0x6F, 0xEE, 0x3F, 0x95, 0xBB, 0x87, 0x39, 0x93,
446     0x85, 0x87, 0x5D, 0x7E, 0x86, 0x74, 0x7E, 0x67, 0x6E, 0x72, 0x89, 0x38,
447     0xAC, 0xBF, 0xF7, 0x09, 0x8E, 0x05, 0xBE, 0x4D, 0xCF, 0xB2, 0x40, 0x52,
448     0xB8, 0x3A, 0xEF, 0xFB, 0x14, 0x78, 0x3F, 0x02, 0x9A, 0xDB, 0xDE, 0x7F,
449     0x53, 0xFA, 0xE9, 0x20, 0x84, 0x22, 0x40, 0x90, 0xE0, 0x07, 0xCE, 0xE9,
450     0x4D, 0x4B, 0xF2, 0xBA, 0xCE, 0x9F, 0xFD, 0x4B, 0x57, 0xD2, 0xAF, 0x7C,
451     0x72, 0x4D, 0x0C, 0xAA, 0x19, 0xBF, 0x05, 0x01, 0xF6, 0xF1, 0x7B, 0x4A,
452     0xA1, 0x0F, 0x42, 0x5E, 0x3E, 0xA7, 0x60, 0x80, 0xB4, 0xB9, 0xD6, 0xB3,
453     0xCE, 0xFE, 0xA1, 0x15, 0xB2, 0xCE, 0xB8, 0x78, 0x9B, 0xB8, 0xA3, 0xB0,
454     0xEA, 0x87, 0xFE, 0xBE, 0x63, 0xB6, 0xC8, 0xF8, 0x46, 0xEC, 0x6D, 0xB0,
455     0xC2, 0x6C, 0x5D, 0x7C
456 };
457
458 static const unsigned char dhtest_rfc5114_2048_224_bad_y[] = {
459     0x45, 0x32, 0x5F, 0x51, 0x07, 0xE5, 0xDF, 0x1C, 0xD6, 0x02, 0x82, 0xB3,
460     0x32, 0x8F, 0xA4, 0x0F, 0x87, 0xB8, 0x41, 0xFE, 0xB9, 0x35, 0xDE, 0xAD,
461     0xC6, 0x26, 0x85, 0xB4, 0xFF, 0x94, 0x8C, 0x12, 0x4C, 0xBF, 0x5B, 0x20,
462     0xC4, 0x46, 0xA3, 0x26, 0xEB, 0xA4, 0x25, 0xB7, 0x68, 0x8E, 0xCC, 0x67,
463     0xBA, 0xEA, 0x58, 0xD0, 0xF2, 0xE9, 0xD2, 0x24, 0x72, 0x60, 0xDA, 0x88,
464     0x18, 0x9C, 0xE0, 0x31, 0x6A, 0xAD, 0x50, 0x6D, 0x94, 0x35, 0x8B, 0x83,
465     0x4A, 0x6E, 0xFA, 0x48, 0x73, 0x0F, 0x83, 0x87, 0xFF, 0x6B, 0x66, 0x1F,
466     0xA8, 0x82, 0xC6, 0x01, 0xE5, 0x80, 0xB5, 0xB0, 0x52, 0xD0, 0xE9, 0xD8,
467     0x72, 0xF9, 0x7D, 0x5B, 0x8B, 0xA5, 0x4C, 0xA5, 0x25, 0x95, 0x74, 0xE2,
468     0x7A, 0x61, 0x4E, 0xA7, 0x8F, 0x12, 0xE2, 0xD2, 0x9D, 0x8C, 0x02, 0x70,
469     0x34, 0x44, 0x32, 0xC7, 0xB2, 0xF3, 0xB9, 0xFE, 0x17, 0x2B, 0xD6, 0x1F,
470     0x8B, 0x7E, 0x4A, 0xFA, 0xA3, 0xB5, 0x3E, 0x7A, 0x81, 0x9A, 0x33, 0x66,
471     0x62, 0xA4, 0x50, 0x18, 0x3E, 0xA2, 0x5F, 0x00, 0x07, 0xD8, 0x9B, 0x22,
472     0xE4, 0xEC, 0x84, 0xD5, 0xEB, 0x5A, 0xF3, 0x2A, 0x31, 0x23, 0xD8, 0x44,
473     0x22, 0x2A, 0x8B, 0x37, 0x44, 0xCC, 0xC6, 0x87, 0x4B, 0xBE, 0x50, 0x9D,
474     0x4A, 0xC4, 0x8E, 0x45, 0xCF, 0x72, 0x4D, 0xC0, 0x89, 0xB3, 0x72, 0xED,
475     0x33, 0x2C, 0xBC, 0x7F, 0x16, 0x39, 0x3B, 0xEB, 0xD2, 0xDD, 0xA8, 0x01,
476     0x73, 0x84, 0x62, 0xB9, 0x29, 0xD2, 0xC9, 0x51, 0x32, 0x9E, 0x7A, 0x6A,
477     0xCF, 0xC1, 0x0A, 0xDB, 0x0E, 0xE0, 0x62, 0x77, 0x6F, 0x59, 0x62, 0x72,
478     0x5A, 0x69, 0xA6, 0x5B, 0x70, 0xCA, 0x65, 0xC4, 0x95, 0x6F, 0x9A, 0xC2,
479     0xDF, 0x72, 0x6D, 0xB1, 0x1E, 0x54, 0x7B, 0x51, 0xB4, 0xEF, 0x7F, 0x89,
480     0x93, 0x74, 0x89, 0x59
481 };
482
483 typedef struct {
484     DH *(*get_param) (void);
485     const unsigned char *xA;
486     size_t xA_len;
487     const unsigned char *yA;
488     size_t yA_len;
489     const unsigned char *xB;
490     size_t xB_len;
491     const unsigned char *yB;
492     size_t yB_len;
493     const unsigned char *Z;
494     size_t Z_len;
495 } rfc5114_td;
496
497 # define make_rfc5114_td(pre) { \
498         DH_get_##pre, \
499         dhtest_##pre##_xA, sizeof(dhtest_##pre##_xA), \
500         dhtest_##pre##_yA, sizeof(dhtest_##pre##_yA), \
501         dhtest_##pre##_xB, sizeof(dhtest_##pre##_xB), \
502         dhtest_##pre##_yB, sizeof(dhtest_##pre##_yB), \
503         dhtest_##pre##_Z, sizeof(dhtest_##pre##_Z) \
504         }
505
506 static const rfc5114_td rfctd[] = {
507         make_rfc5114_td(1024_160),
508         make_rfc5114_td(2048_224),
509         make_rfc5114_td(2048_256)
510 };
511
512 static int rfc5114_test(void)
513 {
514     int i;
515     DH *dhA = NULL;
516     DH *dhB = NULL;
517     unsigned char *Z1 = NULL;
518     unsigned char *Z2 = NULL;
519     const rfc5114_td *td = NULL;
520     BIGNUM *bady = NULL, *priv_key = NULL, *pub_key = NULL;
521     const BIGNUM *pub_key_tmp;
522
523     for (i = 0; i < (int)OSSL_NELEM(rfctd); i++) {
524         td = rfctd + i;
525         /* Set up DH structures setting key components */
526         if (!TEST_ptr(dhA = td->get_param())
527                 || !TEST_ptr(dhB = td->get_param()))
528             goto bad_err;
529
530         if (!TEST_ptr(priv_key = BN_bin2bn(td->xA, td->xA_len, NULL))
531                 || !TEST_ptr(pub_key = BN_bin2bn(td->yA, td->yA_len, NULL))
532                 || !TEST_true(DH_set0_key(dhA, pub_key, priv_key)))
533             goto bad_err;
534
535         if (!TEST_ptr(priv_key = BN_bin2bn(td->xB, td->xB_len, NULL))
536                 || !TEST_ptr(pub_key = BN_bin2bn(td->yB, td->yB_len, NULL))
537                 || !TEST_true( DH_set0_key(dhB, pub_key, priv_key)))
538             goto bad_err;
539         priv_key = pub_key = NULL;
540
541         if (!TEST_uint_eq(td->Z_len, (size_t)DH_size(dhA))
542             || !TEST_uint_eq(td->Z_len, (size_t)DH_size(dhB)))
543             goto err;
544
545         if (!TEST_ptr(Z1 = OPENSSL_malloc(DH_size(dhA)))
546                 || !TEST_ptr(Z2 = OPENSSL_malloc(DH_size(dhB))))
547             goto bad_err;
548         /*
549          * Work out shared secrets using both sides and compare with expected
550          * values.
551          */
552         DH_get0_key(dhB, &pub_key_tmp, NULL);
553         if (!TEST_int_ne(DH_compute_key(Z1, pub_key_tmp, dhA), -1))
554             goto bad_err;
555
556         DH_get0_key(dhA, &pub_key_tmp, NULL);
557         if (!TEST_int_ne(DH_compute_key(Z2, pub_key_tmp, dhB), -1))
558             goto bad_err;
559
560         if (!TEST_mem_eq(Z1, td->Z_len, td->Z, td->Z_len)
561                 || !TEST_mem_eq(Z2, td->Z_len, td->Z, td->Z_len))
562             goto err;
563
564         DH_free(dhA);
565         dhA = NULL;
566         DH_free(dhB);
567         dhB = NULL;
568         OPENSSL_free(Z1);
569         Z1 = NULL;
570         OPENSSL_free(Z2);
571         Z2 = NULL;
572     }
573
574     /* Now i == OSSL_NELEM(rfctd) */
575     /* RFC5114 uses unsafe primes, so now test an invalid y value */
576     if (!TEST_ptr(dhA = DH_get_2048_224())
577             || !TEST_ptr(Z1 = OPENSSL_malloc(DH_size(dhA))))
578         goto bad_err;
579
580     if (!TEST_ptr(bady = BN_bin2bn(dhtest_rfc5114_2048_224_bad_y,
581                                    sizeof(dhtest_rfc5114_2048_224_bad_y),
582                                    NULL)))
583         goto bad_err;
584
585     if (!DH_generate_key(dhA))
586         goto bad_err;
587
588     if (DH_compute_key(Z1, bady, dhA) != -1) {
589         /*
590          * DH_compute_key should fail with -1. If we get here we unexpectedly
591          * allowed an invalid y value
592          */
593         goto err;
594     }
595     /* We'll have a stale error on the queue from the above test so clear it */
596     ERR_clear_error();
597     BN_free(bady);
598     DH_free(dhA);
599     OPENSSL_free(Z1);
600     return 1;
601
602  bad_err:
603     BN_free(bady);
604     DH_free(dhA);
605     DH_free(dhB);
606     BN_free(pub_key);
607     BN_free(priv_key);
608     OPENSSL_free(Z1);
609     OPENSSL_free(Z2);
610     TEST_error("Initialisation error RFC5114 set %d\n", i + 1);
611     return 0;
612
613  err:
614     BN_free(bady);
615     DH_free(dhA);
616     DH_free(dhB);
617     OPENSSL_free(Z1);
618     OPENSSL_free(Z2);
619     TEST_error("Test failed RFC5114 set %d\n", i + 1);
620     return 0;
621 }
622
623 static int rfc7919_test(void)
624 {
625     DH *a = NULL, *b = NULL;
626     const BIGNUM *apub_key = NULL, *bpub_key = NULL;
627     unsigned char *abuf = NULL;
628     unsigned char *bbuf = NULL;
629     int i, alen, blen, aout, bout;
630     int ret = 0;
631
632     if (!TEST_ptr(a = DH_new_by_nid(NID_ffdhe2048)))
633          goto err;
634
635     if (!DH_check(a, &i))
636         goto err;
637     if (!TEST_false(i & DH_CHECK_P_NOT_PRIME)
638             || !TEST_false(i & DH_CHECK_P_NOT_SAFE_PRIME)
639             || !TEST_false(i & DH_UNABLE_TO_CHECK_GENERATOR)
640             || !TEST_false(i & DH_NOT_SUITABLE_GENERATOR)
641             || !TEST_false(i))
642         goto err;
643
644     if (!DH_generate_key(a))
645         goto err;
646     DH_get0_key(a, &apub_key, NULL);
647
648     /* now create another copy of the DH group for the peer */
649     if (!TEST_ptr(b = DH_new_by_nid(NID_ffdhe2048)))
650         goto err;
651
652     if (!DH_generate_key(b))
653         goto err;
654     DH_get0_key(b, &bpub_key, NULL);
655
656     alen = DH_size(a);
657     if (!TEST_ptr(abuf = OPENSSL_malloc(alen))
658             || !TEST_true((aout = DH_compute_key(abuf, bpub_key, a)) != -1))
659         goto err;
660
661     blen = DH_size(b);
662     if (!TEST_ptr(bbuf = OPENSSL_malloc(blen))
663             || !TEST_true((bout = DH_compute_key(bbuf, apub_key, b)) != -1))
664         goto err;
665
666     if (!TEST_true(aout >= 20)
667             || !TEST_mem_eq(abuf, aout, bbuf, bout))
668         goto err;
669
670     ret = 1;
671
672  err:
673     OPENSSL_free(abuf);
674     OPENSSL_free(bbuf);
675     DH_free(a);
676     DH_free(b);
677     return ret;
678 }
679
680 static int prime_groups[] = {
681     NID_ffdhe2048,
682     NID_ffdhe3072,
683     NID_ffdhe4096,
684     NID_ffdhe6144,
685     NID_ffdhe8192,
686     NID_modp_2048,
687     NID_modp_3072,
688     NID_modp_4096,
689     NID_modp_6144,
690 };
691
692 static int dh_test_prime_groups(int index)
693 {
694     int ok = 0;
695     DH *dh = NULL;
696     const BIGNUM *p, *q, *g;
697
698     if (!TEST_ptr(dh = DH_new_by_nid(prime_groups[index])))
699         goto err;
700     DH_get0_pqg(dh, &p, &q, &g);
701     if (!TEST_ptr(p) || !TEST_ptr(q) || !TEST_ptr(g))
702         goto err;
703
704     if (!TEST_int_eq(DH_get_nid(dh), prime_groups[index]))
705         goto err;
706     ok = 1;
707 err:
708     DH_free(dh);
709     return ok;
710 }
711 #endif
712
713
714 int setup_tests(void)
715 {
716 #ifdef OPENSSL_NO_DH
717     TEST_note("No DH support");
718 #else
719     ADD_TEST(dh_test);
720     ADD_TEST(rfc5114_test);
721     ADD_TEST(rfc7919_test);
722     ADD_ALL_TESTS(dh_test_prime_groups, OSSL_NELEM(prime_groups));
723 #endif
724     return 1;
725 }