Home | History | Annotate | Line # | Download | only in test
      1  1.1  christos /*
      2  1.1  christos  * Copyright 2001-2025 The OpenSSL Project Authors. All Rights Reserved.
      3  1.1  christos  * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
      4  1.1  christos  *
      5  1.1  christos  * Licensed under the Apache License 2.0 (the "License").  You may not use
      6  1.1  christos  * this file except in compliance with the License.  You can obtain a copy
      7  1.1  christos  * in the file LICENSE in the source distribution or at
      8  1.1  christos  * https://www.openssl.org/source/license.html
      9  1.1  christos  */
     10  1.1  christos 
     11  1.1  christos /*
     12  1.1  christos  * EC_KEY low level APIs are deprecated for public use, but still ok for
     13  1.1  christos  * internal use.
     14  1.1  christos  */
     15  1.1  christos #include "internal/deprecated.h"
     16  1.1  christos 
     17  1.1  christos #include <string.h>
     18  1.1  christos #include "internal/nelem.h"
     19  1.1  christos #include "testutil.h"
     20  1.1  christos 
     21  1.1  christos #include <openssl/ec.h>
     22  1.1  christos #ifndef OPENSSL_NO_ENGINE
     23  1.3  christos #include <openssl/engine.h>
     24  1.1  christos #endif
     25  1.1  christos #include <openssl/err.h>
     26  1.1  christos #include <openssl/obj_mac.h>
     27  1.1  christos #include <openssl/objects.h>
     28  1.1  christos #include <openssl/rand.h>
     29  1.1  christos #include <openssl/bn.h>
     30  1.1  christos #include <openssl/opensslconf.h>
     31  1.1  christos #include <openssl/core_names.h>
     32  1.1  christos #include <openssl/param_build.h>
     33  1.1  christos #include <openssl/evp.h>
     34  1.1  christos 
     35  1.1  christos static size_t crv_len = 0;
     36  1.1  christos static EC_builtin_curve *curves = NULL;
     37  1.1  christos 
     38  1.1  christos /* test multiplication with group order, long and negative scalars */
     39  1.1  christos static int group_order_tests(EC_GROUP *group)
     40  1.1  christos {
     41  1.1  christos     BIGNUM *n1 = NULL, *n2 = NULL, *order = NULL;
     42  1.1  christos     EC_POINT *P = NULL, *Q = NULL, *R = NULL, *S = NULL;
     43  1.1  christos     const EC_POINT *G = NULL;
     44  1.1  christos     BN_CTX *ctx = NULL;
     45  1.1  christos     int i = 0, r = 0;
     46  1.1  christos 
     47  1.1  christos     if (!TEST_ptr(n1 = BN_new())
     48  1.1  christos         || !TEST_ptr(n2 = BN_new())
     49  1.1  christos         || !TEST_ptr(order = BN_new())
     50  1.1  christos         || !TEST_ptr(ctx = BN_CTX_new())
     51  1.1  christos         || !TEST_ptr(G = EC_GROUP_get0_generator(group))
     52  1.1  christos         || !TEST_ptr(P = EC_POINT_new(group))
     53  1.1  christos         || !TEST_ptr(Q = EC_POINT_new(group))
     54  1.1  christos         || !TEST_ptr(R = EC_POINT_new(group))
     55  1.1  christos         || !TEST_ptr(S = EC_POINT_new(group)))
     56  1.1  christos         goto err;
     57  1.1  christos 
     58  1.1  christos     if (!TEST_true(EC_GROUP_get_order(group, order, ctx))
     59  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q, order, NULL, NULL, ctx))
     60  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, Q))
     61  1.1  christos #ifndef OPENSSL_NO_DEPRECATED_3_0
     62  1.1  christos         || !TEST_true(EC_GROUP_precompute_mult(group, ctx))
     63  1.1  christos #endif
     64  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q, order, NULL, NULL, ctx))
     65  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, Q))
     66  1.1  christos         || !TEST_true(EC_POINT_copy(P, G))
     67  1.1  christos         || !TEST_true(BN_one(n1))
     68  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q, n1, NULL, NULL, ctx))
     69  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx))
     70  1.1  christos         || !TEST_true(BN_sub(n1, order, n1))
     71  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q, n1, NULL, NULL, ctx))
     72  1.1  christos         || !TEST_true(EC_POINT_invert(group, Q, ctx))
     73  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx)))
     74  1.1  christos         goto err;
     75  1.1  christos 
     76  1.1  christos     for (i = 1; i <= 2; i++) {
     77  1.1  christos #ifndef OPENSSL_NO_DEPRECATED_3_0
     78  1.1  christos         const BIGNUM *scalars[6];
     79  1.1  christos         const EC_POINT *points[6];
     80  1.1  christos #endif
     81  1.1  christos 
     82  1.1  christos         if (!TEST_true(BN_set_word(n1, i))
     83  1.1  christos             /*
     84  1.1  christos              * If i == 1, P will be the predefined generator for which
     85  1.1  christos              * EC_GROUP_precompute_mult has set up precomputation.
     86  1.1  christos              */
     87  1.1  christos             || !TEST_true(EC_POINT_mul(group, P, n1, NULL, NULL, ctx))
     88  1.1  christos             || (i == 1 && !TEST_int_eq(0, EC_POINT_cmp(group, P, G, ctx)))
     89  1.1  christos             || !TEST_true(BN_one(n1))
     90  1.1  christos             /* n1 = 1 - order */
     91  1.1  christos             || !TEST_true(BN_sub(n1, n1, order))
     92  1.1  christos             || !TEST_true(EC_POINT_mul(group, Q, NULL, P, n1, ctx))
     93  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx))
     94  1.1  christos 
     95  1.1  christos             /* n2 = 1 + order */
     96  1.1  christos             || !TEST_true(BN_add(n2, order, BN_value_one()))
     97  1.1  christos             || !TEST_true(EC_POINT_mul(group, Q, NULL, P, n2, ctx))
     98  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx))
     99  1.1  christos 
    100  1.1  christos             /* n2 = (1 - order) * (1 + order) = 1 - order^2 */
    101  1.1  christos             || !TEST_true(BN_mul(n2, n1, n2, ctx))
    102  1.1  christos             || !TEST_true(EC_POINT_mul(group, Q, NULL, P, n2, ctx))
    103  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx)))
    104  1.1  christos             goto err;
    105  1.1  christos 
    106  1.1  christos         /* n2 = order^2 - 1 */
    107  1.1  christos         BN_set_negative(n2, 0);
    108  1.1  christos         if (!TEST_true(EC_POINT_mul(group, Q, NULL, P, n2, ctx))
    109  1.1  christos             /* Add P to verify the result. */
    110  1.1  christos             || !TEST_true(EC_POINT_add(group, Q, Q, P, ctx))
    111  1.1  christos             || !TEST_true(EC_POINT_is_at_infinity(group, Q))
    112  1.1  christos             || !TEST_false(EC_POINT_is_at_infinity(group, P)))
    113  1.1  christos             goto err;
    114  1.1  christos 
    115  1.1  christos #ifndef OPENSSL_NO_DEPRECATED_3_0
    116  1.1  christos         /* Exercise EC_POINTs_mul, including corner cases. */
    117  1.1  christos         scalars[0] = scalars[1] = BN_value_one();
    118  1.3  christos         points[0] = points[1] = P;
    119  1.1  christos 
    120  1.1  christos         if (!TEST_true(EC_POINTs_mul(group, R, NULL, 2, points, scalars, ctx))
    121  1.1  christos             || !TEST_true(EC_POINT_dbl(group, S, points[0], ctx))
    122  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, R, S, ctx)))
    123  1.1  christos             goto err;
    124  1.1  christos 
    125  1.1  christos         scalars[0] = n1;
    126  1.3  christos         points[0] = Q; /* => infinity */
    127  1.1  christos         scalars[1] = n2;
    128  1.3  christos         points[1] = P; /* => -P */
    129  1.1  christos         scalars[2] = n1;
    130  1.3  christos         points[2] = Q; /* => infinity */
    131  1.1  christos         scalars[3] = n2;
    132  1.3  christos         points[3] = Q; /* => infinity */
    133  1.1  christos         scalars[4] = n1;
    134  1.3  christos         points[4] = P; /* => P */
    135  1.1  christos         scalars[5] = n2;
    136  1.3  christos         points[5] = Q; /* => infinity */
    137  1.1  christos         if (!TEST_true(EC_POINTs_mul(group, P, NULL, 6, points, scalars, ctx))
    138  1.1  christos             || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    139  1.1  christos             goto err;
    140  1.1  christos #endif
    141  1.1  christos     }
    142  1.1  christos 
    143  1.1  christos     r = 1;
    144  1.1  christos err:
    145  1.1  christos     if (r == 0 && i != 0)
    146  1.3  christos         TEST_info(i == 1 ? "allowing precomputation" : "without precomputation");
    147  1.1  christos     EC_POINT_free(P);
    148  1.1  christos     EC_POINT_free(Q);
    149  1.1  christos     EC_POINT_free(R);
    150  1.1  christos     EC_POINT_free(S);
    151  1.1  christos     BN_free(n1);
    152  1.1  christos     BN_free(n2);
    153  1.1  christos     BN_free(order);
    154  1.1  christos     BN_CTX_free(ctx);
    155  1.1  christos     return r;
    156  1.1  christos }
    157  1.1  christos 
    158  1.1  christos static int prime_field_tests(void)
    159  1.1  christos {
    160  1.1  christos     BN_CTX *ctx = NULL;
    161  1.1  christos     BIGNUM *p = NULL, *a = NULL, *b = NULL, *scalar3 = NULL;
    162  1.1  christos     EC_GROUP *group = NULL;
    163  1.1  christos     EC_POINT *P = NULL, *Q = NULL, *R = NULL;
    164  1.1  christos     BIGNUM *x = NULL, *y = NULL, *z = NULL, *yplusone = NULL;
    165  1.1  christos #ifndef OPENSSL_NO_DEPRECATED_3_0
    166  1.1  christos     const EC_POINT *points[4];
    167  1.1  christos     const BIGNUM *scalars[4];
    168  1.1  christos #endif
    169  1.1  christos     unsigned char buf[100];
    170  1.1  christos     size_t len, r = 0;
    171  1.1  christos     int k;
    172  1.1  christos 
    173  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
    174  1.1  christos         || !TEST_ptr(p = BN_new())
    175  1.1  christos         || !TEST_ptr(a = BN_new())
    176  1.1  christos         || !TEST_ptr(b = BN_new())
    177  1.1  christos         || !TEST_true(BN_hex2bn(&p, "17"))
    178  1.1  christos         || !TEST_true(BN_hex2bn(&a, "1"))
    179  1.1  christos         || !TEST_true(BN_hex2bn(&b, "1"))
    180  1.1  christos         || !TEST_ptr(group = EC_GROUP_new_curve_GFp(p, a, b, ctx))
    181  1.1  christos         || !TEST_true(EC_GROUP_get_curve(group, p, a, b, ctx)))
    182  1.1  christos         goto err;
    183  1.1  christos 
    184  1.1  christos     TEST_info("Curve defined by Weierstrass equation");
    185  1.1  christos     TEST_note("     y^2 = x^3 + a*x + b (mod p)");
    186  1.1  christos     test_output_bignum("a", a);
    187  1.1  christos     test_output_bignum("b", b);
    188  1.1  christos     test_output_bignum("p", p);
    189  1.1  christos 
    190  1.1  christos     buf[0] = 0;
    191  1.1  christos     if (!TEST_ptr(P = EC_POINT_new(group))
    192  1.1  christos         || !TEST_ptr(Q = EC_POINT_new(group))
    193  1.1  christos         || !TEST_ptr(R = EC_POINT_new(group))
    194  1.1  christos         || !TEST_true(EC_POINT_set_to_infinity(group, P))
    195  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P))
    196  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, Q, buf, 1, ctx))
    197  1.1  christos         || !TEST_true(EC_POINT_add(group, P, P, Q, ctx))
    198  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P))
    199  1.1  christos         || !TEST_ptr(x = BN_new())
    200  1.1  christos         || !TEST_ptr(y = BN_new())
    201  1.1  christos         || !TEST_ptr(z = BN_new())
    202  1.1  christos         || !TEST_ptr(yplusone = BN_new())
    203  1.1  christos         || !TEST_true(BN_hex2bn(&x, "D"))
    204  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, Q, x, 1, ctx)))
    205  1.1  christos         goto err;
    206  1.1  christos 
    207  1.1  christos     if (!TEST_int_gt(EC_POINT_is_on_curve(group, Q, ctx), 0)) {
    208  1.1  christos         if (!TEST_true(EC_POINT_get_affine_coordinates(group, Q, x, y, ctx)))
    209  1.1  christos             goto err;
    210  1.1  christos         TEST_info("Point is not on curve");
    211  1.1  christos         test_output_bignum("x", x);
    212  1.1  christos         test_output_bignum("y", y);
    213  1.1  christos         goto err;
    214  1.1  christos     }
    215  1.1  christos 
    216  1.1  christos     TEST_note("A cyclic subgroup:");
    217  1.1  christos     k = 100;
    218  1.1  christos     do {
    219  1.1  christos         if (!TEST_int_ne(k--, 0))
    220  1.1  christos             goto err;
    221  1.1  christos 
    222  1.1  christos         if (EC_POINT_is_at_infinity(group, P)) {
    223  1.1  christos             TEST_note("     point at infinity");
    224  1.1  christos         } else {
    225  1.1  christos             if (!TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y,
    226  1.3  christos                     ctx)))
    227  1.1  christos                 goto err;
    228  1.1  christos 
    229  1.1  christos             test_output_bignum("x", x);
    230  1.1  christos             test_output_bignum("y", y);
    231  1.1  christos         }
    232  1.1  christos 
    233  1.1  christos         if (!TEST_true(EC_POINT_copy(R, P))
    234  1.1  christos             || !TEST_true(EC_POINT_add(group, P, P, Q, ctx)))
    235  1.1  christos             goto err;
    236  1.1  christos 
    237  1.1  christos     } while (!EC_POINT_is_at_infinity(group, P));
    238  1.1  christos 
    239  1.1  christos     if (!TEST_true(EC_POINT_add(group, P, Q, R, ctx))
    240  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    241  1.1  christos         goto err;
    242  1.1  christos 
    243  1.3  christos     len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_COMPRESSED, buf,
    244  1.3  christos         sizeof(buf), ctx);
    245  1.1  christos     if (!TEST_size_t_ne(len, 0)
    246  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))
    247  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))
    248  1.1  christos         goto err;
    249  1.1  christos     test_output_memory("Generator as octet string, compressed form:",
    250  1.3  christos         buf, len);
    251  1.1  christos 
    252  1.1  christos     len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_UNCOMPRESSED,
    253  1.3  christos         buf, sizeof(buf), ctx);
    254  1.1  christos     if (!TEST_size_t_ne(len, 0)
    255  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))
    256  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))
    257  1.1  christos         goto err;
    258  1.1  christos     test_output_memory("Generator as octet string, uncompressed form:",
    259  1.3  christos         buf, len);
    260  1.1  christos 
    261  1.1  christos     len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_HYBRID,
    262  1.3  christos         buf, sizeof(buf), ctx);
    263  1.1  christos     if (!TEST_size_t_ne(len, 0)
    264  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))
    265  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))
    266  1.1  christos         goto err;
    267  1.1  christos     test_output_memory("Generator as octet string, hybrid form:",
    268  1.3  christos         buf, len);
    269  1.1  christos 
    270  1.1  christos     if (!TEST_true(EC_POINT_invert(group, P, ctx))
    271  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx))
    272  1.1  christos 
    273  1.3  christos         /*
    274  1.3  christos          * Curve secp160r1 (Certicom Research SEC 2 Version 1.0, section 2.4.2,
    275  1.3  christos          * 2000) -- not a NIST curve, but commonly used
    276  1.3  christos          */
    277  1.1  christos 
    278  1.3  christos         || !TEST_true(BN_hex2bn(&p, "FFFFFFFF"
    279  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF"))
    280  1.1  christos         || !TEST_int_eq(1, BN_check_prime(p, ctx, NULL))
    281  1.3  christos         || !TEST_true(BN_hex2bn(&a, "FFFFFFFF"
    282  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC"))
    283  1.3  christos         || !TEST_true(BN_hex2bn(&b, "1C97BEFC"
    284  1.1  christos                                     "54BD7A8B65ACF89F81D4D4ADC565FA45"))
    285  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    286  1.3  christos         || !TEST_true(BN_hex2bn(&x, "4A96B568"
    287  1.1  christos                                     "8EF573284664698968C38BB913CBFC82"))
    288  1.3  christos         || !TEST_true(BN_hex2bn(&y, "23a62855"
    289  1.1  christos                                     "3168947d59dcc912042351377ac5fb32"))
    290  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    291  1.3  christos         /*
    292  1.3  christos          * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    293  1.3  christos          * and therefore setting the coordinates should fail.
    294  1.3  christos          */
    295  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    296  1.3  christos             ctx))
    297  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(group, P, x, y, ctx))
    298  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    299  1.3  christos         || !TEST_true(BN_hex2bn(&z, "0100000000"
    300  1.1  christos                                     "000000000001F4C8F927AED3CA752257"))
    301  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    302  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    303  1.1  christos         goto err;
    304  1.1  christos     TEST_info("SEC2 curve secp160r1 -- Generator");
    305  1.1  christos     test_output_bignum("x", x);
    306  1.1  christos     test_output_bignum("y", y);
    307  1.1  christos     /* G_y value taken from the standard: */
    308  1.3  christos     if (!TEST_true(BN_hex2bn(&z, "23a62855"
    309  1.1  christos                                  "3168947d59dcc912042351377ac5fb32"))
    310  1.1  christos         || !TEST_BN_eq(y, z)
    311  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 160)
    312  1.1  christos         || !group_order_tests(group)
    313  1.1  christos 
    314  1.3  christos         /* Curve P-192 (FIPS PUB 186-2, App. 6) */
    315  1.1  christos 
    316  1.3  christos         || !TEST_true(BN_hex2bn(&p, "FFFFFFFFFFFFFFFF"
    317  1.1  christos                                     "FFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF"))
    318  1.1  christos         || !TEST_int_eq(1, BN_check_prime(p, ctx, NULL))
    319  1.3  christos         || !TEST_true(BN_hex2bn(&a, "FFFFFFFFFFFFFFFF"
    320  1.1  christos                                     "FFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"))
    321  1.3  christos         || !TEST_true(BN_hex2bn(&b, "64210519E59C80E7"
    322  1.1  christos                                     "0FA7E9AB72243049FEB8DEECC146B9B1"))
    323  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    324  1.3  christos         || !TEST_true(BN_hex2bn(&x, "188DA80EB03090F6"
    325  1.1  christos                                     "7CBF20EB43A18800F4FF0AFD82FF1012"))
    326  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 1, ctx))
    327  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    328  1.3  christos         || !TEST_true(BN_hex2bn(&z, "FFFFFFFFFFFFFFFF"
    329  1.1  christos                                     "FFFFFFFF99DEF836146BC9B1B4D22831"))
    330  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    331  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    332  1.1  christos         goto err;
    333  1.1  christos 
    334  1.1  christos     TEST_info("NIST curve P-192 -- Generator");
    335  1.1  christos     test_output_bignum("x", x);
    336  1.1  christos     test_output_bignum("y", y);
    337  1.1  christos     /* G_y value taken from the standard: */
    338  1.3  christos     if (!TEST_true(BN_hex2bn(&z, "07192B95FFC8DA78"
    339  1.1  christos                                  "631011ED6B24CDD573F977A11E794811"))
    340  1.1  christos         || !TEST_BN_eq(y, z)
    341  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    342  1.3  christos         /*
    343  1.3  christos          * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    344  1.3  christos          * and therefore setting the coordinates should fail.
    345  1.3  christos          */
    346  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    347  1.3  christos             ctx))
    348  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 192)
    349  1.1  christos         || !group_order_tests(group)
    350  1.1  christos 
    351  1.3  christos         /* Curve P-224 (FIPS PUB 186-2, App. 6) */
    352  1.1  christos 
    353  1.3  christos         || !TEST_true(BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFF"
    354  1.1  christos                                     "FFFFFFFF000000000000000000000001"))
    355  1.1  christos         || !TEST_int_eq(1, BN_check_prime(p, ctx, NULL))
    356  1.3  christos         || !TEST_true(BN_hex2bn(&a, "FFFFFFFFFFFFFFFFFFFFFFFF"
    357  1.1  christos                                     "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE"))
    358  1.3  christos         || !TEST_true(BN_hex2bn(&b, "B4050A850C04B3ABF5413256"
    359  1.1  christos                                     "5044B0B7D7BFD8BA270B39432355FFB4"))
    360  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    361  1.3  christos         || !TEST_true(BN_hex2bn(&x, "B70E0CBD6BB4BF7F321390B9"
    362  1.1  christos                                     "4A03C1D356C21122343280D6115C1D21"))
    363  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 0, ctx))
    364  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    365  1.3  christos         || !TEST_true(BN_hex2bn(&z, "FFFFFFFFFFFFFFFFFFFFFFFF"
    366  1.1  christos                                     "FFFF16A2E0B8F03E13DD29455C5C2A3D"))
    367  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    368  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    369  1.1  christos         goto err;
    370  1.1  christos 
    371  1.1  christos     TEST_info("NIST curve P-224 -- Generator");
    372  1.1  christos     test_output_bignum("x", x);
    373  1.1  christos     test_output_bignum("y", y);
    374  1.1  christos     /* G_y value taken from the standard: */
    375  1.3  christos     if (!TEST_true(BN_hex2bn(&z, "BD376388B5F723FB4C22DFE6"
    376  1.1  christos                                  "CD4375A05A07476444D5819985007E34"))
    377  1.1  christos         || !TEST_BN_eq(y, z)
    378  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    379  1.3  christos         /*
    380  1.3  christos          * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    381  1.3  christos          * and therefore setting the coordinates should fail.
    382  1.3  christos          */
    383  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    384  1.3  christos             ctx))
    385  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 224)
    386  1.1  christos         || !group_order_tests(group)
    387  1.1  christos 
    388  1.3  christos         /* Curve P-256 (FIPS PUB 186-2, App. 6) */
    389  1.1  christos 
    390  1.1  christos         || !TEST_true(BN_hex2bn(&p, "FFFFFFFF000000010000000000000000"
    391  1.1  christos                                     "00000000FFFFFFFFFFFFFFFFFFFFFFFF"))
    392  1.1  christos         || !TEST_int_eq(1, BN_check_prime(p, ctx, NULL))
    393  1.1  christos         || !TEST_true(BN_hex2bn(&a, "FFFFFFFF000000010000000000000000"
    394  1.1  christos                                     "00000000FFFFFFFFFFFFFFFFFFFFFFFC"))
    395  1.1  christos         || !TEST_true(BN_hex2bn(&b, "5AC635D8AA3A93E7B3EBBD55769886BC"
    396  1.1  christos                                     "651D06B0CC53B0F63BCE3C3E27D2604B"))
    397  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    398  1.1  christos 
    399  1.1  christos         || !TEST_true(BN_hex2bn(&x, "6B17D1F2E12C4247F8BCE6E563A440F2"
    400  1.1  christos                                     "77037D812DEB33A0F4A13945D898C296"))
    401  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 1, ctx))
    402  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    403  1.1  christos         || !TEST_true(BN_hex2bn(&z, "FFFFFFFF00000000FFFFFFFFFFFFFFFF"
    404  1.1  christos                                     "BCE6FAADA7179E84F3B9CAC2FC632551"))
    405  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    406  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    407  1.1  christos         goto err;
    408  1.1  christos 
    409  1.1  christos     TEST_info("NIST curve P-256 -- Generator");
    410  1.1  christos     test_output_bignum("x", x);
    411  1.1  christos     test_output_bignum("y", y);
    412  1.1  christos     /* G_y value taken from the standard: */
    413  1.1  christos     if (!TEST_true(BN_hex2bn(&z, "4FE342E2FE1A7F9B8EE7EB4A7C0F9E16"
    414  1.1  christos                                  "2BCE33576B315ECECBB6406837BF51F5"))
    415  1.1  christos         || !TEST_BN_eq(y, z)
    416  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    417  1.3  christos         /*
    418  1.3  christos          * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    419  1.3  christos          * and therefore setting the coordinates should fail.
    420  1.3  christos          */
    421  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    422  1.3  christos             ctx))
    423  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 256)
    424  1.1  christos         || !group_order_tests(group)
    425  1.1  christos 
    426  1.3  christos         /* Curve P-384 (FIPS PUB 186-2, App. 6) */
    427  1.1  christos 
    428  1.1  christos         || !TEST_true(BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    429  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"
    430  1.1  christos                                     "FFFFFFFF0000000000000000FFFFFFFF"))
    431  1.1  christos         || !TEST_int_eq(1, BN_check_prime(p, ctx, NULL))
    432  1.1  christos         || !TEST_true(BN_hex2bn(&a, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    433  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"
    434  1.1  christos                                     "FFFFFFFF0000000000000000FFFFFFFC"))
    435  1.1  christos         || !TEST_true(BN_hex2bn(&b, "B3312FA7E23EE7E4988E056BE3F82D19"
    436  1.1  christos                                     "181D9C6EFE8141120314088F5013875A"
    437  1.1  christos                                     "C656398D8A2ED19D2A85C8EDD3EC2AEF"))
    438  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    439  1.1  christos 
    440  1.1  christos         || !TEST_true(BN_hex2bn(&x, "AA87CA22BE8B05378EB1C71EF320AD74"
    441  1.1  christos                                     "6E1D3B628BA79B9859F741E082542A38"
    442  1.1  christos                                     "5502F25DBF55296C3A545E3872760AB7"))
    443  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 1, ctx))
    444  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    445  1.1  christos         || !TEST_true(BN_hex2bn(&z, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    446  1.1  christos                                     "FFFFFFFFFFFFFFFFC7634D81F4372DDF"
    447  1.1  christos                                     "581A0DB248B0A77AECEC196ACCC52973"))
    448  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    449  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    450  1.1  christos         goto err;
    451  1.1  christos 
    452  1.1  christos     TEST_info("NIST curve P-384 -- Generator");
    453  1.1  christos     test_output_bignum("x", x);
    454  1.1  christos     test_output_bignum("y", y);
    455  1.1  christos     /* G_y value taken from the standard: */
    456  1.1  christos     if (!TEST_true(BN_hex2bn(&z, "3617DE4A96262C6F5D9E98BF9292DC29"
    457  1.1  christos                                  "F8F41DBD289A147CE9DA3113B5F0B8C0"
    458  1.1  christos                                  "0A60B1CE1D7E819D7A431D7C90EA0E5F"))
    459  1.1  christos         || !TEST_BN_eq(y, z)
    460  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    461  1.3  christos         /*
    462  1.3  christos          * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    463  1.3  christos          * and therefore setting the coordinates should fail.
    464  1.3  christos          */
    465  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    466  1.3  christos             ctx))
    467  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 384)
    468  1.1  christos         || !group_order_tests(group)
    469  1.1  christos 
    470  1.3  christos         /* Curve P-521 (FIPS PUB 186-2, App. 6) */
    471  1.3  christos         || !TEST_true(BN_hex2bn(&p, "1FF"
    472  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    473  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    474  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    475  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"))
    476  1.1  christos         || !TEST_int_eq(1, BN_check_prime(p, ctx, NULL))
    477  1.3  christos         || !TEST_true(BN_hex2bn(&a, "1FF"
    478  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    479  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    480  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    481  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC"))
    482  1.3  christos         || !TEST_true(BN_hex2bn(&b, "051"
    483  1.1  christos                                     "953EB9618E1C9A1F929A21A0B68540EE"
    484  1.1  christos                                     "A2DA725B99B315F3B8B489918EF109E1"
    485  1.1  christos                                     "56193951EC7E937B1652C0BD3BB1BF07"
    486  1.1  christos                                     "3573DF883D2C34F1EF451FD46B503F00"))
    487  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    488  1.3  christos         || !TEST_true(BN_hex2bn(&x, "C6"
    489  1.1  christos                                     "858E06B70404E9CD9E3ECB662395B442"
    490  1.1  christos                                     "9C648139053FB521F828AF606B4D3DBA"
    491  1.1  christos                                     "A14B5E77EFE75928FE1DC127A2FFA8DE"
    492  1.1  christos                                     "3348B3C1856A429BF97E7E31C2E5BD66"))
    493  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 0, ctx))
    494  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    495  1.3  christos         || !TEST_true(BN_hex2bn(&z, "1FF"
    496  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    497  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA"
    498  1.1  christos                                     "51868783BF2F966B7FCC0148F709A5D0"
    499  1.1  christos                                     "3BB5C9B8899C47AEBB6FB71E91386409"))
    500  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    501  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    502  1.1  christos         goto err;
    503  1.1  christos 
    504  1.1  christos     TEST_info("NIST curve P-521 -- Generator");
    505  1.1  christos     test_output_bignum("x", x);
    506  1.1  christos     test_output_bignum("y", y);
    507  1.1  christos     /* G_y value taken from the standard: */
    508  1.3  christos     if (!TEST_true(BN_hex2bn(&z, "118"
    509  1.1  christos                                  "39296A789A3BC0045C8A5FB42C7D1BD9"
    510  1.1  christos                                  "98F54449579B446817AFBD17273E662C"
    511  1.1  christos                                  "97EE72995EF42640C550B9013FAD0761"
    512  1.1  christos                                  "353C7086A272C24088BE94769FD16650"))
    513  1.1  christos         || !TEST_BN_eq(y, z)
    514  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    515  1.3  christos         /*
    516  1.3  christos          * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    517  1.3  christos          * and therefore setting the coordinates should fail.
    518  1.3  christos          */
    519  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    520  1.3  christos             ctx))
    521  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 521)
    522  1.1  christos         || !group_order_tests(group)
    523  1.1  christos 
    524  1.3  christos         /* more tests using the last curve */
    525  1.1  christos 
    526  1.3  christos         /* Restore the point that got mangled in the (x, y + 1) test. */
    527  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(group, P, x, y, ctx))
    528  1.1  christos         || !TEST_true(EC_POINT_copy(Q, P))
    529  1.1  christos         || !TEST_false(EC_POINT_is_at_infinity(group, Q))
    530  1.1  christos         || !TEST_true(EC_POINT_dbl(group, P, P, ctx))
    531  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    532  1.3  christos         || !TEST_true(EC_POINT_invert(group, Q, ctx)) /* P = -2Q */
    533  1.1  christos         || !TEST_true(EC_POINT_add(group, R, P, Q, ctx))
    534  1.1  christos         || !TEST_true(EC_POINT_add(group, R, R, Q, ctx))
    535  1.3  christos         || !TEST_true(EC_POINT_is_at_infinity(group, R)) /* R = P + 2Q */
    536  1.1  christos         || !TEST_false(EC_POINT_is_at_infinity(group, Q)))
    537  1.1  christos         goto err;
    538  1.1  christos 
    539  1.1  christos #ifndef OPENSSL_NO_DEPRECATED_3_0
    540  1.1  christos     TEST_note("combined multiplication ...");
    541  1.1  christos     points[0] = Q;
    542  1.1  christos     points[1] = Q;
    543  1.1  christos     points[2] = Q;
    544  1.1  christos     points[3] = Q;
    545  1.1  christos 
    546  1.1  christos     if (!TEST_true(EC_GROUP_get_order(group, z, ctx))
    547  1.1  christos         || !TEST_true(BN_add(y, z, BN_value_one()))
    548  1.1  christos         || !TEST_BN_even(y)
    549  1.1  christos         || !TEST_true(BN_rshift1(y, y)))
    550  1.1  christos         goto err;
    551  1.1  christos 
    552  1.3  christos     scalars[0] = y; /* (group order + 1)/2, so y*Q + y*Q = Q */
    553  1.1  christos     scalars[1] = y;
    554  1.1  christos 
    555  1.1  christos     /* z is still the group order */
    556  1.1  christos     if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))
    557  1.1  christos         || !TEST_true(EC_POINTs_mul(group, R, z, 2, points, scalars, ctx))
    558  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx))
    559  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, R, Q, ctx))
    560  1.1  christos         || !TEST_true(BN_rand(y, BN_num_bits(y), 0, 0))
    561  1.1  christos         || !TEST_true(BN_add(z, z, y)))
    562  1.1  christos         goto err;
    563  1.1  christos     BN_set_negative(z, 1);
    564  1.1  christos     scalars[0] = y;
    565  1.3  christos     scalars[1] = z; /* z = -(order + y) */
    566  1.1  christos 
    567  1.1  christos     if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))
    568  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P))
    569  1.1  christos         || !TEST_true(BN_rand(x, BN_num_bits(y) - 1, 0, 0))
    570  1.1  christos         || !TEST_true(BN_add(z, x, y)))
    571  1.1  christos         goto err;
    572  1.1  christos     BN_set_negative(z, 1);
    573  1.1  christos     scalars[0] = x;
    574  1.1  christos     scalars[1] = y;
    575  1.3  christos     scalars[2] = z; /* z = -(x+y) */
    576  1.1  christos 
    577  1.1  christos     if (!TEST_ptr(scalar3 = BN_new()))
    578  1.1  christos         goto err;
    579  1.1  christos     BN_zero(scalar3);
    580  1.1  christos     scalars[3] = scalar3;
    581  1.1  christos 
    582  1.1  christos     if (!TEST_true(EC_POINTs_mul(group, P, NULL, 4, points, scalars, ctx))
    583  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    584  1.1  christos         goto err;
    585  1.1  christos #endif
    586  1.1  christos     TEST_note(" ok\n");
    587  1.1  christos     r = 1;
    588  1.1  christos err:
    589  1.1  christos     BN_CTX_free(ctx);
    590  1.1  christos     BN_free(p);
    591  1.1  christos     BN_free(a);
    592  1.1  christos     BN_free(b);
    593  1.1  christos     EC_GROUP_free(group);
    594  1.1  christos     EC_POINT_free(P);
    595  1.1  christos     EC_POINT_free(Q);
    596  1.1  christos     EC_POINT_free(R);
    597  1.1  christos     BN_free(x);
    598  1.1  christos     BN_free(y);
    599  1.1  christos     BN_free(z);
    600  1.1  christos     BN_free(yplusone);
    601  1.1  christos     BN_free(scalar3);
    602  1.1  christos     return r;
    603  1.1  christos }
    604  1.1  christos 
    605  1.1  christos #ifndef OPENSSL_NO_EC2M
    606  1.1  christos 
    607  1.1  christos static struct c2_curve_test {
    608  1.1  christos     const char *name;
    609  1.1  christos     const char *p;
    610  1.1  christos     const char *a;
    611  1.1  christos     const char *b;
    612  1.1  christos     const char *x;
    613  1.1  christos     const char *y;
    614  1.1  christos     int ybit;
    615  1.1  christos     const char *order;
    616  1.1  christos     const char *cof;
    617  1.1  christos     int degree;
    618  1.1  christos } char2_curve_tests[] = {
    619  1.1  christos     /* Curve K-163 (FIPS PUB 186-2, App. 6) */
    620  1.1  christos     {
    621  1.1  christos         "NIST curve K-163",
    622  1.1  christos         "0800000000000000000000000000000000000000C9",
    623  1.1  christos         "1",
    624  1.1  christos         "1",
    625  1.1  christos         "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8",
    626  1.1  christos         "0289070FB05D38FF58321F2E800536D538CCDAA3D9",
    627  1.3  christos         1, "04000000000000000000020108A2E0CC0D99F8A5EF", "2", 163 },
    628  1.1  christos     /* Curve B-163 (FIPS PUB 186-2, App. 6) */
    629  1.1  christos     {
    630  1.1  christos         "NIST curve B-163",
    631  1.1  christos         "0800000000000000000000000000000000000000C9",
    632  1.1  christos         "1",
    633  1.1  christos         "020A601907B8C953CA1481EB10512F78744A3205FD",
    634  1.1  christos         "03F0EBA16286A2D57EA0991168D4994637E8343E36",
    635  1.1  christos         "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1",
    636  1.3  christos         1, "040000000000000000000292FE77E70C12A4234C33", "2", 163 },
    637  1.1  christos     /* Curve K-233 (FIPS PUB 186-2, App. 6) */
    638  1.1  christos     {
    639  1.1  christos         "NIST curve K-233",
    640  1.1  christos         "020000000000000000000000000000000000000004000000000000000001",
    641  1.1  christos         "0",
    642  1.1  christos         "1",
    643  1.1  christos         "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126",
    644  1.1  christos         "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3",
    645  1.1  christos         0,
    646  1.1  christos         "008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF",
    647  1.3  christos         "4", 233 },
    648  1.1  christos     /* Curve B-233 (FIPS PUB 186-2, App. 6) */
    649  1.1  christos     {
    650  1.1  christos         "NIST curve B-233",
    651  1.1  christos         "020000000000000000000000000000000000000004000000000000000001",
    652  1.1  christos         "000000000000000000000000000000000000000000000000000000000001",
    653  1.1  christos         "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD",
    654  1.1  christos         "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B",
    655  1.1  christos         "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052",
    656  1.1  christos         1,
    657  1.1  christos         "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7",
    658  1.3  christos         "2", 233 },
    659  1.1  christos     /* Curve K-283 (FIPS PUB 186-2, App. 6) */
    660  1.1  christos     {
    661  1.1  christos         "NIST curve K-283",
    662  1.3  christos         "08000000"
    663  1.1  christos         "00000000000000000000000000000000000000000000000000000000000010A1",
    664  1.1  christos         "0",
    665  1.1  christos         "1",
    666  1.3  christos         "0503213F"
    667  1.1  christos         "78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836",
    668  1.3  christos         "01CCDA38"
    669  1.1  christos         "0F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259",
    670  1.1  christos         0,
    671  1.3  christos         "01FFFFFF"
    672  1.1  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61",
    673  1.3  christos         "4", 283 },
    674  1.1  christos     /* Curve B-283 (FIPS PUB 186-2, App. 6) */
    675  1.1  christos     {
    676  1.1  christos         "NIST curve B-283",
    677  1.3  christos         "08000000"
    678  1.1  christos         "00000000000000000000000000000000000000000000000000000000000010A1",
    679  1.3  christos         "00000000"
    680  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000001",
    681  1.3  christos         "027B680A"
    682  1.1  christos         "C8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5",
    683  1.3  christos         "05F93925"
    684  1.1  christos         "8DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053",
    685  1.3  christos         "03676854"
    686  1.1  christos         "FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4",
    687  1.1  christos         1,
    688  1.3  christos         "03FFFFFF"
    689  1.1  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307",
    690  1.3  christos         "2", 283 },
    691  1.1  christos     /* Curve K-409 (FIPS PUB 186-2, App. 6) */
    692  1.1  christos     {
    693  1.1  christos         "NIST curve K-409",
    694  1.3  christos         "0200000000000000000000000000000000000000"
    695  1.1  christos         "0000000000000000000000000000000000000000008000000000000000000001",
    696  1.1  christos         "0",
    697  1.1  christos         "1",
    698  1.3  christos         "0060F05F658F49C1AD3AB1890F7184210EFD0987"
    699  1.1  christos         "E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746",
    700  1.3  christos         "01E369050B7C4E42ACBA1DACBF04299C3460782F"
    701  1.1  christos         "918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B",
    702  1.1  christos         1,
    703  1.3  christos         "007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    704  1.1  christos         "FFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF",
    705  1.3  christos         "4", 409 },
    706  1.1  christos     /* Curve B-409 (FIPS PUB 186-2, App. 6) */
    707  1.1  christos     {
    708  1.1  christos         "NIST curve B-409",
    709  1.3  christos         "0200000000000000000000000000000000000000"
    710  1.1  christos         "0000000000000000000000000000000000000000008000000000000000000001",
    711  1.3  christos         "0000000000000000000000000000000000000000"
    712  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000001",
    713  1.3  christos         "0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422E"
    714  1.1  christos         "F1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F",
    715  1.3  christos         "015D4860D088DDB3496B0C6064756260441CDE4A"
    716  1.1  christos         "F1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7",
    717  1.3  christos         "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5"
    718  1.1  christos         "A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706",
    719  1.1  christos         1,
    720  1.3  christos         "0100000000000000000000000000000000000000"
    721  1.1  christos         "00000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173",
    722  1.3  christos         "2", 409 },
    723  1.1  christos     /* Curve K-571 (FIPS PUB 186-2, App. 6) */
    724  1.1  christos     {
    725  1.1  christos         "NIST curve K-571",
    726  1.3  christos         "800000000000000"
    727  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000000"
    728  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000425",
    729  1.1  christos         "0",
    730  1.1  christos         "1",
    731  1.3  christos         "026EB7A859923FBC"
    732  1.1  christos         "82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E6"
    733  1.1  christos         "47DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972",
    734  1.3  christos         "0349DC807F4FBF37"
    735  1.1  christos         "4F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA7"
    736  1.1  christos         "4FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3",
    737  1.1  christos         0,
    738  1.3  christos         "0200000000000000"
    739  1.1  christos         "00000000000000000000000000000000000000000000000000000000131850E1"
    740  1.1  christos         "F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001",
    741  1.3  christos         "4", 571 },
    742  1.1  christos     /* Curve B-571 (FIPS PUB 186-2, App. 6) */
    743  1.1  christos     {
    744  1.1  christos         "NIST curve B-571",
    745  1.3  christos         "800000000000000"
    746  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000000"
    747  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000425",
    748  1.3  christos         "0000000000000000"
    749  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000000"
    750  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000001",
    751  1.3  christos         "02F40E7E2221F295"
    752  1.1  christos         "DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA5933"
    753  1.1  christos         "2BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A",
    754  1.3  christos         "0303001D34B85629"
    755  1.1  christos         "6C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293"
    756  1.1  christos         "CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19",
    757  1.3  christos         "037BF27342DA639B"
    758  1.1  christos         "6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A57"
    759  1.1  christos         "6291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B",
    760  1.1  christos         1,
    761  1.3  christos         "03FFFFFFFFFFFFFF"
    762  1.1  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18"
    763  1.1  christos         "FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47",
    764  1.3  christos         "2", 571 }
    765  1.1  christos };
    766  1.1  christos 
    767  1.1  christos static int char2_curve_test(int n)
    768  1.1  christos {
    769  1.1  christos     int r = 0;
    770  1.1  christos     BN_CTX *ctx = NULL;
    771  1.1  christos     BIGNUM *p = NULL, *a = NULL, *b = NULL;
    772  1.1  christos     BIGNUM *x = NULL, *y = NULL, *z = NULL, *cof = NULL, *yplusone = NULL;
    773  1.1  christos     EC_GROUP *group = NULL;
    774  1.1  christos     EC_POINT *P = NULL, *Q = NULL, *R = NULL;
    775  1.3  christos #ifndef OPENSSL_NO_DEPRECATED_3_0
    776  1.1  christos     const EC_POINT *points[3];
    777  1.1  christos     const BIGNUM *scalars[3];
    778  1.3  christos #endif
    779  1.1  christos     struct c2_curve_test *const test = char2_curve_tests + n;
    780  1.1  christos 
    781  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
    782  1.1  christos         || !TEST_ptr(p = BN_new())
    783  1.1  christos         || !TEST_ptr(a = BN_new())
    784  1.1  christos         || !TEST_ptr(b = BN_new())
    785  1.1  christos         || !TEST_ptr(x = BN_new())
    786  1.1  christos         || !TEST_ptr(y = BN_new())
    787  1.1  christos         || !TEST_ptr(z = BN_new())
    788  1.1  christos         || !TEST_ptr(yplusone = BN_new())
    789  1.1  christos         || !TEST_true(BN_hex2bn(&p, test->p))
    790  1.1  christos         || !TEST_true(BN_hex2bn(&a, test->a))
    791  1.1  christos         || !TEST_true(BN_hex2bn(&b, test->b))
    792  1.1  christos         || !TEST_true(group = EC_GROUP_new_curve_GF2m(p, a, b, ctx))
    793  1.1  christos         || !TEST_ptr(P = EC_POINT_new(group))
    794  1.1  christos         || !TEST_ptr(Q = EC_POINT_new(group))
    795  1.1  christos         || !TEST_ptr(R = EC_POINT_new(group))
    796  1.1  christos         || !TEST_true(BN_hex2bn(&x, test->x))
    797  1.1  christos         || !TEST_true(BN_hex2bn(&y, test->y))
    798  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one())))
    799  1.1  christos         goto err;
    800  1.1  christos 
    801  1.1  christos /* Change test based on whether binary point compression is enabled or not. */
    802  1.3  christos #ifdef OPENSSL_EC_BIN_PT_COMP
    803  1.1  christos     /*
    804  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    805  1.1  christos      * and therefore setting the coordinates should fail.
    806  1.1  christos      */
    807  1.1  christos     if (!TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone, ctx))
    808  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x,
    809  1.3  christos             test->y_bit,
    810  1.3  christos             ctx))
    811  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    812  1.1  christos         || !TEST_true(BN_hex2bn(&z, test->order))
    813  1.1  christos         || !TEST_true(BN_hex2bn(&cof, test->cof))
    814  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, cof))
    815  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    816  1.1  christos         goto err;
    817  1.1  christos     TEST_info("%s -- Generator", test->name);
    818  1.1  christos     test_output_bignum("x", x);
    819  1.1  christos     test_output_bignum("y", y);
    820  1.1  christos     /* G_y value taken from the standard: */
    821  1.1  christos     if (!TEST_true(BN_hex2bn(&z, test->y))
    822  1.1  christos         || !TEST_BN_eq(y, z))
    823  1.1  christos         goto err;
    824  1.3  christos #else
    825  1.1  christos     /*
    826  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    827  1.1  christos      * and therefore setting the coordinates should fail.
    828  1.1  christos      */
    829  1.1  christos     if (!TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone, ctx))
    830  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(group, P, x, y, ctx))
    831  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    832  1.1  christos         || !TEST_true(BN_hex2bn(&z, test->order))
    833  1.1  christos         || !TEST_true(BN_hex2bn(&cof, test->cof))
    834  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, cof)))
    835  1.1  christos         goto err;
    836  1.1  christos     TEST_info("%s -- Generator:", test->name);
    837  1.1  christos     test_output_bignum("x", x);
    838  1.1  christos     test_output_bignum("y", y);
    839  1.3  christos #endif
    840  1.1  christos 
    841  1.1  christos     if (!TEST_int_eq(EC_GROUP_get_degree(group), test->degree)
    842  1.1  christos         || !group_order_tests(group))
    843  1.1  christos         goto err;
    844  1.1  christos 
    845  1.1  christos     /* more tests using the last curve */
    846  1.1  christos     if (n == OSSL_NELEM(char2_curve_tests) - 1) {
    847  1.1  christos         if (!TEST_true(EC_POINT_set_affine_coordinates(group, P, x, y, ctx))
    848  1.1  christos             || !TEST_true(EC_POINT_copy(Q, P))
    849  1.1  christos             || !TEST_false(EC_POINT_is_at_infinity(group, Q))
    850  1.1  christos             || !TEST_true(EC_POINT_dbl(group, P, P, ctx))
    851  1.1  christos             || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    852  1.3  christos             || !TEST_true(EC_POINT_invert(group, Q, ctx)) /* P = -2Q */
    853  1.1  christos             || !TEST_true(EC_POINT_add(group, R, P, Q, ctx))
    854  1.1  christos             || !TEST_true(EC_POINT_add(group, R, R, Q, ctx))
    855  1.3  christos             || !TEST_true(EC_POINT_is_at_infinity(group, R)) /* R = P + 2Q */
    856  1.1  christos             || !TEST_false(EC_POINT_is_at_infinity(group, Q)))
    857  1.1  christos             goto err;
    858  1.1  christos 
    859  1.3  christos #ifndef OPENSSL_NO_DEPRECATED_3_0
    860  1.1  christos         TEST_note("combined multiplication ...");
    861  1.1  christos         points[0] = Q;
    862  1.1  christos         points[1] = Q;
    863  1.1  christos         points[2] = Q;
    864  1.1  christos 
    865  1.1  christos         if (!TEST_true(BN_add(y, z, BN_value_one()))
    866  1.1  christos             || !TEST_BN_even(y)
    867  1.1  christos             || !TEST_true(BN_rshift1(y, y)))
    868  1.1  christos             goto err;
    869  1.3  christos         scalars[0] = y; /* (group order + 1)/2, so y*Q + y*Q = Q */
    870  1.1  christos         scalars[1] = y;
    871  1.1  christos 
    872  1.1  christos         /* z is still the group order */
    873  1.1  christos         if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))
    874  1.1  christos             || !TEST_true(EC_POINTs_mul(group, R, z, 2, points, scalars, ctx))
    875  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx))
    876  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, R, Q, ctx)))
    877  1.1  christos             goto err;
    878  1.1  christos 
    879  1.1  christos         if (!TEST_true(BN_rand(y, BN_num_bits(y), 0, 0))
    880  1.1  christos             || !TEST_true(BN_add(z, z, y)))
    881  1.1  christos             goto err;
    882  1.1  christos         BN_set_negative(z, 1);
    883  1.1  christos         scalars[0] = y;
    884  1.3  christos         scalars[1] = z; /* z = -(order + y) */
    885  1.1  christos 
    886  1.1  christos         if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))
    887  1.1  christos             || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    888  1.1  christos             goto err;
    889  1.1  christos 
    890  1.1  christos         if (!TEST_true(BN_rand(x, BN_num_bits(y) - 1, 0, 0))
    891  1.1  christos             || !TEST_true(BN_add(z, x, y)))
    892  1.1  christos             goto err;
    893  1.1  christos         BN_set_negative(z, 1);
    894  1.1  christos         scalars[0] = x;
    895  1.1  christos         scalars[1] = y;
    896  1.3  christos         scalars[2] = z; /* z = -(x+y) */
    897  1.1  christos 
    898  1.1  christos         if (!TEST_true(EC_POINTs_mul(group, P, NULL, 3, points, scalars, ctx))
    899  1.1  christos             || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    900  1.1  christos             goto err;
    901  1.3  christos #endif
    902  1.1  christos     }
    903  1.1  christos 
    904  1.1  christos     r = 1;
    905  1.1  christos err:
    906  1.1  christos     BN_CTX_free(ctx);
    907  1.1  christos     BN_free(p);
    908  1.1  christos     BN_free(a);
    909  1.1  christos     BN_free(b);
    910  1.1  christos     BN_free(x);
    911  1.1  christos     BN_free(y);
    912  1.1  christos     BN_free(z);
    913  1.1  christos     BN_free(yplusone);
    914  1.1  christos     BN_free(cof);
    915  1.1  christos     EC_POINT_free(P);
    916  1.1  christos     EC_POINT_free(Q);
    917  1.1  christos     EC_POINT_free(R);
    918  1.1  christos     EC_GROUP_free(group);
    919  1.1  christos     return r;
    920  1.1  christos }
    921  1.1  christos 
    922  1.1  christos static int char2_field_tests(void)
    923  1.1  christos {
    924  1.1  christos     BN_CTX *ctx = NULL;
    925  1.1  christos     BIGNUM *p = NULL, *a = NULL, *b = NULL;
    926  1.1  christos     EC_GROUP *group = NULL;
    927  1.1  christos     EC_POINT *P = NULL, *Q = NULL, *R = NULL;
    928  1.1  christos     BIGNUM *x = NULL, *y = NULL, *z = NULL, *cof = NULL, *yplusone = NULL;
    929  1.1  christos     unsigned char buf[100];
    930  1.1  christos     size_t len;
    931  1.1  christos     int k, r = 0;
    932  1.1  christos 
    933  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
    934  1.1  christos         || !TEST_ptr(p = BN_new())
    935  1.1  christos         || !TEST_ptr(a = BN_new())
    936  1.1  christos         || !TEST_ptr(b = BN_new())
    937  1.1  christos         || !TEST_true(BN_hex2bn(&p, "13"))
    938  1.1  christos         || !TEST_true(BN_hex2bn(&a, "3"))
    939  1.1  christos         || !TEST_true(BN_hex2bn(&b, "1")))
    940  1.1  christos         goto err;
    941  1.1  christos 
    942  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_curve_GF2m(p, a, b, ctx))
    943  1.1  christos         || !TEST_true(EC_GROUP_get_curve(group, p, a, b, ctx)))
    944  1.1  christos         goto err;
    945  1.1  christos 
    946  1.1  christos     TEST_info("Curve defined by Weierstrass equation");
    947  1.1  christos     TEST_note("     y^2 + x*y = x^3 + a*x^2 + b (mod p)");
    948  1.1  christos     test_output_bignum("a", a);
    949  1.1  christos     test_output_bignum("b", b);
    950  1.1  christos     test_output_bignum("p", p);
    951  1.1  christos 
    952  1.3  christos     if (!TEST_ptr(P = EC_POINT_new(group))
    953  1.1  christos         || !TEST_ptr(Q = EC_POINT_new(group))
    954  1.1  christos         || !TEST_ptr(R = EC_POINT_new(group))
    955  1.1  christos         || !TEST_true(EC_POINT_set_to_infinity(group, P))
    956  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    957  1.1  christos         goto err;
    958  1.1  christos 
    959  1.1  christos     buf[0] = 0;
    960  1.1  christos     if (!TEST_true(EC_POINT_oct2point(group, Q, buf, 1, ctx))
    961  1.1  christos         || !TEST_true(EC_POINT_add(group, P, P, Q, ctx))
    962  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P))
    963  1.1  christos         || !TEST_ptr(x = BN_new())
    964  1.1  christos         || !TEST_ptr(y = BN_new())
    965  1.1  christos         || !TEST_ptr(z = BN_new())
    966  1.1  christos         || !TEST_ptr(cof = BN_new())
    967  1.1  christos         || !TEST_ptr(yplusone = BN_new())
    968  1.1  christos         || !TEST_true(BN_hex2bn(&x, "6"))
    969  1.1  christos /* Change test based on whether binary point compression is enabled or not. */
    970  1.3  christos #ifdef OPENSSL_EC_BIN_PT_COMP
    971  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, Q, x, 1, ctx))
    972  1.3  christos #else
    973  1.1  christos         || !TEST_true(BN_hex2bn(&y, "8"))
    974  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(group, Q, x, y, ctx))
    975  1.3  christos #endif
    976  1.3  christos     )
    977  1.1  christos         goto err;
    978  1.1  christos     if (!TEST_int_gt(EC_POINT_is_on_curve(group, Q, ctx), 0)) {
    979  1.1  christos /* Change test based on whether binary point compression is enabled or not. */
    980  1.3  christos #ifdef OPENSSL_EC_BIN_PT_COMP
    981  1.1  christos         if (!TEST_true(EC_POINT_get_affine_coordinates(group, Q, x, y, ctx)))
    982  1.1  christos             goto err;
    983  1.3  christos #endif
    984  1.1  christos         TEST_info("Point is not on curve");
    985  1.1  christos         test_output_bignum("x", x);
    986  1.1  christos         test_output_bignum("y", y);
    987  1.1  christos         goto err;
    988  1.1  christos     }
    989  1.1  christos 
    990  1.1  christos     TEST_note("A cyclic subgroup:");
    991  1.1  christos     k = 100;
    992  1.1  christos     do {
    993  1.1  christos         if (!TEST_int_ne(k--, 0))
    994  1.1  christos             goto err;
    995  1.1  christos 
    996  1.1  christos         if (EC_POINT_is_at_infinity(group, P))
    997  1.1  christos             TEST_note("     point at infinity");
    998  1.1  christos         else {
    999  1.1  christos             if (!TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y,
   1000  1.3  christos                     ctx)))
   1001  1.1  christos                 goto err;
   1002  1.1  christos 
   1003  1.1  christos             test_output_bignum("x", x);
   1004  1.1  christos             test_output_bignum("y", y);
   1005  1.1  christos         }
   1006  1.1  christos 
   1007  1.1  christos         if (!TEST_true(EC_POINT_copy(R, P))
   1008  1.1  christos             || !TEST_true(EC_POINT_add(group, P, P, Q, ctx)))
   1009  1.1  christos             goto err;
   1010  1.3  christos     } while (!EC_POINT_is_at_infinity(group, P));
   1011  1.1  christos 
   1012  1.1  christos     if (!TEST_true(EC_POINT_add(group, P, Q, R, ctx))
   1013  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P)))
   1014  1.1  christos         goto err;
   1015  1.1  christos 
   1016  1.1  christos /* Change test based on whether binary point compression is enabled or not. */
   1017  1.3  christos #ifdef OPENSSL_EC_BIN_PT_COMP
   1018  1.1  christos     len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_COMPRESSED,
   1019  1.3  christos         buf, sizeof(buf), ctx);
   1020  1.1  christos     if (!TEST_size_t_ne(len, 0)
   1021  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))
   1022  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))
   1023  1.1  christos         goto err;
   1024  1.1  christos     test_output_memory("Generator as octet string, compressed form:",
   1025  1.3  christos         buf, len);
   1026  1.3  christos #endif
   1027  1.1  christos 
   1028  1.1  christos     len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_UNCOMPRESSED,
   1029  1.3  christos         buf, sizeof(buf), ctx);
   1030  1.1  christos     if (!TEST_size_t_ne(len, 0)
   1031  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))
   1032  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))
   1033  1.1  christos         goto err;
   1034  1.1  christos     test_output_memory("Generator as octet string, uncompressed form:",
   1035  1.3  christos         buf, len);
   1036  1.1  christos 
   1037  1.1  christos /* Change test based on whether binary point compression is enabled or not. */
   1038  1.3  christos #ifdef OPENSSL_EC_BIN_PT_COMP
   1039  1.3  christos     len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_HYBRID, buf, sizeof(buf),
   1040  1.3  christos         ctx);
   1041  1.1  christos     if (!TEST_size_t_ne(len, 0)
   1042  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))
   1043  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))
   1044  1.1  christos         goto err;
   1045  1.1  christos     test_output_memory("Generator as octet string, hybrid form:",
   1046  1.3  christos         buf, len);
   1047  1.3  christos #endif
   1048  1.1  christos 
   1049  1.1  christos     if (!TEST_true(EC_POINT_invert(group, P, ctx))
   1050  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx)))
   1051  1.1  christos         goto err;
   1052  1.1  christos 
   1053  1.1  christos     TEST_note("\n");
   1054  1.1  christos 
   1055  1.1  christos     r = 1;
   1056  1.1  christos err:
   1057  1.1  christos     BN_CTX_free(ctx);
   1058  1.1  christos     BN_free(p);
   1059  1.1  christos     BN_free(a);
   1060  1.1  christos     BN_free(b);
   1061  1.1  christos     EC_GROUP_free(group);
   1062  1.1  christos     EC_POINT_free(P);
   1063  1.1  christos     EC_POINT_free(Q);
   1064  1.1  christos     EC_POINT_free(R);
   1065  1.1  christos     BN_free(x);
   1066  1.1  christos     BN_free(y);
   1067  1.1  christos     BN_free(z);
   1068  1.1  christos     BN_free(cof);
   1069  1.1  christos     BN_free(yplusone);
   1070  1.1  christos     return r;
   1071  1.1  christos }
   1072  1.1  christos 
   1073  1.1  christos static int hybrid_point_encoding_test(void)
   1074  1.1  christos {
   1075  1.1  christos     BIGNUM *x = NULL, *y = NULL;
   1076  1.1  christos     EC_GROUP *group = NULL;
   1077  1.1  christos     EC_POINT *point = NULL;
   1078  1.1  christos     unsigned char *buf = NULL;
   1079  1.1  christos     size_t len;
   1080  1.1  christos     int r = 0;
   1081  1.1  christos 
   1082  1.1  christos     if (!TEST_true(BN_dec2bn(&x, "0"))
   1083  1.1  christos         || !TEST_true(BN_dec2bn(&y, "1"))
   1084  1.1  christos         || !TEST_ptr(group = EC_GROUP_new_by_curve_name(NID_sect571k1))
   1085  1.1  christos         || !TEST_ptr(point = EC_POINT_new(group))
   1086  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(group, point, x, y, NULL))
   1087  1.3  christos         || !TEST_size_t_ne(0, (len = EC_POINT_point2oct(group, point, POINT_CONVERSION_HYBRID, NULL, 0, NULL)))
   1088  1.1  christos         || !TEST_ptr(buf = OPENSSL_malloc(len))
   1089  1.3  christos         || !TEST_size_t_eq(len, EC_POINT_point2oct(group, point, POINT_CONVERSION_HYBRID, buf, len, NULL)))
   1090  1.1  christos         goto err;
   1091  1.1  christos 
   1092  1.1  christos     r = 1;
   1093  1.1  christos 
   1094  1.1  christos     /* buf contains a valid hybrid point, check that we can decode it. */
   1095  1.1  christos     if (!TEST_true(EC_POINT_oct2point(group, point, buf, len, NULL)))
   1096  1.1  christos         r = 0;
   1097  1.1  christos 
   1098  1.1  christos     /* Flip the y_bit and verify that the invalid encoding is rejected. */
   1099  1.1  christos     buf[0] ^= 1;
   1100  1.1  christos     if (!TEST_false(EC_POINT_oct2point(group, point, buf, len, NULL)))
   1101  1.1  christos         r = 0;
   1102  1.1  christos 
   1103  1.1  christos err:
   1104  1.1  christos     BN_free(x);
   1105  1.1  christos     BN_free(y);
   1106  1.1  christos     EC_GROUP_free(group);
   1107  1.1  christos     EC_POINT_free(point);
   1108  1.1  christos     OPENSSL_free(buf);
   1109  1.1  christos     return r;
   1110  1.1  christos }
   1111  1.1  christos #endif
   1112  1.1  christos 
   1113  1.1  christos static int internal_curve_test(int n)
   1114  1.1  christos {
   1115  1.1  christos     EC_GROUP *group = NULL;
   1116  1.1  christos     int nid = curves[n].nid;
   1117  1.1  christos 
   1118  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))) {
   1119  1.1  christos         TEST_info("EC_GROUP_new_curve_name() failed with curve %s\n",
   1120  1.3  christos             OBJ_nid2sn(nid));
   1121  1.1  christos         return 0;
   1122  1.1  christos     }
   1123  1.1  christos     if (!TEST_true(EC_GROUP_check(group, NULL))) {
   1124  1.1  christos         TEST_info("EC_GROUP_check() failed with curve %s\n", OBJ_nid2sn(nid));
   1125  1.1  christos         EC_GROUP_free(group);
   1126  1.1  christos         return 0;
   1127  1.1  christos     }
   1128  1.1  christos     EC_GROUP_free(group);
   1129  1.1  christos     return 1;
   1130  1.1  christos }
   1131  1.1  christos 
   1132  1.1  christos static int internal_curve_test_method(int n)
   1133  1.1  christos {
   1134  1.1  christos     int r, nid = curves[n].nid;
   1135  1.1  christos     EC_GROUP *group;
   1136  1.1  christos 
   1137  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))) {
   1138  1.1  christos         TEST_info("Curve %s failed\n", OBJ_nid2sn(nid));
   1139  1.1  christos         return 0;
   1140  1.1  christos     }
   1141  1.1  christos     r = group_order_tests(group);
   1142  1.1  christos     EC_GROUP_free(group);
   1143  1.1  christos     return r;
   1144  1.1  christos }
   1145  1.1  christos 
   1146  1.1  christos static int group_field_test(void)
   1147  1.1  christos {
   1148  1.1  christos     int r = 1;
   1149  1.1  christos     BIGNUM *secp521r1_field = NULL;
   1150  1.1  christos     BIGNUM *sect163r2_field = NULL;
   1151  1.1  christos     EC_GROUP *secp521r1_group = NULL;
   1152  1.1  christos     EC_GROUP *sect163r2_group = NULL;
   1153  1.1  christos 
   1154  1.1  christos     BN_hex2bn(&secp521r1_field,
   1155  1.3  christos         "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
   1156  1.3  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
   1157  1.3  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
   1158  1.3  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
   1159  1.3  christos         "FFFF");
   1160  1.1  christos 
   1161  1.1  christos     BN_hex2bn(&sect163r2_field,
   1162  1.3  christos         "08000000000000000000000000000000"
   1163  1.3  christos         "00000000C9");
   1164  1.1  christos 
   1165  1.1  christos     secp521r1_group = EC_GROUP_new_by_curve_name(NID_secp521r1);
   1166  1.1  christos     if (BN_cmp(secp521r1_field, EC_GROUP_get0_field(secp521r1_group)))
   1167  1.3  christos         r = 0;
   1168  1.1  christos 
   1169  1.3  christos #ifndef OPENSSL_NO_EC2M
   1170  1.1  christos     sect163r2_group = EC_GROUP_new_by_curve_name(NID_sect163r2);
   1171  1.1  christos     if (BN_cmp(sect163r2_field, EC_GROUP_get0_field(sect163r2_group)))
   1172  1.3  christos         r = 0;
   1173  1.3  christos #endif
   1174  1.1  christos 
   1175  1.1  christos     EC_GROUP_free(secp521r1_group);
   1176  1.1  christos     EC_GROUP_free(sect163r2_group);
   1177  1.1  christos     BN_free(secp521r1_field);
   1178  1.1  christos     BN_free(sect163r2_field);
   1179  1.1  christos     return r;
   1180  1.1  christos }
   1181  1.1  christos 
   1182  1.1  christos /*
   1183  1.1  christos  * nistp_test_params contains magic numbers for testing
   1184  1.1  christos  * several NIST curves with characteristic > 3.
   1185  1.1  christos  */
   1186  1.1  christos struct nistp_test_params {
   1187  1.1  christos     const int nid;
   1188  1.1  christos     int degree;
   1189  1.1  christos     /*
   1190  1.1  christos      * Qx, Qy and D are taken from
   1191  1.1  christos      * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf
   1192  1.1  christos      * Otherwise, values are standard curve parameters from FIPS 180-3
   1193  1.1  christos      */
   1194  1.1  christos     const char *p, *a, *b, *Qx, *Qy, *Gx, *Gy, *order, *d;
   1195  1.1  christos };
   1196  1.1  christos 
   1197  1.1  christos static const struct nistp_test_params nistp_tests_params[] = {
   1198  1.1  christos     {
   1199  1.3  christos         /* P-224 */
   1200  1.3  christos         NID_secp224r1,
   1201  1.3  christos         224,
   1202  1.3  christos         /* p */
   1203  1.3  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
   1204  1.3  christos         /* a */
   1205  1.3  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
   1206  1.3  christos         /* b */
   1207  1.3  christos         "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
   1208  1.3  christos         /* Qx */
   1209  1.3  christos         "E84FB0B8E7000CB657D7973CF6B42ED78B301674276DF744AF130B3E",
   1210  1.3  christos         /* Qy */
   1211  1.3  christos         "4376675C6FC5612C21A0FF2D2A89D2987DF7A2BC52183B5982298555",
   1212  1.3  christos         /* Gx */
   1213  1.3  christos         "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
   1214  1.3  christos         /* Gy */
   1215  1.3  christos         "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",
   1216  1.3  christos         /* order */
   1217  1.3  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
   1218  1.3  christos         /* d */
   1219  1.3  christos         "3F0C488E987C80BE0FEE521F8D90BE6034EC69AE11CA72AA777481E8",
   1220  1.3  christos     },
   1221  1.1  christos     {
   1222  1.3  christos         /* P-256 */
   1223  1.3  christos         NID_X9_62_prime256v1,
   1224  1.3  christos         256,
   1225  1.3  christos         /* p */
   1226  1.3  christos         "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
   1227  1.3  christos         /* a */
   1228  1.3  christos         "ffffffff00000001000000000000000000000000fffffffffffffffffffffffc",
   1229  1.3  christos         /* b */
   1230  1.3  christos         "5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b",
   1231  1.3  christos         /* Qx */
   1232  1.3  christos         "b7e08afdfe94bad3f1dc8c734798ba1c62b3a0ad1e9ea2a38201cd0889bc7a19",
   1233  1.3  christos         /* Qy */
   1234  1.3  christos         "3603f747959dbf7a4bb226e41928729063adc7ae43529e61b563bbc606cc5e09",
   1235  1.3  christos         /* Gx */
   1236  1.3  christos         "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
   1237  1.3  christos         /* Gy */
   1238  1.3  christos         "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
   1239  1.3  christos         /* order */
   1240  1.3  christos         "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
   1241  1.3  christos         /* d */
   1242  1.3  christos         "c477f9f65c22cce20657faa5b2d1d8122336f851a508a1ed04e479c34985bf96",
   1243  1.3  christos     },
   1244  1.1  christos     {
   1245  1.3  christos         /* P-521 */
   1246  1.3  christos         NID_secp521r1,
   1247  1.3  christos         521,
   1248  1.3  christos         /* p */
   1249  1.3  christos         "1ff"
   1250  1.3  christos         "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
   1251  1.3  christos         "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
   1252  1.3  christos         /* a */
   1253  1.3  christos         "1ff"
   1254  1.3  christos         "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
   1255  1.3  christos         "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc",
   1256  1.3  christos         /* b */
   1257  1.3  christos         "051"
   1258  1.3  christos         "953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e1"
   1259  1.3  christos         "56193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00",
   1260  1.3  christos         /* Qx */
   1261  1.3  christos         "0098"
   1262  1.3  christos         "e91eef9a68452822309c52fab453f5f117c1da8ed796b255e9ab8f6410cca16e"
   1263  1.3  christos         "59df403a6bdc6ca467a37056b1e54b3005d8ac030decfeb68df18b171885d5c4",
   1264  1.3  christos         /* Qy */
   1265  1.3  christos         "0164"
   1266  1.3  christos         "350c321aecfc1cca1ba4364c9b15656150b4b78d6a48d7d28e7f31985ef17be8"
   1267  1.3  christos         "554376b72900712c4b83ad668327231526e313f5f092999a4632fd50d946bc2e",
   1268  1.3  christos         /* Gx */
   1269  1.3  christos         "c6"
   1270  1.3  christos         "858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dba"
   1271  1.3  christos         "a14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
   1272  1.3  christos         /* Gy */
   1273  1.3  christos         "118"
   1274  1.3  christos         "39296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c"
   1275  1.3  christos         "97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
   1276  1.3  christos         /* order */
   1277  1.3  christos         "1ff"
   1278  1.3  christos         "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"
   1279  1.3  christos         "51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
   1280  1.3  christos         /* d */
   1281  1.3  christos         "0100"
   1282  1.3  christos         "085f47b8e1b8b11b7eb33028c0b2888e304bfc98501955b45bba1478dc184eee"
   1283  1.3  christos         "df09b86a5f7c21994406072787205e69a63709fe35aa93ba333514b24f961722",
   1284  1.3  christos     },
   1285  1.1  christos };
   1286  1.1  christos 
   1287  1.1  christos static int nistp_single_test(int idx)
   1288  1.1  christos {
   1289  1.1  christos     const struct nistp_test_params *test = nistp_tests_params + idx;
   1290  1.1  christos     BN_CTX *ctx = NULL;
   1291  1.1  christos     BIGNUM *p = NULL, *a = NULL, *b = NULL, *x = NULL, *y = NULL;
   1292  1.1  christos     BIGNUM *n = NULL, *m = NULL, *order = NULL, *yplusone = NULL;
   1293  1.1  christos     EC_GROUP *NISTP = NULL;
   1294  1.1  christos     EC_POINT *G = NULL, *P = NULL, *Q = NULL, *Q_CHECK = NULL;
   1295  1.1  christos     int r = 0;
   1296  1.1  christos 
   1297  1.1  christos     TEST_note("NIST curve P-%d (optimised implementation):",
   1298  1.3  christos         test->degree);
   1299  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
   1300  1.1  christos         || !TEST_ptr(p = BN_new())
   1301  1.1  christos         || !TEST_ptr(a = BN_new())
   1302  1.1  christos         || !TEST_ptr(b = BN_new())
   1303  1.1  christos         || !TEST_ptr(x = BN_new())
   1304  1.1  christos         || !TEST_ptr(y = BN_new())
   1305  1.1  christos         || !TEST_ptr(m = BN_new())
   1306  1.1  christos         || !TEST_ptr(n = BN_new())
   1307  1.1  christos         || !TEST_ptr(order = BN_new())
   1308  1.1  christos         || !TEST_ptr(yplusone = BN_new())
   1309  1.1  christos 
   1310  1.1  christos         || !TEST_ptr(NISTP = EC_GROUP_new_by_curve_name(test->nid))
   1311  1.1  christos         || !TEST_true(BN_hex2bn(&p, test->p))
   1312  1.1  christos         || !TEST_int_eq(1, BN_check_prime(p, ctx, NULL))
   1313  1.1  christos         || !TEST_true(BN_hex2bn(&a, test->a))
   1314  1.1  christos         || !TEST_true(BN_hex2bn(&b, test->b))
   1315  1.1  christos         || !TEST_true(EC_GROUP_set_curve(NISTP, p, a, b, ctx))
   1316  1.1  christos         || !TEST_ptr(G = EC_POINT_new(NISTP))
   1317  1.1  christos         || !TEST_ptr(P = EC_POINT_new(NISTP))
   1318  1.1  christos         || !TEST_ptr(Q = EC_POINT_new(NISTP))
   1319  1.1  christos         || !TEST_ptr(Q_CHECK = EC_POINT_new(NISTP))
   1320  1.1  christos         || !TEST_true(BN_hex2bn(&x, test->Qx))
   1321  1.1  christos         || !TEST_true(BN_hex2bn(&y, test->Qy))
   1322  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
   1323  1.3  christos         /*
   1324  1.3  christos          * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
   1325  1.3  christos          * and therefore setting the coordinates should fail.
   1326  1.3  christos          */
   1327  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(NISTP, Q_CHECK, x,
   1328  1.3  christos             yplusone, ctx))
   1329  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(NISTP, Q_CHECK, x, y,
   1330  1.3  christos             ctx))
   1331  1.1  christos         || !TEST_true(BN_hex2bn(&x, test->Gx))
   1332  1.1  christos         || !TEST_true(BN_hex2bn(&y, test->Gy))
   1333  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(NISTP, G, x, y, ctx))
   1334  1.1  christos         || !TEST_true(BN_hex2bn(&order, test->order))
   1335  1.1  christos         || !TEST_true(EC_GROUP_set_generator(NISTP, G, order, BN_value_one()))
   1336  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(NISTP), test->degree))
   1337  1.1  christos         goto err;
   1338  1.1  christos 
   1339  1.1  christos     TEST_note("NIST test vectors ... ");
   1340  1.1  christos     if (!TEST_true(BN_hex2bn(&n, test->d)))
   1341  1.1  christos         goto err;
   1342  1.1  christos     /* fixed point multiplication */
   1343  1.1  christos     EC_POINT_mul(NISTP, Q, n, NULL, NULL, ctx);
   1344  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
   1345  1.1  christos         goto err;
   1346  1.1  christos     /* random point multiplication */
   1347  1.1  christos     EC_POINT_mul(NISTP, Q, NULL, G, n, ctx);
   1348  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx))
   1349  1.1  christos 
   1350  1.1  christos         /* set generator to P = 2*G, where G is the standard generator */
   1351  1.1  christos         || !TEST_true(EC_POINT_dbl(NISTP, P, G, ctx))
   1352  1.1  christos         || !TEST_true(EC_GROUP_set_generator(NISTP, P, order, BN_value_one()))
   1353  1.1  christos         /* set the scalar to m=n/2, where n is the NIST test scalar */
   1354  1.1  christos         || !TEST_true(BN_rshift(m, n, 1)))
   1355  1.1  christos         goto err;
   1356  1.1  christos 
   1357  1.1  christos     /* test the non-standard generator */
   1358  1.1  christos     /* fixed point multiplication */
   1359  1.1  christos     EC_POINT_mul(NISTP, Q, m, NULL, NULL, ctx);
   1360  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
   1361  1.1  christos         goto err;
   1362  1.1  christos     /* random point multiplication */
   1363  1.1  christos     EC_POINT_mul(NISTP, Q, NULL, P, m, ctx);
   1364  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx))
   1365  1.1  christos #ifndef OPENSSL_NO_DEPRECATED_3_0
   1366  1.1  christos         /* We have not performed precomp so this should be false */
   1367  1.1  christos         || !TEST_false(EC_GROUP_have_precompute_mult(NISTP))
   1368  1.1  christos         /* now repeat all tests with precomputation */
   1369  1.1  christos         || !TEST_true(EC_GROUP_precompute_mult(NISTP, ctx))
   1370  1.1  christos #endif
   1371  1.3  christos     )
   1372  1.1  christos         goto err;
   1373  1.1  christos 
   1374  1.1  christos     /* fixed point multiplication */
   1375  1.1  christos     EC_POINT_mul(NISTP, Q, m, NULL, NULL, ctx);
   1376  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
   1377  1.1  christos         goto err;
   1378  1.1  christos     /* random point multiplication */
   1379  1.1  christos     EC_POINT_mul(NISTP, Q, NULL, P, m, ctx);
   1380  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx))
   1381  1.1  christos 
   1382  1.3  christos         /* reset generator */
   1383  1.1  christos         || !TEST_true(EC_GROUP_set_generator(NISTP, G, order, BN_value_one())))
   1384  1.1  christos         goto err;
   1385  1.1  christos     /* fixed point multiplication */
   1386  1.1  christos     EC_POINT_mul(NISTP, Q, n, NULL, NULL, ctx);
   1387  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
   1388  1.1  christos         goto err;
   1389  1.1  christos     /* random point multiplication */
   1390  1.1  christos     EC_POINT_mul(NISTP, Q, NULL, G, n, ctx);
   1391  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
   1392  1.1  christos         goto err;
   1393  1.1  christos 
   1394  1.1  christos     /* regression test for felem_neg bug */
   1395  1.1  christos     if (!TEST_true(BN_set_word(m, 32))
   1396  1.1  christos         || !TEST_true(BN_set_word(n, 31))
   1397  1.1  christos         || !TEST_true(EC_POINT_copy(P, G))
   1398  1.1  christos         || !TEST_true(EC_POINT_invert(NISTP, P, ctx))
   1399  1.1  christos         || !TEST_true(EC_POINT_mul(NISTP, Q, m, P, n, ctx))
   1400  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, G, ctx)))
   1401  1.3  christos         goto err;
   1402  1.1  christos 
   1403  1.1  christos     r = 1;
   1404  1.1  christos err:
   1405  1.1  christos     EC_GROUP_free(NISTP);
   1406  1.1  christos     EC_POINT_free(G);
   1407  1.1  christos     EC_POINT_free(P);
   1408  1.1  christos     EC_POINT_free(Q);
   1409  1.1  christos     EC_POINT_free(Q_CHECK);
   1410  1.1  christos     BN_free(n);
   1411  1.1  christos     BN_free(m);
   1412  1.1  christos     BN_free(p);
   1413  1.1  christos     BN_free(a);
   1414  1.1  christos     BN_free(b);
   1415  1.1  christos     BN_free(x);
   1416  1.1  christos     BN_free(y);
   1417  1.1  christos     BN_free(order);
   1418  1.1  christos     BN_free(yplusone);
   1419  1.1  christos     BN_CTX_free(ctx);
   1420  1.1  christos     return r;
   1421  1.1  christos }
   1422  1.1  christos 
   1423  1.1  christos static const unsigned char p521_named[] = {
   1424  1.3  christos     0x06,
   1425  1.3  christos     0x05,
   1426  1.3  christos     0x2b,
   1427  1.3  christos     0x81,
   1428  1.3  christos     0x04,
   1429  1.3  christos     0x00,
   1430  1.3  christos     0x23,
   1431  1.1  christos };
   1432  1.1  christos 
   1433  1.1  christos static const unsigned char p521_explicit[] = {
   1434  1.3  christos     0x30,
   1435  1.3  christos     0x82,
   1436  1.3  christos     0x01,
   1437  1.3  christos     0xc3,
   1438  1.3  christos     0x02,
   1439  1.3  christos     0x01,
   1440  1.3  christos     0x01,
   1441  1.3  christos     0x30,
   1442  1.3  christos     0x4d,
   1443  1.3  christos     0x06,
   1444  1.3  christos     0x07,
   1445  1.3  christos     0x2a,
   1446  1.3  christos     0x86,
   1447  1.3  christos     0x48,
   1448  1.3  christos     0xce,
   1449  1.3  christos     0x3d,
   1450  1.3  christos     0x01,
   1451  1.3  christos     0x01,
   1452  1.3  christos     0x02,
   1453  1.3  christos     0x42,
   1454  1.3  christos     0x01,
   1455  1.3  christos     0xff,
   1456  1.3  christos     0xff,
   1457  1.3  christos     0xff,
   1458  1.3  christos     0xff,
   1459  1.3  christos     0xff,
   1460  1.3  christos     0xff,
   1461  1.3  christos     0xff,
   1462  1.3  christos     0xff,
   1463  1.3  christos     0xff,
   1464  1.3  christos     0xff,
   1465  1.3  christos     0xff,
   1466  1.3  christos     0xff,
   1467  1.3  christos     0xff,
   1468  1.3  christos     0xff,
   1469  1.3  christos     0xff,
   1470  1.3  christos     0xff,
   1471  1.3  christos     0xff,
   1472  1.3  christos     0xff,
   1473  1.3  christos     0xff,
   1474  1.3  christos     0xff,
   1475  1.3  christos     0xff,
   1476  1.3  christos     0xff,
   1477  1.3  christos     0xff,
   1478  1.3  christos     0xff,
   1479  1.3  christos     0xff,
   1480  1.3  christos     0xff,
   1481  1.3  christos     0xff,
   1482  1.3  christos     0xff,
   1483  1.3  christos     0xff,
   1484  1.3  christos     0xff,
   1485  1.3  christos     0xff,
   1486  1.3  christos     0xff,
   1487  1.3  christos     0xff,
   1488  1.3  christos     0xff,
   1489  1.3  christos     0xff,
   1490  1.3  christos     0xff,
   1491  1.3  christos     0xff,
   1492  1.3  christos     0xff,
   1493  1.3  christos     0xff,
   1494  1.3  christos     0xff,
   1495  1.3  christos     0xff,
   1496  1.3  christos     0xff,
   1497  1.3  christos     0xff,
   1498  1.3  christos     0xff,
   1499  1.3  christos     0xff,
   1500  1.3  christos     0xff,
   1501  1.3  christos     0xff,
   1502  1.3  christos     0xff,
   1503  1.3  christos     0xff,
   1504  1.3  christos     0xff,
   1505  1.3  christos     0xff,
   1506  1.3  christos     0xff,
   1507  1.3  christos     0xff,
   1508  1.3  christos     0xff,
   1509  1.3  christos     0xff,
   1510  1.3  christos     0xff,
   1511  1.3  christos     0xff,
   1512  1.3  christos     0xff,
   1513  1.3  christos     0xff,
   1514  1.3  christos     0xff,
   1515  1.3  christos     0xff,
   1516  1.3  christos     0xff,
   1517  1.3  christos     0xff,
   1518  1.3  christos     0xff,
   1519  1.3  christos     0xff,
   1520  1.3  christos     0x30,
   1521  1.3  christos     0x81,
   1522  1.3  christos     0x9f,
   1523  1.3  christos     0x04,
   1524  1.3  christos     0x42,
   1525  1.3  christos     0x01,
   1526  1.3  christos     0xff,
   1527  1.3  christos     0xff,
   1528  1.3  christos     0xff,
   1529  1.3  christos     0xff,
   1530  1.3  christos     0xff,
   1531  1.3  christos     0xff,
   1532  1.3  christos     0xff,
   1533  1.3  christos     0xff,
   1534  1.3  christos     0xff,
   1535  1.3  christos     0xff,
   1536  1.3  christos     0xff,
   1537  1.3  christos     0xff,
   1538  1.3  christos     0xff,
   1539  1.3  christos     0xff,
   1540  1.3  christos     0xff,
   1541  1.3  christos     0xff,
   1542  1.3  christos     0xff,
   1543  1.3  christos     0xff,
   1544  1.3  christos     0xff,
   1545  1.3  christos     0xff,
   1546  1.3  christos     0xff,
   1547  1.3  christos     0xff,
   1548  1.3  christos     0xff,
   1549  1.3  christos     0xff,
   1550  1.3  christos     0xff,
   1551  1.3  christos     0xff,
   1552  1.3  christos     0xff,
   1553  1.3  christos     0xff,
   1554  1.3  christos     0xff,
   1555  1.3  christos     0xff,
   1556  1.3  christos     0xff,
   1557  1.3  christos     0xff,
   1558  1.3  christos     0xff,
   1559  1.3  christos     0xff,
   1560  1.3  christos     0xff,
   1561  1.3  christos     0xff,
   1562  1.3  christos     0xff,
   1563  1.3  christos     0xff,
   1564  1.3  christos     0xff,
   1565  1.3  christos     0xff,
   1566  1.3  christos     0xff,
   1567  1.3  christos     0xff,
   1568  1.3  christos     0xff,
   1569  1.3  christos     0xff,
   1570  1.3  christos     0xff,
   1571  1.3  christos     0xff,
   1572  1.3  christos     0xff,
   1573  1.3  christos     0xff,
   1574  1.3  christos     0xff,
   1575  1.3  christos     0xff,
   1576  1.3  christos     0xff,
   1577  1.3  christos     0xff,
   1578  1.3  christos     0xff,
   1579  1.3  christos     0xff,
   1580  1.3  christos     0xff,
   1581  1.3  christos     0xff,
   1582  1.3  christos     0xff,
   1583  1.3  christos     0xff,
   1584  1.3  christos     0xff,
   1585  1.3  christos     0xff,
   1586  1.3  christos     0xff,
   1587  1.3  christos     0xff,
   1588  1.3  christos     0xff,
   1589  1.3  christos     0xff,
   1590  1.3  christos     0xfc,
   1591  1.3  christos     0x04,
   1592  1.3  christos     0x42,
   1593  1.3  christos     0x00,
   1594  1.3  christos     0x51,
   1595  1.3  christos     0x95,
   1596  1.3  christos     0x3e,
   1597  1.3  christos     0xb9,
   1598  1.3  christos     0x61,
   1599  1.3  christos     0x8e,
   1600  1.3  christos     0x1c,
   1601  1.3  christos     0x9a,
   1602  1.3  christos     0x1f,
   1603  1.3  christos     0x92,
   1604  1.3  christos     0x9a,
   1605  1.3  christos     0x21,
   1606  1.3  christos     0xa0,
   1607  1.3  christos     0xb6,
   1608  1.3  christos     0x85,
   1609  1.3  christos     0x40,
   1610  1.3  christos     0xee,
   1611  1.3  christos     0xa2,
   1612  1.3  christos     0xda,
   1613  1.3  christos     0x72,
   1614  1.3  christos     0x5b,
   1615  1.3  christos     0x99,
   1616  1.3  christos     0xb3,
   1617  1.3  christos     0x15,
   1618  1.3  christos     0xf3,
   1619  1.3  christos     0xb8,
   1620  1.3  christos     0xb4,
   1621  1.3  christos     0x89,
   1622  1.3  christos     0x91,
   1623  1.3  christos     0x8e,
   1624  1.3  christos     0xf1,
   1625  1.3  christos     0x09,
   1626  1.3  christos     0xe1,
   1627  1.3  christos     0x56,
   1628  1.3  christos     0x19,
   1629  1.3  christos     0x39,
   1630  1.3  christos     0x51,
   1631  1.3  christos     0xec,
   1632  1.3  christos     0x7e,
   1633  1.3  christos     0x93,
   1634  1.3  christos     0x7b,
   1635  1.3  christos     0x16,
   1636  1.3  christos     0x52,
   1637  1.3  christos     0xc0,
   1638  1.3  christos     0xbd,
   1639  1.3  christos     0x3b,
   1640  1.3  christos     0xb1,
   1641  1.3  christos     0xbf,
   1642  1.3  christos     0x07,
   1643  1.3  christos     0x35,
   1644  1.3  christos     0x73,
   1645  1.3  christos     0xdf,
   1646  1.3  christos     0x88,
   1647  1.3  christos     0x3d,
   1648  1.3  christos     0x2c,
   1649  1.3  christos     0x34,
   1650  1.3  christos     0xf1,
   1651  1.3  christos     0xef,
   1652  1.3  christos     0x45,
   1653  1.3  christos     0x1f,
   1654  1.3  christos     0xd4,
   1655  1.3  christos     0x6b,
   1656  1.3  christos     0x50,
   1657  1.3  christos     0x3f,
   1658  1.3  christos     0x00,
   1659  1.3  christos     0x03,
   1660  1.3  christos     0x15,
   1661  1.3  christos     0x00,
   1662  1.3  christos     0xd0,
   1663  1.3  christos     0x9e,
   1664  1.3  christos     0x88,
   1665  1.3  christos     0x00,
   1666  1.3  christos     0x29,
   1667  1.3  christos     0x1c,
   1668  1.3  christos     0xb8,
   1669  1.3  christos     0x53,
   1670  1.3  christos     0x96,
   1671  1.3  christos     0xcc,
   1672  1.3  christos     0x67,
   1673  1.3  christos     0x17,
   1674  1.3  christos     0x39,
   1675  1.3  christos     0x32,
   1676  1.3  christos     0x84,
   1677  1.3  christos     0xaa,
   1678  1.3  christos     0xa0,
   1679  1.3  christos     0xda,
   1680  1.3  christos     0x64,
   1681  1.3  christos     0xba,
   1682  1.3  christos     0x04,
   1683  1.3  christos     0x81,
   1684  1.3  christos     0x85,
   1685  1.3  christos     0x04,
   1686  1.3  christos     0x00,
   1687  1.3  christos     0xc6,
   1688  1.3  christos     0x85,
   1689  1.3  christos     0x8e,
   1690  1.3  christos     0x06,
   1691  1.3  christos     0xb7,
   1692  1.3  christos     0x04,
   1693  1.3  christos     0x04,
   1694  1.3  christos     0xe9,
   1695  1.3  christos     0xcd,
   1696  1.3  christos     0x9e,
   1697  1.3  christos     0x3e,
   1698  1.3  christos     0xcb,
   1699  1.3  christos     0x66,
   1700  1.3  christos     0x23,
   1701  1.3  christos     0x95,
   1702  1.3  christos     0xb4,
   1703  1.3  christos     0x42,
   1704  1.3  christos     0x9c,
   1705  1.3  christos     0x64,
   1706  1.3  christos     0x81,
   1707  1.3  christos     0x39,
   1708  1.3  christos     0x05,
   1709  1.3  christos     0x3f,
   1710  1.3  christos     0xb5,
   1711  1.3  christos     0x21,
   1712  1.3  christos     0xf8,
   1713  1.3  christos     0x28,
   1714  1.3  christos     0xaf,
   1715  1.3  christos     0x60,
   1716  1.3  christos     0x6b,
   1717  1.3  christos     0x4d,
   1718  1.3  christos     0x3d,
   1719  1.3  christos     0xba,
   1720  1.3  christos     0xa1,
   1721  1.3  christos     0x4b,
   1722  1.3  christos     0x5e,
   1723  1.3  christos     0x77,
   1724  1.3  christos     0xef,
   1725  1.3  christos     0xe7,
   1726  1.3  christos     0x59,
   1727  1.3  christos     0x28,
   1728  1.3  christos     0xfe,
   1729  1.3  christos     0x1d,
   1730  1.3  christos     0xc1,
   1731  1.3  christos     0x27,
   1732  1.3  christos     0xa2,
   1733  1.3  christos     0xff,
   1734  1.3  christos     0xa8,
   1735  1.3  christos     0xde,
   1736  1.3  christos     0x33,
   1737  1.3  christos     0x48,
   1738  1.3  christos     0xb3,
   1739  1.3  christos     0xc1,
   1740  1.3  christos     0x85,
   1741  1.3  christos     0x6a,
   1742  1.3  christos     0x42,
   1743  1.3  christos     0x9b,
   1744  1.3  christos     0xf9,
   1745  1.3  christos     0x7e,
   1746  1.3  christos     0x7e,
   1747  1.3  christos     0x31,
   1748  1.3  christos     0xc2,
   1749  1.3  christos     0xe5,
   1750  1.3  christos     0xbd,
   1751  1.3  christos     0x66,
   1752  1.3  christos     0x01,
   1753  1.3  christos     0x18,
   1754  1.3  christos     0x39,
   1755  1.3  christos     0x29,
   1756  1.3  christos     0x6a,
   1757  1.3  christos     0x78,
   1758  1.3  christos     0x9a,
   1759  1.3  christos     0x3b,
   1760  1.3  christos     0xc0,
   1761  1.3  christos     0x04,
   1762  1.3  christos     0x5c,
   1763  1.3  christos     0x8a,
   1764  1.3  christos     0x5f,
   1765  1.3  christos     0xb4,
   1766  1.3  christos     0x2c,
   1767  1.3  christos     0x7d,
   1768  1.3  christos     0x1b,
   1769  1.3  christos     0xd9,
   1770  1.3  christos     0x98,
   1771  1.3  christos     0xf5,
   1772  1.3  christos     0x44,
   1773  1.3  christos     0x49,
   1774  1.3  christos     0x57,
   1775  1.3  christos     0x9b,
   1776  1.3  christos     0x44,
   1777  1.3  christos     0x68,
   1778  1.3  christos     0x17,
   1779  1.3  christos     0xaf,
   1780  1.3  christos     0xbd,
   1781  1.3  christos     0x17,
   1782  1.3  christos     0x27,
   1783  1.3  christos     0x3e,
   1784  1.3  christos     0x66,
   1785  1.3  christos     0x2c,
   1786  1.3  christos     0x97,
   1787  1.3  christos     0xee,
   1788  1.3  christos     0x72,
   1789  1.3  christos     0x99,
   1790  1.3  christos     0x5e,
   1791  1.3  christos     0xf4,
   1792  1.3  christos     0x26,
   1793  1.3  christos     0x40,
   1794  1.3  christos     0xc5,
   1795  1.3  christos     0x50,
   1796  1.3  christos     0xb9,
   1797  1.3  christos     0x01,
   1798  1.3  christos     0x3f,
   1799  1.3  christos     0xad,
   1800  1.3  christos     0x07,
   1801  1.3  christos     0x61,
   1802  1.3  christos     0x35,
   1803  1.3  christos     0x3c,
   1804  1.3  christos     0x70,
   1805  1.3  christos     0x86,
   1806  1.3  christos     0xa2,
   1807  1.3  christos     0x72,
   1808  1.3  christos     0xc2,
   1809  1.3  christos     0x40,
   1810  1.3  christos     0x88,
   1811  1.3  christos     0xbe,
   1812  1.3  christos     0x94,
   1813  1.3  christos     0x76,
   1814  1.3  christos     0x9f,
   1815  1.3  christos     0xd1,
   1816  1.3  christos     0x66,
   1817  1.3  christos     0x50,
   1818  1.3  christos     0x02,
   1819  1.3  christos     0x42,
   1820  1.3  christos     0x01,
   1821  1.3  christos     0xff,
   1822  1.3  christos     0xff,
   1823  1.3  christos     0xff,
   1824  1.3  christos     0xff,
   1825  1.3  christos     0xff,
   1826  1.3  christos     0xff,
   1827  1.3  christos     0xff,
   1828  1.3  christos     0xff,
   1829  1.3  christos     0xff,
   1830  1.3  christos     0xff,
   1831  1.3  christos     0xff,
   1832  1.3  christos     0xff,
   1833  1.3  christos     0xff,
   1834  1.3  christos     0xff,
   1835  1.3  christos     0xff,
   1836  1.3  christos     0xff,
   1837  1.3  christos     0xff,
   1838  1.3  christos     0xff,
   1839  1.3  christos     0xff,
   1840  1.3  christos     0xff,
   1841  1.3  christos     0xff,
   1842  1.3  christos     0xff,
   1843  1.3  christos     0xff,
   1844  1.3  christos     0xff,
   1845  1.3  christos     0xff,
   1846  1.3  christos     0xff,
   1847  1.3  christos     0xff,
   1848  1.3  christos     0xff,
   1849  1.3  christos     0xff,
   1850  1.3  christos     0xff,
   1851  1.3  christos     0xff,
   1852  1.3  christos     0xff,
   1853  1.3  christos     0xfa,
   1854  1.3  christos     0x51,
   1855  1.3  christos     0x86,
   1856  1.3  christos     0x87,
   1857  1.3  christos     0x83,
   1858  1.3  christos     0xbf,
   1859  1.3  christos     0x2f,
   1860  1.3  christos     0x96,
   1861  1.3  christos     0x6b,
   1862  1.3  christos     0x7f,
   1863  1.3  christos     0xcc,
   1864  1.3  christos     0x01,
   1865  1.3  christos     0x48,
   1866  1.3  christos     0xf7,
   1867  1.3  christos     0x09,
   1868  1.3  christos     0xa5,
   1869  1.3  christos     0xd0,
   1870  1.3  christos     0x3b,
   1871  1.3  christos     0xb5,
   1872  1.3  christos     0xc9,
   1873  1.3  christos     0xb8,
   1874  1.3  christos     0x89,
   1875  1.3  christos     0x9c,
   1876  1.3  christos     0x47,
   1877  1.3  christos     0xae,
   1878  1.3  christos     0xbb,
   1879  1.3  christos     0x6f,
   1880  1.3  christos     0xb7,
   1881  1.3  christos     0x1e,
   1882  1.3  christos     0x91,
   1883  1.3  christos     0x38,
   1884  1.3  christos     0x64,
   1885  1.3  christos     0x09,
   1886  1.3  christos     0x02,
   1887  1.3  christos     0x01,
   1888  1.3  christos     0x01,
   1889  1.1  christos };
   1890  1.1  christos 
   1891  1.1  christos /*
   1892  1.1  christos  * This test validates a named curve's group parameters using
   1893  1.1  christos  * EC_GROUP_check_named_curve(). It also checks that modifying any of the
   1894  1.1  christos  * group parameters results in the curve not being valid.
   1895  1.1  christos  */
   1896  1.1  christos static int check_named_curve_test(int id)
   1897  1.1  christos {
   1898  1.1  christos     int ret = 0, nid, field_nid, has_seed;
   1899  1.1  christos     EC_GROUP *group = NULL, *gtest = NULL;
   1900  1.1  christos     const EC_POINT *group_gen = NULL;
   1901  1.1  christos     EC_POINT *other_gen = NULL;
   1902  1.1  christos     BIGNUM *group_p = NULL, *group_a = NULL, *group_b = NULL;
   1903  1.1  christos     BIGNUM *other_p = NULL, *other_a = NULL, *other_b = NULL;
   1904  1.1  christos     BIGNUM *group_cofactor = NULL, *other_cofactor = NULL;
   1905  1.1  christos     BIGNUM *other_order = NULL;
   1906  1.1  christos     const BIGNUM *group_order = NULL;
   1907  1.1  christos     BN_CTX *bn_ctx = NULL;
   1908  1.1  christos     static const unsigned char invalid_seed[] = "THIS IS NOT A VALID SEED";
   1909  1.1  christos     static size_t invalid_seed_len = sizeof(invalid_seed);
   1910  1.1  christos 
   1911  1.1  christos     /* Do some setup */
   1912  1.1  christos     nid = curves[id].nid;
   1913  1.1  christos     if (!TEST_ptr(bn_ctx = BN_CTX_new())
   1914  1.1  christos         || !TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))
   1915  1.1  christos         || !TEST_ptr(gtest = EC_GROUP_dup(group))
   1916  1.1  christos         || !TEST_ptr(group_p = BN_new())
   1917  1.1  christos         || !TEST_ptr(group_a = BN_new())
   1918  1.1  christos         || !TEST_ptr(group_b = BN_new())
   1919  1.1  christos         || !TEST_ptr(group_cofactor = BN_new())
   1920  1.1  christos         || !TEST_ptr(group_gen = EC_GROUP_get0_generator(group))
   1921  1.1  christos         || !TEST_ptr(group_order = EC_GROUP_get0_order(group))
   1922  1.1  christos         || !TEST_true(EC_GROUP_get_cofactor(group, group_cofactor, NULL))
   1923  1.1  christos         || !TEST_true(EC_GROUP_get_curve(group, group_p, group_a, group_b, NULL))
   1924  1.1  christos         || !TEST_ptr(other_gen = EC_POINT_dup(group_gen, group))
   1925  1.1  christos         || !TEST_true(EC_POINT_add(group, other_gen, group_gen, group_gen, NULL))
   1926  1.1  christos         || !TEST_ptr(other_order = BN_dup(group_order))
   1927  1.1  christos         || !TEST_true(BN_add_word(other_order, 1))
   1928  1.1  christos         || !TEST_ptr(other_a = BN_dup(group_a))
   1929  1.1  christos         || !TEST_true(BN_add_word(other_a, 1))
   1930  1.1  christos         || !TEST_ptr(other_b = BN_dup(group_b))
   1931  1.1  christos         || !TEST_true(BN_add_word(other_b, 1))
   1932  1.1  christos         || !TEST_ptr(other_cofactor = BN_dup(group_cofactor))
   1933  1.1  christos         || !TEST_true(BN_add_word(other_cofactor, 1)))
   1934  1.1  christos         goto err;
   1935  1.1  christos 
   1936  1.1  christos     /* Determine if the built-in curve has a seed field set */
   1937  1.1  christos     has_seed = (EC_GROUP_get_seed_len(group) > 0);
   1938  1.1  christos     field_nid = EC_GROUP_get_field_type(group);
   1939  1.1  christos     if (field_nid == NID_X9_62_characteristic_two_field) {
   1940  1.1  christos         if (!TEST_ptr(other_p = BN_dup(group_p))
   1941  1.1  christos             || !TEST_true(BN_lshift1(other_p, other_p)))
   1942  1.1  christos             goto err;
   1943  1.1  christos     } else {
   1944  1.1  christos         if (!TEST_ptr(other_p = BN_dup(group_p)))
   1945  1.1  christos             goto err;
   1946  1.1  christos         /*
   1947  1.1  christos          * Just choosing any arbitrary prime does not work..
   1948  1.1  christos          * Setting p via ec_GFp_nist_group_set_curve() needs the prime to be a
   1949  1.1  christos          * nist prime. So only select one of these as an alternate prime.
   1950  1.1  christos          */
   1951  1.1  christos         if (!TEST_ptr(BN_copy(other_p,
   1952  1.3  christos                 BN_ucmp(BN_get0_nist_prime_192(), other_p) == 0 ? BN_get0_nist_prime_256() : BN_get0_nist_prime_192())))
   1953  1.1  christos             goto err;
   1954  1.1  christos     }
   1955  1.1  christos 
   1956  1.1  christos     /* Passes because this is a valid curve */
   1957  1.1  christos     if (!TEST_int_eq(EC_GROUP_check_named_curve(group, 0, NULL), nid)
   1958  1.1  christos         /* Only NIST curves pass */
   1959  1.1  christos         || !TEST_int_eq(EC_GROUP_check_named_curve(group, 1, NULL),
   1960  1.3  christos             EC_curve_nid2nist(nid) != NULL ? nid : NID_undef))
   1961  1.1  christos         goto err;
   1962  1.1  christos 
   1963  1.1  christos     /* Fail if the curve name doesn't match the parameters */
   1964  1.1  christos     EC_GROUP_set_curve_name(group, nid + 1);
   1965  1.1  christos     ERR_set_mark();
   1966  1.1  christos     if (!TEST_int_le(EC_GROUP_check_named_curve(group, 0, NULL), 0))
   1967  1.1  christos         goto err;
   1968  1.1  christos     ERR_pop_to_mark();
   1969  1.1  christos 
   1970  1.1  christos     /* Restore curve name and ensure it's passing */
   1971  1.1  christos     EC_GROUP_set_curve_name(group, nid);
   1972  1.1  christos     if (!TEST_int_eq(EC_GROUP_check_named_curve(group, 0, NULL), nid))
   1973  1.1  christos         goto err;
   1974  1.1  christos 
   1975  1.1  christos     if (!TEST_int_eq(EC_GROUP_set_seed(group, invalid_seed, invalid_seed_len),
   1976  1.3  christos             invalid_seed_len))
   1977  1.1  christos         goto err;
   1978  1.1  christos 
   1979  1.1  christos     if (has_seed) {
   1980  1.1  christos         /*
   1981  1.1  christos          * If the built-in curve has a seed and we set the seed to another value
   1982  1.1  christos          * then it will fail the check.
   1983  1.1  christos          */
   1984  1.1  christos         if (!TEST_int_eq(EC_GROUP_check_named_curve(group, 0, NULL), 0))
   1985  1.1  christos             goto err;
   1986  1.1  christos     } else {
   1987  1.1  christos         /*
   1988  1.1  christos          * If the built-in curve does not have a seed then setting the seed will
   1989  1.1  christos          * pass the check (as the seed is optional).
   1990  1.1  christos          */
   1991  1.1  christos         if (!TEST_int_eq(EC_GROUP_check_named_curve(group, 0, NULL), nid))
   1992  1.1  christos             goto err;
   1993  1.1  christos     }
   1994  1.1  christos     /* Pass if the seed is unknown (as it is optional) */
   1995  1.1  christos     if (!TEST_int_eq(EC_GROUP_set_seed(group, NULL, 0), 1)
   1996  1.1  christos         || !TEST_int_eq(EC_GROUP_check_named_curve(group, 0, NULL), nid))
   1997  1.1  christos         goto err;
   1998  1.1  christos 
   1999  1.1  christos     /* Check that a duped group passes */
   2000  1.1  christos     if (!TEST_int_eq(EC_GROUP_check_named_curve(gtest, 0, NULL), nid))
   2001  1.1  christos         goto err;
   2002  1.1  christos 
   2003  1.1  christos     /* check that changing any generator parameter fails */
   2004  1.1  christos     if (!TEST_true(EC_GROUP_set_generator(gtest, other_gen, group_order,
   2005  1.3  christos             group_cofactor))
   2006  1.1  christos         || !TEST_int_eq(EC_GROUP_check_named_curve(gtest, 0, NULL), 0)
   2007  1.1  christos         || !TEST_true(EC_GROUP_set_generator(gtest, group_gen, other_order,
   2008  1.3  christos             group_cofactor))
   2009  1.1  christos         || !TEST_int_eq(EC_GROUP_check_named_curve(gtest, 0, NULL), 0)
   2010  1.1  christos         /* The order is not an optional field, so this should fail */
   2011  1.1  christos         || !TEST_false(EC_GROUP_set_generator(gtest, group_gen, NULL,
   2012  1.3  christos             group_cofactor))
   2013  1.1  christos         || !TEST_true(EC_GROUP_set_generator(gtest, group_gen, group_order,
   2014  1.3  christos             other_cofactor))
   2015  1.1  christos         || !TEST_int_eq(EC_GROUP_check_named_curve(gtest, 0, NULL), 0)
   2016  1.1  christos         /* Check that if the cofactor is not set then it still passes */
   2017  1.1  christos         || !TEST_true(EC_GROUP_set_generator(gtest, group_gen, group_order,
   2018  1.3  christos             NULL))
   2019  1.1  christos         || !TEST_int_eq(EC_GROUP_check_named_curve(gtest, 0, NULL), nid)
   2020  1.1  christos         /* check that restoring the generator passes */
   2021  1.1  christos         || !TEST_true(EC_GROUP_set_generator(gtest, group_gen, group_order,
   2022  1.3  christos             group_cofactor))
   2023  1.1  christos         || !TEST_int_eq(EC_GROUP_check_named_curve(gtest, 0, NULL), nid))
   2024  1.1  christos         goto err;
   2025  1.1  christos 
   2026  1.1  christos     /*
   2027  1.1  christos      * check that changing any curve parameter fails
   2028  1.1  christos      *
   2029  1.1  christos      * Setting arbitrary p, a or b might fail for some EC_GROUPs
   2030  1.1  christos      * depending on the internal EC_METHOD implementation, hence run
   2031  1.1  christos      * these tests conditionally to the success of EC_GROUP_set_curve().
   2032  1.1  christos      */
   2033  1.1  christos     ERR_set_mark();
   2034  1.1  christos     if (EC_GROUP_set_curve(gtest, other_p, group_a, group_b, NULL)) {
   2035  1.1  christos         if (!TEST_int_le(EC_GROUP_check_named_curve(gtest, 0, NULL), 0))
   2036  1.1  christos             goto err;
   2037  1.1  christos     } else {
   2038  1.1  christos         /* clear the error stack if EC_GROUP_set_curve() failed */
   2039  1.1  christos         ERR_pop_to_mark();
   2040  1.1  christos         ERR_set_mark();
   2041  1.1  christos     }
   2042  1.1  christos     if (EC_GROUP_set_curve(gtest, group_p, other_a, group_b, NULL)) {
   2043  1.1  christos         if (!TEST_int_le(EC_GROUP_check_named_curve(gtest, 0, NULL), 0))
   2044  1.1  christos             goto err;
   2045  1.1  christos     } else {
   2046  1.1  christos         /* clear the error stack if EC_GROUP_set_curve() failed */
   2047  1.1  christos         ERR_pop_to_mark();
   2048  1.1  christos         ERR_set_mark();
   2049  1.1  christos     }
   2050  1.1  christos     if (EC_GROUP_set_curve(gtest, group_p, group_a, other_b, NULL)) {
   2051  1.1  christos         if (!TEST_int_le(EC_GROUP_check_named_curve(gtest, 0, NULL), 0))
   2052  1.1  christos             goto err;
   2053  1.1  christos     } else {
   2054  1.1  christos         /* clear the error stack if EC_GROUP_set_curve() failed */
   2055  1.1  christos         ERR_pop_to_mark();
   2056  1.1  christos         ERR_set_mark();
   2057  1.1  christos     }
   2058  1.1  christos     ERR_pop_to_mark();
   2059  1.1  christos 
   2060  1.1  christos     /* Check that restoring the curve parameters passes */
   2061  1.1  christos     if (!TEST_true(EC_GROUP_set_curve(gtest, group_p, group_a, group_b, NULL))
   2062  1.1  christos         || !TEST_int_eq(EC_GROUP_check_named_curve(gtest, 0, NULL), nid))
   2063  1.1  christos         goto err;
   2064  1.1  christos 
   2065  1.1  christos     ret = 1;
   2066  1.1  christos err:
   2067  1.1  christos     BN_free(group_p);
   2068  1.1  christos     BN_free(other_p);
   2069  1.1  christos     BN_free(group_a);
   2070  1.1  christos     BN_free(other_a);
   2071  1.1  christos     BN_free(group_b);
   2072  1.1  christos     BN_free(other_b);
   2073  1.1  christos     BN_free(group_cofactor);
   2074  1.1  christos     BN_free(other_cofactor);
   2075  1.1  christos     BN_free(other_order);
   2076  1.1  christos     EC_POINT_free(other_gen);
   2077  1.1  christos     EC_GROUP_free(gtest);
   2078  1.1  christos     EC_GROUP_free(group);
   2079  1.1  christos     BN_CTX_free(bn_ctx);
   2080  1.1  christos     return ret;
   2081  1.1  christos }
   2082  1.1  christos 
   2083  1.1  christos /*
   2084  1.1  christos  * This checks the lookup capability of EC_GROUP_check_named_curve()
   2085  1.1  christos  * when the given group was created with explicit parameters.
   2086  1.1  christos  *
   2087  1.1  christos  * It is possible to retrieve an alternative alias that does not match
   2088  1.1  christos  * the original nid in this case.
   2089  1.1  christos  */
   2090  1.1  christos static int check_named_curve_lookup_test(int id)
   2091  1.1  christos {
   2092  1.1  christos     int ret = 0, nid, rv = 0;
   2093  1.3  christos     EC_GROUP *g = NULL, *ga = NULL;
   2094  1.1  christos     ECPARAMETERS *p = NULL, *pa = NULL;
   2095  1.1  christos     BN_CTX *ctx = NULL;
   2096  1.1  christos 
   2097  1.1  christos     /* Do some setup */
   2098  1.1  christos     nid = curves[id].nid;
   2099  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
   2100  1.1  christos         || !TEST_ptr(g = EC_GROUP_new_by_curve_name(nid))
   2101  1.1  christos         || !TEST_ptr(p = EC_GROUP_get_ecparameters(g, NULL)))
   2102  1.1  christos         goto err;
   2103  1.1  christos 
   2104  1.1  christos     /* replace with group from explicit parameters */
   2105  1.1  christos     EC_GROUP_free(g);
   2106  1.1  christos     if (!TEST_ptr(g = EC_GROUP_new_from_ecparameters(p)))
   2107  1.1  christos         goto err;
   2108  1.1  christos 
   2109  1.1  christos     if (!TEST_int_gt(rv = EC_GROUP_check_named_curve(g, 0, NULL), 0))
   2110  1.1  christos         goto err;
   2111  1.1  christos     if (rv != nid) {
   2112  1.1  christos         /*
   2113  1.1  christos          * Found an alias:
   2114  1.1  christos          * fail if the returned nid is not an alias of the original group.
   2115  1.1  christos          *
   2116  1.1  christos          * The comparison here is done by comparing two explicit
   2117  1.1  christos          * parameter EC_GROUPs with EC_GROUP_cmp(), to ensure the
   2118  1.1  christos          * comparison happens with unnamed EC_GROUPs using the same
   2119  1.1  christos          * EC_METHODs.
   2120  1.1  christos          */
   2121  1.1  christos         if (!TEST_ptr(ga = EC_GROUP_new_by_curve_name(rv))
   2122  1.3  christos             || !TEST_ptr(pa = EC_GROUP_get_ecparameters(ga, NULL)))
   2123  1.1  christos             goto err;
   2124  1.1  christos 
   2125  1.1  christos         /* replace with group from explicit parameters, then compare */
   2126  1.1  christos         EC_GROUP_free(ga);
   2127  1.1  christos         if (!TEST_ptr(ga = EC_GROUP_new_from_ecparameters(pa))
   2128  1.3  christos             || !TEST_int_eq(EC_GROUP_cmp(g, ga, ctx), 0))
   2129  1.1  christos             goto err;
   2130  1.1  christos     }
   2131  1.1  christos 
   2132  1.1  christos     ret = 1;
   2133  1.1  christos 
   2134  1.3  christos err:
   2135  1.1  christos     EC_GROUP_free(g);
   2136  1.1  christos     EC_GROUP_free(ga);
   2137  1.1  christos     ECPARAMETERS_free(p);
   2138  1.1  christos     ECPARAMETERS_free(pa);
   2139  1.1  christos     BN_CTX_free(ctx);
   2140  1.1  christos 
   2141  1.1  christos     return ret;
   2142  1.1  christos }
   2143  1.1  christos 
   2144  1.1  christos /*
   2145  1.1  christos  * Sometime we cannot compare nids for equality, as the built-in curve table
   2146  1.1  christos  * includes aliases with different names for the same curve.
   2147  1.1  christos  *
   2148  1.1  christos  * This function returns TRUE (1) if the checked nids are identical, or if they
   2149  1.1  christos  * alias to the same curve. FALSE (0) otherwise.
   2150  1.1  christos  */
   2151  1.3  christos static ossl_inline int are_ec_nids_compatible(int n1d, int n2d)
   2152  1.1  christos {
   2153  1.1  christos     int ret = 0;
   2154  1.1  christos     switch (n1d) {
   2155  1.1  christos #ifndef OPENSSL_NO_EC2M
   2156  1.3  christos     case NID_sect113r1:
   2157  1.3  christos     case NID_wap_wsg_idm_ecid_wtls4:
   2158  1.3  christos         ret = (n2d == NID_sect113r1 || n2d == NID_wap_wsg_idm_ecid_wtls4);
   2159  1.3  christos         break;
   2160  1.3  christos     case NID_sect163k1:
   2161  1.3  christos     case NID_wap_wsg_idm_ecid_wtls3:
   2162  1.3  christos         ret = (n2d == NID_sect163k1 || n2d == NID_wap_wsg_idm_ecid_wtls3);
   2163  1.3  christos         break;
   2164  1.3  christos     case NID_sect233k1:
   2165  1.3  christos     case NID_wap_wsg_idm_ecid_wtls10:
   2166  1.3  christos         ret = (n2d == NID_sect233k1 || n2d == NID_wap_wsg_idm_ecid_wtls10);
   2167  1.3  christos         break;
   2168  1.3  christos     case NID_sect233r1:
   2169  1.3  christos     case NID_wap_wsg_idm_ecid_wtls11:
   2170  1.3  christos         ret = (n2d == NID_sect233r1 || n2d == NID_wap_wsg_idm_ecid_wtls11);
   2171  1.3  christos         break;
   2172  1.3  christos     case NID_X9_62_c2pnb163v1:
   2173  1.3  christos     case NID_wap_wsg_idm_ecid_wtls5:
   2174  1.3  christos         ret = (n2d == NID_X9_62_c2pnb163v1
   2175  1.3  christos             || n2d == NID_wap_wsg_idm_ecid_wtls5);
   2176  1.3  christos         break;
   2177  1.1  christos #endif /* OPENSSL_NO_EC2M */
   2178  1.3  christos     case NID_secp112r1:
   2179  1.3  christos     case NID_wap_wsg_idm_ecid_wtls6:
   2180  1.3  christos         ret = (n2d == NID_secp112r1 || n2d == NID_wap_wsg_idm_ecid_wtls6);
   2181  1.3  christos         break;
   2182  1.3  christos     case NID_secp160r2:
   2183  1.3  christos     case NID_wap_wsg_idm_ecid_wtls7:
   2184  1.3  christos         ret = (n2d == NID_secp160r2 || n2d == NID_wap_wsg_idm_ecid_wtls7);
   2185  1.3  christos         break;
   2186  1.1  christos #ifdef OPENSSL_NO_EC_NISTP_64_GCC_128
   2187  1.3  christos     case NID_secp224r1:
   2188  1.3  christos     case NID_wap_wsg_idm_ecid_wtls12:
   2189  1.3  christos         ret = (n2d == NID_secp224r1 || n2d == NID_wap_wsg_idm_ecid_wtls12);
   2190  1.3  christos         break;
   2191  1.1  christos #else
   2192  1.3  christos     /*
   2193  1.3  christos      * For SEC P-224 we want to ensure that the SECP nid is returned, as
   2194  1.3  christos      * that is associated with a specialized method.
   2195  1.3  christos      */
   2196  1.3  christos     case NID_wap_wsg_idm_ecid_wtls12:
   2197  1.3  christos         ret = (n2d == NID_secp224r1);
   2198  1.3  christos         break;
   2199  1.1  christos #endif /* def(OPENSSL_NO_EC_NISTP_64_GCC_128) */
   2200  1.1  christos 
   2201  1.3  christos     default:
   2202  1.3  christos         ret = (n1d == n2d);
   2203  1.1  christos     }
   2204  1.1  christos     return ret;
   2205  1.1  christos }
   2206  1.1  christos 
   2207  1.1  christos /*
   2208  1.1  christos  * This checks that EC_GROUP_bew_from_ecparameters() returns a "named"
   2209  1.1  christos  * EC_GROUP for built-in curves.
   2210  1.1  christos  *
   2211  1.1  christos  * Note that it is possible to retrieve an alternative alias that does not match
   2212  1.1  christos  * the original nid.
   2213  1.1  christos  *
   2214  1.1  christos  * Ensure that the OPENSSL_EC_EXPLICIT_CURVE ASN1 flag is set.
   2215  1.1  christos  */
   2216  1.1  christos static int check_named_curve_from_ecparameters(int id)
   2217  1.1  christos {
   2218  1.1  christos     int ret = 0, nid, tnid;
   2219  1.1  christos     EC_GROUP *group = NULL, *tgroup = NULL, *tmpg = NULL;
   2220  1.1  christos     const EC_POINT *group_gen = NULL;
   2221  1.1  christos     EC_POINT *other_gen = NULL;
   2222  1.1  christos     BIGNUM *group_cofactor = NULL, *other_cofactor = NULL;
   2223  1.1  christos     BIGNUM *other_gen_x = NULL, *other_gen_y = NULL;
   2224  1.1  christos     const BIGNUM *group_order = NULL;
   2225  1.1  christos     BIGNUM *other_order = NULL;
   2226  1.1  christos     BN_CTX *bn_ctx = NULL;
   2227  1.1  christos     static const unsigned char invalid_seed[] = "THIS IS NOT A VALID SEED";
   2228  1.1  christos     static size_t invalid_seed_len = sizeof(invalid_seed);
   2229  1.1  christos     ECPARAMETERS *params = NULL, *other_params = NULL;
   2230  1.3  christos     EC_GROUP *g_ary[8] = { NULL };
   2231  1.1  christos     EC_GROUP **g_next = &g_ary[0];
   2232  1.3  christos     ECPARAMETERS *p_ary[8] = { NULL };
   2233  1.1  christos     ECPARAMETERS **p_next = &p_ary[0];
   2234  1.1  christos 
   2235  1.1  christos     /* Do some setup */
   2236  1.1  christos     nid = curves[id].nid;
   2237  1.1  christos     TEST_note("Curve %s", OBJ_nid2sn(nid));
   2238  1.1  christos     if (!TEST_ptr(bn_ctx = BN_CTX_new()))
   2239  1.1  christos         return ret;
   2240  1.1  christos     BN_CTX_start(bn_ctx);
   2241  1.1  christos 
   2242  1.1  christos     if (/* Allocations */
   2243  1.1  christos         !TEST_ptr(group_cofactor = BN_CTX_get(bn_ctx))
   2244  1.1  christos         || !TEST_ptr(other_gen_x = BN_CTX_get(bn_ctx))
   2245  1.1  christos         || !TEST_ptr(other_gen_y = BN_CTX_get(bn_ctx))
   2246  1.1  christos         || !TEST_ptr(other_order = BN_CTX_get(bn_ctx))
   2247  1.1  christos         || !TEST_ptr(other_cofactor = BN_CTX_get(bn_ctx))
   2248  1.1  christos         /* Generate reference group and params */
   2249  1.1  christos         || !TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))
   2250  1.1  christos         || !TEST_ptr(params = EC_GROUP_get_ecparameters(group, NULL))
   2251  1.1  christos         || !TEST_ptr(group_gen = EC_GROUP_get0_generator(group))
   2252  1.1  christos         || !TEST_ptr(group_order = EC_GROUP_get0_order(group))
   2253  1.1  christos         || !TEST_true(EC_GROUP_get_cofactor(group, group_cofactor, NULL))
   2254  1.1  christos         /* compute `other_*` values */
   2255  1.1  christos         || !TEST_ptr(tmpg = EC_GROUP_dup(group))
   2256  1.1  christos         || !TEST_ptr(other_gen = EC_POINT_dup(group_gen, group))
   2257  1.1  christos         || !TEST_true(EC_POINT_add(group, other_gen, group_gen, group_gen, NULL))
   2258  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, other_gen,
   2259  1.3  christos             other_gen_x, other_gen_y, bn_ctx))
   2260  1.1  christos         || !TEST_true(BN_copy(other_order, group_order))
   2261  1.1  christos         || !TEST_true(BN_add_word(other_order, 1))
   2262  1.1  christos         || !TEST_true(BN_copy(other_cofactor, group_cofactor))
   2263  1.1  christos         || !TEST_true(BN_add_word(other_cofactor, 1)))
   2264  1.1  christos         goto err;
   2265  1.1  christos 
   2266  1.1  christos     EC_POINT_free(other_gen);
   2267  1.1  christos     other_gen = NULL;
   2268  1.1  christos 
   2269  1.1  christos     if (!TEST_ptr(other_gen = EC_POINT_new(tmpg))
   2270  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(tmpg, other_gen,
   2271  1.3  christos             other_gen_x, other_gen_y,
   2272  1.3  christos             bn_ctx)))
   2273  1.1  christos         goto err;
   2274  1.1  christos 
   2275  1.1  christos     /*
   2276  1.1  christos      * ###########################
   2277  1.1  christos      * # Actual tests start here #
   2278  1.1  christos      * ###########################
   2279  1.1  christos      */
   2280  1.1  christos 
   2281  1.1  christos     /*
   2282  1.1  christos      * Creating a group from built-in explicit parameters returns a
   2283  1.1  christos      * "named" EC_GROUP
   2284  1.1  christos      */
   2285  1.1  christos     if (!TEST_ptr(tgroup = *g_next++ = EC_GROUP_new_from_ecparameters(params))
   2286  1.1  christos         || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef))
   2287  1.1  christos         goto err;
   2288  1.1  christos     /*
   2289  1.1  christos      * We cannot always guarantee the names match, as the built-in table
   2290  1.1  christos      * contains aliases for the same curve with different names.
   2291  1.1  christos      */
   2292  1.1  christos     if (!TEST_true(are_ec_nids_compatible(nid, tnid))) {
   2293  1.1  christos         TEST_info("nid = %s, tnid = %s", OBJ_nid2sn(nid), OBJ_nid2sn(tnid));
   2294  1.1  christos         goto err;
   2295  1.1  christos     }
   2296  1.1  christos     /* Ensure that the OPENSSL_EC_EXPLICIT_CURVE ASN1 flag is set. */
   2297  1.1  christos     if (!TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup), OPENSSL_EC_EXPLICIT_CURVE))
   2298  1.1  christos         goto err;
   2299  1.1  christos 
   2300  1.1  christos     /*
   2301  1.1  christos      * An invalid seed in the parameters should be ignored: expect a "named"
   2302  1.1  christos      * group.
   2303  1.1  christos      */
   2304  1.1  christos     if (!TEST_int_eq(EC_GROUP_set_seed(tmpg, invalid_seed, invalid_seed_len),
   2305  1.3  christos             invalid_seed_len)
   2306  1.3  christos         || !TEST_ptr(other_params = *p_next++ = EC_GROUP_get_ecparameters(tmpg, NULL))
   2307  1.3  christos         || !TEST_ptr(tgroup = *g_next++ = EC_GROUP_new_from_ecparameters(other_params))
   2308  1.3  christos         || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   2309  1.3  christos         || !TEST_true(are_ec_nids_compatible(nid, tnid))
   2310  1.3  christos         || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
   2311  1.3  christos             OPENSSL_EC_EXPLICIT_CURVE)) {
   2312  1.1  christos         TEST_info("nid = %s, tnid = %s", OBJ_nid2sn(nid), OBJ_nid2sn(tnid));
   2313  1.1  christos         goto err;
   2314  1.1  christos     }
   2315  1.1  christos 
   2316  1.1  christos     /*
   2317  1.1  christos      * A null seed in the parameters should be ignored, as it is optional:
   2318  1.1  christos      * expect a "named" group.
   2319  1.1  christos      */
   2320  1.1  christos     if (!TEST_int_eq(EC_GROUP_set_seed(tmpg, NULL, 0), 1)
   2321  1.3  christos         || !TEST_ptr(other_params = *p_next++ = EC_GROUP_get_ecparameters(tmpg, NULL))
   2322  1.3  christos         || !TEST_ptr(tgroup = *g_next++ = EC_GROUP_new_from_ecparameters(other_params))
   2323  1.3  christos         || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   2324  1.3  christos         || !TEST_true(are_ec_nids_compatible(nid, tnid))
   2325  1.3  christos         || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
   2326  1.3  christos             OPENSSL_EC_EXPLICIT_CURVE)) {
   2327  1.1  christos         TEST_info("nid = %s, tnid = %s", OBJ_nid2sn(nid), OBJ_nid2sn(tnid));
   2328  1.1  christos         goto err;
   2329  1.1  christos     }
   2330  1.1  christos 
   2331  1.1  christos     /*
   2332  1.1  christos      * Check that changing any of the generator parameters does not yield a
   2333  1.1  christos      * match with the built-in curves
   2334  1.1  christos      */
   2335  1.1  christos     if (/* Other gen, same group order & cofactor */
   2336  1.1  christos         !TEST_true(EC_GROUP_set_generator(tmpg, other_gen, group_order,
   2337  1.3  christos             group_cofactor))
   2338  1.3  christos         || !TEST_ptr(other_params = *p_next++ = EC_GROUP_get_ecparameters(tmpg, NULL))
   2339  1.3  christos         || !TEST_ptr(tgroup = *g_next++ = EC_GROUP_new_from_ecparameters(other_params))
   2340  1.1  christos         || !TEST_int_eq((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   2341  1.1  christos         /* Same gen & cofactor, different order */
   2342  1.1  christos         || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, other_order,
   2343  1.3  christos             group_cofactor))
   2344  1.3  christos         || !TEST_ptr(other_params = *p_next++ = EC_GROUP_get_ecparameters(tmpg, NULL))
   2345  1.3  christos         || !TEST_ptr(tgroup = *g_next++ = EC_GROUP_new_from_ecparameters(other_params))
   2346  1.1  christos         || !TEST_int_eq((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   2347  1.1  christos         /* The order is not an optional field, so this should fail */
   2348  1.1  christos         || !TEST_false(EC_GROUP_set_generator(tmpg, group_gen, NULL,
   2349  1.3  christos             group_cofactor))
   2350  1.1  christos         /* Check that a wrong cofactor is ignored, and we still match */
   2351  1.1  christos         || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, group_order,
   2352  1.3  christos             other_cofactor))
   2353  1.3  christos         || !TEST_ptr(other_params = *p_next++ = EC_GROUP_get_ecparameters(tmpg, NULL))
   2354  1.3  christos         || !TEST_ptr(tgroup = *g_next++ = EC_GROUP_new_from_ecparameters(other_params))
   2355  1.1  christos         || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   2356  1.1  christos         || !TEST_true(are_ec_nids_compatible(nid, tnid))
   2357  1.1  christos         || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
   2358  1.3  christos             OPENSSL_EC_EXPLICIT_CURVE)
   2359  1.1  christos         /* Check that if the cofactor is not set then it still matches */
   2360  1.1  christos         || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, group_order,
   2361  1.3  christos             NULL))
   2362  1.3  christos         || !TEST_ptr(other_params = *p_next++ = EC_GROUP_get_ecparameters(tmpg, NULL))
   2363  1.3  christos         || !TEST_ptr(tgroup = *g_next++ = EC_GROUP_new_from_ecparameters(other_params))
   2364  1.1  christos         || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   2365  1.1  christos         || !TEST_true(are_ec_nids_compatible(nid, tnid))
   2366  1.1  christos         || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
   2367  1.3  christos             OPENSSL_EC_EXPLICIT_CURVE)
   2368  1.1  christos         /* check that restoring the generator passes */
   2369  1.1  christos         || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, group_order,
   2370  1.3  christos             group_cofactor))
   2371  1.3  christos         || !TEST_ptr(other_params = *p_next++ = EC_GROUP_get_ecparameters(tmpg, NULL))
   2372  1.3  christos         || !TEST_ptr(tgroup = *g_next++ = EC_GROUP_new_from_ecparameters(other_params))
   2373  1.1  christos         || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   2374  1.1  christos         || !TEST_true(are_ec_nids_compatible(nid, tnid))
   2375  1.1  christos         || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
   2376  1.3  christos             OPENSSL_EC_EXPLICIT_CURVE))
   2377  1.1  christos         goto err;
   2378  1.1  christos 
   2379  1.1  christos     ret = 1;
   2380  1.1  christos err:
   2381  1.1  christos     for (g_next = &g_ary[0]; g_next < g_ary + OSSL_NELEM(g_ary); g_next++)
   2382  1.1  christos         EC_GROUP_free(*g_next);
   2383  1.1  christos     for (p_next = &p_ary[0]; p_next < p_ary + OSSL_NELEM(g_ary); p_next++)
   2384  1.1  christos         ECPARAMETERS_free(*p_next);
   2385  1.1  christos     ECPARAMETERS_free(params);
   2386  1.1  christos     EC_POINT_free(other_gen);
   2387  1.1  christos     EC_GROUP_free(tmpg);
   2388  1.1  christos     EC_GROUP_free(group);
   2389  1.1  christos     BN_CTX_end(bn_ctx);
   2390  1.1  christos     BN_CTX_free(bn_ctx);
   2391  1.1  christos     return ret;
   2392  1.1  christos }
   2393  1.1  christos 
   2394  1.1  christos static int parameter_test(void)
   2395  1.1  christos {
   2396  1.1  christos     EC_GROUP *group = NULL, *group2 = NULL;
   2397  1.1  christos     ECPARAMETERS *ecparameters = NULL;
   2398  1.1  christos     unsigned char *buf = NULL;
   2399  1.1  christos     int r = 0, len;
   2400  1.1  christos 
   2401  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(NID_secp384r1))
   2402  1.1  christos         || !TEST_ptr(ecparameters = EC_GROUP_get_ecparameters(group, NULL))
   2403  1.1  christos         || !TEST_ptr(group2 = EC_GROUP_new_from_ecparameters(ecparameters))
   2404  1.1  christos         || !TEST_int_eq(EC_GROUP_cmp(group, group2, NULL), 0))
   2405  1.1  christos         goto err;
   2406  1.1  christos 
   2407  1.1  christos     EC_GROUP_free(group);
   2408  1.1  christos     group = NULL;
   2409  1.1  christos 
   2410  1.1  christos     /* Test the named curve encoding, which should be default. */
   2411  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(NID_secp521r1))
   2412  1.1  christos         || !TEST_true((len = i2d_ECPKParameters(group, &buf)) >= 0)
   2413  1.1  christos         || !TEST_mem_eq(buf, len, p521_named, sizeof(p521_named)))
   2414  1.1  christos         goto err;
   2415  1.1  christos 
   2416  1.1  christos     OPENSSL_free(buf);
   2417  1.1  christos     buf = NULL;
   2418  1.1  christos 
   2419  1.1  christos     /*
   2420  1.1  christos      * Test the explicit encoding. P-521 requires correctly zero-padding the
   2421  1.1  christos      * curve coefficients.
   2422  1.1  christos      */
   2423  1.1  christos     EC_GROUP_set_asn1_flag(group, OPENSSL_EC_EXPLICIT_CURVE);
   2424  1.1  christos     if (!TEST_true((len = i2d_ECPKParameters(group, &buf)) >= 0)
   2425  1.1  christos         || !TEST_mem_eq(buf, len, p521_explicit, sizeof(p521_explicit)))
   2426  1.1  christos         goto err;
   2427  1.1  christos 
   2428  1.1  christos     r = 1;
   2429  1.1  christos err:
   2430  1.1  christos     EC_GROUP_free(group);
   2431  1.1  christos     EC_GROUP_free(group2);
   2432  1.1  christos     ECPARAMETERS_free(ecparameters);
   2433  1.1  christos     OPENSSL_free(buf);
   2434  1.1  christos     return r;
   2435  1.1  christos }
   2436  1.1  christos 
   2437  1.1  christos /*
   2438  1.1  christos  * This test validates converting an EC_GROUP to an OSSL_PARAM array
   2439  1.1  christos  * using EC_GROUP_to_params(). A named and an explicit curve are tested.
   2440  1.1  christos  */
   2441  1.1  christos static int ossl_parameter_test(void)
   2442  1.1  christos {
   2443  1.1  christos     EC_GROUP *group_nmd = NULL, *group_nmd2 = NULL, *group_nmd3 = NULL;
   2444  1.1  christos     EC_GROUP *group_exp = NULL, *group_exp2 = NULL;
   2445  1.1  christos     OSSL_PARAM *params_nmd = NULL, *params_nmd2 = NULL;
   2446  1.1  christos     OSSL_PARAM *params_exp = NULL, *params_exp2 = NULL;
   2447  1.1  christos     unsigned char *buf = NULL, *buf2 = NULL;
   2448  1.1  christos     BN_CTX *bn_ctx = NULL;
   2449  1.1  christos     OSSL_PARAM_BLD *bld = NULL;
   2450  1.1  christos     BIGNUM *p, *a, *b;
   2451  1.1  christos     const EC_POINT *group_gen = NULL;
   2452  1.1  christos     size_t bsize;
   2453  1.1  christos     int r = 0;
   2454  1.1  christos 
   2455  1.1  christos     if (!TEST_ptr(bn_ctx = BN_CTX_new()))
   2456  1.1  christos         goto err;
   2457  1.1  christos 
   2458  1.1  christos     /* test named curve */
   2459  1.1  christos     if (!TEST_ptr(group_nmd = EC_GROUP_new_by_curve_name(NID_secp384r1))
   2460  1.1  christos         /* test with null BN_CTX */
   2461  1.1  christos         || !TEST_ptr(params_nmd = EC_GROUP_to_params(
   2462  1.3  christos                          group_nmd, NULL, NULL, NULL))
   2463  1.1  christos         || !TEST_ptr(group_nmd2 = EC_GROUP_new_from_params(
   2464  1.3  christos                          params_nmd, NULL, NULL))
   2465  1.1  christos         || !TEST_int_eq(EC_GROUP_cmp(group_nmd, group_nmd2, NULL), 0)
   2466  1.1  christos         /* test with BN_CTX set */
   2467  1.1  christos         || !TEST_ptr(params_nmd2 = EC_GROUP_to_params(
   2468  1.3  christos                          group_nmd, NULL, NULL, bn_ctx))
   2469  1.1  christos         || !TEST_ptr(group_nmd3 = EC_GROUP_new_from_params(
   2470  1.3  christos                          params_nmd2, NULL, NULL))
   2471  1.1  christos         || !TEST_int_eq(EC_GROUP_cmp(group_nmd, group_nmd3, NULL), 0))
   2472  1.1  christos         goto err;
   2473  1.1  christos 
   2474  1.1  christos     /* test explicit curve */
   2475  1.1  christos     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new()))
   2476  1.1  christos         goto err;
   2477  1.1  christos 
   2478  1.1  christos     BN_CTX_start(bn_ctx);
   2479  1.1  christos     p = BN_CTX_get(bn_ctx);
   2480  1.1  christos     a = BN_CTX_get(bn_ctx);
   2481  1.1  christos     b = BN_CTX_get(bn_ctx);
   2482  1.1  christos 
   2483  1.1  christos     if (!TEST_true(EC_GROUP_get_curve(group_nmd, p, a, b, bn_ctx))
   2484  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(
   2485  1.3  christos             bld, OSSL_PKEY_PARAM_EC_FIELD_TYPE, SN_X9_62_prime_field, 0))
   2486  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_P, p))
   2487  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_A, a))
   2488  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_B, b)))
   2489  1.1  christos         goto err;
   2490  1.1  christos 
   2491  1.1  christos     if (EC_GROUP_get0_seed(group_nmd) != NULL) {
   2492  1.1  christos         if (!TEST_true(OSSL_PARAM_BLD_push_octet_string(
   2493  1.1  christos                 bld, OSSL_PKEY_PARAM_EC_SEED, EC_GROUP_get0_seed(group_nmd),
   2494  1.1  christos                 EC_GROUP_get_seed_len(group_nmd))))
   2495  1.1  christos             goto err;
   2496  1.1  christos     }
   2497  1.1  christos     if (EC_GROUP_get0_cofactor(group_nmd) != NULL) {
   2498  1.1  christos         if (!TEST_true(OSSL_PARAM_BLD_push_BN(
   2499  1.1  christos                 bld, OSSL_PKEY_PARAM_EC_COFACTOR,
   2500  1.1  christos                 EC_GROUP_get0_cofactor(group_nmd))))
   2501  1.1  christos             goto err;
   2502  1.1  christos     }
   2503  1.1  christos 
   2504  1.1  christos     if (!TEST_ptr(group_gen = EC_GROUP_get0_generator(group_nmd))
   2505  1.1  christos         || !TEST_size_t_gt(bsize = EC_POINT_point2oct(
   2506  1.3  christos                                group_nmd, EC_GROUP_get0_generator(group_nmd),
   2507  1.3  christos                                POINT_CONVERSION_UNCOMPRESSED, NULL, 0, bn_ctx),
   2508  1.3  christos             0)
   2509  1.1  christos         || !TEST_ptr(buf2 = OPENSSL_malloc(bsize))
   2510  1.1  christos         || !TEST_size_t_eq(EC_POINT_point2oct(
   2511  1.3  christos                                group_nmd, EC_GROUP_get0_generator(group_nmd),
   2512  1.3  christos                                POINT_CONVERSION_UNCOMPRESSED, buf2, bsize, bn_ctx),
   2513  1.3  christos             bsize)
   2514  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(
   2515  1.3  christos             bld, OSSL_PKEY_PARAM_EC_GENERATOR, buf2, bsize))
   2516  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_BN(
   2517  1.3  christos             bld, OSSL_PKEY_PARAM_EC_ORDER, EC_GROUP_get0_order(group_nmd))))
   2518  1.1  christos         goto err;
   2519  1.1  christos 
   2520  1.1  christos     if (!TEST_ptr(params_exp = OSSL_PARAM_BLD_to_param(bld))
   2521  1.3  christos         || !TEST_ptr(group_exp = EC_GROUP_new_from_params(params_exp, NULL, NULL))
   2522  1.3  christos         || !TEST_ptr(params_exp2 = EC_GROUP_to_params(group_exp, NULL, NULL, NULL))
   2523  1.3  christos         || !TEST_ptr(group_exp2 = EC_GROUP_new_from_params(params_exp2, NULL, NULL))
   2524  1.1  christos         || !TEST_int_eq(EC_GROUP_cmp(group_exp, group_exp2, NULL), 0))
   2525  1.1  christos         goto err;
   2526  1.1  christos 
   2527  1.1  christos     r = 1;
   2528  1.1  christos 
   2529  1.1  christos err:
   2530  1.1  christos     EC_GROUP_free(group_nmd);
   2531  1.1  christos     EC_GROUP_free(group_nmd2);
   2532  1.1  christos     EC_GROUP_free(group_nmd3);
   2533  1.1  christos     OSSL_PARAM_free(params_nmd);
   2534  1.1  christos     OSSL_PARAM_free(params_nmd2);
   2535  1.1  christos     OPENSSL_free(buf);
   2536  1.1  christos 
   2537  1.1  christos     EC_GROUP_free(group_exp);
   2538  1.1  christos     EC_GROUP_free(group_exp2);
   2539  1.1  christos     BN_CTX_end(bn_ctx);
   2540  1.1  christos     BN_CTX_free(bn_ctx);
   2541  1.1  christos     OPENSSL_free(buf2);
   2542  1.1  christos     OSSL_PARAM_BLD_free(bld);
   2543  1.1  christos     OSSL_PARAM_free(params_exp);
   2544  1.1  christos     OSSL_PARAM_free(params_exp2);
   2545  1.1  christos     return r;
   2546  1.1  christos }
   2547  1.1  christos 
   2548  1.1  christos /*-
   2549  1.1  christos  * random 256-bit explicit parameters curve, cofactor absent
   2550  1.1  christos  * order:    0x0c38d96a9f892b88772ec2e39614a82f4f (132 bit)
   2551  1.1  christos  * cofactor:   0x12bc94785251297abfafddf1565100da (125 bit)
   2552  1.1  christos  */
   2553  1.1  christos static const unsigned char params_cf_pass[] = {
   2554  1.1  christos     0x30, 0x81, 0xcd, 0x02, 0x01, 0x01, 0x30, 0x2c, 0x06, 0x07, 0x2a, 0x86,
   2555  1.1  christos     0x48, 0xce, 0x3d, 0x01, 0x01, 0x02, 0x21, 0x00, 0xe5, 0x00, 0x1f, 0xc5,
   2556  1.1  christos     0xca, 0x71, 0x9d, 0x8e, 0xf7, 0x07, 0x4b, 0x48, 0x37, 0xf9, 0x33, 0x2d,
   2557  1.1  christos     0x71, 0xbf, 0x79, 0xe7, 0xdc, 0x91, 0xc2, 0xff, 0xb6, 0x7b, 0xc3, 0x93,
   2558  1.1  christos     0x44, 0x88, 0xe6, 0x91, 0x30, 0x44, 0x04, 0x20, 0xe5, 0x00, 0x1f, 0xc5,
   2559  1.1  christos     0xca, 0x71, 0x9d, 0x8e, 0xf7, 0x07, 0x4b, 0x48, 0x37, 0xf9, 0x33, 0x2d,
   2560  1.1  christos     0x71, 0xbf, 0x79, 0xe7, 0xdc, 0x91, 0xc2, 0xff, 0xb6, 0x7b, 0xc3, 0x93,
   2561  1.1  christos     0x44, 0x88, 0xe6, 0x8e, 0x04, 0x20, 0x18, 0x8c, 0x59, 0x57, 0xc4, 0xbc,
   2562  1.1  christos     0x85, 0x57, 0xc3, 0x66, 0x9f, 0x89, 0xd5, 0x92, 0x0d, 0x7e, 0x42, 0x27,
   2563  1.1  christos     0x07, 0x64, 0xaa, 0x26, 0xed, 0x89, 0xc4, 0x09, 0x05, 0x4d, 0xc7, 0x23,
   2564  1.1  christos     0x47, 0xda, 0x04, 0x41, 0x04, 0x1b, 0x6b, 0x41, 0x0b, 0xf9, 0xfb, 0x77,
   2565  1.1  christos     0xfd, 0x50, 0xb7, 0x3e, 0x23, 0xa3, 0xec, 0x9a, 0x3b, 0x09, 0x31, 0x6b,
   2566  1.1  christos     0xfa, 0xf6, 0xce, 0x1f, 0xff, 0xeb, 0x57, 0x93, 0x24, 0x70, 0xf3, 0xf4,
   2567  1.1  christos     0xba, 0x7e, 0xfa, 0x86, 0x6e, 0x19, 0x89, 0xe3, 0x55, 0x6d, 0x5a, 0xe9,
   2568  1.1  christos     0xc0, 0x3d, 0xbc, 0xfb, 0xaf, 0xad, 0xd4, 0x7e, 0xa6, 0xe5, 0xfa, 0x1a,
   2569  1.1  christos     0x58, 0x07, 0x9e, 0x8f, 0x0d, 0x3b, 0xf7, 0x38, 0xca, 0x02, 0x11, 0x0c,
   2570  1.1  christos     0x38, 0xd9, 0x6a, 0x9f, 0x89, 0x2b, 0x88, 0x77, 0x2e, 0xc2, 0xe3, 0x96,
   2571  1.1  christos     0x14, 0xa8, 0x2f, 0x4f
   2572  1.1  christos };
   2573  1.1  christos 
   2574  1.1  christos /*-
   2575  1.1  christos  * random 256-bit explicit parameters curve, cofactor absent
   2576  1.1  christos  * order:    0x045a75c0c17228ebd9b169a10e34a22101 (131 bit)
   2577  1.1  christos  * cofactor:   0x2e134b4ede82649f67a2e559d361e5fe (126 bit)
   2578  1.1  christos  */
   2579  1.1  christos static const unsigned char params_cf_fail[] = {
   2580  1.1  christos     0x30, 0x81, 0xcd, 0x02, 0x01, 0x01, 0x30, 0x2c, 0x06, 0x07, 0x2a, 0x86,
   2581  1.1  christos     0x48, 0xce, 0x3d, 0x01, 0x01, 0x02, 0x21, 0x00, 0xc8, 0x95, 0x27, 0x37,
   2582  1.1  christos     0xe8, 0xe1, 0xfd, 0xcc, 0xf9, 0x6e, 0x0c, 0xa6, 0x21, 0xc1, 0x7d, 0x6b,
   2583  1.1  christos     0x9d, 0x44, 0x42, 0xea, 0x73, 0x4e, 0x04, 0xb6, 0xac, 0x62, 0x50, 0xd0,
   2584  1.1  christos     0x33, 0xc2, 0xea, 0x13, 0x30, 0x44, 0x04, 0x20, 0xc8, 0x95, 0x27, 0x37,
   2585  1.1  christos     0xe8, 0xe1, 0xfd, 0xcc, 0xf9, 0x6e, 0x0c, 0xa6, 0x21, 0xc1, 0x7d, 0x6b,
   2586  1.1  christos     0x9d, 0x44, 0x42, 0xea, 0x73, 0x4e, 0x04, 0xb6, 0xac, 0x62, 0x50, 0xd0,
   2587  1.1  christos     0x33, 0xc2, 0xea, 0x10, 0x04, 0x20, 0xbf, 0xa6, 0xa8, 0x05, 0x1d, 0x09,
   2588  1.1  christos     0xac, 0x70, 0x39, 0xbb, 0x4d, 0xb2, 0x90, 0x8a, 0x15, 0x41, 0x14, 0x1d,
   2589  1.1  christos     0x11, 0x86, 0x9f, 0x13, 0xa2, 0x63, 0x1a, 0xda, 0x95, 0x22, 0x4d, 0x02,
   2590  1.1  christos     0x15, 0x0a, 0x04, 0x41, 0x04, 0xaf, 0x16, 0x71, 0xf9, 0xc4, 0xc8, 0x59,
   2591  1.1  christos     0x1d, 0xa3, 0x6f, 0xe7, 0xc3, 0x57, 0xa1, 0xfa, 0x9f, 0x49, 0x7c, 0x11,
   2592  1.1  christos     0x27, 0x05, 0xa0, 0x7f, 0xff, 0xf9, 0xe0, 0xe7, 0x92, 0xdd, 0x9c, 0x24,
   2593  1.1  christos     0x8e, 0xc7, 0xb9, 0x52, 0x71, 0x3f, 0xbc, 0x7f, 0x6a, 0x9f, 0x35, 0x70,
   2594  1.1  christos     0xe1, 0x27, 0xd5, 0x35, 0x8a, 0x13, 0xfa, 0xa8, 0x33, 0x3e, 0xd4, 0x73,
   2595  1.1  christos     0x1c, 0x14, 0x58, 0x9e, 0xc7, 0x0a, 0x87, 0x65, 0x8d, 0x02, 0x11, 0x04,
   2596  1.1  christos     0x5a, 0x75, 0xc0, 0xc1, 0x72, 0x28, 0xeb, 0xd9, 0xb1, 0x69, 0xa1, 0x0e,
   2597  1.1  christos     0x34, 0xa2, 0x21, 0x01
   2598  1.1  christos };
   2599  1.1  christos 
   2600  1.1  christos /*-
   2601  1.1  christos  * Test two random 256-bit explicit parameters curves with absent cofactor.
   2602  1.1  christos  * The two curves are chosen to roughly straddle the bounds at which the lib
   2603  1.1  christos  * can compute the cofactor automatically, roughly 4*sqrt(p). So test that:
   2604  1.1  christos  *
   2605  1.1  christos  * - params_cf_pass: order is sufficiently close to p to compute cofactor
   2606  1.1  christos  * - params_cf_fail: order is too far away from p to compute cofactor
   2607  1.1  christos  *
   2608  1.1  christos  * For standards-compliant curves, cofactor is chosen as small as possible.
   2609  1.1  christos  * So you can see neither of these curves are fit for cryptographic use.
   2610  1.1  christos  *
   2611  1.1  christos  * Some standards even mandate an upper bound on the cofactor, e.g. SECG1 v2:
   2612  1.1  christos  * h <= 2**(t/8) where t is the security level of the curve, for which the lib
   2613  1.1  christos  * will always succeed in computing the cofactor. Neither of these curves
   2614  1.1  christos  * conform to that -- this is just robustness testing.
   2615  1.1  christos  */
   2616  1.1  christos static int cofactor_range_test(void)
   2617  1.1  christos {
   2618  1.1  christos     EC_GROUP *group = NULL;
   2619  1.1  christos     BIGNUM *cf = NULL;
   2620  1.1  christos     int ret = 0;
   2621  1.1  christos     const unsigned char *b1 = (const unsigned char *)params_cf_fail;
   2622  1.1  christos     const unsigned char *b2 = (const unsigned char *)params_cf_pass;
   2623  1.1  christos 
   2624  1.1  christos     if (!TEST_ptr(group = d2i_ECPKParameters(NULL, &b1, sizeof(params_cf_fail)))
   2625  1.1  christos         || !TEST_BN_eq_zero(EC_GROUP_get0_cofactor(group))
   2626  1.1  christos         || !TEST_ptr(group = d2i_ECPKParameters(&group, &b2,
   2627  1.3  christos                          sizeof(params_cf_pass)))
   2628  1.1  christos         || !TEST_int_gt(BN_hex2bn(&cf, "12bc94785251297abfafddf1565100da"), 0)
   2629  1.1  christos         || !TEST_BN_eq(cf, EC_GROUP_get0_cofactor(group)))
   2630  1.1  christos         goto err;
   2631  1.1  christos     ret = 1;
   2632  1.3  christos err:
   2633  1.1  christos     BN_free(cf);
   2634  1.1  christos     EC_GROUP_free(group);
   2635  1.1  christos     return ret;
   2636  1.1  christos }
   2637  1.1  christos 
   2638  1.1  christos /*-
   2639  1.1  christos  * For named curves, test that:
   2640  1.1  christos  * - the lib correctly computes the cofactor if passed a NULL or zero cofactor
   2641  1.1  christos  * - a nonsensical cofactor throws an error (negative test)
   2642  1.1  christos  * - nonsensical orders throw errors (negative tests)
   2643  1.1  christos  */
   2644  1.1  christos static int cardinality_test(int n)
   2645  1.1  christos {
   2646  1.1  christos     int ret = 0, is_binary = 0;
   2647  1.1  christos     int nid = curves[n].nid;
   2648  1.1  christos     BN_CTX *ctx = NULL;
   2649  1.1  christos     EC_GROUP *g1 = NULL, *g2 = NULL;
   2650  1.1  christos     EC_POINT *g2_gen = NULL;
   2651  1.1  christos     BIGNUM *g1_p = NULL, *g1_a = NULL, *g1_b = NULL, *g1_x = NULL, *g1_y = NULL,
   2652  1.1  christos            *g1_order = NULL, *g1_cf = NULL, *g2_cf = NULL;
   2653  1.1  christos 
   2654  1.1  christos     TEST_info("Curve %s cardinality test", OBJ_nid2sn(nid));
   2655  1.1  christos 
   2656  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
   2657  1.1  christos         || !TEST_ptr(g1 = EC_GROUP_new_by_curve_name(nid))) {
   2658  1.1  christos         BN_CTX_free(ctx);
   2659  1.1  christos         return 0;
   2660  1.1  christos     }
   2661  1.1  christos 
   2662  1.1  christos     is_binary = (EC_GROUP_get_field_type(g1) == NID_X9_62_characteristic_two_field);
   2663  1.1  christos 
   2664  1.1  christos     BN_CTX_start(ctx);
   2665  1.1  christos     g1_p = BN_CTX_get(ctx);
   2666  1.1  christos     g1_a = BN_CTX_get(ctx);
   2667  1.1  christos     g1_b = BN_CTX_get(ctx);
   2668  1.1  christos     g1_x = BN_CTX_get(ctx);
   2669  1.1  christos     g1_y = BN_CTX_get(ctx);
   2670  1.1  christos     g1_order = BN_CTX_get(ctx);
   2671  1.1  christos     g1_cf = BN_CTX_get(ctx);
   2672  1.1  christos 
   2673  1.1  christos     if (!TEST_ptr(g2_cf = BN_CTX_get(ctx))
   2674  1.1  christos         /* pull out the explicit curve parameters */
   2675  1.1  christos         || !TEST_true(EC_GROUP_get_curve(g1, g1_p, g1_a, g1_b, ctx))
   2676  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(g1,
   2677  1.3  christos             EC_GROUP_get0_generator(g1), g1_x, g1_y, ctx))
   2678  1.1  christos         || !TEST_true(BN_copy(g1_order, EC_GROUP_get0_order(g1)))
   2679  1.1  christos         || !TEST_true(EC_GROUP_get_cofactor(g1, g1_cf, ctx))
   2680  1.3  christos     /* construct g2 manually with g1 parameters */
   2681  1.1  christos #ifndef OPENSSL_NO_EC2M
   2682  1.3  christos         || !TEST_ptr(g2 = (is_binary) ? EC_GROUP_new_curve_GF2m(g1_p, g1_a, g1_b, ctx) : EC_GROUP_new_curve_GFp(g1_p, g1_a, g1_b, ctx))
   2683  1.1  christos #else
   2684  1.1  christos         || !TEST_int_eq(0, is_binary)
   2685  1.1  christos         || !TEST_ptr(g2 = EC_GROUP_new_curve_GFp(g1_p, g1_a, g1_b, ctx))
   2686  1.1  christos #endif
   2687  1.1  christos         || !TEST_ptr(g2_gen = EC_POINT_new(g2))
   2688  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(g2, g2_gen, g1_x, g1_y, ctx))
   2689  1.1  christos         /* pass NULL cofactor: lib should compute it */
   2690  1.1  christos         || !TEST_true(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL))
   2691  1.1  christos         || !TEST_true(EC_GROUP_get_cofactor(g2, g2_cf, ctx))
   2692  1.1  christos         || !TEST_BN_eq(g1_cf, g2_cf)
   2693  1.1  christos         /* pass zero cofactor: lib should compute it */
   2694  1.1  christos         || !TEST_true(BN_set_word(g2_cf, 0))
   2695  1.1  christos         || !TEST_true(EC_GROUP_set_generator(g2, g2_gen, g1_order, g2_cf))
   2696  1.1  christos         || !TEST_true(EC_GROUP_get_cofactor(g2, g2_cf, ctx))
   2697  1.1  christos         || !TEST_BN_eq(g1_cf, g2_cf)
   2698  1.1  christos         /* negative test for invalid cofactor */
   2699  1.1  christos         || !TEST_true(BN_set_word(g2_cf, 0))
   2700  1.1  christos         || !TEST_true(BN_sub(g2_cf, g2_cf, BN_value_one()))
   2701  1.1  christos         || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, g2_cf))
   2702  1.1  christos         /* negative test for NULL order */
   2703  1.1  christos         || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, NULL, NULL))
   2704  1.1  christos         /* negative test for zero order */
   2705  1.1  christos         || !TEST_true(BN_set_word(g1_order, 0))
   2706  1.1  christos         || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL))
   2707  1.1  christos         /* negative test for negative order */
   2708  1.1  christos         || !TEST_true(BN_set_word(g2_cf, 0))
   2709  1.1  christos         || !TEST_true(BN_sub(g2_cf, g2_cf, BN_value_one()))
   2710  1.1  christos         || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL))
   2711  1.1  christos         /* negative test for too large order */
   2712  1.1  christos         || !TEST_true(BN_lshift(g1_order, g1_p, 2))
   2713  1.1  christos         || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL)))
   2714  1.1  christos         goto err;
   2715  1.1  christos     ret = 1;
   2716  1.3  christos err:
   2717  1.1  christos     EC_POINT_free(g2_gen);
   2718  1.1  christos     EC_GROUP_free(g1);
   2719  1.1  christos     EC_GROUP_free(g2);
   2720  1.1  christos     BN_CTX_end(ctx);
   2721  1.1  christos     BN_CTX_free(ctx);
   2722  1.1  christos     return ret;
   2723  1.1  christos }
   2724  1.1  christos 
   2725  1.1  christos static int check_ec_key_field_public_range_test(int id)
   2726  1.1  christos {
   2727  1.1  christos     int ret = 0, type = 0;
   2728  1.1  christos     const EC_POINT *pub = NULL;
   2729  1.1  christos     const EC_GROUP *group = NULL;
   2730  1.1  christos     const BIGNUM *field = NULL;
   2731  1.1  christos     BIGNUM *x = NULL, *y = NULL;
   2732  1.1  christos     EC_KEY *key = NULL;
   2733  1.1  christos 
   2734  1.1  christos     if (!TEST_ptr(x = BN_new())
   2735  1.3  christos         || !TEST_ptr(y = BN_new())
   2736  1.3  christos         || !TEST_ptr(key = EC_KEY_new_by_curve_name(curves[id].nid))
   2737  1.3  christos         || !TEST_ptr(group = EC_KEY_get0_group(key))
   2738  1.3  christos         || !TEST_ptr(field = EC_GROUP_get0_field(group))
   2739  1.3  christos         || !TEST_int_gt(EC_KEY_generate_key(key), 0)
   2740  1.3  christos         || !TEST_int_gt(EC_KEY_check_key(key), 0)
   2741  1.3  christos         || !TEST_ptr(pub = EC_KEY_get0_public_key(key))
   2742  1.3  christos         || !TEST_int_gt(EC_POINT_get_affine_coordinates(group, pub, x, y,
   2743  1.3  christos                             NULL),
   2744  1.3  christos             0))
   2745  1.1  christos         goto err;
   2746  1.1  christos 
   2747  1.1  christos     /*
   2748  1.1  christos      * Make the public point out of range by adding the field (which will still
   2749  1.1  christos      * be the same point on the curve). The add is different for char2 fields.
   2750  1.1  christos      */
   2751  1.1  christos     type = EC_GROUP_get_field_type(group);
   2752  1.1  christos #ifndef OPENSSL_NO_EC2M
   2753  1.1  christos     if (type == NID_X9_62_characteristic_two_field) {
   2754  1.1  christos         /* test for binary curves */
   2755  1.1  christos         if (!TEST_true(BN_GF2m_add(x, x, field)))
   2756  1.1  christos             goto err;
   2757  1.1  christos     } else
   2758  1.1  christos #endif
   2759  1.3  christos         if (type == NID_X9_62_prime_field) {
   2760  1.1  christos         /* test for prime curves */
   2761  1.1  christos         if (!TEST_true(BN_add(x, x, field)))
   2762  1.1  christos             goto err;
   2763  1.1  christos     } else {
   2764  1.1  christos         /* this should never happen */
   2765  1.1  christos         TEST_error("Unsupported EC_METHOD field_type");
   2766  1.1  christos         goto err;
   2767  1.1  christos     }
   2768  1.1  christos     if (!TEST_int_le(EC_KEY_set_public_key_affine_coordinates(key, x, y), 0))
   2769  1.1  christos         goto err;
   2770  1.1  christos 
   2771  1.1  christos     ret = 1;
   2772  1.1  christos err:
   2773  1.1  christos     BN_free(x);
   2774  1.1  christos     BN_free(y);
   2775  1.1  christos     EC_KEY_free(key);
   2776  1.1  christos     return ret;
   2777  1.1  christos }
   2778  1.1  christos 
   2779  1.1  christos /*
   2780  1.1  christos  * Helper for ec_point_hex2point_test
   2781  1.1  christos  *
   2782  1.1  christos  * Self-tests EC_POINT_point2hex() against EC_POINT_hex2point() for the given
   2783  1.1  christos  * (group,P) pair.
   2784  1.1  christos  *
   2785  1.1  christos  * If P is NULL use point at infinity.
   2786  1.1  christos  */
   2787  1.3  christos static ossl_inline int ec_point_hex2point_test_helper(const EC_GROUP *group, const EC_POINT *P,
   2788  1.3  christos     point_conversion_form_t form,
   2789  1.3  christos     BN_CTX *bnctx)
   2790  1.1  christos {
   2791  1.1  christos     int ret = 0;
   2792  1.1  christos     EC_POINT *Q = NULL, *Pinf = NULL;
   2793  1.1  christos     char *hex = NULL;
   2794  1.1  christos 
   2795  1.1  christos     if (P == NULL) {
   2796  1.1  christos         /* If P is NULL use point at infinity. */
   2797  1.1  christos         if (!TEST_ptr(Pinf = EC_POINT_new(group))
   2798  1.3  christos             || !TEST_true(EC_POINT_set_to_infinity(group, Pinf)))
   2799  1.1  christos             goto err;
   2800  1.1  christos         P = Pinf;
   2801  1.1  christos     }
   2802  1.1  christos 
   2803  1.1  christos     if (!TEST_ptr(hex = EC_POINT_point2hex(group, P, form, bnctx))
   2804  1.3  christos         || !TEST_ptr(Q = EC_POINT_hex2point(group, hex, NULL, bnctx))
   2805  1.3  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, bnctx)))
   2806  1.1  christos         goto err;
   2807  1.1  christos 
   2808  1.1  christos     /*
   2809  1.1  christos      * The next check is most likely superfluous, as EC_POINT_cmp should already
   2810  1.1  christos      * cover this.
   2811  1.1  christos      * Nonetheless it increases the test coverage for EC_POINT_is_at_infinity,
   2812  1.1  christos      * so we include it anyway!
   2813  1.1  christos      */
   2814  1.1  christos     if (Pinf != NULL
   2815  1.3  christos         && !TEST_true(EC_POINT_is_at_infinity(group, Q)))
   2816  1.1  christos         goto err;
   2817  1.1  christos 
   2818  1.1  christos     ret = 1;
   2819  1.1  christos 
   2820  1.3  christos err:
   2821  1.1  christos     EC_POINT_free(Pinf);
   2822  1.1  christos     OPENSSL_free(hex);
   2823  1.1  christos     EC_POINT_free(Q);
   2824  1.1  christos 
   2825  1.1  christos     return ret;
   2826  1.1  christos }
   2827  1.1  christos 
   2828  1.1  christos /*
   2829  1.1  christos  * This test self-validates EC_POINT_hex2point() and EC_POINT_point2hex()
   2830  1.1  christos  */
   2831  1.1  christos static int ec_point_hex2point_test(int id)
   2832  1.1  christos {
   2833  1.1  christos     int ret = 0, nid;
   2834  1.1  christos     EC_GROUP *group = NULL;
   2835  1.1  christos     const EC_POINT *G = NULL;
   2836  1.1  christos     EC_POINT *P = NULL;
   2837  1.1  christos     BN_CTX *bnctx = NULL;
   2838  1.1  christos 
   2839  1.1  christos     /* Do some setup */
   2840  1.1  christos     nid = curves[id].nid;
   2841  1.1  christos     if (!TEST_ptr(bnctx = BN_CTX_new())
   2842  1.3  christos         || !TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))
   2843  1.3  christos         || !TEST_ptr(G = EC_GROUP_get0_generator(group))
   2844  1.3  christos         || !TEST_ptr(P = EC_POINT_dup(G, group)))
   2845  1.1  christos         goto err;
   2846  1.1  christos 
   2847  1.1  christos     if (!TEST_true(ec_point_hex2point_test_helper(group, P,
   2848  1.3  christos             POINT_CONVERSION_COMPRESSED,
   2849  1.3  christos             bnctx))
   2850  1.3  christos         || !TEST_true(ec_point_hex2point_test_helper(group, NULL,
   2851  1.3  christos             POINT_CONVERSION_COMPRESSED,
   2852  1.3  christos             bnctx))
   2853  1.3  christos         || !TEST_true(ec_point_hex2point_test_helper(group, P,
   2854  1.3  christos             POINT_CONVERSION_UNCOMPRESSED,
   2855  1.3  christos             bnctx))
   2856  1.3  christos         || !TEST_true(ec_point_hex2point_test_helper(group, NULL,
   2857  1.3  christos             POINT_CONVERSION_UNCOMPRESSED,
   2858  1.3  christos             bnctx))
   2859  1.3  christos         || !TEST_true(ec_point_hex2point_test_helper(group, P,
   2860  1.3  christos             POINT_CONVERSION_HYBRID,
   2861  1.3  christos             bnctx))
   2862  1.3  christos         || !TEST_true(ec_point_hex2point_test_helper(group, NULL,
   2863  1.3  christos             POINT_CONVERSION_HYBRID,
   2864  1.3  christos             bnctx)))
   2865  1.1  christos         goto err;
   2866  1.1  christos 
   2867  1.1  christos     ret = 1;
   2868  1.1  christos 
   2869  1.3  christos err:
   2870  1.1  christos     EC_POINT_free(P);
   2871  1.1  christos     EC_GROUP_free(group);
   2872  1.1  christos     BN_CTX_free(bnctx);
   2873  1.1  christos 
   2874  1.1  christos     return ret;
   2875  1.1  christos }
   2876  1.1  christos 
   2877  1.1  christos static int do_test_custom_explicit_fromdata(EC_GROUP *group, BN_CTX *ctx,
   2878  1.3  christos     unsigned char *gen, int gen_size)
   2879  1.1  christos {
   2880  1.1  christos     int ret = 0, i_out;
   2881  1.1  christos     EVP_PKEY_CTX *pctx = NULL;
   2882  1.1  christos     EVP_PKEY *pkeyparam = NULL;
   2883  1.1  christos     OSSL_PARAM_BLD *bld = NULL;
   2884  1.1  christos     const char *field_name;
   2885  1.1  christos     OSSL_PARAM *params = NULL;
   2886  1.1  christos     const OSSL_PARAM *gettable;
   2887  1.1  christos     BIGNUM *p, *a, *b;
   2888  1.1  christos     BIGNUM *p_out = NULL, *a_out = NULL, *b_out = NULL;
   2889  1.1  christos     BIGNUM *order_out = NULL, *cofactor_out = NULL;
   2890  1.1  christos     char name[80];
   2891  1.1  christos     unsigned char buf[1024];
   2892  1.1  christos     size_t buf_len, name_len;
   2893  1.1  christos #ifndef OPENSSL_NO_EC2M
   2894  1.1  christos     unsigned int k1 = 0, k2 = 0, k3 = 0;
   2895  1.1  christos     const char *basis_name = NULL;
   2896  1.1  christos #endif
   2897  1.1  christos 
   2898  1.1  christos     p = BN_CTX_get(ctx);
   2899  1.1  christos     a = BN_CTX_get(ctx);
   2900  1.1  christos     b = BN_CTX_get(ctx);
   2901  1.1  christos 
   2902  1.1  christos     if (!TEST_ptr(b)
   2903  1.1  christos         || !TEST_ptr(bld = OSSL_PARAM_BLD_new()))
   2904  1.1  christos         goto err;
   2905  1.1  christos 
   2906  1.1  christos     if (EC_GROUP_get_field_type(group) == NID_X9_62_prime_field) {
   2907  1.1  christos         field_name = SN_X9_62_prime_field;
   2908  1.1  christos     } else {
   2909  1.1  christos         field_name = SN_X9_62_characteristic_two_field;
   2910  1.1  christos #ifndef OPENSSL_NO_EC2M
   2911  1.1  christos         if (EC_GROUP_get_basis_type(group) == NID_X9_62_tpBasis) {
   2912  1.1  christos             basis_name = SN_X9_62_tpBasis;
   2913  1.1  christos             if (!TEST_true(EC_GROUP_get_trinomial_basis(group, &k1)))
   2914  1.1  christos                 goto err;
   2915  1.1  christos         } else {
   2916  1.1  christos             basis_name = SN_X9_62_ppBasis;
   2917  1.1  christos             if (!TEST_true(EC_GROUP_get_pentanomial_basis(group, &k1, &k2, &k3)))
   2918  1.1  christos                 goto err;
   2919  1.1  christos         }
   2920  1.1  christos #endif /* OPENSSL_NO_EC2M */
   2921  1.1  christos     }
   2922  1.1  christos     if (!TEST_true(EC_GROUP_get_curve(group, p, a, b, ctx))
   2923  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
   2924  1.3  christos             OSSL_PKEY_PARAM_EC_FIELD_TYPE, field_name, 0))
   2925  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_P, p))
   2926  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_A, a))
   2927  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_B, b)))
   2928  1.1  christos         goto err;
   2929  1.1  christos 
   2930  1.1  christos     if (EC_GROUP_get0_seed(group) != NULL) {
   2931  1.1  christos         if (!TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
   2932  1.3  christos                 OSSL_PKEY_PARAM_EC_SEED, EC_GROUP_get0_seed(group),
   2933  1.3  christos                 EC_GROUP_get_seed_len(group))))
   2934  1.1  christos             goto err;
   2935  1.1  christos     }
   2936  1.1  christos     if (EC_GROUP_get0_cofactor(group) != NULL) {
   2937  1.1  christos         if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_COFACTOR,
   2938  1.3  christos                 EC_GROUP_get0_cofactor(group))))
   2939  1.1  christos             goto err;
   2940  1.1  christos     }
   2941  1.1  christos 
   2942  1.1  christos     if (!TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
   2943  1.3  christos             OSSL_PKEY_PARAM_EC_GENERATOR, gen, gen_size))
   2944  1.1  christos         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_ORDER,
   2945  1.3  christos             EC_GROUP_get0_order(group))))
   2946  1.1  christos         goto err;
   2947  1.1  christos 
   2948  1.1  christos     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
   2949  1.1  christos         || !TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL))
   2950  1.1  christos         || !TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
   2951  1.1  christos         || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkeyparam,
   2952  1.3  christos                             EVP_PKEY_KEY_PARAMETERS, params),
   2953  1.3  christos             0))
   2954  1.1  christos         goto err;
   2955  1.1  christos 
   2956  1.1  christos     /*- Check that all the set values are retrievable -*/
   2957  1.1  christos 
   2958  1.1  christos     /* There should be no match to a group name since the generator changed */
   2959  1.1  christos     if (!TEST_false(EVP_PKEY_get_utf8_string_param(pkeyparam,
   2960  1.3  christos             OSSL_PKEY_PARAM_GROUP_NAME, name, sizeof(name),
   2961  1.3  christos             &name_len)))
   2962  1.1  christos         goto err;
   2963  1.1  christos 
   2964  1.1  christos     /* The encoding should be explicit as it has no group */
   2965  1.1  christos     if (!TEST_true(EVP_PKEY_get_utf8_string_param(pkeyparam,
   2966  1.3  christos             OSSL_PKEY_PARAM_EC_ENCODING,
   2967  1.3  christos             name, sizeof(name), &name_len))
   2968  1.1  christos         || !TEST_str_eq(name, OSSL_PKEY_EC_ENCODING_EXPLICIT))
   2969  1.1  christos         goto err;
   2970  1.1  christos 
   2971  1.1  christos     if (!TEST_true(EVP_PKEY_get_utf8_string_param(pkeyparam,
   2972  1.3  christos             OSSL_PKEY_PARAM_EC_FIELD_TYPE, name, sizeof(name),
   2973  1.3  christos             &name_len))
   2974  1.1  christos         || !TEST_str_eq(name, field_name))
   2975  1.1  christos         goto err;
   2976  1.1  christos 
   2977  1.1  christos     if (!TEST_true(EVP_PKEY_get_octet_string_param(pkeyparam,
   2978  1.3  christos             OSSL_PKEY_PARAM_EC_GENERATOR, buf, sizeof(buf), &buf_len))
   2979  1.1  christos         || !TEST_mem_eq(buf, (int)buf_len, gen, gen_size))
   2980  1.1  christos         goto err;
   2981  1.1  christos 
   2982  1.1  christos     if (!TEST_true(EVP_PKEY_get_bn_param(pkeyparam, OSSL_PKEY_PARAM_EC_P, &p_out))
   2983  1.1  christos         || !TEST_BN_eq(p_out, p)
   2984  1.1  christos         || !TEST_true(EVP_PKEY_get_bn_param(pkeyparam, OSSL_PKEY_PARAM_EC_A,
   2985  1.3  christos             &a_out))
   2986  1.1  christos         || !TEST_BN_eq(a_out, a)
   2987  1.1  christos         || !TEST_true(EVP_PKEY_get_bn_param(pkeyparam, OSSL_PKEY_PARAM_EC_B,
   2988  1.3  christos             &b_out))
   2989  1.1  christos         || !TEST_BN_eq(b_out, b)
   2990  1.1  christos         || !TEST_true(EVP_PKEY_get_bn_param(pkeyparam, OSSL_PKEY_PARAM_EC_ORDER,
   2991  1.3  christos             &order_out))
   2992  1.1  christos         || !TEST_BN_eq(order_out, EC_GROUP_get0_order(group)))
   2993  1.1  christos         goto err;
   2994  1.1  christos 
   2995  1.1  christos     if (EC_GROUP_get0_cofactor(group) != NULL) {
   2996  1.1  christos         if (!TEST_true(EVP_PKEY_get_bn_param(pkeyparam,
   2997  1.3  christos                 OSSL_PKEY_PARAM_EC_COFACTOR, &cofactor_out))
   2998  1.1  christos             || !TEST_BN_eq(cofactor_out, EC_GROUP_get0_cofactor(group)))
   2999  1.1  christos             goto err;
   3000  1.1  christos     }
   3001  1.1  christos     if (EC_GROUP_get0_seed(group) != NULL) {
   3002  1.1  christos         if (!TEST_true(EVP_PKEY_get_octet_string_param(pkeyparam,
   3003  1.3  christos                 OSSL_PKEY_PARAM_EC_SEED, buf, sizeof(buf), &buf_len))
   3004  1.1  christos             || !TEST_mem_eq(buf, buf_len, EC_GROUP_get0_seed(group),
   3005  1.3  christos                 EC_GROUP_get_seed_len(group)))
   3006  1.1  christos             goto err;
   3007  1.1  christos     }
   3008  1.1  christos 
   3009  1.1  christos     if (EC_GROUP_get_field_type(group) == NID_X9_62_prime_field) {
   3010  1.1  christos         /* No extra fields should be set for a prime field */
   3011  1.1  christos         if (!TEST_false(EVP_PKEY_get_int_param(pkeyparam,
   3012  1.3  christos                 OSSL_PKEY_PARAM_EC_CHAR2_M, &i_out))
   3013  1.1  christos             || !TEST_false(EVP_PKEY_get_int_param(pkeyparam,
   3014  1.3  christos                 OSSL_PKEY_PARAM_EC_CHAR2_TP_BASIS, &i_out))
   3015  1.1  christos             || !TEST_false(EVP_PKEY_get_int_param(pkeyparam,
   3016  1.3  christos                 OSSL_PKEY_PARAM_EC_CHAR2_PP_K1, &i_out))
   3017  1.1  christos             || !TEST_false(EVP_PKEY_get_int_param(pkeyparam,
   3018  1.3  christos                 OSSL_PKEY_PARAM_EC_CHAR2_PP_K2, &i_out))
   3019  1.1  christos             || !TEST_false(EVP_PKEY_get_int_param(pkeyparam,
   3020  1.3  christos                 OSSL_PKEY_PARAM_EC_CHAR2_PP_K3, &i_out))
   3021  1.1  christos             || !TEST_false(EVP_PKEY_get_utf8_string_param(pkeyparam,
   3022  1.3  christos                 OSSL_PKEY_PARAM_EC_CHAR2_TYPE, name, sizeof(name),
   3023  1.3  christos                 &name_len)))
   3024  1.1  christos             goto err;
   3025  1.1  christos     } else {
   3026  1.1  christos #ifndef OPENSSL_NO_EC2M
   3027  1.1  christos         if (!TEST_true(EVP_PKEY_get_int_param(pkeyparam,
   3028  1.3  christos                 OSSL_PKEY_PARAM_EC_CHAR2_M, &i_out))
   3029  1.1  christos             || !TEST_int_eq(EC_GROUP_get_degree(group), i_out)
   3030  1.1  christos             || !TEST_true(EVP_PKEY_get_utf8_string_param(pkeyparam,
   3031  1.3  christos                 OSSL_PKEY_PARAM_EC_CHAR2_TYPE, name, sizeof(name),
   3032  1.3  christos                 &name_len))
   3033  1.1  christos             || !TEST_str_eq(name, basis_name))
   3034  1.1  christos             goto err;
   3035  1.1  christos 
   3036  1.1  christos         if (EC_GROUP_get_basis_type(group) == NID_X9_62_tpBasis) {
   3037  1.1  christos             if (!TEST_true(EVP_PKEY_get_int_param(pkeyparam,
   3038  1.3  christos                     OSSL_PKEY_PARAM_EC_CHAR2_TP_BASIS, &i_out))
   3039  1.1  christos                 || !TEST_int_eq(k1, i_out)
   3040  1.1  christos                 || !TEST_false(EVP_PKEY_get_int_param(pkeyparam,
   3041  1.3  christos                     OSSL_PKEY_PARAM_EC_CHAR2_PP_K1, &i_out))
   3042  1.1  christos                 || !TEST_false(EVP_PKEY_get_int_param(pkeyparam,
   3043  1.3  christos                     OSSL_PKEY_PARAM_EC_CHAR2_PP_K2, &i_out))
   3044  1.1  christos                 || !TEST_false(EVP_PKEY_get_int_param(pkeyparam,
   3045  1.3  christos                     OSSL_PKEY_PARAM_EC_CHAR2_PP_K3, &i_out)))
   3046  1.1  christos                 goto err;
   3047  1.1  christos         } else {
   3048  1.1  christos             if (!TEST_false(EVP_PKEY_get_int_param(pkeyparam,
   3049  1.3  christos                     OSSL_PKEY_PARAM_EC_CHAR2_TP_BASIS, &i_out))
   3050  1.1  christos                 || !TEST_true(EVP_PKEY_get_int_param(pkeyparam,
   3051  1.3  christos                     OSSL_PKEY_PARAM_EC_CHAR2_PP_K1, &i_out))
   3052  1.1  christos                 || !TEST_int_eq(k1, i_out)
   3053  1.1  christos                 || !TEST_true(EVP_PKEY_get_int_param(pkeyparam,
   3054  1.3  christos                     OSSL_PKEY_PARAM_EC_CHAR2_PP_K2, &i_out))
   3055  1.1  christos                 || !TEST_int_eq(k2, i_out)
   3056  1.1  christos                 || !TEST_true(EVP_PKEY_get_int_param(pkeyparam,
   3057  1.3  christos                     OSSL_PKEY_PARAM_EC_CHAR2_PP_K3, &i_out))
   3058  1.1  christos                 || !TEST_int_eq(k3, i_out))
   3059  1.1  christos                 goto err;
   3060  1.1  christos         }
   3061  1.1  christos #endif /* OPENSSL_NO_EC2M */
   3062  1.1  christos     }
   3063  1.1  christos     if (!TEST_ptr(gettable = EVP_PKEY_gettable_params(pkeyparam))
   3064  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_GROUP_NAME))
   3065  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_ENCODING))
   3066  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_FIELD_TYPE))
   3067  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_P))
   3068  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_A))
   3069  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_B))
   3070  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_GENERATOR))
   3071  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_ORDER))
   3072  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_COFACTOR))
   3073  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_SEED))
   3074  1.1  christos #ifndef OPENSSL_NO_EC2M
   3075  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_CHAR2_M))
   3076  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_CHAR2_TYPE))
   3077  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_CHAR2_TP_BASIS))
   3078  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_CHAR2_PP_K1))
   3079  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_CHAR2_PP_K2))
   3080  1.1  christos         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_EC_CHAR2_PP_K3))
   3081  1.1  christos #endif
   3082  1.3  christos     )
   3083  1.1  christos         goto err;
   3084  1.1  christos     ret = 1;
   3085  1.1  christos err:
   3086  1.1  christos     BN_free(order_out);
   3087  1.1  christos     BN_free(cofactor_out);
   3088  1.1  christos     BN_free(a_out);
   3089  1.1  christos     BN_free(b_out);
   3090  1.1  christos     BN_free(p_out);
   3091  1.1  christos     OSSL_PARAM_free(params);
   3092  1.1  christos     OSSL_PARAM_BLD_free(bld);
   3093  1.1  christos     EVP_PKEY_free(pkeyparam);
   3094  1.1  christos     EVP_PKEY_CTX_free(pctx);
   3095  1.1  christos     return ret;
   3096  1.1  christos }
   3097  1.1  christos 
   3098  1.1  christos /*
   3099  1.1  christos  * check the EC_METHOD respects the supplied EC_GROUP_set_generator G
   3100  1.1  christos  */
   3101  1.1  christos static int custom_generator_test(int id)
   3102  1.1  christos {
   3103  1.1  christos     int ret = 0, nid, bsize;
   3104  1.1  christos     EC_GROUP *group = NULL;
   3105  1.1  christos     EC_POINT *G2 = NULL, *Q1 = NULL, *Q2 = NULL;
   3106  1.1  christos     BN_CTX *ctx = NULL;
   3107  1.1  christos     BIGNUM *k = NULL;
   3108  1.1  christos     unsigned char *b1 = NULL, *b2 = NULL;
   3109  1.1  christos 
   3110  1.1  christos     /* Do some setup */
   3111  1.1  christos     nid = curves[id].nid;
   3112  1.1  christos     TEST_note("Curve %s", OBJ_nid2sn(nid));
   3113  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new()))
   3114  1.1  christos         return 0;
   3115  1.1  christos 
   3116  1.1  christos     BN_CTX_start(ctx);
   3117  1.1  christos 
   3118  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(nid)))
   3119  1.1  christos         goto err;
   3120  1.1  christos 
   3121  1.1  christos     /* expected byte length of encoded points */
   3122  1.1  christos     bsize = (EC_GROUP_get_degree(group) + 7) / 8;
   3123  1.1  christos     bsize = 1 + 2 * bsize; /* UNCOMPRESSED_POINT format */
   3124  1.1  christos 
   3125  1.1  christos     if (!TEST_ptr(k = BN_CTX_get(ctx))
   3126  1.1  christos         /* fetch a testing scalar k != 0,1 */
   3127  1.1  christos         || !TEST_true(BN_rand(k, EC_GROUP_order_bits(group) - 1,
   3128  1.3  christos             BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY))
   3129  1.1  christos         /* make k even */
   3130  1.1  christos         || !TEST_true(BN_clear_bit(k, 0))
   3131  1.1  christos         || !TEST_ptr(G2 = EC_POINT_new(group))
   3132  1.1  christos         || !TEST_ptr(Q1 = EC_POINT_new(group))
   3133  1.1  christos         /* Q1 := kG */
   3134  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q1, k, NULL, NULL, ctx))
   3135  1.1  christos         /* pull out the bytes of that */
   3136  1.1  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q1,
   3137  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED, NULL,
   3138  1.3  christos                             0, ctx),
   3139  1.3  christos             bsize)
   3140  1.1  christos         || !TEST_ptr(b1 = OPENSSL_malloc(bsize))
   3141  1.1  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q1,
   3142  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED, b1,
   3143  1.3  christos                             bsize, ctx),
   3144  1.3  christos             bsize)
   3145  1.1  christos         /* new generator is G2 := 2G */
   3146  1.1  christos         || !TEST_true(EC_POINT_dbl(group, G2, EC_GROUP_get0_generator(group),
   3147  1.3  christos             ctx))
   3148  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, G2,
   3149  1.3  christos             EC_GROUP_get0_order(group),
   3150  1.3  christos             EC_GROUP_get0_cofactor(group)))
   3151  1.1  christos         || !TEST_ptr(Q2 = EC_POINT_new(group))
   3152  1.1  christos         || !TEST_true(BN_rshift1(k, k))
   3153  1.1  christos         /* Q2 := k/2 G2 */
   3154  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q2, k, NULL, NULL, ctx))
   3155  1.1  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q2,
   3156  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED, NULL,
   3157  1.3  christos                             0, ctx),
   3158  1.3  christos             bsize)
   3159  1.1  christos         || !TEST_ptr(b2 = OPENSSL_malloc(bsize))
   3160  1.1  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q2,
   3161  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED, b2,
   3162  1.3  christos                             bsize, ctx),
   3163  1.3  christos             bsize)
   3164  1.1  christos         /* Q1 = kG = k/2 G2 = Q2 should hold */
   3165  1.1  christos         || !TEST_mem_eq(b1, bsize, b2, bsize))
   3166  1.1  christos         goto err;
   3167  1.1  christos 
   3168  1.1  christos     if (!do_test_custom_explicit_fromdata(group, ctx, b1, bsize))
   3169  1.1  christos         goto err;
   3170  1.1  christos 
   3171  1.1  christos     ret = 1;
   3172  1.1  christos 
   3173  1.3  christos err:
   3174  1.1  christos     EC_POINT_free(Q1);
   3175  1.1  christos     EC_POINT_free(Q2);
   3176  1.1  christos     EC_POINT_free(G2);
   3177  1.1  christos     EC_GROUP_free(group);
   3178  1.1  christos     BN_CTX_end(ctx);
   3179  1.1  christos     BN_CTX_free(ctx);
   3180  1.1  christos     OPENSSL_free(b1);
   3181  1.1  christos     OPENSSL_free(b2);
   3182  1.1  christos 
   3183  1.1  christos     return ret;
   3184  1.1  christos }
   3185  1.1  christos 
   3186  1.1  christos /*
   3187  1.1  christos  * check creation of curves from explicit params through the public API
   3188  1.1  christos  */
   3189  1.1  christos static int custom_params_test(int id)
   3190  1.1  christos {
   3191  1.1  christos     int ret = 0, nid, bsize;
   3192  1.1  christos     const char *curve_name = NULL;
   3193  1.1  christos     EC_GROUP *group = NULL, *altgroup = NULL;
   3194  1.1  christos     EC_POINT *G2 = NULL, *Q1 = NULL, *Q2 = NULL;
   3195  1.1  christos     const EC_POINT *Q = NULL;
   3196  1.1  christos     BN_CTX *ctx = NULL;
   3197  1.1  christos     BIGNUM *k = NULL;
   3198  1.1  christos     unsigned char *buf1 = NULL, *buf2 = NULL;
   3199  1.1  christos     const BIGNUM *z = NULL, *cof = NULL, *priv1 = NULL;
   3200  1.1  christos     BIGNUM *p = NULL, *a = NULL, *b = NULL;
   3201  1.1  christos     int is_prime = 0;
   3202  1.1  christos     EC_KEY *eckey1 = NULL, *eckey2 = NULL;
   3203  1.1  christos     EVP_PKEY *pkey1 = NULL, *pkey2 = NULL;
   3204  1.1  christos     EVP_PKEY_CTX *pctx1 = NULL, *pctx2 = NULL, *dctx = NULL;
   3205  1.1  christos     size_t sslen, t;
   3206  1.3  christos     unsigned char *pub1 = NULL, *pub2 = NULL;
   3207  1.1  christos     OSSL_PARAM_BLD *param_bld = NULL;
   3208  1.1  christos     OSSL_PARAM *params1 = NULL, *params2 = NULL;
   3209  1.1  christos 
   3210  1.1  christos     /* Do some setup */
   3211  1.1  christos     nid = curves[id].nid;
   3212  1.1  christos     curve_name = OBJ_nid2sn(nid);
   3213  1.1  christos     TEST_note("Curve %s", curve_name);
   3214  1.1  christos 
   3215  1.1  christos     if (nid == NID_sm2)
   3216  1.1  christos         return TEST_skip("custom params not supported with SM2");
   3217  1.1  christos 
   3218  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new()))
   3219  1.1  christos         return 0;
   3220  1.1  christos 
   3221  1.1  christos     BN_CTX_start(ctx);
   3222  1.1  christos     if (!TEST_ptr(p = BN_CTX_get(ctx))
   3223  1.3  christos         || !TEST_ptr(a = BN_CTX_get(ctx))
   3224  1.3  christos         || !TEST_ptr(b = BN_CTX_get(ctx))
   3225  1.3  christos         || !TEST_ptr(k = BN_CTX_get(ctx)))
   3226  1.1  christos         goto err;
   3227  1.1  christos 
   3228  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(nid)))
   3229  1.1  christos         goto err;
   3230  1.1  christos 
   3231  1.1  christos     is_prime = EC_GROUP_get_field_type(group) == NID_X9_62_prime_field;
   3232  1.1  christos #ifdef OPENSSL_NO_EC2M
   3233  1.1  christos     if (!is_prime) {
   3234  1.1  christos         ret = TEST_skip("binary curves not supported in this build");
   3235  1.1  christos         goto err;
   3236  1.1  christos     }
   3237  1.1  christos #endif
   3238  1.1  christos 
   3239  1.1  christos     /* expected byte length of encoded points */
   3240  1.1  christos     bsize = (EC_GROUP_get_degree(group) + 7) / 8;
   3241  1.1  christos     bsize = 1 + 2 * bsize; /* UNCOMPRESSED_POINT format */
   3242  1.1  christos 
   3243  1.1  christos     /* extract parameters from built-in curve */
   3244  1.1  christos     if (!TEST_true(EC_GROUP_get_curve(group, p, a, b, ctx))
   3245  1.3  christos         || !TEST_ptr(G2 = EC_POINT_new(group))
   3246  1.3  christos         /* new generator is G2 := 2G */
   3247  1.3  christos         || !TEST_true(EC_POINT_dbl(group, G2,
   3248  1.3  christos             EC_GROUP_get0_generator(group), ctx))
   3249  1.3  christos         /* pull out the bytes of that */
   3250  1.3  christos         || !TEST_int_eq(EC_POINT_point2oct(group, G2,
   3251  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED,
   3252  1.3  christos                             NULL, 0, ctx),
   3253  1.3  christos             bsize)
   3254  1.3  christos         || !TEST_ptr(buf1 = OPENSSL_malloc(bsize))
   3255  1.3  christos         || !TEST_int_eq(EC_POINT_point2oct(group, G2,
   3256  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED,
   3257  1.3  christos                             buf1, bsize, ctx),
   3258  1.3  christos             bsize)
   3259  1.3  christos         || !TEST_ptr(z = EC_GROUP_get0_order(group))
   3260  1.3  christos         || !TEST_ptr(cof = EC_GROUP_get0_cofactor(group)))
   3261  1.1  christos         goto err;
   3262  1.1  christos 
   3263  1.1  christos     /* create a new group using same params (but different generator) */
   3264  1.1  christos     if (is_prime) {
   3265  1.1  christos         if (!TEST_ptr(altgroup = EC_GROUP_new_curve_GFp(p, a, b, ctx)))
   3266  1.1  christos             goto err;
   3267  1.1  christos     }
   3268  1.1  christos #ifndef OPENSSL_NO_EC2M
   3269  1.1  christos     else {
   3270  1.1  christos         if (!TEST_ptr(altgroup = EC_GROUP_new_curve_GF2m(p, a, b, ctx)))
   3271  1.1  christos             goto err;
   3272  1.1  christos     }
   3273  1.1  christos #endif
   3274  1.1  christos 
   3275  1.1  christos     /* set 2*G as the generator of altgroup */
   3276  1.1  christos     EC_POINT_free(G2); /* discard G2 as it refers to the original group */
   3277  1.1  christos     if (!TEST_ptr(G2 = EC_POINT_new(altgroup))
   3278  1.3  christos         || !TEST_true(EC_POINT_oct2point(altgroup, G2, buf1, bsize, ctx))
   3279  1.3  christos         || !TEST_int_eq(EC_POINT_is_on_curve(altgroup, G2, ctx), 1)
   3280  1.3  christos         || !TEST_true(EC_GROUP_set_generator(altgroup, G2, z, cof)))
   3281  1.1  christos         goto err;
   3282  1.1  christos 
   3283  1.1  christos     /* verify math checks out */
   3284  1.1  christos     if (/* allocate temporary points on group and altgroup */
   3285  1.3  christos         !TEST_ptr(Q1 = EC_POINT_new(group))
   3286  1.3  christos         || !TEST_ptr(Q2 = EC_POINT_new(altgroup))
   3287  1.3  christos         /* fetch a testing scalar k != 0,1 */
   3288  1.3  christos         || !TEST_true(BN_rand(k, EC_GROUP_order_bits(group) - 1,
   3289  1.3  christos             BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY))
   3290  1.3  christos         /* make k even */
   3291  1.3  christos         || !TEST_true(BN_clear_bit(k, 0))
   3292  1.3  christos         /* Q1 := kG on group */
   3293  1.3  christos         || !TEST_true(EC_POINT_mul(group, Q1, k, NULL, NULL, ctx))
   3294  1.3  christos         /* pull out the bytes of that */
   3295  1.3  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q1,
   3296  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED,
   3297  1.3  christos                             NULL, 0, ctx),
   3298  1.3  christos             bsize)
   3299  1.3  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q1,
   3300  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED,
   3301  1.3  christos                             buf1, bsize, ctx),
   3302  1.3  christos             bsize)
   3303  1.3  christos         /* k := k/2 */
   3304  1.3  christos         || !TEST_true(BN_rshift1(k, k))
   3305  1.3  christos         /* Q2 := k/2 G2 on altgroup */
   3306  1.3  christos         || !TEST_true(EC_POINT_mul(altgroup, Q2, k, NULL, NULL, ctx))
   3307  1.3  christos         /* pull out the bytes of that */
   3308  1.3  christos         || !TEST_int_eq(EC_POINT_point2oct(altgroup, Q2,
   3309  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED,
   3310  1.3  christos                             NULL, 0, ctx),
   3311  1.3  christos             bsize)
   3312  1.3  christos         || !TEST_ptr(buf2 = OPENSSL_malloc(bsize))
   3313  1.3  christos         || !TEST_int_eq(EC_POINT_point2oct(altgroup, Q2,
   3314  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED,
   3315  1.3  christos                             buf2, bsize, ctx),
   3316  1.3  christos             bsize)
   3317  1.3  christos         /* Q1 = kG = k/2 G2 = Q2 should hold */
   3318  1.3  christos         || !TEST_mem_eq(buf1, bsize, buf2, bsize))
   3319  1.1  christos         goto err;
   3320  1.1  christos 
   3321  1.1  christos     /* create two `EC_KEY`s on altgroup */
   3322  1.1  christos     if (!TEST_ptr(eckey1 = EC_KEY_new())
   3323  1.3  christos         || !TEST_true(EC_KEY_set_group(eckey1, altgroup))
   3324  1.3  christos         || !TEST_true(EC_KEY_generate_key(eckey1))
   3325  1.3  christos         || !TEST_ptr(eckey2 = EC_KEY_new())
   3326  1.3  christos         || !TEST_true(EC_KEY_set_group(eckey2, altgroup))
   3327  1.3  christos         || !TEST_true(EC_KEY_generate_key(eckey2)))
   3328  1.1  christos         goto err;
   3329  1.1  christos 
   3330  1.1  christos     /* retrieve priv1 for later */
   3331  1.1  christos     if (!TEST_ptr(priv1 = EC_KEY_get0_private_key(eckey1)))
   3332  1.1  christos         goto err;
   3333  1.1  christos 
   3334  1.1  christos     /*
   3335  1.1  christos      * retrieve bytes for pub1 for later
   3336  1.1  christos      *
   3337  1.1  christos      * We compute the pub key in the original group as we will later use it to
   3338  1.1  christos      * define a provider key in the built-in group.
   3339  1.1  christos      */
   3340  1.1  christos     if (!TEST_true(EC_POINT_mul(group, Q1, priv1, NULL, NULL, ctx))
   3341  1.3  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q1,
   3342  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED,
   3343  1.3  christos                             NULL, 0, ctx),
   3344  1.3  christos             bsize)
   3345  1.3  christos         || !TEST_ptr(pub1 = OPENSSL_malloc(bsize))
   3346  1.3  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q1,
   3347  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED,
   3348  1.3  christos                             pub1, bsize, ctx),
   3349  1.3  christos             bsize))
   3350  1.1  christos         goto err;
   3351  1.1  christos 
   3352  1.1  christos     /* retrieve bytes for pub2 for later */
   3353  1.1  christos     if (!TEST_ptr(Q = EC_KEY_get0_public_key(eckey2))
   3354  1.3  christos         || !TEST_int_eq(EC_POINT_point2oct(altgroup, Q,
   3355  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED,
   3356  1.3  christos                             NULL, 0, ctx),
   3357  1.3  christos             bsize)
   3358  1.3  christos         || !TEST_ptr(pub2 = OPENSSL_malloc(bsize))
   3359  1.3  christos         || !TEST_int_eq(EC_POINT_point2oct(altgroup, Q,
   3360  1.3  christos                             POINT_CONVERSION_UNCOMPRESSED,
   3361  1.3  christos                             pub2, bsize, ctx),
   3362  1.3  christos             bsize))
   3363  1.1  christos         goto err;
   3364  1.1  christos 
   3365  1.1  christos     /* create two `EVP_PKEY`s from the `EC_KEY`s */
   3366  1.1  christos     if (!TEST_ptr(pkey1 = EVP_PKEY_new())
   3367  1.3  christos         || !TEST_int_eq(EVP_PKEY_assign_EC_KEY(pkey1, eckey1), 1))
   3368  1.1  christos         goto err;
   3369  1.1  christos     eckey1 = NULL; /* ownership passed to pkey1 */
   3370  1.1  christos     if (!TEST_ptr(pkey2 = EVP_PKEY_new())
   3371  1.3  christos         || !TEST_int_eq(EVP_PKEY_assign_EC_KEY(pkey2, eckey2), 1))
   3372  1.1  christos         goto err;
   3373  1.1  christos     eckey2 = NULL; /* ownership passed to pkey2 */
   3374  1.1  christos 
   3375  1.1  christos     /* Compute keyexchange in both directions */
   3376  1.1  christos     if (!TEST_ptr(pctx1 = EVP_PKEY_CTX_new(pkey1, NULL))
   3377  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive_init(pctx1), 1)
   3378  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive_set_peer(pctx1, pkey2), 1)
   3379  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive(pctx1, NULL, &sslen), 1)
   3380  1.3  christos         || !TEST_int_gt(bsize, sslen)
   3381  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive(pctx1, buf1, &sslen), 1))
   3382  1.1  christos         goto err;
   3383  1.1  christos     if (!TEST_ptr(pctx2 = EVP_PKEY_CTX_new(pkey2, NULL))
   3384  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive_init(pctx2), 1)
   3385  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive_set_peer(pctx2, pkey1), 1)
   3386  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive(pctx2, NULL, &t), 1)
   3387  1.3  christos         || !TEST_int_gt(bsize, t)
   3388  1.3  christos         || !TEST_int_le(sslen, t)
   3389  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive(pctx2, buf2, &t), 1))
   3390  1.1  christos         goto err;
   3391  1.1  christos 
   3392  1.1  christos     /* Both sides should expect the same shared secret */
   3393  1.1  christos     if (!TEST_mem_eq(buf1, sslen, buf2, t))
   3394  1.1  christos         goto err;
   3395  1.1  christos 
   3396  1.1  christos     /* Build parameters for provider-native keys */
   3397  1.1  christos     if (!TEST_ptr(param_bld = OSSL_PARAM_BLD_new())
   3398  1.3  christos         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(param_bld,
   3399  1.3  christos             OSSL_PKEY_PARAM_GROUP_NAME,
   3400  1.3  christos             curve_name, 0))
   3401  1.3  christos         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(param_bld,
   3402  1.3  christos             OSSL_PKEY_PARAM_PUB_KEY,
   3403  1.3  christos             pub1, bsize))
   3404  1.3  christos         || !TEST_true(OSSL_PARAM_BLD_push_BN(param_bld,
   3405  1.3  christos             OSSL_PKEY_PARAM_PRIV_KEY,
   3406  1.3  christos             priv1))
   3407  1.3  christos         || !TEST_ptr(params1 = OSSL_PARAM_BLD_to_param(param_bld)))
   3408  1.1  christos         goto err;
   3409  1.1  christos 
   3410  1.1  christos     OSSL_PARAM_BLD_free(param_bld);
   3411  1.1  christos     if (!TEST_ptr(param_bld = OSSL_PARAM_BLD_new())
   3412  1.3  christos         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(param_bld,
   3413  1.3  christos             OSSL_PKEY_PARAM_GROUP_NAME,
   3414  1.3  christos             curve_name, 0))
   3415  1.3  christos         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(param_bld,
   3416  1.3  christos             OSSL_PKEY_PARAM_PUB_KEY,
   3417  1.3  christos             pub2, bsize))
   3418  1.3  christos         || !TEST_ptr(params2 = OSSL_PARAM_BLD_to_param(param_bld)))
   3419  1.1  christos         goto err;
   3420  1.1  christos 
   3421  1.1  christos     /* create two new provider-native `EVP_PKEY`s */
   3422  1.1  christos     EVP_PKEY_CTX_free(pctx2);
   3423  1.1  christos     if (!TEST_ptr(pctx2 = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL))
   3424  1.3  christos         || !TEST_int_eq(EVP_PKEY_fromdata_init(pctx2), 1)
   3425  1.3  christos         || !TEST_int_eq(EVP_PKEY_fromdata(pctx2, &pkey1, EVP_PKEY_KEYPAIR,
   3426  1.3  christos                             params1),
   3427  1.3  christos             1)
   3428  1.3  christos         || !TEST_int_eq(EVP_PKEY_fromdata(pctx2, &pkey2, EVP_PKEY_PUBLIC_KEY,
   3429  1.3  christos                             params2),
   3430  1.3  christos             1))
   3431  1.1  christos         goto err;
   3432  1.1  christos 
   3433  1.1  christos     /* compute keyexchange once more using the provider keys */
   3434  1.1  christos     EVP_PKEY_CTX_free(pctx1);
   3435  1.1  christos     if (!TEST_ptr(pctx1 = EVP_PKEY_CTX_new(pkey1, NULL))
   3436  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive_init(pctx1), 1)
   3437  1.3  christos         || !TEST_ptr(dctx = EVP_PKEY_CTX_dup(pctx1))
   3438  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive_set_peer_ex(dctx, pkey2, 1), 1)
   3439  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive(dctx, NULL, &t), 1)
   3440  1.3  christos         || !TEST_int_gt(bsize, t)
   3441  1.3  christos         || !TEST_int_le(sslen, t)
   3442  1.3  christos         || !TEST_int_eq(EVP_PKEY_derive(dctx, buf1, &t), 1)
   3443  1.3  christos         /* compare with previous result */
   3444  1.3  christos         || !TEST_mem_eq(buf1, t, buf2, sslen))
   3445  1.1  christos         goto err;
   3446  1.1  christos 
   3447  1.1  christos     ret = 1;
   3448  1.1  christos 
   3449  1.3  christos err:
   3450  1.1  christos     BN_CTX_end(ctx);
   3451  1.1  christos     BN_CTX_free(ctx);
   3452  1.1  christos     OSSL_PARAM_BLD_free(param_bld);
   3453  1.1  christos     OSSL_PARAM_free(params1);
   3454  1.1  christos     OSSL_PARAM_free(params2);
   3455  1.1  christos     EC_POINT_free(Q1);
   3456  1.1  christos     EC_POINT_free(Q2);
   3457  1.1  christos     EC_POINT_free(G2);
   3458  1.1  christos     EC_GROUP_free(group);
   3459  1.1  christos     EC_GROUP_free(altgroup);
   3460  1.1  christos     OPENSSL_free(buf1);
   3461  1.1  christos     OPENSSL_free(buf2);
   3462  1.1  christos     OPENSSL_free(pub1);
   3463  1.1  christos     OPENSSL_free(pub2);
   3464  1.1  christos     EC_KEY_free(eckey1);
   3465  1.1  christos     EC_KEY_free(eckey2);
   3466  1.1  christos     EVP_PKEY_free(pkey1);
   3467  1.1  christos     EVP_PKEY_free(pkey2);
   3468  1.1  christos     EVP_PKEY_CTX_free(pctx1);
   3469  1.1  christos     EVP_PKEY_CTX_free(pctx2);
   3470  1.1  christos     EVP_PKEY_CTX_free(dctx);
   3471  1.1  christos 
   3472  1.1  christos     return ret;
   3473  1.1  christos }
   3474  1.1  christos 
   3475  1.1  christos static int ec_d2i_publickey_test(void)
   3476  1.1  christos {
   3477  1.3  christos     unsigned char buf[1000];
   3478  1.3  christos     unsigned char *pubkey_enc = buf;
   3479  1.3  christos     const unsigned char *pk_enc = pubkey_enc;
   3480  1.3  christos     EVP_PKEY *gen_key = NULL, *decoded_key = NULL;
   3481  1.3  christos     EVP_PKEY_CTX *pctx = NULL;
   3482  1.3  christos     int pklen, ret = 0;
   3483  1.3  christos     OSSL_PARAM params[2];
   3484  1.3  christos 
   3485  1.3  christos     if (!TEST_ptr(gen_key = EVP_EC_gen("P-256")))
   3486  1.3  christos         goto err;
   3487  1.3  christos 
   3488  1.3  christos     if (!TEST_int_gt(pklen = i2d_PublicKey(gen_key, &pubkey_enc), 0))
   3489  1.3  christos         goto err;
   3490  1.3  christos 
   3491  1.3  christos     params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
   3492  1.3  christos         "P-256", 0);
   3493  1.3  christos     params[1] = OSSL_PARAM_construct_end();
   3494  1.3  christos 
   3495  1.3  christos     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL))
   3496  1.3  christos         || !TEST_true(EVP_PKEY_fromdata_init(pctx))
   3497  1.3  christos         || !TEST_true(EVP_PKEY_fromdata(pctx, &decoded_key,
   3498  1.3  christos             OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
   3499  1.3  christos             params))
   3500  1.3  christos         || !TEST_ptr(decoded_key)
   3501  1.3  christos         || !TEST_ptr(decoded_key = d2i_PublicKey(EVP_PKEY_EC, &decoded_key,
   3502  1.3  christos                          &pk_enc, pklen)))
   3503  1.3  christos         goto err;
   3504  1.3  christos 
   3505  1.3  christos     if (!TEST_true(EVP_PKEY_eq(gen_key, decoded_key)))
   3506  1.3  christos         goto err;
   3507  1.3  christos     ret = 1;
   3508  1.3  christos 
   3509  1.3  christos err:
   3510  1.3  christos     EVP_PKEY_CTX_free(pctx);
   3511  1.3  christos     EVP_PKEY_free(gen_key);
   3512  1.3  christos     EVP_PKEY_free(decoded_key);
   3513  1.3  christos     return ret;
   3514  1.1  christos }
   3515  1.1  christos 
   3516  1.1  christos int setup_tests(void)
   3517  1.1  christos {
   3518  1.1  christos     crv_len = EC_get_builtin_curves(NULL, 0);
   3519  1.1  christos     if (!TEST_ptr(curves = OPENSSL_malloc(sizeof(*curves) * crv_len))
   3520  1.1  christos         || !TEST_true(EC_get_builtin_curves(curves, crv_len)))
   3521  1.1  christos         return 0;
   3522  1.1  christos 
   3523  1.1  christos     ADD_TEST(parameter_test);
   3524  1.1  christos     ADD_TEST(ossl_parameter_test);
   3525  1.1  christos     ADD_TEST(cofactor_range_test);
   3526  1.1  christos     ADD_ALL_TESTS(cardinality_test, crv_len);
   3527  1.1  christos     ADD_TEST(prime_field_tests);
   3528  1.1  christos #ifndef OPENSSL_NO_EC2M
   3529  1.1  christos     ADD_TEST(hybrid_point_encoding_test);
   3530  1.1  christos     ADD_TEST(char2_field_tests);
   3531  1.1  christos     ADD_ALL_TESTS(char2_curve_test, OSSL_NELEM(char2_curve_tests));
   3532  1.1  christos #endif
   3533  1.1  christos     ADD_ALL_TESTS(nistp_single_test, OSSL_NELEM(nistp_tests_params));
   3534  1.1  christos     ADD_ALL_TESTS(internal_curve_test, crv_len);
   3535  1.1  christos     ADD_ALL_TESTS(internal_curve_test_method, crv_len);
   3536  1.1  christos     ADD_TEST(group_field_test);
   3537  1.1  christos     ADD_ALL_TESTS(check_named_curve_test, crv_len);
   3538  1.1  christos     ADD_ALL_TESTS(check_named_curve_lookup_test, crv_len);
   3539  1.1  christos     ADD_ALL_TESTS(check_ec_key_field_public_range_test, crv_len);
   3540  1.1  christos     ADD_ALL_TESTS(check_named_curve_from_ecparameters, crv_len);
   3541  1.1  christos     ADD_ALL_TESTS(ec_point_hex2point_test, crv_len);
   3542  1.1  christos     ADD_ALL_TESTS(custom_generator_test, crv_len);
   3543  1.1  christos     ADD_ALL_TESTS(custom_params_test, crv_len);
   3544  1.1  christos     ADD_TEST(ec_d2i_publickey_test);
   3545  1.1  christos     return 1;
   3546  1.1  christos }
   3547  1.1  christos 
   3548  1.1  christos void cleanup_tests(void)
   3549  1.1  christos {
   3550  1.1  christos     OPENSSL_free(curves);
   3551  1.1  christos }
   3552