Home | History | Annotate | Line # | Download | only in test
      1      1.1  christos /*
      2      1.1  christos  * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
      3      1.1  christos  *
      4      1.1  christos  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5      1.1  christos  * this file except in compliance with the License.  You can obtain a copy
      6      1.1  christos  * in the file LICENSE in the source distribution or at
      7      1.1  christos  * https://www.openssl.org/source/license.html
      8      1.1  christos  */
      9      1.1  christos 
     10      1.1  christos /*
     11      1.1  christos  * DH low level APIs are deprecated for public use, but still ok for
     12      1.1  christos  * internal use.
     13      1.1  christos  */
     14      1.1  christos #include "internal/deprecated.h"
     15      1.1  christos 
     16      1.1  christos #include <stdio.h>
     17      1.1  christos #include <stdlib.h>
     18      1.1  christos #include <string.h>
     19      1.1  christos 
     20      1.1  christos #include "internal/nelem.h"
     21      1.1  christos #include <openssl/crypto.h>
     22      1.1  christos #include <openssl/bio.h>
     23      1.1  christos #include <openssl/bn.h>
     24      1.1  christos #include <openssl/rand.h>
     25      1.1  christos #include <openssl/err.h>
     26      1.1  christos #include <openssl/obj_mac.h>
     27      1.1  christos #include <openssl/core_names.h>
     28      1.1  christos #include "testutil.h"
     29      1.1  christos 
     30      1.1  christos #ifndef OPENSSL_NO_DH
     31  1.1.1.2  christos #include <openssl/dh.h>
     32  1.1.1.2  christos #include "crypto/bn_dh.h"
     33  1.1.1.2  christos #include "crypto/dh.h"
     34      1.1  christos 
     35      1.1  christos static int cb(int p, int n, BN_GENCB *arg);
     36      1.1  christos 
     37      1.1  christos static int dh_test(void)
     38      1.1  christos {
     39      1.1  christos     DH *dh = NULL;
     40      1.1  christos     BIGNUM *p = NULL, *q = NULL, *g = NULL;
     41      1.1  christos     const BIGNUM *p2, *q2, *g2;
     42      1.1  christos     BIGNUM *priv_key = NULL;
     43      1.1  christos     const BIGNUM *pub_key2, *priv_key2;
     44      1.1  christos     BN_GENCB *_cb = NULL;
     45      1.1  christos     DH *a = NULL;
     46      1.1  christos     DH *b = NULL;
     47      1.1  christos     DH *c = NULL;
     48      1.1  christos     const BIGNUM *ap = NULL, *ag = NULL, *apub_key = NULL;
     49      1.1  christos     const BIGNUM *bpub_key = NULL, *bpriv_key = NULL;
     50      1.1  christos     BIGNUM *bp = NULL, *bg = NULL, *cpriv_key = NULL;
     51      1.1  christos     unsigned char *abuf = NULL;
     52      1.1  christos     unsigned char *bbuf = NULL;
     53      1.1  christos     unsigned char *cbuf = NULL;
     54      1.1  christos     int i, alen, blen, clen, aout, bout, cout;
     55      1.1  christos     int ret = 0;
     56      1.1  christos 
     57      1.1  christos     if (!TEST_ptr(dh = DH_new())
     58      1.1  christos         || !TEST_ptr(p = BN_new())
     59      1.1  christos         || !TEST_ptr(q = BN_new())
     60      1.1  christos         || !TEST_ptr(g = BN_new())
     61      1.1  christos         || !TEST_ptr(priv_key = BN_new()))
     62      1.1  christos         goto err1;
     63      1.1  christos 
     64      1.1  christos     /*
     65      1.1  christos      * I) basic tests
     66      1.1  christos      */
     67      1.1  christos 
     68      1.1  christos     /* using a small predefined Sophie Germain DH group with generator 3 */
     69      1.1  christos     if (!TEST_true(BN_set_word(p, 4079L))
     70      1.1  christos         || !TEST_true(BN_set_word(q, 2039L))
     71      1.1  christos         || !TEST_true(BN_set_word(g, 3L))
     72      1.1  christos         || !TEST_true(DH_set0_pqg(dh, p, q, g)))
     73      1.1  christos         goto err1;
     74      1.1  christos 
     75      1.1  christos     /* check fails, because p is way too small */
     76      1.1  christos     if (!TEST_true(DH_check(dh, &i)))
     77      1.1  christos         goto err2;
     78      1.1  christos     i ^= DH_MODULUS_TOO_SMALL;
     79      1.1  christos     if (!TEST_false(i & DH_CHECK_P_NOT_PRIME)
     80  1.1.1.2  christos         || !TEST_false(i & DH_CHECK_P_NOT_SAFE_PRIME)
     81  1.1.1.2  christos         || !TEST_false(i & DH_UNABLE_TO_CHECK_GENERATOR)
     82  1.1.1.2  christos         || !TEST_false(i & DH_NOT_SUITABLE_GENERATOR)
     83  1.1.1.2  christos         || !TEST_false(i & DH_CHECK_Q_NOT_PRIME)
     84  1.1.1.2  christos         || !TEST_false(i & DH_CHECK_INVALID_Q_VALUE)
     85  1.1.1.2  christos         || !TEST_false(i & DH_CHECK_INVALID_J_VALUE)
     86  1.1.1.2  christos         || !TEST_false(i & DH_MODULUS_TOO_SMALL)
     87  1.1.1.2  christos         || !TEST_false(i & DH_MODULUS_TOO_LARGE)
     88  1.1.1.2  christos         || !TEST_false(i))
     89      1.1  christos         goto err2;
     90      1.1  christos 
     91      1.1  christos     /* test the combined getter for p, q, and g */
     92      1.1  christos     DH_get0_pqg(dh, &p2, &q2, &g2);
     93      1.1  christos     if (!TEST_ptr_eq(p2, p)
     94      1.1  christos         || !TEST_ptr_eq(q2, q)
     95      1.1  christos         || !TEST_ptr_eq(g2, g))
     96      1.1  christos         goto err2;
     97      1.1  christos 
     98      1.1  christos     /* test the simple getters for p, q, and g */
     99      1.1  christos     if (!TEST_ptr_eq(DH_get0_p(dh), p2)
    100      1.1  christos         || !TEST_ptr_eq(DH_get0_q(dh), q2)
    101      1.1  christos         || !TEST_ptr_eq(DH_get0_g(dh), g2))
    102      1.1  christos         goto err2;
    103      1.1  christos 
    104      1.1  christos     /* set the private key only*/
    105      1.1  christos     if (!TEST_true(BN_set_word(priv_key, 1234L))
    106      1.1  christos         || !TEST_true(DH_set0_key(dh, NULL, priv_key)))
    107      1.1  christos         goto err2;
    108      1.1  christos 
    109      1.1  christos     /* test the combined getter for pub_key and priv_key */
    110      1.1  christos     DH_get0_key(dh, &pub_key2, &priv_key2);
    111      1.1  christos     if (!TEST_ptr_eq(pub_key2, NULL)
    112      1.1  christos         || !TEST_ptr_eq(priv_key2, priv_key))
    113      1.1  christos         goto err3;
    114      1.1  christos 
    115      1.1  christos     /* test the simple getters for pub_key and priv_key */
    116      1.1  christos     if (!TEST_ptr_eq(DH_get0_pub_key(dh), pub_key2)
    117      1.1  christos         || !TEST_ptr_eq(DH_get0_priv_key(dh), priv_key2))
    118      1.1  christos         goto err3;
    119      1.1  christos 
    120      1.1  christos     /* now generate a key pair (expect failure since modulus is too small) */
    121      1.1  christos     if (!TEST_false(DH_generate_key(dh)))
    122      1.1  christos         goto err3;
    123      1.1  christos 
    124      1.1  christos     /* We'll have a stale error on the queue from the above test so clear it */
    125      1.1  christos     ERR_clear_error();
    126      1.1  christos 
    127      1.1  christos     if (!TEST_ptr(BN_copy(q, p)) || !TEST_true(BN_add(q, q, BN_value_one())))
    128      1.1  christos         goto err3;
    129      1.1  christos 
    130      1.1  christos     if (!TEST_true(DH_check(dh, &i)))
    131      1.1  christos         goto err3;
    132      1.1  christos     if (!TEST_true(i & DH_CHECK_INVALID_Q_VALUE)
    133      1.1  christos         || !TEST_false(i & DH_CHECK_Q_NOT_PRIME))
    134      1.1  christos         goto err3;
    135      1.1  christos 
    136      1.1  christos     /* Modulus of size: dh check max modulus bits + 1 */
    137      1.1  christos     if (!TEST_true(BN_set_word(p, 1))
    138  1.1.1.2  christos         || !TEST_true(BN_lshift(p, p, OPENSSL_DH_CHECK_MAX_MODULUS_BITS)))
    139      1.1  christos         goto err3;
    140      1.1  christos 
    141      1.1  christos     /*
    142      1.1  christos      * We expect no checks at all for an excessively large modulus
    143      1.1  christos      */
    144      1.1  christos     if (!TEST_false(DH_check(dh, &i)))
    145      1.1  christos         goto err3;
    146      1.1  christos 
    147      1.1  christos     /* We'll have a stale error on the queue from the above test so clear it */
    148      1.1  christos     ERR_clear_error();
    149      1.1  christos 
    150      1.1  christos     /*
    151      1.1  christos      * II) key generation
    152      1.1  christos      */
    153      1.1  christos 
    154      1.1  christos     /* generate a DH group ... */
    155      1.1  christos     if (!TEST_ptr(_cb = BN_GENCB_new()))
    156      1.1  christos         goto err3;
    157      1.1  christos     BN_GENCB_set(_cb, &cb, NULL);
    158      1.1  christos     if (!TEST_ptr(a = DH_new())
    159  1.1.1.2  christos         || !TEST_true(DH_generate_parameters_ex(a, 512,
    160  1.1.1.2  christos             DH_GENERATOR_5, _cb)))
    161      1.1  christos         goto err3;
    162      1.1  christos 
    163      1.1  christos     /* ... and check whether it is valid */
    164      1.1  christos     if (!TEST_true(DH_check(a, &i)))
    165      1.1  christos         goto err3;
    166      1.1  christos     if (!TEST_false(i & DH_CHECK_P_NOT_PRIME)
    167  1.1.1.2  christos         || !TEST_false(i & DH_CHECK_P_NOT_SAFE_PRIME)
    168  1.1.1.2  christos         || !TEST_false(i & DH_UNABLE_TO_CHECK_GENERATOR)
    169  1.1.1.2  christos         || !TEST_false(i & DH_NOT_SUITABLE_GENERATOR)
    170  1.1.1.2  christos         || !TEST_false(i & DH_CHECK_Q_NOT_PRIME)
    171  1.1.1.2  christos         || !TEST_false(i & DH_CHECK_INVALID_Q_VALUE)
    172  1.1.1.2  christos         || !TEST_false(i & DH_CHECK_INVALID_J_VALUE)
    173  1.1.1.2  christos         || !TEST_false(i & DH_MODULUS_TOO_SMALL)
    174  1.1.1.2  christos         || !TEST_false(i & DH_MODULUS_TOO_LARGE)
    175  1.1.1.2  christos         || !TEST_false(i))
    176      1.1  christos         goto err3;
    177      1.1  christos 
    178      1.1  christos     DH_get0_pqg(a, &ap, NULL, &ag);
    179      1.1  christos 
    180      1.1  christos     /* now create another copy of the DH group for the peer */
    181      1.1  christos     if (!TEST_ptr(b = DH_new()))
    182      1.1  christos         goto err3;
    183      1.1  christos 
    184      1.1  christos     if (!TEST_ptr(bp = BN_dup(ap))
    185  1.1.1.2  christos         || !TEST_ptr(bg = BN_dup(ag))
    186  1.1.1.2  christos         || !TEST_true(DH_set0_pqg(b, bp, NULL, bg)))
    187      1.1  christos         goto err3;
    188      1.1  christos     bp = bg = NULL;
    189      1.1  christos 
    190      1.1  christos     /*
    191      1.1  christos      * III) simulate a key exchange
    192      1.1  christos      */
    193      1.1  christos 
    194      1.1  christos     if (!DH_generate_key(a))
    195      1.1  christos         goto err3;
    196      1.1  christos     DH_get0_key(a, &apub_key, NULL);
    197      1.1  christos 
    198      1.1  christos     if (!DH_generate_key(b))
    199      1.1  christos         goto err3;
    200      1.1  christos     DH_get0_key(b, &bpub_key, &bpriv_key);
    201      1.1  christos 
    202      1.1  christos     /* Also test with a private-key-only copy of |b|. */
    203      1.1  christos     if (!TEST_ptr(c = DHparams_dup(b))
    204  1.1.1.2  christos         || !TEST_ptr(cpriv_key = BN_dup(bpriv_key))
    205  1.1.1.2  christos         || !TEST_true(DH_set0_key(c, NULL, cpriv_key)))
    206      1.1  christos         goto err3;
    207      1.1  christos     cpriv_key = NULL;
    208      1.1  christos 
    209      1.1  christos     alen = DH_size(a);
    210      1.1  christos     if (!TEST_ptr(abuf = OPENSSL_malloc(alen))
    211  1.1.1.2  christos         || !TEST_int_gt((aout = DH_compute_key(abuf, bpub_key, a)), 0))
    212      1.1  christos         goto err3;
    213      1.1  christos 
    214      1.1  christos     blen = DH_size(b);
    215      1.1  christos     if (!TEST_ptr(bbuf = OPENSSL_malloc(blen))
    216  1.1.1.2  christos         || !TEST_int_gt((bout = DH_compute_key(bbuf, apub_key, b)), 0))
    217      1.1  christos         goto err3;
    218      1.1  christos 
    219      1.1  christos     clen = DH_size(c);
    220      1.1  christos     if (!TEST_ptr(cbuf = OPENSSL_malloc(clen))
    221  1.1.1.2  christos         || !TEST_int_gt((cout = DH_compute_key(cbuf, apub_key, c)), 0))
    222      1.1  christos         goto err3;
    223      1.1  christos 
    224      1.1  christos     if (!TEST_true(aout >= 20)
    225  1.1.1.2  christos         || !TEST_mem_eq(abuf, aout, bbuf, bout)
    226  1.1.1.2  christos         || !TEST_mem_eq(abuf, aout, cbuf, cout))
    227      1.1  christos         goto err3;
    228      1.1  christos 
    229      1.1  christos     ret = 1;
    230      1.1  christos     goto success;
    231      1.1  christos 
    232  1.1.1.2  christos err1:
    233      1.1  christos     /* an error occurred before p,q,g were assigned to dh */
    234      1.1  christos     BN_free(p);
    235      1.1  christos     BN_free(q);
    236      1.1  christos     BN_free(g);
    237  1.1.1.2  christos err2:
    238      1.1  christos     /* an error occurred before priv_key was assigned to dh */
    239      1.1  christos     BN_free(priv_key);
    240  1.1.1.2  christos err3:
    241  1.1.1.2  christos success:
    242      1.1  christos     OPENSSL_free(abuf);
    243      1.1  christos     OPENSSL_free(bbuf);
    244      1.1  christos     OPENSSL_free(cbuf);
    245      1.1  christos     DH_free(b);
    246      1.1  christos     DH_free(a);
    247      1.1  christos     DH_free(c);
    248      1.1  christos     BN_free(bp);
    249      1.1  christos     BN_free(bg);
    250      1.1  christos     BN_free(cpriv_key);
    251      1.1  christos     BN_GENCB_free(_cb);
    252      1.1  christos     DH_free(dh);
    253      1.1  christos 
    254      1.1  christos     return ret;
    255      1.1  christos }
    256      1.1  christos 
    257      1.1  christos static int cb(int p, int n, BN_GENCB *arg)
    258      1.1  christos {
    259      1.1  christos     return 1;
    260      1.1  christos }
    261      1.1  christos 
    262      1.1  christos static int dh_computekey_range_test(void)
    263      1.1  christos {
    264      1.1  christos     int ret = 0, sz;
    265      1.1  christos     DH *dh = NULL;
    266      1.1  christos     BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
    267      1.1  christos     unsigned char *buf = NULL;
    268      1.1  christos 
    269      1.1  christos     if (!TEST_ptr(p = BN_dup(&ossl_bignum_ffdhe2048_p))
    270      1.1  christos         || !TEST_ptr(q = BN_dup(&ossl_bignum_ffdhe2048_q))
    271      1.1  christos         || !TEST_ptr(g = BN_dup(&ossl_bignum_const_2))
    272      1.1  christos         || !TEST_ptr(dh = DH_new())
    273      1.1  christos         || !TEST_true(DH_set0_pqg(dh, p, q, g)))
    274      1.1  christos         goto err;
    275      1.1  christos     p = q = g = NULL;
    276      1.1  christos 
    277      1.1  christos     if (!TEST_int_gt(sz = DH_size(dh), 0)
    278      1.1  christos         || !TEST_ptr(buf = OPENSSL_malloc(sz))
    279      1.1  christos         || !TEST_ptr(pub = BN_new())
    280      1.1  christos         || !TEST_ptr(priv = BN_new()))
    281      1.1  christos         goto err;
    282      1.1  christos 
    283      1.1  christos     if (!TEST_true(BN_set_word(priv, 1))
    284      1.1  christos         || !TEST_true(DH_set0_key(dh, NULL, priv)))
    285      1.1  christos         goto err;
    286      1.1  christos     priv = NULL;
    287      1.1  christos     if (!TEST_true(BN_set_word(pub, 1)))
    288      1.1  christos         goto err;
    289      1.1  christos 
    290      1.1  christos     /* Given z = pub ^ priv mod p */
    291      1.1  christos 
    292      1.1  christos     /* Test that z == 1 fails */
    293      1.1  christos     if (!TEST_int_le(ossl_dh_compute_key(buf, pub, dh), 0))
    294      1.1  christos         goto err;
    295      1.1  christos     /* Test that z == 0 fails */
    296      1.1  christos     if (!TEST_ptr(BN_copy(pub, DH_get0_p(dh)))
    297      1.1  christos         || !TEST_int_le(ossl_dh_compute_key(buf, pub, dh), 0))
    298      1.1  christos         goto err;
    299      1.1  christos     /* Test that z == p - 1 fails */
    300      1.1  christos     if (!TEST_true(BN_sub_word(pub, 1))
    301      1.1  christos         || !TEST_int_le(ossl_dh_compute_key(buf, pub, dh), 0))
    302      1.1  christos         goto err;
    303      1.1  christos     /* Test that z == p - 2 passes */
    304      1.1  christos     if (!TEST_true(BN_sub_word(pub, 1))
    305      1.1  christos         || !TEST_int_eq(ossl_dh_compute_key(buf, pub, dh), sz))
    306      1.1  christos         goto err;
    307      1.1  christos 
    308      1.1  christos     ret = 1;
    309      1.1  christos err:
    310      1.1  christos     OPENSSL_free(buf);
    311      1.1  christos     BN_free(priv);
    312      1.1  christos     BN_free(pub);
    313      1.1  christos     BN_free(g);
    314      1.1  christos     BN_free(q);
    315      1.1  christos     BN_free(p);
    316      1.1  christos     DH_free(dh);
    317      1.1  christos     return ret;
    318      1.1  christos }
    319      1.1  christos 
    320      1.1  christos /* Test data from RFC 5114 */
    321      1.1  christos 
    322      1.1  christos static const unsigned char dhtest_1024_160_xA[] = {
    323      1.1  christos     0xB9, 0xA3, 0xB3, 0xAE, 0x8F, 0xEF, 0xC1, 0xA2, 0x93, 0x04, 0x96, 0x50,
    324      1.1  christos     0x70, 0x86, 0xF8, 0x45, 0x5D, 0x48, 0x94, 0x3E
    325      1.1  christos };
    326      1.1  christos 
    327      1.1  christos static const unsigned char dhtest_1024_160_yA[] = {
    328      1.1  christos     0x2A, 0x85, 0x3B, 0x3D, 0x92, 0x19, 0x75, 0x01, 0xB9, 0x01, 0x5B, 0x2D,
    329      1.1  christos     0xEB, 0x3E, 0xD8, 0x4F, 0x5E, 0x02, 0x1D, 0xCC, 0x3E, 0x52, 0xF1, 0x09,
    330      1.1  christos     0xD3, 0x27, 0x3D, 0x2B, 0x75, 0x21, 0x28, 0x1C, 0xBA, 0xBE, 0x0E, 0x76,
    331      1.1  christos     0xFF, 0x57, 0x27, 0xFA, 0x8A, 0xCC, 0xE2, 0x69, 0x56, 0xBA, 0x9A, 0x1F,
    332      1.1  christos     0xCA, 0x26, 0xF2, 0x02, 0x28, 0xD8, 0x69, 0x3F, 0xEB, 0x10, 0x84, 0x1D,
    333      1.1  christos     0x84, 0xA7, 0x36, 0x00, 0x54, 0xEC, 0xE5, 0xA7, 0xF5, 0xB7, 0xA6, 0x1A,
    334      1.1  christos     0xD3, 0xDF, 0xB3, 0xC6, 0x0D, 0x2E, 0x43, 0x10, 0x6D, 0x87, 0x27, 0xDA,
    335      1.1  christos     0x37, 0xDF, 0x9C, 0xCE, 0x95, 0xB4, 0x78, 0x75, 0x5D, 0x06, 0xBC, 0xEA,
    336      1.1  christos     0x8F, 0x9D, 0x45, 0x96, 0x5F, 0x75, 0xA5, 0xF3, 0xD1, 0xDF, 0x37, 0x01,
    337      1.1  christos     0x16, 0x5F, 0xC9, 0xE5, 0x0C, 0x42, 0x79, 0xCE, 0xB0, 0x7F, 0x98, 0x95,
    338      1.1  christos     0x40, 0xAE, 0x96, 0xD5, 0xD8, 0x8E, 0xD7, 0x76
    339      1.1  christos };
    340      1.1  christos 
    341      1.1  christos static const unsigned char dhtest_1024_160_xB[] = {
    342      1.1  christos     0x93, 0x92, 0xC9, 0xF9, 0xEB, 0x6A, 0x7A, 0x6A, 0x90, 0x22, 0xF7, 0xD8,
    343      1.1  christos     0x3E, 0x72, 0x23, 0xC6, 0x83, 0x5B, 0xBD, 0xDA
    344      1.1  christos };
    345      1.1  christos 
    346      1.1  christos static const unsigned char dhtest_1024_160_yB[] = {
    347      1.1  christos     0x71, 0x7A, 0x6C, 0xB0, 0x53, 0x37, 0x1F, 0xF4, 0xA3, 0xB9, 0x32, 0x94,
    348      1.1  christos     0x1C, 0x1E, 0x56, 0x63, 0xF8, 0x61, 0xA1, 0xD6, 0xAD, 0x34, 0xAE, 0x66,
    349      1.1  christos     0x57, 0x6D, 0xFB, 0x98, 0xF6, 0xC6, 0xCB, 0xF9, 0xDD, 0xD5, 0xA5, 0x6C,
    350      1.1  christos     0x78, 0x33, 0xF6, 0xBC, 0xFD, 0xFF, 0x09, 0x55, 0x82, 0xAD, 0x86, 0x8E,
    351      1.1  christos     0x44, 0x0E, 0x8D, 0x09, 0xFD, 0x76, 0x9E, 0x3C, 0xEC, 0xCD, 0xC3, 0xD3,
    352      1.1  christos     0xB1, 0xE4, 0xCF, 0xA0, 0x57, 0x77, 0x6C, 0xAA, 0xF9, 0x73, 0x9B, 0x6A,
    353      1.1  christos     0x9F, 0xEE, 0x8E, 0x74, 0x11, 0xF8, 0xD6, 0xDA, 0xC0, 0x9D, 0x6A, 0x4E,
    354      1.1  christos     0xDB, 0x46, 0xCC, 0x2B, 0x5D, 0x52, 0x03, 0x09, 0x0E, 0xAE, 0x61, 0x26,
    355      1.1  christos     0x31, 0x1E, 0x53, 0xFD, 0x2C, 0x14, 0xB5, 0x74, 0xE6, 0xA3, 0x10, 0x9A,
    356      1.1  christos     0x3D, 0xA1, 0xBE, 0x41, 0xBD, 0xCE, 0xAA, 0x18, 0x6F, 0x5C, 0xE0, 0x67,
    357      1.1  christos     0x16, 0xA2, 0xB6, 0xA0, 0x7B, 0x3C, 0x33, 0xFE
    358      1.1  christos };
    359      1.1  christos 
    360      1.1  christos static const unsigned char dhtest_1024_160_Z[] = {
    361      1.1  christos     0x5C, 0x80, 0x4F, 0x45, 0x4D, 0x30, 0xD9, 0xC4, 0xDF, 0x85, 0x27, 0x1F,
    362      1.1  christos     0x93, 0x52, 0x8C, 0x91, 0xDF, 0x6B, 0x48, 0xAB, 0x5F, 0x80, 0xB3, 0xB5,
    363      1.1  christos     0x9C, 0xAA, 0xC1, 0xB2, 0x8F, 0x8A, 0xCB, 0xA9, 0xCD, 0x3E, 0x39, 0xF3,
    364      1.1  christos     0xCB, 0x61, 0x45, 0x25, 0xD9, 0x52, 0x1D, 0x2E, 0x64, 0x4C, 0x53, 0xB8,
    365      1.1  christos     0x07, 0xB8, 0x10, 0xF3, 0x40, 0x06, 0x2F, 0x25, 0x7D, 0x7D, 0x6F, 0xBF,
    366      1.1  christos     0xE8, 0xD5, 0xE8, 0xF0, 0x72, 0xE9, 0xB6, 0xE9, 0xAF, 0xDA, 0x94, 0x13,
    367      1.1  christos     0xEA, 0xFB, 0x2E, 0x8B, 0x06, 0x99, 0xB1, 0xFB, 0x5A, 0x0C, 0xAC, 0xED,
    368      1.1  christos     0xDE, 0xAE, 0xAD, 0x7E, 0x9C, 0xFB, 0xB3, 0x6A, 0xE2, 0xB4, 0x20, 0x83,
    369      1.1  christos     0x5B, 0xD8, 0x3A, 0x19, 0xFB, 0x0B, 0x5E, 0x96, 0xBF, 0x8F, 0xA4, 0xD0,
    370      1.1  christos     0x9E, 0x34, 0x55, 0x25, 0x16, 0x7E, 0xCD, 0x91, 0x55, 0x41, 0x6F, 0x46,
    371      1.1  christos     0xF4, 0x08, 0xED, 0x31, 0xB6, 0x3C, 0x6E, 0x6D
    372      1.1  christos };
    373      1.1  christos 
    374      1.1  christos static const unsigned char dhtest_2048_224_xA[] = {
    375      1.1  christos     0x22, 0xE6, 0x26, 0x01, 0xDB, 0xFF, 0xD0, 0x67, 0x08, 0xA6, 0x80, 0xF7,
    376      1.1  christos     0x47, 0xF3, 0x61, 0xF7, 0x6D, 0x8F, 0x4F, 0x72, 0x1A, 0x05, 0x48, 0xE4,
    377      1.1  christos     0x83, 0x29, 0x4B, 0x0C
    378      1.1  christos };
    379      1.1  christos 
    380      1.1  christos static const unsigned char dhtest_2048_224_yA[] = {
    381      1.1  christos     0x1B, 0x3A, 0x63, 0x45, 0x1B, 0xD8, 0x86, 0xE6, 0x99, 0xE6, 0x7B, 0x49,
    382      1.1  christos     0x4E, 0x28, 0x8B, 0xD7, 0xF8, 0xE0, 0xD3, 0x70, 0xBA, 0xDD, 0xA7, 0xA0,
    383      1.1  christos     0xEF, 0xD2, 0xFD, 0xE7, 0xD8, 0xF6, 0x61, 0x45, 0xCC, 0x9F, 0x28, 0x04,
    384      1.1  christos     0x19, 0x97, 0x5E, 0xB8, 0x08, 0x87, 0x7C, 0x8A, 0x4C, 0x0C, 0x8E, 0x0B,
    385      1.1  christos     0xD4, 0x8D, 0x4A, 0x54, 0x01, 0xEB, 0x1E, 0x87, 0x76, 0xBF, 0xEE, 0xE1,
    386      1.1  christos     0x34, 0xC0, 0x38, 0x31, 0xAC, 0x27, 0x3C, 0xD9, 0xD6, 0x35, 0xAB, 0x0C,
    387      1.1  christos     0xE0, 0x06, 0xA4, 0x2A, 0x88, 0x7E, 0x3F, 0x52, 0xFB, 0x87, 0x66, 0xB6,
    388      1.1  christos     0x50, 0xF3, 0x80, 0x78, 0xBC, 0x8E, 0xE8, 0x58, 0x0C, 0xEF, 0xE2, 0x43,
    389      1.1  christos     0x96, 0x8C, 0xFC, 0x4F, 0x8D, 0xC3, 0xDB, 0x08, 0x45, 0x54, 0x17, 0x1D,
    390      1.1  christos     0x41, 0xBF, 0x2E, 0x86, 0x1B, 0x7B, 0xB4, 0xD6, 0x9D, 0xD0, 0xE0, 0x1E,
    391      1.1  christos     0xA3, 0x87, 0xCB, 0xAA, 0x5C, 0xA6, 0x72, 0xAF, 0xCB, 0xE8, 0xBD, 0xB9,
    392      1.1  christos     0xD6, 0x2D, 0x4C, 0xE1, 0x5F, 0x17, 0xDD, 0x36, 0xF9, 0x1E, 0xD1, 0xEE,
    393      1.1  christos     0xDD, 0x65, 0xCA, 0x4A, 0x06, 0x45, 0x5C, 0xB9, 0x4C, 0xD4, 0x0A, 0x52,
    394      1.1  christos     0xEC, 0x36, 0x0E, 0x84, 0xB3, 0xC9, 0x26, 0xE2, 0x2C, 0x43, 0x80, 0xA3,
    395      1.1  christos     0xBF, 0x30, 0x9D, 0x56, 0x84, 0x97, 0x68, 0xB7, 0xF5, 0x2C, 0xFD, 0xF6,
    396      1.1  christos     0x55, 0xFD, 0x05, 0x3A, 0x7E, 0xF7, 0x06, 0x97, 0x9E, 0x7E, 0x58, 0x06,
    397      1.1  christos     0xB1, 0x7D, 0xFA, 0xE5, 0x3A, 0xD2, 0xA5, 0xBC, 0x56, 0x8E, 0xBB, 0x52,
    398      1.1  christos     0x9A, 0x7A, 0x61, 0xD6, 0x8D, 0x25, 0x6F, 0x8F, 0xC9, 0x7C, 0x07, 0x4A,
    399      1.1  christos     0x86, 0x1D, 0x82, 0x7E, 0x2E, 0xBC, 0x8C, 0x61, 0x34, 0x55, 0x31, 0x15,
    400      1.1  christos     0xB7, 0x0E, 0x71, 0x03, 0x92, 0x0A, 0xA1, 0x6D, 0x85, 0xE5, 0x2B, 0xCB,
    401      1.1  christos     0xAB, 0x8D, 0x78, 0x6A, 0x68, 0x17, 0x8F, 0xA8, 0xFF, 0x7C, 0x2F, 0x5C,
    402      1.1  christos     0x71, 0x64, 0x8D, 0x6F
    403      1.1  christos };
    404      1.1  christos 
    405      1.1  christos static const unsigned char dhtest_2048_224_xB[] = {
    406      1.1  christos     0x4F, 0xF3, 0xBC, 0x96, 0xC7, 0xFC, 0x6A, 0x6D, 0x71, 0xD3, 0xB3, 0x63,
    407      1.1  christos     0x80, 0x0A, 0x7C, 0xDF, 0xEF, 0x6F, 0xC4, 0x1B, 0x44, 0x17, 0xEA, 0x15,
    408      1.1  christos     0x35, 0x3B, 0x75, 0x90
    409      1.1  christos };
    410      1.1  christos 
    411      1.1  christos static const unsigned char dhtest_2048_224_yB[] = {
    412      1.1  christos     0x4D, 0xCE, 0xE9, 0x92, 0xA9, 0x76, 0x2A, 0x13, 0xF2, 0xF8, 0x38, 0x44,
    413      1.1  christos     0xAD, 0x3D, 0x77, 0xEE, 0x0E, 0x31, 0xC9, 0x71, 0x8B, 0x3D, 0xB6, 0xC2,
    414      1.1  christos     0x03, 0x5D, 0x39, 0x61, 0x18, 0x2C, 0x3E, 0x0B, 0xA2, 0x47, 0xEC, 0x41,
    415      1.1  christos     0x82, 0xD7, 0x60, 0xCD, 0x48, 0xD9, 0x95, 0x99, 0x97, 0x06, 0x22, 0xA1,
    416      1.1  christos     0x88, 0x1B, 0xBA, 0x2D, 0xC8, 0x22, 0x93, 0x9C, 0x78, 0xC3, 0x91, 0x2C,
    417      1.1  christos     0x66, 0x61, 0xFA, 0x54, 0x38, 0xB2, 0x07, 0x66, 0x22, 0x2B, 0x75, 0xE2,
    418      1.1  christos     0x4C, 0x2E, 0x3A, 0xD0, 0xC7, 0x28, 0x72, 0x36, 0x12, 0x95, 0x25, 0xEE,
    419      1.1  christos     0x15, 0xB5, 0xDD, 0x79, 0x98, 0xAA, 0x04, 0xC4, 0xA9, 0x69, 0x6C, 0xAC,
    420      1.1  christos     0xD7, 0x17, 0x20, 0x83, 0xA9, 0x7A, 0x81, 0x66, 0x4E, 0xAD, 0x2C, 0x47,
    421      1.1  christos     0x9E, 0x44, 0x4E, 0x4C, 0x06, 0x54, 0xCC, 0x19, 0xE2, 0x8D, 0x77, 0x03,
    422      1.1  christos     0xCE, 0xE8, 0xDA, 0xCD, 0x61, 0x26, 0xF5, 0xD6, 0x65, 0xEC, 0x52, 0xC6,
    423      1.1  christos     0x72, 0x55, 0xDB, 0x92, 0x01, 0x4B, 0x03, 0x7E, 0xB6, 0x21, 0xA2, 0xAC,
    424      1.1  christos     0x8E, 0x36, 0x5D, 0xE0, 0x71, 0xFF, 0xC1, 0x40, 0x0A, 0xCF, 0x07, 0x7A,
    425      1.1  christos     0x12, 0x91, 0x3D, 0xD8, 0xDE, 0x89, 0x47, 0x34, 0x37, 0xAB, 0x7B, 0xA3,
    426      1.1  christos     0x46, 0x74, 0x3C, 0x1B, 0x21, 0x5D, 0xD9, 0xC1, 0x21, 0x64, 0xA7, 0xE4,
    427      1.1  christos     0x05, 0x31, 0x18, 0xD1, 0x99, 0xBE, 0xC8, 0xEF, 0x6F, 0xC5, 0x61, 0x17,
    428      1.1  christos     0x0C, 0x84, 0xC8, 0x7D, 0x10, 0xEE, 0x9A, 0x67, 0x4A, 0x1F, 0xA8, 0xFF,
    429      1.1  christos     0xE1, 0x3B, 0xDF, 0xBA, 0x1D, 0x44, 0xDE, 0x48, 0x94, 0x6D, 0x68, 0xDC,
    430      1.1  christos     0x0C, 0xDD, 0x77, 0x76, 0x35, 0xA7, 0xAB, 0x5B, 0xFB, 0x1E, 0x4B, 0xB7,
    431      1.1  christos     0xB8, 0x56, 0xF9, 0x68, 0x27, 0x73, 0x4C, 0x18, 0x41, 0x38, 0xE9, 0x15,
    432      1.1  christos     0xD9, 0xC3, 0x00, 0x2E, 0xBC, 0xE5, 0x31, 0x20, 0x54, 0x6A, 0x7E, 0x20,
    433      1.1  christos     0x02, 0x14, 0x2B, 0x6C
    434      1.1  christos };
    435      1.1  christos 
    436      1.1  christos static const unsigned char dhtest_2048_224_Z[] = {
    437      1.1  christos     0x34, 0xD9, 0xBD, 0xDC, 0x1B, 0x42, 0x17, 0x6C, 0x31, 0x3F, 0xEA, 0x03,
    438      1.1  christos     0x4C, 0x21, 0x03, 0x4D, 0x07, 0x4A, 0x63, 0x13, 0xBB, 0x4E, 0xCD, 0xB3,
    439      1.1  christos     0x70, 0x3F, 0xFF, 0x42, 0x45, 0x67, 0xA4, 0x6B, 0xDF, 0x75, 0x53, 0x0E,
    440      1.1  christos     0xDE, 0x0A, 0x9D, 0xA5, 0x22, 0x9D, 0xE7, 0xD7, 0x67, 0x32, 0x28, 0x6C,
    441      1.1  christos     0xBC, 0x0F, 0x91, 0xDA, 0x4C, 0x3C, 0x85, 0x2F, 0xC0, 0x99, 0xC6, 0x79,
    442      1.1  christos     0x53, 0x1D, 0x94, 0xC7, 0x8A, 0xB0, 0x3D, 0x9D, 0xEC, 0xB0, 0xA4, 0xE4,
    443      1.1  christos     0xCA, 0x8B, 0x2B, 0xB4, 0x59, 0x1C, 0x40, 0x21, 0xCF, 0x8C, 0xE3, 0xA2,
    444      1.1  christos     0x0A, 0x54, 0x1D, 0x33, 0x99, 0x40, 0x17, 0xD0, 0x20, 0x0A, 0xE2, 0xC9,
    445      1.1  christos     0x51, 0x6E, 0x2F, 0xF5, 0x14, 0x57, 0x79, 0x26, 0x9E, 0x86, 0x2B, 0x0F,
    446      1.1  christos     0xB4, 0x74, 0xA2, 0xD5, 0x6D, 0xC3, 0x1E, 0xD5, 0x69, 0xA7, 0x70, 0x0B,
    447      1.1  christos     0x4C, 0x4A, 0xB1, 0x6B, 0x22, 0xA4, 0x55, 0x13, 0x53, 0x1E, 0xF5, 0x23,
    448      1.1  christos     0xD7, 0x12, 0x12, 0x07, 0x7B, 0x5A, 0x16, 0x9B, 0xDE, 0xFF, 0xAD, 0x7A,
    449      1.1  christos     0xD9, 0x60, 0x82, 0x84, 0xC7, 0x79, 0x5B, 0x6D, 0x5A, 0x51, 0x83, 0xB8,
    450      1.1  christos     0x70, 0x66, 0xDE, 0x17, 0xD8, 0xD6, 0x71, 0xC9, 0xEB, 0xD8, 0xEC, 0x89,
    451      1.1  christos     0x54, 0x4D, 0x45, 0xEC, 0x06, 0x15, 0x93, 0xD4, 0x42, 0xC6, 0x2A, 0xB9,
    452      1.1  christos     0xCE, 0x3B, 0x1C, 0xB9, 0x94, 0x3A, 0x1D, 0x23, 0xA5, 0xEA, 0x3B, 0xCF,
    453      1.1  christos     0x21, 0xA0, 0x14, 0x71, 0xE6, 0x7E, 0x00, 0x3E, 0x7F, 0x8A, 0x69, 0xC7,
    454      1.1  christos     0x28, 0xBE, 0x49, 0x0B, 0x2F, 0xC8, 0x8C, 0xFE, 0xB9, 0x2D, 0xB6, 0xA2,
    455      1.1  christos     0x15, 0xE5, 0xD0, 0x3C, 0x17, 0xC4, 0x64, 0xC9, 0xAC, 0x1A, 0x46, 0xE2,
    456      1.1  christos     0x03, 0xE1, 0x3F, 0x95, 0x29, 0x95, 0xFB, 0x03, 0xC6, 0x9D, 0x3C, 0xC4,
    457      1.1  christos     0x7F, 0xCB, 0x51, 0x0B, 0x69, 0x98, 0xFF, 0xD3, 0xAA, 0x6D, 0xE7, 0x3C,
    458      1.1  christos     0xF9, 0xF6, 0x38, 0x69
    459      1.1  christos };
    460      1.1  christos 
    461      1.1  christos static const unsigned char dhtest_2048_256_xA[] = {
    462      1.1  christos     0x08, 0x81, 0x38, 0x2C, 0xDB, 0x87, 0x66, 0x0C, 0x6D, 0xC1, 0x3E, 0x61,
    463      1.1  christos     0x49, 0x38, 0xD5, 0xB9, 0xC8, 0xB2, 0xF2, 0x48, 0x58, 0x1C, 0xC5, 0xE3,
    464      1.1  christos     0x1B, 0x35, 0x45, 0x43, 0x97, 0xFC, 0xE5, 0x0E
    465      1.1  christos };
    466      1.1  christos 
    467      1.1  christos static const unsigned char dhtest_2048_256_yA[] = {
    468      1.1  christos     0x2E, 0x93, 0x80, 0xC8, 0x32, 0x3A, 0xF9, 0x75, 0x45, 0xBC, 0x49, 0x41,
    469      1.1  christos     0xDE, 0xB0, 0xEC, 0x37, 0x42, 0xC6, 0x2F, 0xE0, 0xEC, 0xE8, 0x24, 0xA6,
    470      1.1  christos     0xAB, 0xDB, 0xE6, 0x6C, 0x59, 0xBE, 0xE0, 0x24, 0x29, 0x11, 0xBF, 0xB9,
    471      1.1  christos     0x67, 0x23, 0x5C, 0xEB, 0xA3, 0x5A, 0xE1, 0x3E, 0x4E, 0xC7, 0x52, 0xBE,
    472      1.1  christos     0x63, 0x0B, 0x92, 0xDC, 0x4B, 0xDE, 0x28, 0x47, 0xA9, 0xC6, 0x2C, 0xB8,
    473      1.1  christos     0x15, 0x27, 0x45, 0x42, 0x1F, 0xB7, 0xEB, 0x60, 0xA6, 0x3C, 0x0F, 0xE9,
    474      1.1  christos     0x15, 0x9F, 0xCC, 0xE7, 0x26, 0xCE, 0x7C, 0xD8, 0x52, 0x3D, 0x74, 0x50,
    475      1.1  christos     0x66, 0x7E, 0xF8, 0x40, 0xE4, 0x91, 0x91, 0x21, 0xEB, 0x5F, 0x01, 0xC8,
    476      1.1  christos     0xC9, 0xB0, 0xD3, 0xD6, 0x48, 0xA9, 0x3B, 0xFB, 0x75, 0x68, 0x9E, 0x82,
    477      1.1  christos     0x44, 0xAC, 0x13, 0x4A, 0xF5, 0x44, 0x71, 0x1C, 0xE7, 0x9A, 0x02, 0xDC,
    478      1.1  christos     0xC3, 0x42, 0x26, 0x68, 0x47, 0x80, 0xDD, 0xDC, 0xB4, 0x98, 0x59, 0x41,
    479      1.1  christos     0x06, 0xC3, 0x7F, 0x5B, 0xC7, 0x98, 0x56, 0x48, 0x7A, 0xF5, 0xAB, 0x02,
    480      1.1  christos     0x2A, 0x2E, 0x5E, 0x42, 0xF0, 0x98, 0x97, 0xC1, 0xA8, 0x5A, 0x11, 0xEA,
    481      1.1  christos     0x02, 0x12, 0xAF, 0x04, 0xD9, 0xB4, 0xCE, 0xBC, 0x93, 0x7C, 0x3C, 0x1A,
    482      1.1  christos     0x3E, 0x15, 0xA8, 0xA0, 0x34, 0x2E, 0x33, 0x76, 0x15, 0xC8, 0x4E, 0x7F,
    483      1.1  christos     0xE3, 0xB8, 0xB9, 0xB8, 0x7F, 0xB1, 0xE7, 0x3A, 0x15, 0xAF, 0x12, 0xA3,
    484      1.1  christos     0x0D, 0x74, 0x6E, 0x06, 0xDF, 0xC3, 0x4F, 0x29, 0x0D, 0x79, 0x7C, 0xE5,
    485      1.1  christos     0x1A, 0xA1, 0x3A, 0xA7, 0x85, 0xBF, 0x66, 0x58, 0xAF, 0xF5, 0xE4, 0xB0,
    486      1.1  christos     0x93, 0x00, 0x3C, 0xBE, 0xAF, 0x66, 0x5B, 0x3C, 0x2E, 0x11, 0x3A, 0x3A,
    487      1.1  christos     0x4E, 0x90, 0x52, 0x69, 0x34, 0x1D, 0xC0, 0x71, 0x14, 0x26, 0x68, 0x5F,
    488      1.1  christos     0x4E, 0xF3, 0x7E, 0x86, 0x8A, 0x81, 0x26, 0xFF, 0x3F, 0x22, 0x79, 0xB5,
    489      1.1  christos     0x7C, 0xA6, 0x7E, 0x29
    490      1.1  christos };
    491      1.1  christos 
    492      1.1  christos static const unsigned char dhtest_2048_256_xB[] = {
    493      1.1  christos     0x7D, 0x62, 0xA7, 0xE3, 0xEF, 0x36, 0xDE, 0x61, 0x7B, 0x13, 0xD1, 0xAF,
    494      1.1  christos     0xB8, 0x2C, 0x78, 0x0D, 0x83, 0xA2, 0x3B, 0xD4, 0xEE, 0x67, 0x05, 0x64,
    495      1.1  christos     0x51, 0x21, 0xF3, 0x71, 0xF5, 0x46, 0xA5, 0x3D
    496      1.1  christos };
    497      1.1  christos 
    498      1.1  christos static const unsigned char dhtest_2048_256_yB[] = {
    499      1.1  christos     0x57, 0x5F, 0x03, 0x51, 0xBD, 0x2B, 0x1B, 0x81, 0x74, 0x48, 0xBD, 0xF8,
    500      1.1  christos     0x7A, 0x6C, 0x36, 0x2C, 0x1E, 0x28, 0x9D, 0x39, 0x03, 0xA3, 0x0B, 0x98,
    501      1.1  christos     0x32, 0xC5, 0x74, 0x1F, 0xA2, 0x50, 0x36, 0x3E, 0x7A, 0xCB, 0xC7, 0xF7,
    502      1.1  christos     0x7F, 0x3D, 0xAC, 0xBC, 0x1F, 0x13, 0x1A, 0xDD, 0x8E, 0x03, 0x36, 0x7E,
    503      1.1  christos     0xFF, 0x8F, 0xBB, 0xB3, 0xE1, 0xC5, 0x78, 0x44, 0x24, 0x80, 0x9B, 0x25,
    504      1.1  christos     0xAF, 0xE4, 0xD2, 0x26, 0x2A, 0x1A, 0x6F, 0xD2, 0xFA, 0xB6, 0x41, 0x05,
    505      1.1  christos     0xCA, 0x30, 0xA6, 0x74, 0xE0, 0x7F, 0x78, 0x09, 0x85, 0x20, 0x88, 0x63,
    506      1.1  christos     0x2F, 0xC0, 0x49, 0x23, 0x37, 0x91, 0xAD, 0x4E, 0xDD, 0x08, 0x3A, 0x97,
    507      1.1  christos     0x8B, 0x88, 0x3E, 0xE6, 0x18, 0xBC, 0x5E, 0x0D, 0xD0, 0x47, 0x41, 0x5F,
    508      1.1  christos     0x2D, 0x95, 0xE6, 0x83, 0xCF, 0x14, 0x82, 0x6B, 0x5F, 0xBE, 0x10, 0xD3,
    509      1.1  christos     0xCE, 0x41, 0xC6, 0xC1, 0x20, 0xC7, 0x8A, 0xB2, 0x00, 0x08, 0xC6, 0x98,
    510      1.1  christos     0xBF, 0x7F, 0x0B, 0xCA, 0xB9, 0xD7, 0xF4, 0x07, 0xBE, 0xD0, 0xF4, 0x3A,
    511      1.1  christos     0xFB, 0x29, 0x70, 0xF5, 0x7F, 0x8D, 0x12, 0x04, 0x39, 0x63, 0xE6, 0x6D,
    512      1.1  christos     0xDD, 0x32, 0x0D, 0x59, 0x9A, 0xD9, 0x93, 0x6C, 0x8F, 0x44, 0x13, 0x7C,
    513      1.1  christos     0x08, 0xB1, 0x80, 0xEC, 0x5E, 0x98, 0x5C, 0xEB, 0xE1, 0x86, 0xF3, 0xD5,
    514      1.1  christos     0x49, 0x67, 0x7E, 0x80, 0x60, 0x73, 0x31, 0xEE, 0x17, 0xAF, 0x33, 0x80,
    515      1.1  christos     0xA7, 0x25, 0xB0, 0x78, 0x23, 0x17, 0xD7, 0xDD, 0x43, 0xF5, 0x9D, 0x7A,
    516      1.1  christos     0xF9, 0x56, 0x8A, 0x9B, 0xB6, 0x3A, 0x84, 0xD3, 0x65, 0xF9, 0x22, 0x44,
    517      1.1  christos     0xED, 0x12, 0x09, 0x88, 0x21, 0x93, 0x02, 0xF4, 0x29, 0x24, 0xC7, 0xCA,
    518      1.1  christos     0x90, 0xB8, 0x9D, 0x24, 0xF7, 0x1B, 0x0A, 0xB6, 0x97, 0x82, 0x3D, 0x7D,
    519      1.1  christos     0xEB, 0x1A, 0xFF, 0x5B, 0x0E, 0x8E, 0x4A, 0x45, 0xD4, 0x9F, 0x7F, 0x53,
    520      1.1  christos     0x75, 0x7E, 0x19, 0x13
    521      1.1  christos };
    522      1.1  christos 
    523      1.1  christos static const unsigned char dhtest_2048_256_Z[] = {
    524      1.1  christos     0x86, 0xC7, 0x0B, 0xF8, 0xD0, 0xBB, 0x81, 0xBB, 0x01, 0x07, 0x8A, 0x17,
    525      1.1  christos     0x21, 0x9C, 0xB7, 0xD2, 0x72, 0x03, 0xDB, 0x2A, 0x19, 0xC8, 0x77, 0xF1,
    526      1.1  christos     0xD1, 0xF1, 0x9F, 0xD7, 0xD7, 0x7E, 0xF2, 0x25, 0x46, 0xA6, 0x8F, 0x00,
    527      1.1  christos     0x5A, 0xD5, 0x2D, 0xC8, 0x45, 0x53, 0xB7, 0x8F, 0xC6, 0x03, 0x30, 0xBE,
    528      1.1  christos     0x51, 0xEA, 0x7C, 0x06, 0x72, 0xCA, 0xC1, 0x51, 0x5E, 0x4B, 0x35, 0xC0,
    529      1.1  christos     0x47, 0xB9, 0xA5, 0x51, 0xB8, 0x8F, 0x39, 0xDC, 0x26, 0xDA, 0x14, 0xA0,
    530      1.1  christos     0x9E, 0xF7, 0x47, 0x74, 0xD4, 0x7C, 0x76, 0x2D, 0xD1, 0x77, 0xF9, 0xED,
    531      1.1  christos     0x5B, 0xC2, 0xF1, 0x1E, 0x52, 0xC8, 0x79, 0xBD, 0x95, 0x09, 0x85, 0x04,
    532      1.1  christos     0xCD, 0x9E, 0xEC, 0xD8, 0xA8, 0xF9, 0xB3, 0xEF, 0xBD, 0x1F, 0x00, 0x8A,
    533      1.1  christos     0xC5, 0x85, 0x30, 0x97, 0xD9, 0xD1, 0x83, 0x7F, 0x2B, 0x18, 0xF7, 0x7C,
    534      1.1  christos     0xD7, 0xBE, 0x01, 0xAF, 0x80, 0xA7, 0xC7, 0xB5, 0xEA, 0x3C, 0xA5, 0x4C,
    535      1.1  christos     0xC0, 0x2D, 0x0C, 0x11, 0x6F, 0xEE, 0x3F, 0x95, 0xBB, 0x87, 0x39, 0x93,
    536      1.1  christos     0x85, 0x87, 0x5D, 0x7E, 0x86, 0x74, 0x7E, 0x67, 0x6E, 0x72, 0x89, 0x38,
    537      1.1  christos     0xAC, 0xBF, 0xF7, 0x09, 0x8E, 0x05, 0xBE, 0x4D, 0xCF, 0xB2, 0x40, 0x52,
    538      1.1  christos     0xB8, 0x3A, 0xEF, 0xFB, 0x14, 0x78, 0x3F, 0x02, 0x9A, 0xDB, 0xDE, 0x7F,
    539      1.1  christos     0x53, 0xFA, 0xE9, 0x20, 0x84, 0x22, 0x40, 0x90, 0xE0, 0x07, 0xCE, 0xE9,
    540      1.1  christos     0x4D, 0x4B, 0xF2, 0xBA, 0xCE, 0x9F, 0xFD, 0x4B, 0x57, 0xD2, 0xAF, 0x7C,
    541      1.1  christos     0x72, 0x4D, 0x0C, 0xAA, 0x19, 0xBF, 0x05, 0x01, 0xF6, 0xF1, 0x7B, 0x4A,
    542      1.1  christos     0xA1, 0x0F, 0x42, 0x5E, 0x3E, 0xA7, 0x60, 0x80, 0xB4, 0xB9, 0xD6, 0xB3,
    543      1.1  christos     0xCE, 0xFE, 0xA1, 0x15, 0xB2, 0xCE, 0xB8, 0x78, 0x9B, 0xB8, 0xA3, 0xB0,
    544      1.1  christos     0xEA, 0x87, 0xFE, 0xBE, 0x63, 0xB6, 0xC8, 0xF8, 0x46, 0xEC, 0x6D, 0xB0,
    545      1.1  christos     0xC2, 0x6C, 0x5D, 0x7C
    546      1.1  christos };
    547      1.1  christos 
    548      1.1  christos typedef struct {
    549  1.1.1.2  christos     DH *(*get_param)(void);
    550      1.1  christos     const unsigned char *xA;
    551      1.1  christos     size_t xA_len;
    552      1.1  christos     const unsigned char *yA;
    553      1.1  christos     size_t yA_len;
    554      1.1  christos     const unsigned char *xB;
    555      1.1  christos     size_t xB_len;
    556      1.1  christos     const unsigned char *yB;
    557      1.1  christos     size_t yB_len;
    558      1.1  christos     const unsigned char *Z;
    559      1.1  christos     size_t Z_len;
    560      1.1  christos } rfc5114_td;
    561      1.1  christos 
    562  1.1.1.2  christos #define make_rfc5114_td(pre) {                    \
    563  1.1.1.2  christos     DH_get_##pre,                                 \
    564  1.1.1.2  christos     dhtest_##pre##_xA, sizeof(dhtest_##pre##_xA), \
    565  1.1.1.2  christos     dhtest_##pre##_yA, sizeof(dhtest_##pre##_yA), \
    566  1.1.1.2  christos     dhtest_##pre##_xB, sizeof(dhtest_##pre##_xB), \
    567  1.1.1.2  christos     dhtest_##pre##_yB, sizeof(dhtest_##pre##_yB), \
    568  1.1.1.2  christos     dhtest_##pre##_Z, sizeof(dhtest_##pre##_Z)    \
    569  1.1.1.2  christos }
    570      1.1  christos 
    571      1.1  christos static const rfc5114_td rfctd[] = {
    572  1.1.1.2  christos     make_rfc5114_td(1024_160),
    573  1.1.1.2  christos     make_rfc5114_td(2048_224),
    574  1.1.1.2  christos     make_rfc5114_td(2048_256)
    575      1.1  christos };
    576      1.1  christos 
    577      1.1  christos static int rfc5114_test(void)
    578      1.1  christos {
    579      1.1  christos     int i;
    580      1.1  christos     DH *dhA = NULL;
    581      1.1  christos     DH *dhB = NULL;
    582      1.1  christos     unsigned char *Z1 = NULL;
    583      1.1  christos     unsigned char *Z2 = NULL;
    584      1.1  christos     int szA, szB;
    585      1.1  christos     const rfc5114_td *td = NULL;
    586      1.1  christos     BIGNUM *priv_key = NULL, *pub_key = NULL;
    587      1.1  christos     const BIGNUM *pub_key_tmp;
    588      1.1  christos 
    589      1.1  christos     for (i = 0; i < (int)OSSL_NELEM(rfctd); i++) {
    590      1.1  christos         td = rfctd + i;
    591      1.1  christos         /* Set up DH structures setting key components */
    592      1.1  christos         if (!TEST_ptr(dhA = td->get_param())
    593  1.1.1.2  christos             || !TEST_ptr(dhB = td->get_param()))
    594      1.1  christos             goto bad_err;
    595      1.1  christos 
    596      1.1  christos         if (!TEST_ptr(priv_key = BN_bin2bn(td->xA, td->xA_len, NULL))
    597  1.1.1.2  christos             || !TEST_ptr(pub_key = BN_bin2bn(td->yA, td->yA_len, NULL))
    598  1.1.1.2  christos             || !TEST_true(DH_set0_key(dhA, pub_key, priv_key)))
    599      1.1  christos             goto bad_err;
    600      1.1  christos 
    601      1.1  christos         if (!TEST_ptr(priv_key = BN_bin2bn(td->xB, td->xB_len, NULL))
    602  1.1.1.2  christos             || !TEST_ptr(pub_key = BN_bin2bn(td->yB, td->yB_len, NULL))
    603  1.1.1.2  christos             || !TEST_true(DH_set0_key(dhB, pub_key, priv_key)))
    604      1.1  christos             goto bad_err;
    605      1.1  christos         priv_key = pub_key = NULL;
    606      1.1  christos 
    607      1.1  christos         if (!TEST_int_gt(szA = DH_size(dhA), 0)
    608  1.1.1.2  christos             || !TEST_int_gt(szB = DH_size(dhB), 0)
    609  1.1.1.2  christos             || !TEST_size_t_eq(td->Z_len, (size_t)szA)
    610  1.1.1.2  christos             || !TEST_size_t_eq(td->Z_len, (size_t)szB))
    611      1.1  christos             goto err;
    612      1.1  christos 
    613      1.1  christos         if (!TEST_ptr(Z1 = OPENSSL_malloc((size_t)szA))
    614  1.1.1.2  christos             || !TEST_ptr(Z2 = OPENSSL_malloc((size_t)szB)))
    615      1.1  christos             goto bad_err;
    616      1.1  christos         /*
    617      1.1  christos          * Work out shared secrets using both sides and compare with expected
    618      1.1  christos          * values.
    619      1.1  christos          */
    620      1.1  christos         DH_get0_key(dhB, &pub_key_tmp, NULL);
    621      1.1  christos         if (!TEST_int_ne(DH_compute_key(Z1, pub_key_tmp, dhA), -1))
    622      1.1  christos             goto bad_err;
    623      1.1  christos 
    624      1.1  christos         DH_get0_key(dhA, &pub_key_tmp, NULL);
    625      1.1  christos         if (!TEST_int_ne(DH_compute_key(Z2, pub_key_tmp, dhB), -1))
    626      1.1  christos             goto bad_err;
    627      1.1  christos 
    628      1.1  christos         if (!TEST_mem_eq(Z1, td->Z_len, td->Z, td->Z_len)
    629  1.1.1.2  christos             || !TEST_mem_eq(Z2, td->Z_len, td->Z, td->Z_len))
    630      1.1  christos             goto err;
    631      1.1  christos 
    632      1.1  christos         DH_free(dhA);
    633      1.1  christos         dhA = NULL;
    634      1.1  christos         DH_free(dhB);
    635      1.1  christos         dhB = NULL;
    636      1.1  christos         OPENSSL_free(Z1);
    637      1.1  christos         Z1 = NULL;
    638      1.1  christos         OPENSSL_free(Z2);
    639      1.1  christos         Z2 = NULL;
    640      1.1  christos     }
    641      1.1  christos     return 1;
    642      1.1  christos 
    643  1.1.1.2  christos bad_err:
    644      1.1  christos     DH_free(dhA);
    645      1.1  christos     DH_free(dhB);
    646      1.1  christos     BN_free(pub_key);
    647      1.1  christos     BN_free(priv_key);
    648      1.1  christos     OPENSSL_free(Z1);
    649      1.1  christos     OPENSSL_free(Z2);
    650      1.1  christos     TEST_error("Initialisation error RFC5114 set %d\n", i + 1);
    651      1.1  christos     return 0;
    652      1.1  christos 
    653  1.1.1.2  christos err:
    654      1.1  christos     DH_free(dhA);
    655      1.1  christos     DH_free(dhB);
    656      1.1  christos     OPENSSL_free(Z1);
    657      1.1  christos     OPENSSL_free(Z2);
    658      1.1  christos     TEST_error("Test failed RFC5114 set %d\n", i + 1);
    659      1.1  christos     return 0;
    660      1.1  christos }
    661      1.1  christos 
    662      1.1  christos static int rfc7919_test(void)
    663      1.1  christos {
    664      1.1  christos     DH *a = NULL, *b = NULL;
    665      1.1  christos     const BIGNUM *apub_key = NULL, *bpub_key = NULL;
    666      1.1  christos     unsigned char *abuf = NULL;
    667      1.1  christos     unsigned char *bbuf = NULL;
    668      1.1  christos     int i, alen, blen, aout, bout;
    669      1.1  christos     int ret = 0;
    670      1.1  christos 
    671      1.1  christos     if (!TEST_ptr(a = DH_new_by_nid(NID_ffdhe2048)))
    672  1.1.1.2  christos         goto err;
    673      1.1  christos 
    674      1.1  christos     if (!DH_check(a, &i))
    675      1.1  christos         goto err;
    676      1.1  christos     if (!TEST_false(i & DH_CHECK_P_NOT_PRIME)
    677  1.1.1.2  christos         || !TEST_false(i & DH_CHECK_P_NOT_SAFE_PRIME)
    678  1.1.1.2  christos         || !TEST_false(i & DH_UNABLE_TO_CHECK_GENERATOR)
    679  1.1.1.2  christos         || !TEST_false(i & DH_NOT_SUITABLE_GENERATOR)
    680  1.1.1.2  christos         || !TEST_false(i))
    681      1.1  christos         goto err;
    682      1.1  christos 
    683      1.1  christos     if (!DH_generate_key(a))
    684      1.1  christos         goto err;
    685      1.1  christos     DH_get0_key(a, &apub_key, NULL);
    686      1.1  christos 
    687      1.1  christos     /* now create another copy of the DH group for the peer */
    688      1.1  christos     if (!TEST_ptr(b = DH_new_by_nid(NID_ffdhe2048)))
    689      1.1  christos         goto err;
    690      1.1  christos 
    691      1.1  christos     if (!DH_generate_key(b))
    692      1.1  christos         goto err;
    693      1.1  christos     DH_get0_key(b, &bpub_key, NULL);
    694      1.1  christos 
    695      1.1  christos     alen = DH_size(a);
    696      1.1  christos     if (!TEST_int_gt(alen, 0) || !TEST_ptr(abuf = OPENSSL_malloc(alen))
    697  1.1.1.2  christos         || !TEST_int_gt((aout = DH_compute_key(abuf, bpub_key, a)), 0))
    698      1.1  christos         goto err;
    699      1.1  christos 
    700      1.1  christos     blen = DH_size(b);
    701      1.1  christos     if (!TEST_int_gt(blen, 0) || !TEST_ptr(bbuf = OPENSSL_malloc(blen))
    702  1.1.1.2  christos         || !TEST_int_gt((bout = DH_compute_key(bbuf, apub_key, b)), 0))
    703      1.1  christos         goto err;
    704      1.1  christos 
    705      1.1  christos     if (!TEST_true(aout >= 20)
    706  1.1.1.2  christos         || !TEST_mem_eq(abuf, aout, bbuf, bout))
    707      1.1  christos         goto err;
    708      1.1  christos 
    709      1.1  christos     ret = 1;
    710      1.1  christos 
    711  1.1.1.2  christos err:
    712      1.1  christos     OPENSSL_free(abuf);
    713      1.1  christos     OPENSSL_free(bbuf);
    714      1.1  christos     DH_free(a);
    715      1.1  christos     DH_free(b);
    716      1.1  christos     return ret;
    717      1.1  christos }
    718      1.1  christos 
    719      1.1  christos static int prime_groups[] = {
    720      1.1  christos     NID_ffdhe2048,
    721      1.1  christos     NID_ffdhe3072,
    722      1.1  christos     NID_ffdhe4096,
    723      1.1  christos     NID_ffdhe6144,
    724      1.1  christos     NID_ffdhe8192,
    725      1.1  christos     NID_modp_2048,
    726      1.1  christos     NID_modp_3072,
    727      1.1  christos     NID_modp_4096,
    728      1.1  christos     NID_modp_6144,
    729      1.1  christos };
    730      1.1  christos 
    731      1.1  christos static int dh_test_prime_groups(int index)
    732      1.1  christos {
    733      1.1  christos     int ok = 0;
    734      1.1  christos     DH *dh = NULL;
    735      1.1  christos     const BIGNUM *p, *q, *g;
    736      1.1  christos 
    737      1.1  christos     if (!TEST_ptr(dh = DH_new_by_nid(prime_groups[index])))
    738      1.1  christos         goto err;
    739      1.1  christos     DH_get0_pqg(dh, &p, &q, &g);
    740      1.1  christos     if (!TEST_ptr(p) || !TEST_ptr(q) || !TEST_ptr(g))
    741      1.1  christos         goto err;
    742      1.1  christos 
    743      1.1  christos     if (!TEST_int_eq(DH_get_nid(dh), prime_groups[index]))
    744      1.1  christos         goto err;
    745      1.1  christos 
    746      1.1  christos     /* Since q is set there is no need for the private length to be set */
    747      1.1  christos     if (!TEST_int_eq((int)DH_get_length(dh), 0))
    748      1.1  christos         goto err;
    749      1.1  christos 
    750      1.1  christos     ok = 1;
    751      1.1  christos err:
    752      1.1  christos     DH_free(dh);
    753      1.1  christos     return ok;
    754      1.1  christos }
    755      1.1  christos 
    756      1.1  christos static int dh_rfc5114_fix_nid_test(void)
    757      1.1  christos {
    758      1.1  christos     int ok = 0;
    759      1.1  christos     EVP_PKEY_CTX *paramgen_ctx;
    760      1.1  christos 
    761      1.1  christos     /* Run the test. Success is any time the test does not cause a SIGSEGV interrupt */
    762      1.1  christos     paramgen_ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DHX, 0);
    763      1.1  christos     if (!TEST_ptr(paramgen_ctx))
    764      1.1  christos         goto err;
    765      1.1  christos     if (!TEST_int_eq(EVP_PKEY_paramgen_init(paramgen_ctx), 1))
    766      1.1  christos         goto err;
    767      1.1  christos     /* Tested function is called here */
    768      1.1  christos     if (!TEST_int_eq(EVP_PKEY_CTX_set_dhx_rfc5114(paramgen_ctx, 3), 1))
    769      1.1  christos         goto err;
    770      1.1  christos     /* Negative test */
    771      1.1  christos     if (!TEST_int_eq(EVP_PKEY_CTX_set_dhx_rfc5114(paramgen_ctx, 99), 0))
    772      1.1  christos         goto err;
    773      1.1  christos     /* If we're still running then the test passed. */
    774      1.1  christos     ok = 1;
    775      1.1  christos err:
    776      1.1  christos     EVP_PKEY_CTX_free(paramgen_ctx);
    777      1.1  christos     return ok;
    778      1.1  christos }
    779      1.1  christos 
    780      1.1  christos static int dh_set_dh_nid_test(void)
    781      1.1  christos {
    782      1.1  christos     int ok = 0;
    783      1.1  christos     EVP_PKEY_CTX *paramgen_ctx;
    784      1.1  christos 
    785      1.1  christos     /* Run the test. Success is any time the test does not cause a SIGSEGV interrupt */
    786      1.1  christos     paramgen_ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DH, 0);
    787      1.1  christos     if (!TEST_ptr(paramgen_ctx))
    788      1.1  christos         goto err;
    789      1.1  christos     if (!TEST_int_eq(EVP_PKEY_paramgen_init(paramgen_ctx), 1))
    790      1.1  christos         goto err;
    791      1.1  christos     /* Tested function is called here */
    792      1.1  christos     if (!TEST_int_eq(EVP_PKEY_CTX_set_dh_nid(paramgen_ctx, NID_ffdhe2048), 1))
    793      1.1  christos         goto err;
    794      1.1  christos     /* Negative test */
    795      1.1  christos     if (!TEST_int_eq(EVP_PKEY_CTX_set_dh_nid(paramgen_ctx, NID_secp521r1), 0))
    796      1.1  christos         goto err;
    797      1.1  christos     /* If we're still running then the test passed. */
    798      1.1  christos     ok = 1;
    799      1.1  christos err:
    800      1.1  christos     EVP_PKEY_CTX_free(paramgen_ctx);
    801      1.1  christos     return ok;
    802      1.1  christos }
    803      1.1  christos 
    804      1.1  christos static int dh_get_nid(void)
    805      1.1  christos {
    806      1.1  christos     int ok = 0;
    807      1.1  christos     const BIGNUM *p, *q, *g;
    808      1.1  christos     BIGNUM *pcpy = NULL, *gcpy = NULL, *qcpy = NULL;
    809      1.1  christos     DH *dh1 = DH_new_by_nid(NID_ffdhe2048);
    810      1.1  christos     DH *dh2 = DH_new();
    811      1.1  christos 
    812      1.1  christos     if (!TEST_ptr(dh1)
    813      1.1  christos         || !TEST_ptr(dh2))
    814      1.1  christos         goto err;
    815      1.1  christos 
    816      1.1  christos     /* Set new DH parameters manually using a existing named group's p & g */
    817      1.1  christos     DH_get0_pqg(dh1, &p, &q, &g);
    818      1.1  christos     if (!TEST_ptr(p)
    819      1.1  christos         || !TEST_ptr(q)
    820      1.1  christos         || !TEST_ptr(g)
    821      1.1  christos         || !TEST_ptr(pcpy = BN_dup(p))
    822      1.1  christos         || !TEST_ptr(gcpy = BN_dup(g)))
    823      1.1  christos         goto err;
    824      1.1  christos 
    825      1.1  christos     if (!TEST_true(DH_set0_pqg(dh2, pcpy, NULL, gcpy)))
    826      1.1  christos         goto err;
    827      1.1  christos     pcpy = gcpy = NULL;
    828      1.1  christos     /* Test q is set if p and g are provided */
    829      1.1  christos     if (!TEST_ptr(DH_get0_q(dh2)))
    830      1.1  christos         goto err;
    831      1.1  christos 
    832      1.1  christos     /* Test that setting p & g manually returns that it is a named group */
    833      1.1  christos     if (!TEST_int_eq(DH_get_nid(dh2), NID_ffdhe2048))
    834      1.1  christos         goto err;
    835      1.1  christos 
    836      1.1  christos     /* Test that after changing g it is no longer a named group */
    837      1.1  christos     if (!TEST_ptr(gcpy = BN_dup(BN_value_one())))
    838  1.1.1.2  christos         goto err;
    839      1.1  christos     if (!TEST_true(DH_set0_pqg(dh2, NULL, NULL, gcpy)))
    840  1.1.1.2  christos         goto err;
    841      1.1  christos     gcpy = NULL;
    842      1.1  christos     if (!TEST_int_eq(DH_get_nid(dh2), NID_undef))
    843      1.1  christos         goto err;
    844      1.1  christos 
    845      1.1  christos     /* Test that setting an incorrect q results in this not being a named group */
    846      1.1  christos     if (!TEST_ptr(pcpy = BN_dup(p))
    847      1.1  christos         || !TEST_ptr(qcpy = BN_dup(q))
    848      1.1  christos         || !TEST_ptr(gcpy = BN_dup(g))
    849      1.1  christos         || !TEST_int_eq(BN_add_word(qcpy, 2), 1)
    850      1.1  christos         || !TEST_true(DH_set0_pqg(dh2, pcpy, qcpy, gcpy)))
    851      1.1  christos         goto err;
    852      1.1  christos     pcpy = qcpy = gcpy = NULL;
    853      1.1  christos     if (!TEST_int_eq(DH_get_nid(dh2), NID_undef))
    854      1.1  christos         goto err;
    855      1.1  christos 
    856      1.1  christos     ok = 1;
    857      1.1  christos err:
    858      1.1  christos     BN_free(pcpy);
    859      1.1  christos     BN_free(qcpy);
    860      1.1  christos     BN_free(gcpy);
    861      1.1  christos     DH_free(dh2);
    862      1.1  christos     DH_free(dh1);
    863      1.1  christos     return ok;
    864      1.1  christos }
    865      1.1  christos 
    866      1.1  christos static const unsigned char dh_pub_der[] = {
    867      1.1  christos     0x30, 0x82, 0x02, 0x28, 0x30, 0x82, 0x01, 0x1b, 0x06, 0x09, 0x2a, 0x86,
    868      1.1  christos     0x48, 0x86, 0xf7, 0x0d, 0x01, 0x03, 0x01, 0x30, 0x82, 0x01, 0x0c, 0x02,
    869      1.1  christos     0x82, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    870      1.1  christos     0xc9, 0x0f, 0xda, 0xa2, 0x21, 0x68, 0xc2, 0x34, 0xc4, 0xc6, 0x62, 0x8b,
    871      1.1  christos     0x80, 0xdc, 0x1c, 0xd1, 0x29, 0x02, 0x4e, 0x08, 0x8a, 0x67, 0xcc, 0x74,
    872      1.1  christos     0x02, 0x0b, 0xbe, 0xa6, 0x3b, 0x13, 0x9b, 0x22, 0x51, 0x4a, 0x08, 0x79,
    873      1.1  christos     0x8e, 0x34, 0x04, 0xdd, 0xef, 0x95, 0x19, 0xb3, 0xcd, 0x3a, 0x43, 0x1b,
    874      1.1  christos     0x30, 0x2b, 0x0a, 0x6d, 0xf2, 0x5f, 0x14, 0x37, 0x4f, 0xe1, 0x35, 0x6d,
    875      1.1  christos     0x6d, 0x51, 0xc2, 0x45, 0xe4, 0x85, 0xb5, 0x76, 0x62, 0x5e, 0x7e, 0xc6,
    876      1.1  christos     0xf4, 0x4c, 0x42, 0xe9, 0xa6, 0x37, 0xed, 0x6b, 0x0b, 0xff, 0x5c, 0xb6,
    877      1.1  christos     0xf4, 0x06, 0xb7, 0xed, 0xee, 0x38, 0x6b, 0xfb, 0x5a, 0x89, 0x9f, 0xa5,
    878      1.1  christos     0xae, 0x9f, 0x24, 0x11, 0x7c, 0x4b, 0x1f, 0xe6, 0x49, 0x28, 0x66, 0x51,
    879      1.1  christos     0xec, 0xe4, 0x5b, 0x3d, 0xc2, 0x00, 0x7c, 0xb8, 0xa1, 0x63, 0xbf, 0x05,
    880      1.1  christos     0x98, 0xda, 0x48, 0x36, 0x1c, 0x55, 0xd3, 0x9a, 0x69, 0x16, 0x3f, 0xa8,
    881      1.1  christos     0xfd, 0x24, 0xcf, 0x5f, 0x83, 0x65, 0x5d, 0x23, 0xdc, 0xa3, 0xad, 0x96,
    882      1.1  christos     0x1c, 0x62, 0xf3, 0x56, 0x20, 0x85, 0x52, 0xbb, 0x9e, 0xd5, 0x29, 0x07,
    883      1.1  christos     0x70, 0x96, 0x96, 0x6d, 0x67, 0x0c, 0x35, 0x4e, 0x4a, 0xbc, 0x98, 0x04,
    884      1.1  christos     0xf1, 0x74, 0x6c, 0x08, 0xca, 0x18, 0x21, 0x7c, 0x32, 0x90, 0x5e, 0x46,
    885      1.1  christos     0x2e, 0x36, 0xce, 0x3b, 0xe3, 0x9e, 0x77, 0x2c, 0x18, 0x0e, 0x86, 0x03,
    886      1.1  christos     0x9b, 0x27, 0x83, 0xa2, 0xec, 0x07, 0xa2, 0x8f, 0xb5, 0xc5, 0x5d, 0xf0,
    887      1.1  christos     0x6f, 0x4c, 0x52, 0xc9, 0xde, 0x2b, 0xcb, 0xf6, 0x95, 0x58, 0x17, 0x18,
    888      1.1  christos     0x39, 0x95, 0x49, 0x7c, 0xea, 0x95, 0x6a, 0xe5, 0x15, 0xd2, 0x26, 0x18,
    889      1.1  christos     0x98, 0xfa, 0x05, 0x10, 0x15, 0x72, 0x8e, 0x5a, 0x8a, 0xac, 0xaa, 0x68,
    890      1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x01, 0x02, 0x02,
    891      1.1  christos     0x02, 0x04, 0x00, 0x03, 0x82, 0x01, 0x05, 0x00, 0x02, 0x82, 0x01, 0x00,
    892      1.1  christos     0x08, 0x87, 0x8a, 0x5f, 0x4f, 0x3b, 0xef, 0xe1, 0x77, 0x13, 0x3b, 0xd7,
    893      1.1  christos     0x58, 0x76, 0xc9, 0xeb, 0x7e, 0x2d, 0xcc, 0x7e, 0xed, 0xc5, 0xee, 0xf9,
    894      1.1  christos     0x2d, 0x55, 0xb0, 0xe2, 0x37, 0x8c, 0x51, 0x87, 0x6a, 0x8e, 0x0d, 0xb2,
    895      1.1  christos     0x08, 0xed, 0x4f, 0x88, 0x9b, 0x63, 0x19, 0x7a, 0x67, 0xa1, 0x61, 0xd8,
    896      1.1  christos     0x17, 0xa0, 0x2c, 0xdb, 0xc2, 0xfa, 0xb3, 0x4f, 0xe7, 0xcb, 0x16, 0xf2,
    897      1.1  christos     0xe7, 0xd0, 0x2c, 0xf8, 0xcc, 0x97, 0xd3, 0xe7, 0xae, 0xc2, 0x71, 0xd8,
    898      1.1  christos     0x2b, 0x12, 0x83, 0xe9, 0x5a, 0x45, 0xfe, 0x66, 0x5c, 0xa2, 0xb6, 0xce,
    899      1.1  christos     0x2f, 0x04, 0x05, 0xe7, 0xa7, 0xbc, 0xe5, 0x63, 0x1a, 0x93, 0x3d, 0x4d,
    900      1.1  christos     0xf4, 0x77, 0xdd, 0x2a, 0xc9, 0x51, 0x7b, 0xf5, 0x54, 0xa2, 0xab, 0x26,
    901      1.1  christos     0xee, 0x16, 0xd3, 0x83, 0x92, 0x85, 0x40, 0x67, 0xa3, 0xa9, 0x31, 0x16,
    902      1.1  christos     0x64, 0x45, 0x5a, 0x2a, 0x9d, 0xa8, 0x1a, 0x84, 0x2f, 0x59, 0x57, 0x6b,
    903      1.1  christos     0xbb, 0x51, 0x28, 0xbd, 0x91, 0x60, 0xd9, 0x8f, 0x54, 0x6a, 0xa0, 0x6b,
    904      1.1  christos     0xb2, 0xf6, 0x78, 0x79, 0xd2, 0x3a, 0x8f, 0xa6, 0x24, 0x7e, 0xe9, 0x6e,
    905      1.1  christos     0x66, 0x30, 0xed, 0xbf, 0x55, 0x71, 0x9c, 0x89, 0x81, 0xf0, 0xa7, 0xe7,
    906      1.1  christos     0x05, 0x87, 0x51, 0xc1, 0xff, 0xe5, 0xcf, 0x1f, 0x19, 0xe4, 0xeb, 0x7c,
    907      1.1  christos     0x1c, 0x1a, 0x58, 0xd5, 0x22, 0x3d, 0x31, 0x22, 0xc7, 0x8b, 0x60, 0xf5,
    908      1.1  christos     0xe8, 0x95, 0x73, 0xe0, 0x20, 0xe2, 0x4f, 0x03, 0x9e, 0x89, 0x34, 0x91,
    909      1.1  christos     0x5e, 0xda, 0x4f, 0x60, 0xff, 0xc9, 0x4f, 0x5a, 0x37, 0x1e, 0xb0, 0xed,
    910      1.1  christos     0x26, 0x4c, 0xa4, 0xc6, 0x26, 0xc9, 0xcc, 0xab, 0xd2, 0x1a, 0x3a, 0x82,
    911      1.1  christos     0x68, 0x03, 0x49, 0x8f, 0xb0, 0xb9, 0xc8, 0x48, 0x9d, 0xc7, 0xdf, 0x8b,
    912      1.1  christos     0x1c, 0xbf, 0xda, 0x89, 0x78, 0x6f, 0xd3, 0x62, 0xad, 0x35, 0xb9, 0xd3,
    913      1.1  christos     0x9b, 0xd0, 0x25, 0x65
    914      1.1  christos };
    915      1.1  christos 
    916      1.1  christos /*
    917      1.1  christos  * Load PKCS3 DH Parameters that contain an optional private value length.
    918      1.1  christos  * Loading a named group should not overwrite the private value length field.
    919      1.1  christos  */
    920      1.1  christos static int dh_load_pkcs3_namedgroup_privlen_test(void)
    921      1.1  christos {
    922      1.1  christos     int ret, privlen = 0;
    923      1.1  christos     EVP_PKEY *pkey = NULL;
    924      1.1  christos     const unsigned char *p = dh_pub_der;
    925      1.1  christos 
    926      1.1  christos     ret = TEST_ptr(pkey = d2i_PUBKEY_ex(NULL, &p, sizeof(dh_pub_der),
    927  1.1.1.2  christos                        NULL, NULL))
    928  1.1.1.2  christos         && TEST_true(EVP_PKEY_get_int_param(pkey, OSSL_PKEY_PARAM_DH_PRIV_LEN,
    929  1.1.1.2  christos             &privlen))
    930  1.1.1.2  christos         && TEST_int_eq(privlen, 1024);
    931      1.1  christos 
    932      1.1  christos     EVP_PKEY_free(pkey);
    933      1.1  christos     return ret;
    934      1.1  christos }
    935      1.1  christos 
    936      1.1  christos #endif
    937      1.1  christos 
    938      1.1  christos int setup_tests(void)
    939      1.1  christos {
    940      1.1  christos #ifdef OPENSSL_NO_DH
    941      1.1  christos     TEST_note("No DH support");
    942      1.1  christos #else
    943      1.1  christos     ADD_TEST(dh_test);
    944      1.1  christos     ADD_TEST(dh_computekey_range_test);
    945      1.1  christos     ADD_TEST(rfc5114_test);
    946      1.1  christos     ADD_TEST(rfc7919_test);
    947      1.1  christos     ADD_ALL_TESTS(dh_test_prime_groups, OSSL_NELEM(prime_groups));
    948      1.1  christos     ADD_TEST(dh_get_nid);
    949      1.1  christos     ADD_TEST(dh_load_pkcs3_namedgroup_privlen_test);
    950      1.1  christos     ADD_TEST(dh_rfc5114_fix_nid_test);
    951      1.1  christos     ADD_TEST(dh_set_dh_nid_test);
    952      1.1  christos #endif
    953      1.1  christos     return 1;
    954      1.1  christos }
    955