Home | History | Annotate | Line # | Download | only in test
      1  1.1  christos /*
      2  1.1  christos  * Copyright 2001-2021 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 OpenSSL license (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 #include "internal/nelem.h"
     12  1.1  christos #include "testutil.h"
     13  1.1  christos 
     14  1.1  christos #ifndef OPENSSL_NO_EC
     15  1.1  christos # include <openssl/ec.h>
     16  1.1  christos # ifndef OPENSSL_NO_ENGINE
     17  1.1  christos #  include <openssl/engine.h>
     18  1.1  christos # endif
     19  1.1  christos # include <openssl/err.h>
     20  1.1  christos # include <openssl/obj_mac.h>
     21  1.1  christos # include <openssl/objects.h>
     22  1.1  christos # include <openssl/rand.h>
     23  1.1  christos # include <openssl/bn.h>
     24  1.1  christos # include <openssl/opensslconf.h>
     25  1.1  christos 
     26  1.1  christos static size_t crv_len = 0;
     27  1.1  christos static EC_builtin_curve *curves = NULL;
     28  1.1  christos 
     29  1.1  christos /* test multiplication with group order, long and negative scalars */
     30  1.1  christos static int group_order_tests(EC_GROUP *group)
     31  1.1  christos {
     32  1.1  christos     BIGNUM *n1 = NULL, *n2 = NULL, *order = NULL;
     33  1.1  christos     EC_POINT *P = NULL, *Q = NULL, *R = NULL, *S = NULL;
     34  1.1  christos     const EC_POINT *G = NULL;
     35  1.1  christos     BN_CTX *ctx = NULL;
     36  1.1  christos     int i = 0, r = 0;
     37  1.1  christos 
     38  1.1  christos     if (!TEST_ptr(n1 = BN_new())
     39  1.1  christos         || !TEST_ptr(n2 = BN_new())
     40  1.1  christos         || !TEST_ptr(order = BN_new())
     41  1.1  christos         || !TEST_ptr(ctx = BN_CTX_new())
     42  1.1  christos         || !TEST_ptr(G = EC_GROUP_get0_generator(group))
     43  1.1  christos         || !TEST_ptr(P = EC_POINT_new(group))
     44  1.1  christos         || !TEST_ptr(Q = EC_POINT_new(group))
     45  1.1  christos         || !TEST_ptr(R = EC_POINT_new(group))
     46  1.1  christos         || !TEST_ptr(S = EC_POINT_new(group)))
     47  1.1  christos         goto err;
     48  1.1  christos 
     49  1.1  christos     if (!TEST_true(EC_GROUP_get_order(group, order, ctx))
     50  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q, order, NULL, NULL, ctx))
     51  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, Q))
     52  1.1  christos         || !TEST_true(EC_GROUP_precompute_mult(group, ctx))
     53  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q, order, NULL, NULL, ctx))
     54  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, Q))
     55  1.1  christos         || !TEST_true(EC_POINT_copy(P, G))
     56  1.1  christos         || !TEST_true(BN_one(n1))
     57  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q, n1, NULL, NULL, ctx))
     58  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx))
     59  1.1  christos         || !TEST_true(BN_sub(n1, order, n1))
     60  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q, n1, NULL, NULL, ctx))
     61  1.1  christos         || !TEST_true(EC_POINT_invert(group, Q, ctx))
     62  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx)))
     63  1.1  christos         goto err;
     64  1.1  christos 
     65  1.1  christos     for (i = 1; i <= 2; i++) {
     66  1.1  christos         const BIGNUM *scalars[6];
     67  1.1  christos         const EC_POINT *points[6];
     68  1.1  christos 
     69  1.1  christos         if (!TEST_true(BN_set_word(n1, i))
     70  1.1  christos             /*
     71  1.1  christos              * If i == 1, P will be the predefined generator for which
     72  1.1  christos              * EC_GROUP_precompute_mult has set up precomputation.
     73  1.1  christos              */
     74  1.1  christos             || !TEST_true(EC_POINT_mul(group, P, n1, NULL, NULL, ctx))
     75  1.1  christos             || (i == 1 && !TEST_int_eq(0, EC_POINT_cmp(group, P, G, ctx)))
     76  1.1  christos             || !TEST_true(BN_one(n1))
     77  1.1  christos             /* n1 = 1 - order */
     78  1.1  christos             || !TEST_true(BN_sub(n1, n1, order))
     79  1.1  christos             || !TEST_true(EC_POINT_mul(group, Q, NULL, P, n1, ctx))
     80  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx))
     81  1.1  christos 
     82  1.1  christos             /* n2 = 1 + order */
     83  1.1  christos             || !TEST_true(BN_add(n2, order, BN_value_one()))
     84  1.1  christos             || !TEST_true(EC_POINT_mul(group, Q, NULL, P, n2, ctx))
     85  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx))
     86  1.1  christos 
     87  1.1  christos             /* n2 = (1 - order) * (1 + order) = 1 - order^2 */
     88  1.1  christos             || !TEST_true(BN_mul(n2, n1, n2, ctx))
     89  1.1  christos             || !TEST_true(EC_POINT_mul(group, Q, NULL, P, n2, ctx))
     90  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx)))
     91  1.1  christos             goto err;
     92  1.1  christos 
     93  1.1  christos         /* n2 = order^2 - 1 */
     94  1.1  christos         BN_set_negative(n2, 0);
     95  1.1  christos         if (!TEST_true(EC_POINT_mul(group, Q, NULL, P, n2, ctx))
     96  1.1  christos             /* Add P to verify the result. */
     97  1.1  christos             || !TEST_true(EC_POINT_add(group, Q, Q, P, ctx))
     98  1.1  christos             || !TEST_true(EC_POINT_is_at_infinity(group, Q))
     99  1.1  christos 
    100  1.1  christos             /* Exercise EC_POINTs_mul, including corner cases. */
    101  1.1  christos             || !TEST_false(EC_POINT_is_at_infinity(group, P)))
    102  1.1  christos             goto err;
    103  1.1  christos 
    104  1.1  christos         scalars[0] = scalars[1] = BN_value_one();
    105  1.1  christos         points[0]  = points[1]  = P;
    106  1.1  christos 
    107  1.1  christos         if (!TEST_true(EC_POINTs_mul(group, R, NULL, 2, points, scalars, ctx))
    108  1.1  christos             || !TEST_true(EC_POINT_dbl(group, S, points[0], ctx))
    109  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, R, S, ctx)))
    110  1.1  christos             goto err;
    111  1.1  christos 
    112  1.1  christos         scalars[0] = n1;
    113  1.1  christos         points[0] = Q;          /* => infinity */
    114  1.1  christos         scalars[1] = n2;
    115  1.1  christos         points[1] = P;          /* => -P */
    116  1.1  christos         scalars[2] = n1;
    117  1.1  christos         points[2] = Q;          /* => infinity */
    118  1.1  christos         scalars[3] = n2;
    119  1.1  christos         points[3] = Q;          /* => infinity */
    120  1.1  christos         scalars[4] = n1;
    121  1.1  christos         points[4] = P;          /* => P */
    122  1.1  christos         scalars[5] = n2;
    123  1.1  christos         points[5] = Q;          /* => infinity */
    124  1.1  christos         if (!TEST_true(EC_POINTs_mul(group, P, NULL, 6, points, scalars, ctx))
    125  1.1  christos             || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    126  1.1  christos             goto err;
    127  1.1  christos     }
    128  1.1  christos 
    129  1.1  christos     r = 1;
    130  1.1  christos err:
    131  1.1  christos     if (r == 0 && i != 0)
    132  1.1  christos         TEST_info(i == 1 ? "allowing precomputation" :
    133  1.1  christos                            "without precomputation");
    134  1.1  christos     EC_POINT_free(P);
    135  1.1  christos     EC_POINT_free(Q);
    136  1.1  christos     EC_POINT_free(R);
    137  1.1  christos     EC_POINT_free(S);
    138  1.1  christos     BN_free(n1);
    139  1.1  christos     BN_free(n2);
    140  1.1  christos     BN_free(order);
    141  1.1  christos     BN_CTX_free(ctx);
    142  1.1  christos     return r;
    143  1.1  christos }
    144  1.1  christos 
    145  1.1  christos static int prime_field_tests(void)
    146  1.1  christos {
    147  1.1  christos     BN_CTX *ctx = NULL;
    148  1.1  christos     BIGNUM *p = NULL, *a = NULL, *b = NULL, *scalar3 = NULL;
    149  1.1  christos     EC_GROUP *group = NULL, *tmp = NULL;
    150  1.1  christos     EC_GROUP *P_160 = NULL, *P_192 = NULL, *P_224 = NULL,
    151  1.1  christos              *P_256 = NULL, *P_384 = NULL, *P_521 = NULL;
    152  1.1  christos     EC_POINT *P = NULL, *Q = NULL, *R = NULL;
    153  1.1  christos     BIGNUM *x = NULL, *y = NULL, *z = NULL, *yplusone = NULL;
    154  1.1  christos     const EC_POINT *points[4];
    155  1.1  christos     const BIGNUM *scalars[4];
    156  1.1  christos     unsigned char buf[100];
    157  1.1  christos     size_t len, r = 0;
    158  1.1  christos     int k;
    159  1.1  christos 
    160  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
    161  1.1  christos         || !TEST_ptr(p = BN_new())
    162  1.1  christos         || !TEST_ptr(a = BN_new())
    163  1.1  christos         || !TEST_ptr(b = BN_new())
    164  1.1  christos         || !TEST_true(BN_hex2bn(&p, "17"))
    165  1.1  christos         || !TEST_true(BN_hex2bn(&a, "1"))
    166  1.1  christos         || !TEST_true(BN_hex2bn(&b, "1"))
    167  1.1  christos         /*
    168  1.1  christos          * applications should use EC_GROUP_new_curve_GFp so
    169  1.1  christos          * that the library gets to choose the EC_METHOD
    170  1.1  christos          */
    171  1.1  christos         || !TEST_ptr(group = EC_GROUP_new(EC_GFp_mont_method()))
    172  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    173  1.1  christos         || !TEST_ptr(tmp = EC_GROUP_new(EC_GROUP_method_of(group)))
    174  1.1  christos         || !TEST_true(EC_GROUP_copy(tmp, group)))
    175  1.1  christos         goto err;
    176  1.1  christos     EC_GROUP_free(group);
    177  1.1  christos     group = tmp;
    178  1.1  christos     tmp = NULL;
    179  1.1  christos 
    180  1.1  christos     if (!TEST_true(EC_GROUP_get_curve(group, p, a, b, ctx)))
    181  1.1  christos         goto err;
    182  1.1  christos 
    183  1.1  christos     TEST_info("Curve defined by Weierstrass equation");
    184  1.1  christos     TEST_note("     y^2 = x^3 + a*x + b (mod p)");
    185  1.1  christos     test_output_bignum("a", a);
    186  1.1  christos     test_output_bignum("b", b);
    187  1.1  christos     test_output_bignum("p", p);
    188  1.1  christos 
    189  1.1  christos     buf[0] = 0;
    190  1.1  christos     if (!TEST_ptr(P = EC_POINT_new(group))
    191  1.1  christos         || !TEST_ptr(Q = EC_POINT_new(group))
    192  1.1  christos         || !TEST_ptr(R = EC_POINT_new(group))
    193  1.1  christos         || !TEST_true(EC_POINT_set_to_infinity(group, P))
    194  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P))
    195  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, Q, buf, 1, ctx))
    196  1.1  christos         || !TEST_true(EC_POINT_add(group, P, P, Q, ctx))
    197  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P))
    198  1.1  christos         || !TEST_ptr(x = BN_new())
    199  1.1  christos         || !TEST_ptr(y = BN_new())
    200  1.1  christos         || !TEST_ptr(z = BN_new())
    201  1.1  christos         || !TEST_ptr(yplusone = BN_new())
    202  1.1  christos         || !TEST_true(BN_hex2bn(&x, "D"))
    203  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, Q, x, 1, ctx)))
    204  1.1  christos         goto err;
    205  1.1  christos 
    206  1.1  christos     if (!TEST_int_gt(EC_POINT_is_on_curve(group, Q, ctx), 0)) {
    207  1.1  christos         if (!TEST_true(EC_POINT_get_affine_coordinates(group, Q, x, y, ctx)))
    208  1.1  christos             goto err;
    209  1.1  christos         TEST_info("Point is not on curve");
    210  1.1  christos         test_output_bignum("x", x);
    211  1.1  christos         test_output_bignum("y", y);
    212  1.1  christos         goto err;
    213  1.1  christos     }
    214  1.1  christos 
    215  1.1  christos     TEST_note("A cyclic subgroup:");
    216  1.1  christos     k = 100;
    217  1.1  christos     do {
    218  1.1  christos         if (!TEST_int_ne(k--, 0))
    219  1.1  christos             goto err;
    220  1.1  christos 
    221  1.1  christos         if (EC_POINT_is_at_infinity(group, P)) {
    222  1.1  christos             TEST_note("     point at infinity");
    223  1.1  christos         } else {
    224  1.1  christos             if (!TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y,
    225  1.1  christos                                                            ctx)))
    226  1.1  christos                 goto err;
    227  1.1  christos 
    228  1.1  christos             test_output_bignum("x", x);
    229  1.1  christos             test_output_bignum("y", y);
    230  1.1  christos         }
    231  1.1  christos 
    232  1.1  christos         if (!TEST_true(EC_POINT_copy(R, P))
    233  1.1  christos             || !TEST_true(EC_POINT_add(group, P, P, Q, ctx)))
    234  1.1  christos             goto err;
    235  1.1  christos 
    236  1.1  christos     } while (!EC_POINT_is_at_infinity(group, P));
    237  1.1  christos 
    238  1.1  christos     if (!TEST_true(EC_POINT_add(group, P, Q, R, ctx))
    239  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    240  1.1  christos         goto err;
    241  1.1  christos 
    242  1.1  christos     len =
    243  1.1  christos         EC_POINT_point2oct(group, Q, POINT_CONVERSION_COMPRESSED, buf,
    244  1.1  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.1  christos                        buf, len);
    251  1.1  christos 
    252  1.1  christos     len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_UNCOMPRESSED,
    253  1.1  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.1  christos                        buf, len);
    260  1.1  christos 
    261  1.1  christos     len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_HYBRID,
    262  1.1  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.1  christos                        buf, len);
    269  1.1  christos 
    270  1.1  christos     if (!TEST_true(EC_POINT_get_Jprojective_coordinates_GFp(group, R, x, y, z,
    271  1.1  christos                                                             ctx)))
    272  1.1  christos         goto err;
    273  1.1  christos     TEST_info("A representation of the inverse of that generator in");
    274  1.1  christos     TEST_note("Jacobian projective coordinates");
    275  1.1  christos     test_output_bignum("x", x);
    276  1.1  christos     test_output_bignum("y", y);
    277  1.1  christos     test_output_bignum("z", z);
    278  1.1  christos 
    279  1.1  christos     if (!TEST_true(EC_POINT_invert(group, P, ctx))
    280  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx))
    281  1.1  christos 
    282  1.1  christos     /*
    283  1.1  christos      * Curve secp160r1 (Certicom Research SEC 2 Version 1.0, section 2.4.2,
    284  1.1  christos      * 2000) -- not a NIST curve, but commonly used
    285  1.1  christos      */
    286  1.1  christos 
    287  1.1  christos         || !TEST_true(BN_hex2bn(&p,                         "FFFFFFFF"
    288  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF"))
    289  1.1  christos         || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
    290  1.1  christos         || !TEST_true(BN_hex2bn(&a,                         "FFFFFFFF"
    291  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC"))
    292  1.1  christos         || !TEST_true(BN_hex2bn(&b,                         "1C97BEFC"
    293  1.1  christos                                     "54BD7A8B65ACF89F81D4D4ADC565FA45"))
    294  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    295  1.1  christos         || !TEST_true(BN_hex2bn(&x,                         "4A96B568"
    296  1.1  christos                                     "8EF573284664698968C38BB913CBFC82"))
    297  1.1  christos         || !TEST_true(BN_hex2bn(&y,                         "23a62855"
    298  1.1  christos                                     "3168947d59dcc912042351377ac5fb32"))
    299  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    300  1.1  christos     /*
    301  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    302  1.1  christos      * and therefore setting the coordinates should fail.
    303  1.1  christos      */
    304  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    305  1.1  christos                                                        ctx))
    306  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(group, P, x, y, ctx))
    307  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    308  1.1  christos         || !TEST_true(BN_hex2bn(&z,                       "0100000000"
    309  1.1  christos                                     "000000000001F4C8F927AED3CA752257"))
    310  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    311  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    312  1.1  christos         goto err;
    313  1.1  christos     TEST_info("SEC2 curve secp160r1 -- Generator");
    314  1.1  christos     test_output_bignum("x", x);
    315  1.1  christos     test_output_bignum("y", y);
    316  1.1  christos     /* G_y value taken from the standard: */
    317  1.1  christos     if (!TEST_true(BN_hex2bn(&z,                         "23a62855"
    318  1.1  christos                                  "3168947d59dcc912042351377ac5fb32"))
    319  1.1  christos         || !TEST_BN_eq(y, z)
    320  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 160)
    321  1.1  christos         || !group_order_tests(group)
    322  1.1  christos         || !TEST_ptr(P_160 = EC_GROUP_new(EC_GROUP_method_of(group)))
    323  1.1  christos         || !TEST_true(EC_GROUP_copy(P_160, group))
    324  1.1  christos 
    325  1.1  christos     /* Curve P-192 (FIPS PUB 186-2, App. 6) */
    326  1.1  christos 
    327  1.1  christos         || !TEST_true(BN_hex2bn(&p,                 "FFFFFFFFFFFFFFFF"
    328  1.1  christos                                     "FFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF"))
    329  1.1  christos         || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
    330  1.1  christos         || !TEST_true(BN_hex2bn(&a,                 "FFFFFFFFFFFFFFFF"
    331  1.1  christos                                     "FFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"))
    332  1.1  christos         || !TEST_true(BN_hex2bn(&b,                 "64210519E59C80E7"
    333  1.1  christos                                     "0FA7E9AB72243049FEB8DEECC146B9B1"))
    334  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    335  1.1  christos         || !TEST_true(BN_hex2bn(&x,                 "188DA80EB03090F6"
    336  1.1  christos                                     "7CBF20EB43A18800F4FF0AFD82FF1012"))
    337  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 1, ctx))
    338  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    339  1.1  christos         || !TEST_true(BN_hex2bn(&z,                 "FFFFFFFFFFFFFFFF"
    340  1.1  christos                                     "FFFFFFFF99DEF836146BC9B1B4D22831"))
    341  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    342  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    343  1.1  christos         goto err;
    344  1.1  christos 
    345  1.1  christos     TEST_info("NIST curve P-192 -- Generator");
    346  1.1  christos     test_output_bignum("x", x);
    347  1.1  christos     test_output_bignum("y", y);
    348  1.1  christos     /* G_y value taken from the standard: */
    349  1.1  christos     if (!TEST_true(BN_hex2bn(&z,                 "07192B95FFC8DA78"
    350  1.1  christos                                  "631011ED6B24CDD573F977A11E794811"))
    351  1.1  christos         || !TEST_BN_eq(y, z)
    352  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    353  1.1  christos     /*
    354  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    355  1.1  christos      * and therefore setting the coordinates should fail.
    356  1.1  christos      */
    357  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    358  1.1  christos                                                        ctx))
    359  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 192)
    360  1.1  christos         || !group_order_tests(group)
    361  1.1  christos         || !TEST_ptr(P_192 = EC_GROUP_new(EC_GROUP_method_of(group)))
    362  1.1  christos         || !TEST_true(EC_GROUP_copy(P_192, group))
    363  1.1  christos 
    364  1.1  christos     /* Curve P-224 (FIPS PUB 186-2, App. 6) */
    365  1.1  christos 
    366  1.1  christos         || !TEST_true(BN_hex2bn(&p,         "FFFFFFFFFFFFFFFFFFFFFFFF"
    367  1.1  christos                                     "FFFFFFFF000000000000000000000001"))
    368  1.1  christos         || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
    369  1.1  christos         || !TEST_true(BN_hex2bn(&a,         "FFFFFFFFFFFFFFFFFFFFFFFF"
    370  1.1  christos                                     "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE"))
    371  1.1  christos         || !TEST_true(BN_hex2bn(&b,         "B4050A850C04B3ABF5413256"
    372  1.1  christos                                     "5044B0B7D7BFD8BA270B39432355FFB4"))
    373  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    374  1.1  christos         || !TEST_true(BN_hex2bn(&x,         "B70E0CBD6BB4BF7F321390B9"
    375  1.1  christos                                     "4A03C1D356C21122343280D6115C1D21"))
    376  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 0, ctx))
    377  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    378  1.1  christos         || !TEST_true(BN_hex2bn(&z,         "FFFFFFFFFFFFFFFFFFFFFFFF"
    379  1.1  christos                                     "FFFF16A2E0B8F03E13DD29455C5C2A3D"))
    380  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    381  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    382  1.1  christos         goto err;
    383  1.1  christos 
    384  1.1  christos     TEST_info("NIST curve P-224 -- Generator");
    385  1.1  christos     test_output_bignum("x", x);
    386  1.1  christos     test_output_bignum("y", y);
    387  1.1  christos     /* G_y value taken from the standard: */
    388  1.1  christos     if (!TEST_true(BN_hex2bn(&z,         "BD376388B5F723FB4C22DFE6"
    389  1.1  christos                                  "CD4375A05A07476444D5819985007E34"))
    390  1.1  christos         || !TEST_BN_eq(y, z)
    391  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    392  1.1  christos     /*
    393  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    394  1.1  christos      * and therefore setting the coordinates should fail.
    395  1.1  christos      */
    396  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    397  1.1  christos                                                        ctx))
    398  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 224)
    399  1.1  christos         || !group_order_tests(group)
    400  1.1  christos         || !TEST_ptr(P_224 = EC_GROUP_new(EC_GROUP_method_of(group)))
    401  1.1  christos         || !TEST_true(EC_GROUP_copy(P_224, group))
    402  1.1  christos 
    403  1.1  christos     /* Curve P-256 (FIPS PUB 186-2, App. 6) */
    404  1.1  christos 
    405  1.1  christos         || !TEST_true(BN_hex2bn(&p, "FFFFFFFF000000010000000000000000"
    406  1.1  christos                                     "00000000FFFFFFFFFFFFFFFFFFFFFFFF"))
    407  1.1  christos         || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
    408  1.1  christos         || !TEST_true(BN_hex2bn(&a, "FFFFFFFF000000010000000000000000"
    409  1.1  christos                                     "00000000FFFFFFFFFFFFFFFFFFFFFFFC"))
    410  1.1  christos         || !TEST_true(BN_hex2bn(&b, "5AC635D8AA3A93E7B3EBBD55769886BC"
    411  1.1  christos                                     "651D06B0CC53B0F63BCE3C3E27D2604B"))
    412  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    413  1.1  christos 
    414  1.1  christos         || !TEST_true(BN_hex2bn(&x, "6B17D1F2E12C4247F8BCE6E563A440F2"
    415  1.1  christos                                     "77037D812DEB33A0F4A13945D898C296"))
    416  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 1, ctx))
    417  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    418  1.1  christos         || !TEST_true(BN_hex2bn(&z, "FFFFFFFF00000000FFFFFFFFFFFFFFFF"
    419  1.1  christos                                     "BCE6FAADA7179E84F3B9CAC2FC632551"))
    420  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    421  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    422  1.1  christos         goto err;
    423  1.1  christos 
    424  1.1  christos     TEST_info("NIST curve P-256 -- Generator");
    425  1.1  christos     test_output_bignum("x", x);
    426  1.1  christos     test_output_bignum("y", y);
    427  1.1  christos     /* G_y value taken from the standard: */
    428  1.1  christos     if (!TEST_true(BN_hex2bn(&z, "4FE342E2FE1A7F9B8EE7EB4A7C0F9E16"
    429  1.1  christos                                  "2BCE33576B315ECECBB6406837BF51F5"))
    430  1.1  christos         || !TEST_BN_eq(y, z)
    431  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    432  1.1  christos     /*
    433  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    434  1.1  christos      * and therefore setting the coordinates should fail.
    435  1.1  christos      */
    436  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    437  1.1  christos                                                        ctx))
    438  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 256)
    439  1.1  christos         || !group_order_tests(group)
    440  1.1  christos         || !TEST_ptr(P_256 = EC_GROUP_new(EC_GROUP_method_of(group)))
    441  1.1  christos         || !TEST_true(EC_GROUP_copy(P_256, group))
    442  1.1  christos 
    443  1.1  christos     /* Curve P-384 (FIPS PUB 186-2, App. 6) */
    444  1.1  christos 
    445  1.1  christos         || !TEST_true(BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    446  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"
    447  1.1  christos                                     "FFFFFFFF0000000000000000FFFFFFFF"))
    448  1.1  christos         || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
    449  1.1  christos         || !TEST_true(BN_hex2bn(&a, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    450  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"
    451  1.1  christos                                     "FFFFFFFF0000000000000000FFFFFFFC"))
    452  1.1  christos         || !TEST_true(BN_hex2bn(&b, "B3312FA7E23EE7E4988E056BE3F82D19"
    453  1.1  christos                                     "181D9C6EFE8141120314088F5013875A"
    454  1.1  christos                                     "C656398D8A2ED19D2A85C8EDD3EC2AEF"))
    455  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    456  1.1  christos 
    457  1.1  christos         || !TEST_true(BN_hex2bn(&x, "AA87CA22BE8B05378EB1C71EF320AD74"
    458  1.1  christos                                     "6E1D3B628BA79B9859F741E082542A38"
    459  1.1  christos                                     "5502F25DBF55296C3A545E3872760AB7"))
    460  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 1, ctx))
    461  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    462  1.1  christos         || !TEST_true(BN_hex2bn(&z, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    463  1.1  christos                                     "FFFFFFFFFFFFFFFFC7634D81F4372DDF"
    464  1.1  christos                                     "581A0DB248B0A77AECEC196ACCC52973"))
    465  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    466  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    467  1.1  christos         goto err;
    468  1.1  christos 
    469  1.1  christos     TEST_info("NIST curve P-384 -- Generator");
    470  1.1  christos     test_output_bignum("x", x);
    471  1.1  christos     test_output_bignum("y", y);
    472  1.1  christos     /* G_y value taken from the standard: */
    473  1.1  christos     if (!TEST_true(BN_hex2bn(&z, "3617DE4A96262C6F5D9E98BF9292DC29"
    474  1.1  christos                                  "F8F41DBD289A147CE9DA3113B5F0B8C0"
    475  1.1  christos                                  "0A60B1CE1D7E819D7A431D7C90EA0E5F"))
    476  1.1  christos         || !TEST_BN_eq(y, z)
    477  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    478  1.1  christos     /*
    479  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    480  1.1  christos      * and therefore setting the coordinates should fail.
    481  1.1  christos      */
    482  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    483  1.1  christos                                                        ctx))
    484  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 384)
    485  1.1  christos         || !group_order_tests(group)
    486  1.1  christos         || !TEST_ptr(P_384 = EC_GROUP_new(EC_GROUP_method_of(group)))
    487  1.1  christos         || !TEST_true(EC_GROUP_copy(P_384, group))
    488  1.1  christos 
    489  1.1  christos     /* Curve P-521 (FIPS PUB 186-2, App. 6) */
    490  1.1  christos         || !TEST_true(BN_hex2bn(&p,                              "1FF"
    491  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    492  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    493  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    494  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"))
    495  1.1  christos         || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
    496  1.1  christos         || !TEST_true(BN_hex2bn(&a,                              "1FF"
    497  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    498  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    499  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    500  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC"))
    501  1.1  christos         || !TEST_true(BN_hex2bn(&b,                              "051"
    502  1.1  christos                                     "953EB9618E1C9A1F929A21A0B68540EE"
    503  1.1  christos                                     "A2DA725B99B315F3B8B489918EF109E1"
    504  1.1  christos                                     "56193951EC7E937B1652C0BD3BB1BF07"
    505  1.1  christos                                     "3573DF883D2C34F1EF451FD46B503F00"))
    506  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    507  1.1  christos         || !TEST_true(BN_hex2bn(&x,                               "C6"
    508  1.1  christos                                     "858E06B70404E9CD9E3ECB662395B442"
    509  1.1  christos                                     "9C648139053FB521F828AF606B4D3DBA"
    510  1.1  christos                                     "A14B5E77EFE75928FE1DC127A2FFA8DE"
    511  1.1  christos                                     "3348B3C1856A429BF97E7E31C2E5BD66"))
    512  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 0, ctx))
    513  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    514  1.1  christos         || !TEST_true(BN_hex2bn(&z,                              "1FF"
    515  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    516  1.1  christos                                     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA"
    517  1.1  christos                                     "51868783BF2F966B7FCC0148F709A5D0"
    518  1.1  christos                                     "3BB5C9B8899C47AEBB6FB71E91386409"))
    519  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
    520  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    521  1.1  christos         goto err;
    522  1.1  christos 
    523  1.1  christos     TEST_info("NIST curve P-521 -- Generator");
    524  1.1  christos     test_output_bignum("x", x);
    525  1.1  christos     test_output_bignum("y", y);
    526  1.1  christos     /* G_y value taken from the standard: */
    527  1.1  christos     if (!TEST_true(BN_hex2bn(&z,                              "118"
    528  1.1  christos                                  "39296A789A3BC0045C8A5FB42C7D1BD9"
    529  1.1  christos                                  "98F54449579B446817AFBD17273E662C"
    530  1.1  christos                                  "97EE72995EF42640C550B9013FAD0761"
    531  1.1  christos                                  "353C7086A272C24088BE94769FD16650"))
    532  1.1  christos         || !TEST_BN_eq(y, z)
    533  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
    534  1.1  christos     /*
    535  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    536  1.1  christos      * and therefore setting the coordinates should fail.
    537  1.1  christos      */
    538  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
    539  1.1  christos                                                        ctx))
    540  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(group), 521)
    541  1.1  christos         || !group_order_tests(group)
    542  1.1  christos         || !TEST_ptr(P_521 = EC_GROUP_new(EC_GROUP_method_of(group)))
    543  1.1  christos         || !TEST_true(EC_GROUP_copy(P_521, group))
    544  1.1  christos 
    545  1.1  christos     /* more tests using the last curve */
    546  1.1  christos 
    547  1.1  christos     /* Restore the point that got mangled in the (x, y + 1) test. */
    548  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(group, P, x, y, ctx))
    549  1.1  christos         || !TEST_true(EC_POINT_copy(Q, P))
    550  1.1  christos         || !TEST_false(EC_POINT_is_at_infinity(group, Q))
    551  1.1  christos         || !TEST_true(EC_POINT_dbl(group, P, P, ctx))
    552  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    553  1.1  christos         || !TEST_true(EC_POINT_invert(group, Q, ctx))       /* P = -2Q */
    554  1.1  christos         || !TEST_true(EC_POINT_add(group, R, P, Q, ctx))
    555  1.1  christos         || !TEST_true(EC_POINT_add(group, R, R, Q, ctx))
    556  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, R))    /* R = P + 2Q */
    557  1.1  christos         || !TEST_false(EC_POINT_is_at_infinity(group, Q)))
    558  1.1  christos         goto err;
    559  1.1  christos     points[0] = Q;
    560  1.1  christos     points[1] = Q;
    561  1.1  christos     points[2] = Q;
    562  1.1  christos     points[3] = Q;
    563  1.1  christos 
    564  1.1  christos     if (!TEST_true(EC_GROUP_get_order(group, z, ctx))
    565  1.1  christos         || !TEST_true(BN_add(y, z, BN_value_one()))
    566  1.1  christos         || !TEST_BN_even(y)
    567  1.1  christos         || !TEST_true(BN_rshift1(y, y)))
    568  1.1  christos         goto err;
    569  1.1  christos     scalars[0] = y;         /* (group order + 1)/2, so y*Q + y*Q = Q */
    570  1.1  christos     scalars[1] = y;
    571  1.1  christos 
    572  1.1  christos     TEST_note("combined multiplication ...");
    573  1.1  christos 
    574  1.1  christos     /* z is still the group order */
    575  1.1  christos     if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))
    576  1.1  christos         || !TEST_true(EC_POINTs_mul(group, R, z, 2, points, scalars, ctx))
    577  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx))
    578  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, R, Q, ctx))
    579  1.1  christos         || !TEST_true(BN_rand(y, BN_num_bits(y), 0, 0))
    580  1.1  christos         || !TEST_true(BN_add(z, z, y)))
    581  1.1  christos         goto err;
    582  1.1  christos     BN_set_negative(z, 1);
    583  1.1  christos     scalars[0] = y;
    584  1.1  christos     scalars[1] = z;         /* z = -(order + y) */
    585  1.1  christos 
    586  1.1  christos     if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))
    587  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P))
    588  1.1  christos         || !TEST_true(BN_rand(x, BN_num_bits(y) - 1, 0, 0))
    589  1.1  christos         || !TEST_true(BN_add(z, x, y)))
    590  1.1  christos         goto err;
    591  1.1  christos     BN_set_negative(z, 1);
    592  1.1  christos     scalars[0] = x;
    593  1.1  christos     scalars[1] = y;
    594  1.1  christos     scalars[2] = z;         /* z = -(x+y) */
    595  1.1  christos 
    596  1.1  christos     if (!TEST_ptr(scalar3 = BN_new()))
    597  1.1  christos         goto err;
    598  1.1  christos     BN_zero(scalar3);
    599  1.1  christos     scalars[3] = scalar3;
    600  1.1  christos 
    601  1.1  christos     if (!TEST_true(EC_POINTs_mul(group, P, NULL, 4, points, scalars, ctx))
    602  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    603  1.1  christos         goto err;
    604  1.1  christos 
    605  1.1  christos     TEST_note(" ok\n");
    606  1.1  christos 
    607  1.1  christos 
    608  1.1  christos     r = 1;
    609  1.1  christos err:
    610  1.1  christos     BN_CTX_free(ctx);
    611  1.1  christos     BN_free(p);
    612  1.1  christos     BN_free(a);
    613  1.1  christos     BN_free(b);
    614  1.1  christos     EC_GROUP_free(group);
    615  1.1  christos     EC_GROUP_free(tmp);
    616  1.1  christos     EC_POINT_free(P);
    617  1.1  christos     EC_POINT_free(Q);
    618  1.1  christos     EC_POINT_free(R);
    619  1.1  christos     BN_free(x);
    620  1.1  christos     BN_free(y);
    621  1.1  christos     BN_free(z);
    622  1.1  christos     BN_free(yplusone);
    623  1.1  christos     BN_free(scalar3);
    624  1.1  christos 
    625  1.1  christos     EC_GROUP_free(P_160);
    626  1.1  christos     EC_GROUP_free(P_192);
    627  1.1  christos     EC_GROUP_free(P_224);
    628  1.1  christos     EC_GROUP_free(P_256);
    629  1.1  christos     EC_GROUP_free(P_384);
    630  1.1  christos     EC_GROUP_free(P_521);
    631  1.1  christos     return r;
    632  1.1  christos }
    633  1.1  christos 
    634  1.1  christos # ifndef OPENSSL_NO_EC2M
    635  1.1  christos 
    636  1.1  christos static struct c2_curve_test {
    637  1.1  christos     const char *name;
    638  1.1  christos     const char *p;
    639  1.1  christos     const char *a;
    640  1.1  christos     const char *b;
    641  1.1  christos     const char *x;
    642  1.1  christos     const char *y;
    643  1.1  christos     int ybit;
    644  1.1  christos     const char *order;
    645  1.1  christos     const char *cof;
    646  1.1  christos     int degree;
    647  1.1  christos } char2_curve_tests[] = {
    648  1.1  christos     /* Curve K-163 (FIPS PUB 186-2, App. 6) */
    649  1.1  christos     {
    650  1.1  christos         "NIST curve K-163",
    651  1.1  christos         "0800000000000000000000000000000000000000C9",
    652  1.1  christos         "1",
    653  1.1  christos         "1",
    654  1.1  christos         "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8",
    655  1.1  christos         "0289070FB05D38FF58321F2E800536D538CCDAA3D9",
    656  1.1  christos         1, "04000000000000000000020108A2E0CC0D99F8A5EF", "2", 163
    657  1.1  christos     },
    658  1.1  christos     /* Curve B-163 (FIPS PUB 186-2, App. 6) */
    659  1.1  christos     {
    660  1.1  christos         "NIST curve B-163",
    661  1.1  christos         "0800000000000000000000000000000000000000C9",
    662  1.1  christos         "1",
    663  1.1  christos         "020A601907B8C953CA1481EB10512F78744A3205FD",
    664  1.1  christos         "03F0EBA16286A2D57EA0991168D4994637E8343E36",
    665  1.1  christos         "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1",
    666  1.1  christos         1, "040000000000000000000292FE77E70C12A4234C33", "2", 163
    667  1.1  christos     },
    668  1.1  christos     /* Curve K-233 (FIPS PUB 186-2, App. 6) */
    669  1.1  christos     {
    670  1.1  christos         "NIST curve K-233",
    671  1.1  christos         "020000000000000000000000000000000000000004000000000000000001",
    672  1.1  christos         "0",
    673  1.1  christos         "1",
    674  1.1  christos         "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126",
    675  1.1  christos         "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3",
    676  1.1  christos         0,
    677  1.1  christos         "008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF",
    678  1.1  christos         "4", 233
    679  1.1  christos     },
    680  1.1  christos     /* Curve B-233 (FIPS PUB 186-2, App. 6) */
    681  1.1  christos     {
    682  1.1  christos         "NIST curve B-233",
    683  1.1  christos         "020000000000000000000000000000000000000004000000000000000001",
    684  1.1  christos         "000000000000000000000000000000000000000000000000000000000001",
    685  1.1  christos         "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD",
    686  1.1  christos         "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B",
    687  1.1  christos         "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052",
    688  1.1  christos         1,
    689  1.1  christos         "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7",
    690  1.1  christos         "2", 233
    691  1.1  christos     },
    692  1.1  christos     /* Curve K-283 (FIPS PUB 186-2, App. 6) */
    693  1.1  christos     {
    694  1.1  christos         "NIST curve K-283",
    695  1.1  christos                                                                 "08000000"
    696  1.1  christos         "00000000000000000000000000000000000000000000000000000000000010A1",
    697  1.1  christos         "0",
    698  1.1  christos         "1",
    699  1.1  christos                                                                 "0503213F"
    700  1.1  christos         "78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836",
    701  1.1  christos                                                                 "01CCDA38"
    702  1.1  christos         "0F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259",
    703  1.1  christos         0,
    704  1.1  christos                                                                 "01FFFFFF"
    705  1.1  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61",
    706  1.1  christos         "4", 283
    707  1.1  christos     },
    708  1.1  christos     /* Curve B-283 (FIPS PUB 186-2, App. 6) */
    709  1.1  christos     {
    710  1.1  christos         "NIST curve B-283",
    711  1.1  christos                                                                 "08000000"
    712  1.1  christos         "00000000000000000000000000000000000000000000000000000000000010A1",
    713  1.1  christos                                                                 "00000000"
    714  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000001",
    715  1.1  christos                                                                 "027B680A"
    716  1.1  christos         "C8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5",
    717  1.1  christos                                                                 "05F93925"
    718  1.1  christos         "8DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053",
    719  1.1  christos                                                                 "03676854"
    720  1.1  christos         "FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4",
    721  1.1  christos         1,
    722  1.1  christos                                                                 "03FFFFFF"
    723  1.1  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307",
    724  1.1  christos         "2", 283
    725  1.1  christos     },
    726  1.1  christos     /* Curve K-409 (FIPS PUB 186-2, App. 6) */
    727  1.1  christos     {
    728  1.1  christos         "NIST curve K-409",
    729  1.1  christos                                 "0200000000000000000000000000000000000000"
    730  1.1  christos         "0000000000000000000000000000000000000000008000000000000000000001",
    731  1.1  christos         "0",
    732  1.1  christos         "1",
    733  1.1  christos                                 "0060F05F658F49C1AD3AB1890F7184210EFD0987"
    734  1.1  christos         "E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746",
    735  1.1  christos                                 "01E369050B7C4E42ACBA1DACBF04299C3460782F"
    736  1.1  christos         "918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B",
    737  1.1  christos         1,
    738  1.1  christos                                 "007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    739  1.1  christos         "FFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF",
    740  1.1  christos         "4", 409
    741  1.1  christos     },
    742  1.1  christos     /* Curve B-409 (FIPS PUB 186-2, App. 6) */
    743  1.1  christos     {
    744  1.1  christos         "NIST curve B-409",
    745  1.1  christos                                 "0200000000000000000000000000000000000000"
    746  1.1  christos         "0000000000000000000000000000000000000000008000000000000000000001",
    747  1.1  christos                                 "0000000000000000000000000000000000000000"
    748  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000001",
    749  1.1  christos                                 "0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422E"
    750  1.1  christos         "F1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F",
    751  1.1  christos                                 "015D4860D088DDB3496B0C6064756260441CDE4A"
    752  1.1  christos         "F1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7",
    753  1.1  christos                                 "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5"
    754  1.1  christos         "A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706",
    755  1.1  christos         1,
    756  1.1  christos                                 "0100000000000000000000000000000000000000"
    757  1.1  christos         "00000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173",
    758  1.1  christos         "2", 409
    759  1.1  christos     },
    760  1.1  christos     /* Curve K-571 (FIPS PUB 186-2, App. 6) */
    761  1.1  christos     {
    762  1.1  christos         "NIST curve K-571",
    763  1.1  christos                                                          "800000000000000"
    764  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000000"
    765  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000425",
    766  1.1  christos         "0",
    767  1.1  christos         "1",
    768  1.1  christos                                                         "026EB7A859923FBC"
    769  1.1  christos         "82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E6"
    770  1.1  christos         "47DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972",
    771  1.1  christos                                                         "0349DC807F4FBF37"
    772  1.1  christos         "4F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA7"
    773  1.1  christos         "4FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3",
    774  1.1  christos         0,
    775  1.1  christos                                                         "0200000000000000"
    776  1.1  christos         "00000000000000000000000000000000000000000000000000000000131850E1"
    777  1.1  christos         "F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001",
    778  1.1  christos         "4", 571
    779  1.1  christos     },
    780  1.1  christos     /* Curve B-571 (FIPS PUB 186-2, App. 6) */
    781  1.1  christos     {
    782  1.1  christos         "NIST curve B-571",
    783  1.1  christos                                                          "800000000000000"
    784  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000000"
    785  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000425",
    786  1.1  christos                                                         "0000000000000000"
    787  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000000"
    788  1.1  christos         "0000000000000000000000000000000000000000000000000000000000000001",
    789  1.1  christos                                                         "02F40E7E2221F295"
    790  1.1  christos         "DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA5933"
    791  1.1  christos         "2BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A",
    792  1.1  christos                                                         "0303001D34B85629"
    793  1.1  christos         "6C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293"
    794  1.1  christos         "CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19",
    795  1.1  christos                                                         "037BF27342DA639B"
    796  1.1  christos         "6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A57"
    797  1.1  christos         "6291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B",
    798  1.1  christos         1,
    799  1.1  christos                                                         "03FFFFFFFFFFFFFF"
    800  1.1  christos         "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18"
    801  1.1  christos         "FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47",
    802  1.1  christos         "2", 571
    803  1.1  christos     }
    804  1.1  christos };
    805  1.1  christos 
    806  1.1  christos static int char2_curve_test(int n)
    807  1.1  christos {
    808  1.1  christos     int r = 0;
    809  1.1  christos     BN_CTX *ctx = NULL;
    810  1.1  christos     BIGNUM *p = NULL, *a = NULL, *b = NULL;
    811  1.1  christos     BIGNUM *x = NULL, *y = NULL, *z = NULL, *cof = NULL, *yplusone = NULL;
    812  1.1  christos     EC_GROUP *group = NULL, *variable = NULL;
    813  1.1  christos     EC_POINT *P = NULL, *Q = NULL, *R = NULL;
    814  1.1  christos     const EC_POINT *points[3];
    815  1.1  christos     const BIGNUM *scalars[3];
    816  1.1  christos     struct c2_curve_test *const test = char2_curve_tests + n;
    817  1.1  christos 
    818  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
    819  1.1  christos         || !TEST_ptr(p = BN_new())
    820  1.1  christos         || !TEST_ptr(a = BN_new())
    821  1.1  christos         || !TEST_ptr(b = BN_new())
    822  1.1  christos         || !TEST_ptr(x = BN_new())
    823  1.1  christos         || !TEST_ptr(y = BN_new())
    824  1.1  christos         || !TEST_ptr(z = BN_new())
    825  1.1  christos         || !TEST_ptr(yplusone = BN_new())
    826  1.1  christos         || !TEST_true(BN_hex2bn(&p, test->p))
    827  1.1  christos         || !TEST_true(BN_hex2bn(&a, test->a))
    828  1.1  christos         || !TEST_true(BN_hex2bn(&b, test->b))
    829  1.1  christos         || !TEST_true(group = EC_GROUP_new(EC_GF2m_simple_method()))
    830  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    831  1.1  christos         || !TEST_ptr(P = EC_POINT_new(group))
    832  1.1  christos         || !TEST_ptr(Q = EC_POINT_new(group))
    833  1.1  christos         || !TEST_ptr(R = EC_POINT_new(group))
    834  1.1  christos         || !TEST_true(BN_hex2bn(&x, test->x))
    835  1.1  christos         || !TEST_true(BN_hex2bn(&y, test->y))
    836  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one())))
    837  1.1  christos         goto err;
    838  1.1  christos 
    839  1.1  christos /* Change test based on whether binary point compression is enabled or not. */
    840  1.1  christos # ifdef OPENSSL_EC_BIN_PT_COMP
    841  1.1  christos     /*
    842  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    843  1.1  christos      * and therefore setting the coordinates should fail.
    844  1.1  christos      */
    845  1.1  christos     if (!TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone, ctx))
    846  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x,
    847  1.1  christos                                                           test->y_bit,
    848  1.1  christos                                                           ctx))
    849  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    850  1.1  christos         || !TEST_true(BN_hex2bn(&z, test->order))
    851  1.1  christos         || !TEST_true(BN_hex2bn(&cof, test->cof))
    852  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, cof))
    853  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
    854  1.1  christos         goto err;
    855  1.1  christos     TEST_info("%s -- Generator", test->name);
    856  1.1  christos     test_output_bignum("x", x);
    857  1.1  christos     test_output_bignum("y", y);
    858  1.1  christos     /* G_y value taken from the standard: */
    859  1.1  christos     if (!TEST_true(BN_hex2bn(&z, test->y))
    860  1.1  christos         || !TEST_BN_eq(y, z))
    861  1.1  christos         goto err;
    862  1.1  christos # else
    863  1.1  christos     /*
    864  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
    865  1.1  christos      * and therefore setting the coordinates should fail.
    866  1.1  christos      */
    867  1.1  christos     if (!TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone, ctx))
    868  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(group, P, x, y, ctx))
    869  1.1  christos         || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    870  1.1  christos         || !TEST_true(BN_hex2bn(&z, test->order))
    871  1.1  christos         || !TEST_true(BN_hex2bn(&cof, test->cof))
    872  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, P, z, cof)))
    873  1.1  christos         goto err;
    874  1.1  christos     TEST_info("%s -- Generator:", test->name);
    875  1.1  christos     test_output_bignum("x", x);
    876  1.1  christos     test_output_bignum("y", y);
    877  1.1  christos # endif
    878  1.1  christos 
    879  1.1  christos     if (!TEST_int_eq(EC_GROUP_get_degree(group), test->degree)
    880  1.1  christos         || !group_order_tests(group)
    881  1.1  christos         || !TEST_ptr(variable = EC_GROUP_new(EC_GROUP_method_of(group)))
    882  1.1  christos         || !TEST_true(EC_GROUP_copy(variable, group)))
    883  1.1  christos         goto err;
    884  1.1  christos 
    885  1.1  christos     /* more tests using the last curve */
    886  1.1  christos     if (n == OSSL_NELEM(char2_curve_tests) - 1) {
    887  1.1  christos         if (!TEST_true(EC_POINT_set_affine_coordinates(group, P, x, y, ctx))
    888  1.1  christos             || !TEST_true(EC_POINT_copy(Q, P))
    889  1.1  christos             || !TEST_false(EC_POINT_is_at_infinity(group, Q))
    890  1.1  christos             || !TEST_true(EC_POINT_dbl(group, P, P, ctx))
    891  1.1  christos             || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
    892  1.1  christos             || !TEST_true(EC_POINT_invert(group, Q, ctx))       /* P = -2Q */
    893  1.1  christos             || !TEST_true(EC_POINT_add(group, R, P, Q, ctx))
    894  1.1  christos             || !TEST_true(EC_POINT_add(group, R, R, Q, ctx))
    895  1.1  christos             || !TEST_true(EC_POINT_is_at_infinity(group, R))   /* R = P + 2Q */
    896  1.1  christos             || !TEST_false(EC_POINT_is_at_infinity(group, Q)))
    897  1.1  christos             goto err;
    898  1.1  christos 
    899  1.1  christos         points[0] = Q;
    900  1.1  christos         points[1] = Q;
    901  1.1  christos         points[2] = Q;
    902  1.1  christos 
    903  1.1  christos         if (!TEST_true(BN_add(y, z, BN_value_one()))
    904  1.1  christos             || !TEST_BN_even(y)
    905  1.1  christos             || !TEST_true(BN_rshift1(y, y)))
    906  1.1  christos             goto err;
    907  1.1  christos         scalars[0] = y;         /* (group order + 1)/2, so y*Q + y*Q = Q */
    908  1.1  christos         scalars[1] = y;
    909  1.1  christos 
    910  1.1  christos         TEST_note("combined multiplication ...");
    911  1.1  christos 
    912  1.1  christos         /* z is still the group order */
    913  1.1  christos         if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))
    914  1.1  christos             || !TEST_true(EC_POINTs_mul(group, R, z, 2, points, scalars, ctx))
    915  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx))
    916  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, R, Q, ctx)))
    917  1.1  christos             goto err;
    918  1.1  christos 
    919  1.1  christos         if (!TEST_true(BN_rand(y, BN_num_bits(y), 0, 0))
    920  1.1  christos             || !TEST_true(BN_add(z, z, y)))
    921  1.1  christos             goto err;
    922  1.1  christos         BN_set_negative(z, 1);
    923  1.1  christos         scalars[0] = y;
    924  1.1  christos         scalars[1] = z;         /* z = -(order + y) */
    925  1.1  christos 
    926  1.1  christos         if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))
    927  1.1  christos             || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    928  1.1  christos             goto err;
    929  1.1  christos 
    930  1.1  christos         if (!TEST_true(BN_rand(x, BN_num_bits(y) - 1, 0, 0))
    931  1.1  christos             || !TEST_true(BN_add(z, x, y)))
    932  1.1  christos             goto err;
    933  1.1  christos         BN_set_negative(z, 1);
    934  1.1  christos         scalars[0] = x;
    935  1.1  christos         scalars[1] = y;
    936  1.1  christos         scalars[2] = z;         /* z = -(x+y) */
    937  1.1  christos 
    938  1.1  christos         if (!TEST_true(EC_POINTs_mul(group, P, NULL, 3, points, scalars, ctx))
    939  1.1  christos             || !TEST_true(EC_POINT_is_at_infinity(group, P)))
    940  1.1  christos             goto err;;
    941  1.1  christos     }
    942  1.1  christos 
    943  1.1  christos     r = 1;
    944  1.1  christos err:
    945  1.1  christos     BN_CTX_free(ctx);
    946  1.1  christos     BN_free(p);
    947  1.1  christos     BN_free(a);
    948  1.1  christos     BN_free(b);
    949  1.1  christos     BN_free(x);
    950  1.1  christos     BN_free(y);
    951  1.1  christos     BN_free(z);
    952  1.1  christos     BN_free(yplusone);
    953  1.1  christos     BN_free(cof);
    954  1.1  christos     EC_POINT_free(P);
    955  1.1  christos     EC_POINT_free(Q);
    956  1.1  christos     EC_POINT_free(R);
    957  1.1  christos     EC_GROUP_free(group);
    958  1.1  christos     EC_GROUP_free(variable);
    959  1.1  christos     return r;
    960  1.1  christos }
    961  1.1  christos 
    962  1.1  christos static int char2_field_tests(void)
    963  1.1  christos {
    964  1.1  christos     BN_CTX *ctx = NULL;
    965  1.1  christos     BIGNUM *p = NULL, *a = NULL, *b = NULL;
    966  1.1  christos     EC_GROUP *group = NULL, *tmp = NULL;
    967  1.1  christos     EC_POINT *P = NULL, *Q = NULL, *R = NULL;
    968  1.1  christos     BIGNUM *x = NULL, *y = NULL, *z = NULL, *cof = NULL, *yplusone = NULL;
    969  1.1  christos     unsigned char buf[100];
    970  1.1  christos     size_t len;
    971  1.1  christos     int k, r = 0;
    972  1.1  christos 
    973  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
    974  1.1  christos         || !TEST_ptr(p = BN_new())
    975  1.1  christos         || !TEST_ptr(a = BN_new())
    976  1.1  christos         || !TEST_ptr(b = BN_new())
    977  1.1  christos         || !TEST_true(BN_hex2bn(&p, "13"))
    978  1.1  christos         || !TEST_true(BN_hex2bn(&a, "3"))
    979  1.1  christos         || !TEST_true(BN_hex2bn(&b, "1")))
    980  1.1  christos         goto err;
    981  1.1  christos 
    982  1.1  christos     group = EC_GROUP_new(EC_GF2m_simple_method()); /* applications should use
    983  1.1  christos                                                     * EC_GROUP_new_curve_GF2m
    984  1.1  christos                                                     * so that the library gets
    985  1.1  christos                                                     * to choose the EC_METHOD */
    986  1.1  christos     if (!TEST_ptr(group)
    987  1.1  christos         || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
    988  1.1  christos         || !TEST_ptr(tmp = EC_GROUP_new(EC_GROUP_method_of(group)))
    989  1.1  christos         || !TEST_true(EC_GROUP_copy(tmp, group)))
    990  1.1  christos         goto err;
    991  1.1  christos     EC_GROUP_free(group);
    992  1.1  christos     group = tmp;
    993  1.1  christos     tmp = NULL;
    994  1.1  christos 
    995  1.1  christos     if (!TEST_true(EC_GROUP_get_curve(group, p, a, b, ctx)))
    996  1.1  christos         goto err;
    997  1.1  christos 
    998  1.1  christos     TEST_info("Curve defined by Weierstrass equation");
    999  1.1  christos     TEST_note("     y^2 + x*y = x^3 + a*x^2 + b (mod p)");
   1000  1.1  christos     test_output_bignum("a", a);
   1001  1.1  christos     test_output_bignum("b", b);
   1002  1.1  christos     test_output_bignum("p", p);
   1003  1.1  christos 
   1004  1.1  christos      if (!TEST_ptr(P = EC_POINT_new(group))
   1005  1.1  christos         || !TEST_ptr(Q = EC_POINT_new(group))
   1006  1.1  christos         || !TEST_ptr(R = EC_POINT_new(group))
   1007  1.1  christos         || !TEST_true(EC_POINT_set_to_infinity(group, P))
   1008  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P)))
   1009  1.1  christos         goto err;
   1010  1.1  christos 
   1011  1.1  christos     buf[0] = 0;
   1012  1.1  christos     if (!TEST_true(EC_POINT_oct2point(group, Q, buf, 1, ctx))
   1013  1.1  christos         || !TEST_true(EC_POINT_add(group, P, P, Q, ctx))
   1014  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P))
   1015  1.1  christos         || !TEST_ptr(x = BN_new())
   1016  1.1  christos         || !TEST_ptr(y = BN_new())
   1017  1.1  christos         || !TEST_ptr(z = BN_new())
   1018  1.1  christos         || !TEST_ptr(cof = BN_new())
   1019  1.1  christos         || !TEST_ptr(yplusone = BN_new())
   1020  1.1  christos         || !TEST_true(BN_hex2bn(&x, "6"))
   1021  1.1  christos /* Change test based on whether binary point compression is enabled or not. */
   1022  1.1  christos #  ifdef OPENSSL_EC_BIN_PT_COMP
   1023  1.1  christos         || !TEST_true(EC_POINT_set_compressed_coordinates(group, Q, x, 1, ctx))
   1024  1.1  christos #  else
   1025  1.1  christos         || !TEST_true(BN_hex2bn(&y, "8"))
   1026  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(group, Q, x, y, ctx))
   1027  1.1  christos #  endif
   1028  1.1  christos        )
   1029  1.1  christos         goto err;
   1030  1.1  christos     if (!TEST_int_gt(EC_POINT_is_on_curve(group, Q, ctx), 0)) {
   1031  1.1  christos /* Change test based on whether binary point compression is enabled or not. */
   1032  1.1  christos #  ifdef OPENSSL_EC_BIN_PT_COMP
   1033  1.1  christos         if (!TEST_true(EC_POINT_get_affine_coordinates(group, Q, x, y, ctx)))
   1034  1.1  christos             goto err;
   1035  1.1  christos #  endif
   1036  1.1  christos         TEST_info("Point is not on curve");
   1037  1.1  christos         test_output_bignum("x", x);
   1038  1.1  christos         test_output_bignum("y", y);
   1039  1.1  christos         goto err;
   1040  1.1  christos     }
   1041  1.1  christos 
   1042  1.1  christos     TEST_note("A cyclic subgroup:");
   1043  1.1  christos     k = 100;
   1044  1.1  christos     do {
   1045  1.1  christos         if (!TEST_int_ne(k--, 0))
   1046  1.1  christos             goto err;
   1047  1.1  christos 
   1048  1.1  christos         if (EC_POINT_is_at_infinity(group, P))
   1049  1.1  christos             TEST_note("     point at infinity");
   1050  1.1  christos         else {
   1051  1.1  christos             if (!TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y,
   1052  1.1  christos                                                            ctx)))
   1053  1.1  christos                 goto err;
   1054  1.1  christos 
   1055  1.1  christos             test_output_bignum("x", x);
   1056  1.1  christos             test_output_bignum("y", y);
   1057  1.1  christos         }
   1058  1.1  christos 
   1059  1.1  christos         if (!TEST_true(EC_POINT_copy(R, P))
   1060  1.1  christos             || !TEST_true(EC_POINT_add(group, P, P, Q, ctx)))
   1061  1.1  christos             goto err;
   1062  1.1  christos     }
   1063  1.1  christos     while (!EC_POINT_is_at_infinity(group, P));
   1064  1.1  christos 
   1065  1.1  christos     if (!TEST_true(EC_POINT_add(group, P, Q, R, ctx))
   1066  1.1  christos         || !TEST_true(EC_POINT_is_at_infinity(group, P)))
   1067  1.1  christos         goto err;
   1068  1.1  christos 
   1069  1.1  christos /* Change test based on whether binary point compression is enabled or not. */
   1070  1.1  christos #  ifdef OPENSSL_EC_BIN_PT_COMP
   1071  1.1  christos     len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_COMPRESSED,
   1072  1.1  christos                              buf, sizeof(buf), ctx);
   1073  1.1  christos     if (!TEST_size_t_ne(len, 0)
   1074  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))
   1075  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))
   1076  1.1  christos         goto err;
   1077  1.1  christos     test_output_memory("Generator as octet string, compressed form:",
   1078  1.1  christos                        buf, len);
   1079  1.1  christos #  endif
   1080  1.1  christos 
   1081  1.1  christos     len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_UNCOMPRESSED,
   1082  1.1  christos                              buf, sizeof(buf), ctx);
   1083  1.1  christos     if (!TEST_size_t_ne(len, 0)
   1084  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))
   1085  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))
   1086  1.1  christos         goto err;
   1087  1.1  christos     test_output_memory("Generator as octet string, uncompressed form:",
   1088  1.1  christos                        buf, len);
   1089  1.1  christos 
   1090  1.1  christos /* Change test based on whether binary point compression is enabled or not. */
   1091  1.1  christos #  ifdef OPENSSL_EC_BIN_PT_COMP
   1092  1.1  christos     len =
   1093  1.1  christos         EC_POINT_point2oct(group, Q, POINT_CONVERSION_HYBRID, buf, sizeof(buf),
   1094  1.1  christos                            ctx);
   1095  1.1  christos     if (!TEST_size_t_ne(len, 0)
   1096  1.1  christos         || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))
   1097  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))
   1098  1.1  christos         goto err;
   1099  1.1  christos     test_output_memory("Generator as octet string, hybrid form:",
   1100  1.1  christos                        buf, len);
   1101  1.1  christos #  endif
   1102  1.1  christos 
   1103  1.1  christos     if (!TEST_true(EC_POINT_invert(group, P, ctx))
   1104  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx)))
   1105  1.1  christos         goto err;
   1106  1.1  christos 
   1107  1.1  christos     TEST_note("\n");
   1108  1.1  christos 
   1109  1.1  christos     r = 1;
   1110  1.1  christos err:
   1111  1.1  christos     BN_CTX_free(ctx);
   1112  1.1  christos     BN_free(p);
   1113  1.1  christos     BN_free(a);
   1114  1.1  christos     BN_free(b);
   1115  1.1  christos     EC_GROUP_free(group);
   1116  1.1  christos     EC_GROUP_free(tmp);
   1117  1.1  christos     EC_POINT_free(P);
   1118  1.1  christos     EC_POINT_free(Q);
   1119  1.1  christos     EC_POINT_free(R);
   1120  1.1  christos     BN_free(x);
   1121  1.1  christos     BN_free(y);
   1122  1.1  christos     BN_free(z);
   1123  1.1  christos     BN_free(cof);
   1124  1.1  christos     BN_free(yplusone);
   1125  1.1  christos     return r;
   1126  1.1  christos }
   1127  1.1  christos 
   1128  1.1  christos static int hybrid_point_encoding_test(void)
   1129  1.1  christos {
   1130  1.1  christos     BIGNUM *x = NULL, *y = NULL;
   1131  1.1  christos     EC_GROUP *group = NULL;
   1132  1.1  christos     EC_POINT *point = NULL;
   1133  1.1  christos     unsigned char *buf = NULL;
   1134  1.1  christos     size_t len;
   1135  1.1  christos     int r = 0;
   1136  1.1  christos 
   1137  1.1  christos     if (!TEST_true(BN_dec2bn(&x, "0"))
   1138  1.1  christos         || !TEST_true(BN_dec2bn(&y, "1"))
   1139  1.1  christos         || !TEST_ptr(group = EC_GROUP_new_by_curve_name(NID_sect571k1))
   1140  1.1  christos         || !TEST_ptr(point = EC_POINT_new(group))
   1141  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(group, point, x, y, NULL))
   1142  1.1  christos         || !TEST_size_t_ne(0, (len = EC_POINT_point2oct(group,
   1143  1.1  christos                                                         point,
   1144  1.1  christos                                                         POINT_CONVERSION_HYBRID,
   1145  1.1  christos                                                         NULL,
   1146  1.1  christos                                                         0,
   1147  1.1  christos                                                         NULL)))
   1148  1.1  christos         || !TEST_ptr(buf = OPENSSL_malloc(len))
   1149  1.1  christos         || !TEST_size_t_eq(len, EC_POINT_point2oct(group,
   1150  1.1  christos                                                    point,
   1151  1.1  christos                                                    POINT_CONVERSION_HYBRID,
   1152  1.1  christos                                                    buf,
   1153  1.1  christos                                                    len,
   1154  1.1  christos                                                    NULL)))
   1155  1.1  christos         goto err;
   1156  1.1  christos 
   1157  1.1  christos     r = 1;
   1158  1.1  christos 
   1159  1.1  christos     /* buf contains a valid hybrid point, check that we can decode it. */
   1160  1.1  christos     if (!TEST_true(EC_POINT_oct2point(group, point, buf, len, NULL)))
   1161  1.1  christos         r = 0;
   1162  1.1  christos 
   1163  1.1  christos     /* Flip the y_bit and verify that the invalid encoding is rejected. */
   1164  1.1  christos     buf[0] ^= 1;
   1165  1.1  christos     if (!TEST_false(EC_POINT_oct2point(group, point, buf, len, NULL)))
   1166  1.1  christos         r = 0;
   1167  1.1  christos 
   1168  1.1  christos err:
   1169  1.1  christos     BN_free(x);
   1170  1.1  christos     BN_free(y);
   1171  1.1  christos     EC_GROUP_free(group);
   1172  1.1  christos     EC_POINT_free(point);
   1173  1.1  christos     OPENSSL_free(buf);
   1174  1.1  christos     return r;
   1175  1.1  christos }
   1176  1.1  christos #endif
   1177  1.1  christos 
   1178  1.1  christos static int internal_curve_test(int n)
   1179  1.1  christos {
   1180  1.1  christos     EC_GROUP *group = NULL;
   1181  1.1  christos     int nid = curves[n].nid;
   1182  1.1  christos 
   1183  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))) {
   1184  1.1  christos         TEST_info("EC_GROUP_new_curve_name() failed with curve %s\n",
   1185  1.1  christos                   OBJ_nid2sn(nid));
   1186  1.1  christos         return 0;
   1187  1.1  christos     }
   1188  1.1  christos     if (!TEST_true(EC_GROUP_check(group, NULL))) {
   1189  1.1  christos         TEST_info("EC_GROUP_check() failed with curve %s\n", OBJ_nid2sn(nid));
   1190  1.1  christos         EC_GROUP_free(group);
   1191  1.1  christos         return 0;
   1192  1.1  christos     }
   1193  1.1  christos     EC_GROUP_free(group);
   1194  1.1  christos     return 1;
   1195  1.1  christos }
   1196  1.1  christos 
   1197  1.1  christos static int internal_curve_test_method(int n)
   1198  1.1  christos {
   1199  1.1  christos     int r, nid = curves[n].nid;
   1200  1.1  christos     EC_GROUP *group;
   1201  1.1  christos 
   1202  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))) {
   1203  1.1  christos         TEST_info("Curve %s failed\n", OBJ_nid2sn(nid));
   1204  1.1  christos         return 0;
   1205  1.1  christos     }
   1206  1.1  christos     r = group_order_tests(group);
   1207  1.1  christos     EC_GROUP_free(group);
   1208  1.1  christos     return r;
   1209  1.1  christos }
   1210  1.1  christos 
   1211  1.1  christos # ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
   1212  1.1  christos /*
   1213  1.1  christos  * nistp_test_params contains magic numbers for testing our optimized
   1214  1.1  christos  * implementations of several NIST curves with characteristic > 3.
   1215  1.1  christos  */
   1216  1.1  christos struct nistp_test_params {
   1217  1.1  christos     const EC_METHOD *(*meth) (void);
   1218  1.1  christos     int degree;
   1219  1.1  christos     /*
   1220  1.1  christos      * Qx, Qy and D are taken from
   1221  1.1  christos      * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf
   1222  1.1  christos      * Otherwise, values are standard curve parameters from FIPS 180-3
   1223  1.1  christos      */
   1224  1.1  christos     const char *p, *a, *b, *Qx, *Qy, *Gx, *Gy, *order, *d;
   1225  1.1  christos };
   1226  1.1  christos 
   1227  1.1  christos static const struct nistp_test_params nistp_tests_params[] = {
   1228  1.1  christos     {
   1229  1.1  christos      /* P-224 */
   1230  1.1  christos      EC_GFp_nistp224_method,
   1231  1.1  christos      224,
   1232  1.1  christos      /* p */
   1233  1.1  christos      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
   1234  1.1  christos      /* a */
   1235  1.1  christos      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
   1236  1.1  christos      /* b */
   1237  1.1  christos      "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
   1238  1.1  christos      /* Qx */
   1239  1.1  christos      "E84FB0B8E7000CB657D7973CF6B42ED78B301674276DF744AF130B3E",
   1240  1.1  christos      /* Qy */
   1241  1.1  christos      "4376675C6FC5612C21A0FF2D2A89D2987DF7A2BC52183B5982298555",
   1242  1.1  christos      /* Gx */
   1243  1.1  christos      "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
   1244  1.1  christos      /* Gy */
   1245  1.1  christos      "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",
   1246  1.1  christos      /* order */
   1247  1.1  christos      "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
   1248  1.1  christos      /* d */
   1249  1.1  christos      "3F0C488E987C80BE0FEE521F8D90BE6034EC69AE11CA72AA777481E8",
   1250  1.1  christos      },
   1251  1.1  christos     {
   1252  1.1  christos      /* P-256 */
   1253  1.1  christos      EC_GFp_nistp256_method,
   1254  1.1  christos      256,
   1255  1.1  christos      /* p */
   1256  1.1  christos      "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
   1257  1.1  christos      /* a */
   1258  1.1  christos      "ffffffff00000001000000000000000000000000fffffffffffffffffffffffc",
   1259  1.1  christos      /* b */
   1260  1.1  christos      "5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b",
   1261  1.1  christos      /* Qx */
   1262  1.1  christos      "b7e08afdfe94bad3f1dc8c734798ba1c62b3a0ad1e9ea2a38201cd0889bc7a19",
   1263  1.1  christos      /* Qy */
   1264  1.1  christos      "3603f747959dbf7a4bb226e41928729063adc7ae43529e61b563bbc606cc5e09",
   1265  1.1  christos      /* Gx */
   1266  1.1  christos      "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
   1267  1.1  christos      /* Gy */
   1268  1.1  christos      "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
   1269  1.1  christos      /* order */
   1270  1.1  christos      "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
   1271  1.1  christos      /* d */
   1272  1.1  christos      "c477f9f65c22cce20657faa5b2d1d8122336f851a508a1ed04e479c34985bf96",
   1273  1.1  christos      },
   1274  1.1  christos     {
   1275  1.1  christos      /* P-521 */
   1276  1.1  christos      EC_GFp_nistp521_method,
   1277  1.1  christos      521,
   1278  1.1  christos      /* p */
   1279  1.1  christos                                                                   "1ff"
   1280  1.1  christos      "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
   1281  1.1  christos      "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
   1282  1.1  christos      /* a */
   1283  1.1  christos                                                                   "1ff"
   1284  1.1  christos      "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
   1285  1.1  christos      "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc",
   1286  1.1  christos      /* b */
   1287  1.1  christos                                                                   "051"
   1288  1.1  christos      "953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e1"
   1289  1.1  christos      "56193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00",
   1290  1.1  christos      /* Qx */
   1291  1.1  christos                                                                  "0098"
   1292  1.1  christos      "e91eef9a68452822309c52fab453f5f117c1da8ed796b255e9ab8f6410cca16e"
   1293  1.1  christos      "59df403a6bdc6ca467a37056b1e54b3005d8ac030decfeb68df18b171885d5c4",
   1294  1.1  christos      /* Qy */
   1295  1.1  christos                                                                  "0164"
   1296  1.1  christos      "350c321aecfc1cca1ba4364c9b15656150b4b78d6a48d7d28e7f31985ef17be8"
   1297  1.1  christos      "554376b72900712c4b83ad668327231526e313f5f092999a4632fd50d946bc2e",
   1298  1.1  christos      /* Gx */
   1299  1.1  christos                                                                    "c6"
   1300  1.1  christos      "858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dba"
   1301  1.1  christos      "a14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
   1302  1.1  christos      /* Gy */
   1303  1.1  christos                                                                   "118"
   1304  1.1  christos      "39296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c"
   1305  1.1  christos      "97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
   1306  1.1  christos      /* order */
   1307  1.1  christos                                                                   "1ff"
   1308  1.1  christos      "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"
   1309  1.1  christos      "51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
   1310  1.1  christos      /* d */
   1311  1.1  christos                                                                  "0100"
   1312  1.1  christos      "085f47b8e1b8b11b7eb33028c0b2888e304bfc98501955b45bba1478dc184eee"
   1313  1.1  christos      "df09b86a5f7c21994406072787205e69a63709fe35aa93ba333514b24f961722",
   1314  1.1  christos      },
   1315  1.1  christos };
   1316  1.1  christos 
   1317  1.1  christos static int nistp_single_test(int idx)
   1318  1.1  christos {
   1319  1.1  christos     const struct nistp_test_params *test = nistp_tests_params + idx;
   1320  1.1  christos     BN_CTX *ctx = NULL;
   1321  1.1  christos     BIGNUM *p = NULL, *a = NULL, *b = NULL, *x = NULL, *y = NULL;
   1322  1.1  christos     BIGNUM *n = NULL, *m = NULL, *order = NULL, *yplusone = NULL;
   1323  1.1  christos     EC_GROUP *NISTP = NULL;
   1324  1.1  christos     EC_POINT *G = NULL, *P = NULL, *Q = NULL, *Q_CHECK = NULL;
   1325  1.1  christos     int r = 0;
   1326  1.1  christos 
   1327  1.1  christos     TEST_note("NIST curve P-%d (optimised implementation):",
   1328  1.1  christos               test->degree);
   1329  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
   1330  1.1  christos         || !TEST_ptr(p = BN_new())
   1331  1.1  christos         || !TEST_ptr(a = BN_new())
   1332  1.1  christos         || !TEST_ptr(b = BN_new())
   1333  1.1  christos         || !TEST_ptr(x = BN_new())
   1334  1.1  christos         || !TEST_ptr(y = BN_new())
   1335  1.1  christos         || !TEST_ptr(m = BN_new())
   1336  1.1  christos         || !TEST_ptr(n = BN_new())
   1337  1.1  christos         || !TEST_ptr(order = BN_new())
   1338  1.1  christos         || !TEST_ptr(yplusone = BN_new())
   1339  1.1  christos 
   1340  1.1  christos         || !TEST_ptr(NISTP = EC_GROUP_new(test->meth()))
   1341  1.1  christos         || !TEST_true(BN_hex2bn(&p, test->p))
   1342  1.1  christos         || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
   1343  1.1  christos         || !TEST_true(BN_hex2bn(&a, test->a))
   1344  1.1  christos         || !TEST_true(BN_hex2bn(&b, test->b))
   1345  1.1  christos         || !TEST_true(EC_GROUP_set_curve(NISTP, p, a, b, ctx))
   1346  1.1  christos         || !TEST_ptr(G = EC_POINT_new(NISTP))
   1347  1.1  christos         || !TEST_ptr(P = EC_POINT_new(NISTP))
   1348  1.1  christos         || !TEST_ptr(Q = EC_POINT_new(NISTP))
   1349  1.1  christos         || !TEST_ptr(Q_CHECK = EC_POINT_new(NISTP))
   1350  1.1  christos         || !TEST_true(BN_hex2bn(&x, test->Qx))
   1351  1.1  christos         || !TEST_true(BN_hex2bn(&y, test->Qy))
   1352  1.1  christos         || !TEST_true(BN_add(yplusone, y, BN_value_one()))
   1353  1.1  christos     /*
   1354  1.1  christos      * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
   1355  1.1  christos      * and therefore setting the coordinates should fail.
   1356  1.1  christos      */
   1357  1.1  christos         || !TEST_false(EC_POINT_set_affine_coordinates(NISTP, Q_CHECK, x,
   1358  1.1  christos                                                        yplusone, ctx))
   1359  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(NISTP, Q_CHECK, x, y,
   1360  1.1  christos                                                       ctx))
   1361  1.1  christos         || !TEST_true(BN_hex2bn(&x, test->Gx))
   1362  1.1  christos         || !TEST_true(BN_hex2bn(&y, test->Gy))
   1363  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(NISTP, G, x, y, ctx))
   1364  1.1  christos         || !TEST_true(BN_hex2bn(&order, test->order))
   1365  1.1  christos         || !TEST_true(EC_GROUP_set_generator(NISTP, G, order, BN_value_one()))
   1366  1.1  christos         || !TEST_int_eq(EC_GROUP_get_degree(NISTP), test->degree))
   1367  1.1  christos         goto err;
   1368  1.1  christos 
   1369  1.1  christos     TEST_note("NIST test vectors ... ");
   1370  1.1  christos     if (!TEST_true(BN_hex2bn(&n, test->d)))
   1371  1.1  christos         goto err;
   1372  1.1  christos     /* fixed point multiplication */
   1373  1.1  christos     EC_POINT_mul(NISTP, Q, n, NULL, NULL, ctx);
   1374  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
   1375  1.1  christos         goto err;
   1376  1.1  christos     /* random point multiplication */
   1377  1.1  christos     EC_POINT_mul(NISTP, Q, NULL, G, n, ctx);
   1378  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx))
   1379  1.1  christos 
   1380  1.1  christos         /* set generator to P = 2*G, where G is the standard generator */
   1381  1.1  christos         || !TEST_true(EC_POINT_dbl(NISTP, P, G, ctx))
   1382  1.1  christos         || !TEST_true(EC_GROUP_set_generator(NISTP, P, order, BN_value_one()))
   1383  1.1  christos         /* set the scalar to m=n/2, where n is the NIST test scalar */
   1384  1.1  christos         || !TEST_true(BN_rshift(m, n, 1)))
   1385  1.1  christos         goto err;
   1386  1.1  christos 
   1387  1.1  christos     /* test the non-standard generator */
   1388  1.1  christos     /* fixed point multiplication */
   1389  1.1  christos     EC_POINT_mul(NISTP, Q, m, NULL, NULL, ctx);
   1390  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
   1391  1.1  christos         goto err;
   1392  1.1  christos     /* random point multiplication */
   1393  1.1  christos     EC_POINT_mul(NISTP, Q, NULL, P, m, ctx);
   1394  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx))
   1395  1.1  christos 
   1396  1.1  christos     /*
   1397  1.1  christos      * We have not performed precomputation so have_precompute mult should be
   1398  1.1  christos      * false
   1399  1.1  christos      */
   1400  1.1  christos         || !TEST_false(EC_GROUP_have_precompute_mult(NISTP))
   1401  1.1  christos 
   1402  1.1  christos     /* now repeat all tests with precomputation */
   1403  1.1  christos         || !TEST_true(EC_GROUP_precompute_mult(NISTP, ctx))
   1404  1.1  christos         || !TEST_true(EC_GROUP_have_precompute_mult(NISTP)))
   1405  1.1  christos         goto err;
   1406  1.1  christos 
   1407  1.1  christos     /* fixed point multiplication */
   1408  1.1  christos     EC_POINT_mul(NISTP, Q, m, NULL, NULL, ctx);
   1409  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
   1410  1.1  christos         goto err;
   1411  1.1  christos     /* random point multiplication */
   1412  1.1  christos     EC_POINT_mul(NISTP, Q, NULL, P, m, ctx);
   1413  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx))
   1414  1.1  christos 
   1415  1.1  christos     /* reset generator */
   1416  1.1  christos         || !TEST_true(EC_GROUP_set_generator(NISTP, G, order, BN_value_one())))
   1417  1.1  christos         goto err;
   1418  1.1  christos     /* fixed point multiplication */
   1419  1.1  christos     EC_POINT_mul(NISTP, Q, n, NULL, NULL, ctx);
   1420  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
   1421  1.1  christos         goto err;
   1422  1.1  christos     /* random point multiplication */
   1423  1.1  christos     EC_POINT_mul(NISTP, Q, NULL, G, n, ctx);
   1424  1.1  christos     if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
   1425  1.1  christos         goto err;
   1426  1.1  christos 
   1427  1.1  christos     /* regression test for felem_neg bug */
   1428  1.1  christos     if (!TEST_true(BN_set_word(m, 32))
   1429  1.1  christos         || !TEST_true(BN_set_word(n, 31))
   1430  1.1  christos         || !TEST_true(EC_POINT_copy(P, G))
   1431  1.1  christos         || !TEST_true(EC_POINT_invert(NISTP, P, ctx))
   1432  1.1  christos         || !TEST_true(EC_POINT_mul(NISTP, Q, m, P, n, ctx))
   1433  1.1  christos         || !TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, G, ctx)))
   1434  1.1  christos       goto err;
   1435  1.1  christos 
   1436  1.1  christos     r = group_order_tests(NISTP);
   1437  1.1  christos err:
   1438  1.1  christos     EC_GROUP_free(NISTP);
   1439  1.1  christos     EC_POINT_free(G);
   1440  1.1  christos     EC_POINT_free(P);
   1441  1.1  christos     EC_POINT_free(Q);
   1442  1.1  christos     EC_POINT_free(Q_CHECK);
   1443  1.1  christos     BN_free(n);
   1444  1.1  christos     BN_free(m);
   1445  1.1  christos     BN_free(p);
   1446  1.1  christos     BN_free(a);
   1447  1.1  christos     BN_free(b);
   1448  1.1  christos     BN_free(x);
   1449  1.1  christos     BN_free(y);
   1450  1.1  christos     BN_free(order);
   1451  1.1  christos     BN_free(yplusone);
   1452  1.1  christos     BN_CTX_free(ctx);
   1453  1.1  christos     return r;
   1454  1.1  christos }
   1455  1.1  christos 
   1456  1.1  christos /*
   1457  1.1  christos  * Tests a point known to cause an incorrect underflow in an old version of
   1458  1.1  christos  * ecp_nist521.c
   1459  1.1  christos  */
   1460  1.1  christos static int underflow_test(void)
   1461  1.1  christos {
   1462  1.1  christos     BN_CTX *ctx = NULL;
   1463  1.1  christos     EC_GROUP *grp = NULL;
   1464  1.1  christos     EC_POINT *P = NULL, *Q = NULL, *R = NULL;
   1465  1.1  christos     BIGNUM *x1 = NULL, *y1 = NULL, *z1 = NULL, *x2 = NULL, *y2 = NULL;
   1466  1.1  christos     BIGNUM *k = NULL;
   1467  1.1  christos     int testresult = 0;
   1468  1.1  christos     const char *x1str =
   1469  1.1  christos         "1534f0077fffffe87e9adcfe000000000000000000003e05a21d2400002e031b1f4"
   1470  1.1  christos         "b80000c6fafa4f3c1288798d624a247b5e2ffffffffffffffefe099241900004";
   1471  1.1  christos     const char *p521m1 =
   1472  1.1  christos         "1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
   1473  1.1  christos         "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe";
   1474  1.1  christos 
   1475  1.1  christos     ctx = BN_CTX_new();
   1476  1.1  christos     if (!TEST_ptr(ctx))
   1477  1.1  christos         return 0;
   1478  1.1  christos 
   1479  1.1  christos     BN_CTX_start(ctx);
   1480  1.1  christos     x1 = BN_CTX_get(ctx);
   1481  1.1  christos     y1 = BN_CTX_get(ctx);
   1482  1.1  christos     z1 = BN_CTX_get(ctx);
   1483  1.1  christos     x2 = BN_CTX_get(ctx);
   1484  1.1  christos     y2 = BN_CTX_get(ctx);
   1485  1.1  christos     k = BN_CTX_get(ctx);
   1486  1.1  christos     if (!TEST_ptr(k))
   1487  1.1  christos         goto err;
   1488  1.1  christos 
   1489  1.1  christos     grp = EC_GROUP_new_by_curve_name(NID_secp521r1);
   1490  1.1  christos     P = EC_POINT_new(grp);
   1491  1.1  christos     Q = EC_POINT_new(grp);
   1492  1.1  christos     R = EC_POINT_new(grp);
   1493  1.1  christos     if (!TEST_ptr(grp) || !TEST_ptr(P) || !TEST_ptr(Q) || !TEST_ptr(R))
   1494  1.1  christos         goto err;
   1495  1.1  christos 
   1496  1.1  christos     if (!TEST_int_gt(BN_hex2bn(&x1, x1str), 0)
   1497  1.1  christos             || !TEST_int_gt(BN_hex2bn(&y1, p521m1), 0)
   1498  1.1  christos             || !TEST_int_gt(BN_hex2bn(&z1, p521m1), 0)
   1499  1.1  christos             || !TEST_int_gt(BN_hex2bn(&k, "02"), 0)
   1500  1.1  christos             || !TEST_true(EC_POINT_set_Jprojective_coordinates_GFp(grp, P, x1,
   1501  1.1  christos                                                                    y1, z1, ctx))
   1502  1.1  christos             || !TEST_true(EC_POINT_mul(grp, Q, NULL, P, k, ctx))
   1503  1.1  christos             || !TEST_true(EC_POINT_get_affine_coordinates(grp, Q, x1, y1, ctx))
   1504  1.1  christos             || !TEST_true(EC_POINT_dbl(grp, R, P, ctx))
   1505  1.1  christos             || !TEST_true(EC_POINT_get_affine_coordinates(grp, R, x2, y2, ctx)))
   1506  1.1  christos         goto err;
   1507  1.1  christos 
   1508  1.1  christos     if (!TEST_int_eq(BN_cmp(x1, x2), 0)
   1509  1.1  christos             || !TEST_int_eq(BN_cmp(y1, y2), 0))
   1510  1.1  christos         goto err;
   1511  1.1  christos 
   1512  1.1  christos     testresult = 1;
   1513  1.1  christos 
   1514  1.1  christos  err:
   1515  1.1  christos     BN_CTX_end(ctx);
   1516  1.1  christos     EC_POINT_free(P);
   1517  1.1  christos     EC_POINT_free(Q);
   1518  1.1  christos     EC_POINT_free(R);
   1519  1.1  christos     EC_GROUP_free(grp);
   1520  1.1  christos     BN_CTX_free(ctx);
   1521  1.1  christos 
   1522  1.1  christos     return testresult;
   1523  1.1  christos }
   1524  1.1  christos # endif
   1525  1.1  christos 
   1526  1.1  christos static const unsigned char p521_named[] = {
   1527  1.1  christos     0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x23,
   1528  1.1  christos };
   1529  1.1  christos 
   1530  1.1  christos static const unsigned char p521_explicit[] = {
   1531  1.1  christos     0x30, 0x82, 0x01, 0xc3, 0x02, 0x01, 0x01, 0x30, 0x4d, 0x06, 0x07, 0x2a,
   1532  1.1  christos     0x86, 0x48, 0xce, 0x3d, 0x01, 0x01, 0x02, 0x42, 0x01, 0xff, 0xff, 0xff,
   1533  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1534  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1535  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1536  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1537  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1538  1.1  christos     0xff, 0xff, 0x30, 0x81, 0x9f, 0x04, 0x42, 0x01, 0xff, 0xff, 0xff, 0xff,
   1539  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1540  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1541  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1542  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1543  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1544  1.1  christos     0xfc, 0x04, 0x42, 0x00, 0x51, 0x95, 0x3e, 0xb9, 0x61, 0x8e, 0x1c, 0x9a,
   1545  1.1  christos     0x1f, 0x92, 0x9a, 0x21, 0xa0, 0xb6, 0x85, 0x40, 0xee, 0xa2, 0xda, 0x72,
   1546  1.1  christos     0x5b, 0x99, 0xb3, 0x15, 0xf3, 0xb8, 0xb4, 0x89, 0x91, 0x8e, 0xf1, 0x09,
   1547  1.1  christos     0xe1, 0x56, 0x19, 0x39, 0x51, 0xec, 0x7e, 0x93, 0x7b, 0x16, 0x52, 0xc0,
   1548  1.1  christos     0xbd, 0x3b, 0xb1, 0xbf, 0x07, 0x35, 0x73, 0xdf, 0x88, 0x3d, 0x2c, 0x34,
   1549  1.1  christos     0xf1, 0xef, 0x45, 0x1f, 0xd4, 0x6b, 0x50, 0x3f, 0x00, 0x03, 0x15, 0x00,
   1550  1.1  christos     0xd0, 0x9e, 0x88, 0x00, 0x29, 0x1c, 0xb8, 0x53, 0x96, 0xcc, 0x67, 0x17,
   1551  1.1  christos     0x39, 0x32, 0x84, 0xaa, 0xa0, 0xda, 0x64, 0xba, 0x04, 0x81, 0x85, 0x04,
   1552  1.1  christos     0x00, 0xc6, 0x85, 0x8e, 0x06, 0xb7, 0x04, 0x04, 0xe9, 0xcd, 0x9e, 0x3e,
   1553  1.1  christos     0xcb, 0x66, 0x23, 0x95, 0xb4, 0x42, 0x9c, 0x64, 0x81, 0x39, 0x05, 0x3f,
   1554  1.1  christos     0xb5, 0x21, 0xf8, 0x28, 0xaf, 0x60, 0x6b, 0x4d, 0x3d, 0xba, 0xa1, 0x4b,
   1555  1.1  christos     0x5e, 0x77, 0xef, 0xe7, 0x59, 0x28, 0xfe, 0x1d, 0xc1, 0x27, 0xa2, 0xff,
   1556  1.1  christos     0xa8, 0xde, 0x33, 0x48, 0xb3, 0xc1, 0x85, 0x6a, 0x42, 0x9b, 0xf9, 0x7e,
   1557  1.1  christos     0x7e, 0x31, 0xc2, 0xe5, 0xbd, 0x66, 0x01, 0x18, 0x39, 0x29, 0x6a, 0x78,
   1558  1.1  christos     0x9a, 0x3b, 0xc0, 0x04, 0x5c, 0x8a, 0x5f, 0xb4, 0x2c, 0x7d, 0x1b, 0xd9,
   1559  1.1  christos     0x98, 0xf5, 0x44, 0x49, 0x57, 0x9b, 0x44, 0x68, 0x17, 0xaf, 0xbd, 0x17,
   1560  1.1  christos     0x27, 0x3e, 0x66, 0x2c, 0x97, 0xee, 0x72, 0x99, 0x5e, 0xf4, 0x26, 0x40,
   1561  1.1  christos     0xc5, 0x50, 0xb9, 0x01, 0x3f, 0xad, 0x07, 0x61, 0x35, 0x3c, 0x70, 0x86,
   1562  1.1  christos     0xa2, 0x72, 0xc2, 0x40, 0x88, 0xbe, 0x94, 0x76, 0x9f, 0xd1, 0x66, 0x50,
   1563  1.1  christos     0x02, 0x42, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1564  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   1565  1.1  christos     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,
   1566  1.1  christos     0x51, 0x86, 0x87, 0x83, 0xbf, 0x2f, 0x96, 0x6b, 0x7f, 0xcc, 0x01, 0x48,
   1567  1.1  christos     0xf7, 0x09, 0xa5, 0xd0, 0x3b, 0xb5, 0xc9, 0xb8, 0x89, 0x9c, 0x47, 0xae,
   1568  1.1  christos     0xbb, 0x6f, 0xb7, 0x1e, 0x91, 0x38, 0x64, 0x09, 0x02, 0x01, 0x01,
   1569  1.1  christos };
   1570  1.1  christos 
   1571  1.1  christos /*
   1572  1.1  christos  * Sometime we cannot compare nids for equality, as the built-in curve table
   1573  1.1  christos  * includes aliases with different names for the same curve.
   1574  1.1  christos  *
   1575  1.1  christos  * This function returns TRUE (1) if the checked nids are identical, or if they
   1576  1.1  christos  * alias to the same curve. FALSE (0) otherwise.
   1577  1.1  christos  */
   1578  1.1  christos static ossl_inline
   1579  1.1  christos int are_ec_nids_compatible(int n1d, int n2d)
   1580  1.1  christos {
   1581  1.1  christos     int ret = 0;
   1582  1.1  christos     switch (n1d) {
   1583  1.1  christos # ifndef OPENSSL_NO_EC2M
   1584  1.1  christos         case NID_sect113r1:
   1585  1.1  christos         case NID_wap_wsg_idm_ecid_wtls4:
   1586  1.1  christos             ret = (n2d == NID_sect113r1 || n2d == NID_wap_wsg_idm_ecid_wtls4);
   1587  1.1  christos             break;
   1588  1.1  christos         case NID_sect163k1:
   1589  1.1  christos         case NID_wap_wsg_idm_ecid_wtls3:
   1590  1.1  christos             ret = (n2d == NID_sect163k1 || n2d == NID_wap_wsg_idm_ecid_wtls3);
   1591  1.1  christos             break;
   1592  1.1  christos         case NID_sect233k1:
   1593  1.1  christos         case NID_wap_wsg_idm_ecid_wtls10:
   1594  1.1  christos             ret = (n2d == NID_sect233k1 || n2d == NID_wap_wsg_idm_ecid_wtls10);
   1595  1.1  christos             break;
   1596  1.1  christos         case NID_sect233r1:
   1597  1.1  christos         case NID_wap_wsg_idm_ecid_wtls11:
   1598  1.1  christos             ret = (n2d == NID_sect233r1 || n2d == NID_wap_wsg_idm_ecid_wtls11);
   1599  1.1  christos             break;
   1600  1.1  christos         case NID_X9_62_c2pnb163v1:
   1601  1.1  christos         case NID_wap_wsg_idm_ecid_wtls5:
   1602  1.1  christos             ret = (n2d == NID_X9_62_c2pnb163v1
   1603  1.1  christos                    || n2d == NID_wap_wsg_idm_ecid_wtls5);
   1604  1.1  christos             break;
   1605  1.1  christos # endif /* OPENSSL_NO_EC2M */
   1606  1.1  christos         case NID_secp112r1:
   1607  1.1  christos         case NID_wap_wsg_idm_ecid_wtls6:
   1608  1.1  christos             ret = (n2d == NID_secp112r1 || n2d == NID_wap_wsg_idm_ecid_wtls6);
   1609  1.1  christos             break;
   1610  1.1  christos         case NID_secp160r2:
   1611  1.1  christos         case NID_wap_wsg_idm_ecid_wtls7:
   1612  1.1  christos             ret = (n2d == NID_secp160r2 || n2d == NID_wap_wsg_idm_ecid_wtls7);
   1613  1.1  christos             break;
   1614  1.1  christos # ifdef OPENSSL_NO_EC_NISTP_64_GCC_128
   1615  1.1  christos         case NID_secp224r1:
   1616  1.1  christos         case NID_wap_wsg_idm_ecid_wtls12:
   1617  1.1  christos             ret = (n2d == NID_secp224r1 || n2d == NID_wap_wsg_idm_ecid_wtls12);
   1618  1.1  christos             break;
   1619  1.1  christos # else
   1620  1.1  christos         /*
   1621  1.1  christos          * For SEC P-224 we want to ensure that the SECP nid is returned, as
   1622  1.1  christos          * that is associated with a specialized method.
   1623  1.1  christos          */
   1624  1.1  christos         case NID_wap_wsg_idm_ecid_wtls12:
   1625  1.1  christos             ret = (n2d == NID_secp224r1);
   1626  1.1  christos             break;
   1627  1.1  christos # endif /* def(OPENSSL_NO_EC_NISTP_64_GCC_128) */
   1628  1.1  christos 
   1629  1.1  christos         default:
   1630  1.1  christos             ret = (n1d == n2d);
   1631  1.1  christos     }
   1632  1.1  christos     return ret;
   1633  1.1  christos }
   1634  1.1  christos 
   1635  1.1  christos /*
   1636  1.1  christos  * This checks that EC_GROUP_bew_from_ecparameters() returns a "named"
   1637  1.1  christos  * EC_GROUP for built-in curves.
   1638  1.1  christos  *
   1639  1.1  christos  * Note that it is possible to retrieve an alternative alias that does not match
   1640  1.1  christos  * the original nid.
   1641  1.1  christos  *
   1642  1.1  christos  * Ensure that the OPENSSL_EC_EXPLICIT_CURVE ASN1 flag is set.
   1643  1.1  christos  */
   1644  1.1  christos static int check_named_curve_from_ecparameters(int id)
   1645  1.1  christos {
   1646  1.1  christos     int ret = 0, nid, tnid;
   1647  1.1  christos     EC_GROUP *group = NULL, *tgroup = NULL, *tmpg = NULL;
   1648  1.1  christos     const EC_POINT *group_gen = NULL;
   1649  1.1  christos     EC_POINT *other_gen = NULL;
   1650  1.1  christos     BIGNUM *group_cofactor = NULL, *other_cofactor = NULL;
   1651  1.1  christos     BIGNUM *other_gen_x = NULL, *other_gen_y = NULL;
   1652  1.1  christos     const BIGNUM *group_order = NULL;
   1653  1.1  christos     BIGNUM *other_order = NULL;
   1654  1.1  christos     BN_CTX *bn_ctx = NULL;
   1655  1.1  christos     static const unsigned char invalid_seed[] = "THIS IS NOT A VALID SEED";
   1656  1.1  christos     static size_t invalid_seed_len = sizeof(invalid_seed);
   1657  1.1  christos     ECPARAMETERS *params = NULL, *other_params = NULL;
   1658  1.1  christos     EC_GROUP *g_ary[8] = {NULL};
   1659  1.1  christos     EC_GROUP **g_next = &g_ary[0];
   1660  1.1  christos     ECPARAMETERS *p_ary[8] = {NULL};
   1661  1.1  christos     ECPARAMETERS **p_next = &p_ary[0];
   1662  1.1  christos 
   1663  1.1  christos     /* Do some setup */
   1664  1.1  christos     nid = curves[id].nid;
   1665  1.1  christos     TEST_note("Curve %s", OBJ_nid2sn(nid));
   1666  1.1  christos     if (!TEST_ptr(bn_ctx = BN_CTX_new()))
   1667  1.1  christos         return ret;
   1668  1.1  christos     BN_CTX_start(bn_ctx);
   1669  1.1  christos 
   1670  1.1  christos     if (/* Allocations */
   1671  1.1  christos         !TEST_ptr(group_cofactor = BN_CTX_get(bn_ctx))
   1672  1.1  christos         || !TEST_ptr(other_gen_x = BN_CTX_get(bn_ctx))
   1673  1.1  christos         || !TEST_ptr(other_gen_y = BN_CTX_get(bn_ctx))
   1674  1.1  christos         || !TEST_ptr(other_order = BN_CTX_get(bn_ctx))
   1675  1.1  christos         || !TEST_ptr(other_cofactor = BN_CTX_get(bn_ctx))
   1676  1.1  christos         /* Generate reference group and params */
   1677  1.1  christos         || !TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))
   1678  1.1  christos         || !TEST_ptr(params = EC_GROUP_get_ecparameters(group, NULL))
   1679  1.1  christos         || !TEST_ptr(group_gen = EC_GROUP_get0_generator(group))
   1680  1.1  christos         || !TEST_ptr(group_order = EC_GROUP_get0_order(group))
   1681  1.1  christos         || !TEST_true(EC_GROUP_get_cofactor(group, group_cofactor, NULL))
   1682  1.1  christos         /* compute `other_*` values */
   1683  1.1  christos         || !TEST_ptr(tmpg = EC_GROUP_dup(group))
   1684  1.1  christos         || !TEST_ptr(other_gen = EC_POINT_dup(group_gen, group))
   1685  1.1  christos         || !TEST_true(EC_POINT_add(group, other_gen, group_gen, group_gen, NULL))
   1686  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(group, other_gen,
   1687  1.1  christos                       other_gen_x, other_gen_y, bn_ctx))
   1688  1.1  christos         || !TEST_true(BN_copy(other_order, group_order))
   1689  1.1  christos         || !TEST_true(BN_add_word(other_order, 1))
   1690  1.1  christos         || !TEST_true(BN_copy(other_cofactor, group_cofactor))
   1691  1.1  christos         || !TEST_true(BN_add_word(other_cofactor, 1)))
   1692  1.1  christos         goto err;
   1693  1.1  christos 
   1694  1.1  christos     EC_POINT_free(other_gen);
   1695  1.1  christos     other_gen = NULL;
   1696  1.1  christos 
   1697  1.1  christos     if (!TEST_ptr(other_gen = EC_POINT_new(tmpg))
   1698  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(tmpg, other_gen,
   1699  1.1  christos                                                       other_gen_x, other_gen_y,
   1700  1.1  christos                                                       bn_ctx)))
   1701  1.1  christos         goto err;
   1702  1.1  christos 
   1703  1.1  christos     /*
   1704  1.1  christos      * ###########################
   1705  1.1  christos      * # Actual tests start here #
   1706  1.1  christos      * ###########################
   1707  1.1  christos      */
   1708  1.1  christos 
   1709  1.1  christos     /*
   1710  1.1  christos      * Creating a group from built-in explicit parameters returns a
   1711  1.1  christos      * "named" EC_GROUP
   1712  1.1  christos      */
   1713  1.1  christos     if (!TEST_ptr(tgroup = *g_next++ = EC_GROUP_new_from_ecparameters(params))
   1714  1.1  christos         || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef))
   1715  1.1  christos         goto err;
   1716  1.1  christos     /*
   1717  1.1  christos      * We cannot always guarantee the names match, as the built-in table
   1718  1.1  christos      * contains aliases for the same curve with different names.
   1719  1.1  christos      */
   1720  1.1  christos     if (!TEST_true(are_ec_nids_compatible(nid, tnid))) {
   1721  1.1  christos         TEST_info("nid = %s, tnid = %s", OBJ_nid2sn(nid), OBJ_nid2sn(tnid));
   1722  1.1  christos         goto err;
   1723  1.1  christos     }
   1724  1.1  christos     /* Ensure that the OPENSSL_EC_EXPLICIT_CURVE ASN1 flag is set. */
   1725  1.1  christos     if (!TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup), OPENSSL_EC_EXPLICIT_CURVE))
   1726  1.1  christos         goto err;
   1727  1.1  christos 
   1728  1.1  christos     /*
   1729  1.1  christos      * An invalid seed in the parameters should be ignored: expect a "named"
   1730  1.1  christos      * group.
   1731  1.1  christos      */
   1732  1.1  christos     if (!TEST_int_eq(EC_GROUP_set_seed(tmpg, invalid_seed, invalid_seed_len),
   1733  1.1  christos                      invalid_seed_len)
   1734  1.1  christos             || !TEST_ptr(other_params = *p_next++ =
   1735  1.1  christos                          EC_GROUP_get_ecparameters(tmpg, NULL))
   1736  1.1  christos             || !TEST_ptr(tgroup = *g_next++ =
   1737  1.1  christos                           EC_GROUP_new_from_ecparameters(other_params))
   1738  1.1  christos             || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   1739  1.1  christos             || !TEST_true(are_ec_nids_compatible(nid, tnid))
   1740  1.1  christos             || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
   1741  1.1  christos                             OPENSSL_EC_EXPLICIT_CURVE)) {
   1742  1.1  christos         TEST_info("nid = %s, tnid = %s", OBJ_nid2sn(nid), OBJ_nid2sn(tnid));
   1743  1.1  christos         goto err;
   1744  1.1  christos     }
   1745  1.1  christos 
   1746  1.1  christos     /*
   1747  1.1  christos      * A null seed in the parameters should be ignored, as it is optional:
   1748  1.1  christos      * expect a "named" group.
   1749  1.1  christos      */
   1750  1.1  christos     if (!TEST_int_eq(EC_GROUP_set_seed(tmpg, NULL, 0), 1)
   1751  1.1  christos             || !TEST_ptr(other_params = *p_next++ =
   1752  1.1  christos                          EC_GROUP_get_ecparameters(tmpg, NULL))
   1753  1.1  christos             || !TEST_ptr(tgroup = *g_next++ =
   1754  1.1  christos                           EC_GROUP_new_from_ecparameters(other_params))
   1755  1.1  christos             || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   1756  1.1  christos             || !TEST_true(are_ec_nids_compatible(nid, tnid))
   1757  1.1  christos             || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
   1758  1.1  christos                             OPENSSL_EC_EXPLICIT_CURVE)) {
   1759  1.1  christos         TEST_info("nid = %s, tnid = %s", OBJ_nid2sn(nid), OBJ_nid2sn(tnid));
   1760  1.1  christos         goto err;
   1761  1.1  christos     }
   1762  1.1  christos 
   1763  1.1  christos     /*
   1764  1.1  christos      * Check that changing any of the generator parameters does not yield a
   1765  1.1  christos      * match with the built-in curves
   1766  1.1  christos      */
   1767  1.1  christos     if (/* Other gen, same group order & cofactor */
   1768  1.1  christos         !TEST_true(EC_GROUP_set_generator(tmpg, other_gen, group_order,
   1769  1.1  christos                                           group_cofactor))
   1770  1.1  christos         || !TEST_ptr(other_params = *p_next++ =
   1771  1.1  christos                      EC_GROUP_get_ecparameters(tmpg, NULL))
   1772  1.1  christos         || !TEST_ptr(tgroup = *g_next++ =
   1773  1.1  christos                       EC_GROUP_new_from_ecparameters(other_params))
   1774  1.1  christos         || !TEST_int_eq((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   1775  1.1  christos         /* Same gen & cofactor, different order */
   1776  1.1  christos         || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, other_order,
   1777  1.1  christos                                              group_cofactor))
   1778  1.1  christos         || !TEST_ptr(other_params = *p_next++ =
   1779  1.1  christos                      EC_GROUP_get_ecparameters(tmpg, NULL))
   1780  1.1  christos         || !TEST_ptr(tgroup = *g_next++ =
   1781  1.1  christos                       EC_GROUP_new_from_ecparameters(other_params))
   1782  1.1  christos         || !TEST_int_eq((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   1783  1.1  christos         /* The order is not an optional field, so this should fail */
   1784  1.1  christos         || !TEST_false(EC_GROUP_set_generator(tmpg, group_gen, NULL,
   1785  1.1  christos                                               group_cofactor))
   1786  1.1  christos         /* Check that a wrong cofactor is ignored, and we still match */
   1787  1.1  christos         || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, group_order,
   1788  1.1  christos                                              other_cofactor))
   1789  1.1  christos         || !TEST_ptr(other_params = *p_next++ =
   1790  1.1  christos                      EC_GROUP_get_ecparameters(tmpg, NULL))
   1791  1.1  christos         || !TEST_ptr(tgroup = *g_next++ =
   1792  1.1  christos                       EC_GROUP_new_from_ecparameters(other_params))
   1793  1.1  christos         || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   1794  1.1  christos         || !TEST_true(are_ec_nids_compatible(nid, tnid))
   1795  1.1  christos         || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
   1796  1.1  christos                         OPENSSL_EC_EXPLICIT_CURVE)
   1797  1.1  christos         /* Check that if the cofactor is not set then it still matches */
   1798  1.1  christos         || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, group_order,
   1799  1.1  christos                                              NULL))
   1800  1.1  christos         || !TEST_ptr(other_params = *p_next++ =
   1801  1.1  christos                      EC_GROUP_get_ecparameters(tmpg, NULL))
   1802  1.1  christos         || !TEST_ptr(tgroup = *g_next++ =
   1803  1.1  christos                       EC_GROUP_new_from_ecparameters(other_params))
   1804  1.1  christos         || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   1805  1.1  christos         || !TEST_true(are_ec_nids_compatible(nid, tnid))
   1806  1.1  christos         || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
   1807  1.1  christos                         OPENSSL_EC_EXPLICIT_CURVE)
   1808  1.1  christos         /* check that restoring the generator passes */
   1809  1.1  christos         || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, group_order,
   1810  1.1  christos                                              group_cofactor))
   1811  1.1  christos         || !TEST_ptr(other_params = *p_next++ =
   1812  1.1  christos                      EC_GROUP_get_ecparameters(tmpg, NULL))
   1813  1.1  christos         || !TEST_ptr(tgroup = *g_next++ =
   1814  1.1  christos                       EC_GROUP_new_from_ecparameters(other_params))
   1815  1.1  christos         || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
   1816  1.1  christos         || !TEST_true(are_ec_nids_compatible(nid, tnid))
   1817  1.1  christos         || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
   1818  1.1  christos                         OPENSSL_EC_EXPLICIT_CURVE))
   1819  1.1  christos         goto err;
   1820  1.1  christos 
   1821  1.1  christos     ret = 1;
   1822  1.1  christos err:
   1823  1.1  christos     for (g_next = &g_ary[0]; g_next < g_ary + OSSL_NELEM(g_ary); g_next++)
   1824  1.1  christos         EC_GROUP_free(*g_next);
   1825  1.1  christos     for (p_next = &p_ary[0]; p_next < p_ary + OSSL_NELEM(g_ary); p_next++)
   1826  1.1  christos         ECPARAMETERS_free(*p_next);
   1827  1.1  christos     ECPARAMETERS_free(params);
   1828  1.1  christos     EC_POINT_free(other_gen);
   1829  1.1  christos     EC_GROUP_free(tmpg);
   1830  1.1  christos     EC_GROUP_free(group);
   1831  1.1  christos     BN_CTX_end(bn_ctx);
   1832  1.1  christos     BN_CTX_free(bn_ctx);
   1833  1.1  christos     return ret;
   1834  1.1  christos }
   1835  1.1  christos 
   1836  1.1  christos static int parameter_test(void)
   1837  1.1  christos {
   1838  1.1  christos     EC_GROUP *group = NULL, *group2 = NULL;
   1839  1.1  christos     ECPARAMETERS *ecparameters = NULL;
   1840  1.1  christos     unsigned char *buf = NULL;
   1841  1.1  christos     int r = 0, len;
   1842  1.1  christos 
   1843  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(NID_secp112r1))
   1844  1.1  christos         || !TEST_ptr(ecparameters = EC_GROUP_get_ecparameters(group, NULL))
   1845  1.1  christos         || !TEST_ptr(group2 = EC_GROUP_new_from_ecparameters(ecparameters))
   1846  1.1  christos         || !TEST_int_eq(EC_GROUP_cmp(group, group2, NULL), 0))
   1847  1.1  christos         goto err;
   1848  1.1  christos 
   1849  1.1  christos     EC_GROUP_free(group);
   1850  1.1  christos     group = NULL;
   1851  1.1  christos 
   1852  1.1  christos     /* Test the named curve encoding, which should be default. */
   1853  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(NID_secp521r1))
   1854  1.1  christos         || !TEST_true((len = i2d_ECPKParameters(group, &buf)) >= 0)
   1855  1.1  christos         || !TEST_mem_eq(buf, len, p521_named, sizeof(p521_named)))
   1856  1.1  christos         goto err;
   1857  1.1  christos 
   1858  1.1  christos     OPENSSL_free(buf);
   1859  1.1  christos     buf = NULL;
   1860  1.1  christos 
   1861  1.1  christos     /*
   1862  1.1  christos      * Test the explicit encoding. P-521 requires correctly zero-padding the
   1863  1.1  christos      * curve coefficients.
   1864  1.1  christos      */
   1865  1.1  christos     EC_GROUP_set_asn1_flag(group, OPENSSL_EC_EXPLICIT_CURVE);
   1866  1.1  christos     if (!TEST_true((len = i2d_ECPKParameters(group, &buf)) >= 0)
   1867  1.1  christos         || !TEST_mem_eq(buf, len, p521_explicit, sizeof(p521_explicit)))
   1868  1.1  christos         goto err;
   1869  1.1  christos 
   1870  1.1  christos     r = 1;
   1871  1.1  christos err:
   1872  1.1  christos     EC_GROUP_free(group);
   1873  1.1  christos     EC_GROUP_free(group2);
   1874  1.1  christos     ECPARAMETERS_free(ecparameters);
   1875  1.1  christos     OPENSSL_free(buf);
   1876  1.1  christos     return r;
   1877  1.1  christos }
   1878  1.1  christos 
   1879  1.1  christos /*-
   1880  1.1  christos  * random 256-bit explicit parameters curve, cofactor absent
   1881  1.1  christos  * order:    0x0c38d96a9f892b88772ec2e39614a82f4f (132 bit)
   1882  1.1  christos  * cofactor:   0x12bc94785251297abfafddf1565100da (125 bit)
   1883  1.1  christos  */
   1884  1.1  christos static const unsigned char params_cf_pass[] = {
   1885  1.1  christos     0x30, 0x81, 0xcd, 0x02, 0x01, 0x01, 0x30, 0x2c, 0x06, 0x07, 0x2a, 0x86,
   1886  1.1  christos     0x48, 0xce, 0x3d, 0x01, 0x01, 0x02, 0x21, 0x00, 0xe5, 0x00, 0x1f, 0xc5,
   1887  1.1  christos     0xca, 0x71, 0x9d, 0x8e, 0xf7, 0x07, 0x4b, 0x48, 0x37, 0xf9, 0x33, 0x2d,
   1888  1.1  christos     0x71, 0xbf, 0x79, 0xe7, 0xdc, 0x91, 0xc2, 0xff, 0xb6, 0x7b, 0xc3, 0x93,
   1889  1.1  christos     0x44, 0x88, 0xe6, 0x91, 0x30, 0x44, 0x04, 0x20, 0xe5, 0x00, 0x1f, 0xc5,
   1890  1.1  christos     0xca, 0x71, 0x9d, 0x8e, 0xf7, 0x07, 0x4b, 0x48, 0x37, 0xf9, 0x33, 0x2d,
   1891  1.1  christos     0x71, 0xbf, 0x79, 0xe7, 0xdc, 0x91, 0xc2, 0xff, 0xb6, 0x7b, 0xc3, 0x93,
   1892  1.1  christos     0x44, 0x88, 0xe6, 0x8e, 0x04, 0x20, 0x18, 0x8c, 0x59, 0x57, 0xc4, 0xbc,
   1893  1.1  christos     0x85, 0x57, 0xc3, 0x66, 0x9f, 0x89, 0xd5, 0x92, 0x0d, 0x7e, 0x42, 0x27,
   1894  1.1  christos     0x07, 0x64, 0xaa, 0x26, 0xed, 0x89, 0xc4, 0x09, 0x05, 0x4d, 0xc7, 0x23,
   1895  1.1  christos     0x47, 0xda, 0x04, 0x41, 0x04, 0x1b, 0x6b, 0x41, 0x0b, 0xf9, 0xfb, 0x77,
   1896  1.1  christos     0xfd, 0x50, 0xb7, 0x3e, 0x23, 0xa3, 0xec, 0x9a, 0x3b, 0x09, 0x31, 0x6b,
   1897  1.1  christos     0xfa, 0xf6, 0xce, 0x1f, 0xff, 0xeb, 0x57, 0x93, 0x24, 0x70, 0xf3, 0xf4,
   1898  1.1  christos     0xba, 0x7e, 0xfa, 0x86, 0x6e, 0x19, 0x89, 0xe3, 0x55, 0x6d, 0x5a, 0xe9,
   1899  1.1  christos     0xc0, 0x3d, 0xbc, 0xfb, 0xaf, 0xad, 0xd4, 0x7e, 0xa6, 0xe5, 0xfa, 0x1a,
   1900  1.1  christos     0x58, 0x07, 0x9e, 0x8f, 0x0d, 0x3b, 0xf7, 0x38, 0xca, 0x02, 0x11, 0x0c,
   1901  1.1  christos     0x38, 0xd9, 0x6a, 0x9f, 0x89, 0x2b, 0x88, 0x77, 0x2e, 0xc2, 0xe3, 0x96,
   1902  1.1  christos     0x14, 0xa8, 0x2f, 0x4f
   1903  1.1  christos };
   1904  1.1  christos 
   1905  1.1  christos /*-
   1906  1.1  christos  * random 256-bit explicit parameters curve, cofactor absent
   1907  1.1  christos  * order:    0x045a75c0c17228ebd9b169a10e34a22101 (131 bit)
   1908  1.1  christos  * cofactor:   0x2e134b4ede82649f67a2e559d361e5fe (126 bit)
   1909  1.1  christos  */
   1910  1.1  christos static const unsigned char params_cf_fail[] = {
   1911  1.1  christos     0x30, 0x81, 0xcd, 0x02, 0x01, 0x01, 0x30, 0x2c, 0x06, 0x07, 0x2a, 0x86,
   1912  1.1  christos     0x48, 0xce, 0x3d, 0x01, 0x01, 0x02, 0x21, 0x00, 0xc8, 0x95, 0x27, 0x37,
   1913  1.1  christos     0xe8, 0xe1, 0xfd, 0xcc, 0xf9, 0x6e, 0x0c, 0xa6, 0x21, 0xc1, 0x7d, 0x6b,
   1914  1.1  christos     0x9d, 0x44, 0x42, 0xea, 0x73, 0x4e, 0x04, 0xb6, 0xac, 0x62, 0x50, 0xd0,
   1915  1.1  christos     0x33, 0xc2, 0xea, 0x13, 0x30, 0x44, 0x04, 0x20, 0xc8, 0x95, 0x27, 0x37,
   1916  1.1  christos     0xe8, 0xe1, 0xfd, 0xcc, 0xf9, 0x6e, 0x0c, 0xa6, 0x21, 0xc1, 0x7d, 0x6b,
   1917  1.1  christos     0x9d, 0x44, 0x42, 0xea, 0x73, 0x4e, 0x04, 0xb6, 0xac, 0x62, 0x50, 0xd0,
   1918  1.1  christos     0x33, 0xc2, 0xea, 0x10, 0x04, 0x20, 0xbf, 0xa6, 0xa8, 0x05, 0x1d, 0x09,
   1919  1.1  christos     0xac, 0x70, 0x39, 0xbb, 0x4d, 0xb2, 0x90, 0x8a, 0x15, 0x41, 0x14, 0x1d,
   1920  1.1  christos     0x11, 0x86, 0x9f, 0x13, 0xa2, 0x63, 0x1a, 0xda, 0x95, 0x22, 0x4d, 0x02,
   1921  1.1  christos     0x15, 0x0a, 0x04, 0x41, 0x04, 0xaf, 0x16, 0x71, 0xf9, 0xc4, 0xc8, 0x59,
   1922  1.1  christos     0x1d, 0xa3, 0x6f, 0xe7, 0xc3, 0x57, 0xa1, 0xfa, 0x9f, 0x49, 0x7c, 0x11,
   1923  1.1  christos     0x27, 0x05, 0xa0, 0x7f, 0xff, 0xf9, 0xe0, 0xe7, 0x92, 0xdd, 0x9c, 0x24,
   1924  1.1  christos     0x8e, 0xc7, 0xb9, 0x52, 0x71, 0x3f, 0xbc, 0x7f, 0x6a, 0x9f, 0x35, 0x70,
   1925  1.1  christos     0xe1, 0x27, 0xd5, 0x35, 0x8a, 0x13, 0xfa, 0xa8, 0x33, 0x3e, 0xd4, 0x73,
   1926  1.1  christos     0x1c, 0x14, 0x58, 0x9e, 0xc7, 0x0a, 0x87, 0x65, 0x8d, 0x02, 0x11, 0x04,
   1927  1.1  christos     0x5a, 0x75, 0xc0, 0xc1, 0x72, 0x28, 0xeb, 0xd9, 0xb1, 0x69, 0xa1, 0x0e,
   1928  1.1  christos     0x34, 0xa2, 0x21, 0x01
   1929  1.1  christos };
   1930  1.1  christos 
   1931  1.1  christos /*-
   1932  1.1  christos  * Test two random 256-bit explicit parameters curves with absent cofactor.
   1933  1.1  christos  * The two curves are chosen to roughly straddle the bounds at which the lib
   1934  1.1  christos  * can compute the cofactor automatically, roughly 4*sqrt(p). So test that:
   1935  1.1  christos  *
   1936  1.1  christos  * - params_cf_pass: order is sufficiently close to p to compute cofactor
   1937  1.1  christos  * - params_cf_fail: order is too far away from p to compute cofactor
   1938  1.1  christos  *
   1939  1.1  christos  * For standards-compliant curves, cofactor is chosen as small as possible.
   1940  1.1  christos  * So you can see neither of these curves are fit for cryptographic use.
   1941  1.1  christos  *
   1942  1.1  christos  * Some standards even mandate an upper bound on the cofactor, e.g. SECG1 v2:
   1943  1.1  christos  * h <= 2**(t/8) where t is the security level of the curve, for which the lib
   1944  1.1  christos  * will always succeed in computing the cofactor. Neither of these curves
   1945  1.1  christos  * conform to that -- this is just robustness testing.
   1946  1.1  christos  */
   1947  1.1  christos static int cofactor_range_test(void)
   1948  1.1  christos {
   1949  1.1  christos     EC_GROUP *group = NULL;
   1950  1.1  christos     BIGNUM *cf = NULL;
   1951  1.1  christos     int ret = 0;
   1952  1.1  christos     const unsigned char *b1 = (const unsigned char *)params_cf_fail;
   1953  1.1  christos     const unsigned char *b2 = (const unsigned char *)params_cf_pass;
   1954  1.1  christos 
   1955  1.1  christos     if (!TEST_ptr(group = d2i_ECPKParameters(NULL, &b1, sizeof(params_cf_fail)))
   1956  1.1  christos         || !TEST_BN_eq_zero(EC_GROUP_get0_cofactor(group))
   1957  1.1  christos         || !TEST_ptr(group = d2i_ECPKParameters(&group, &b2,
   1958  1.1  christos                                                 sizeof(params_cf_pass)))
   1959  1.1  christos         || !TEST_int_gt(BN_hex2bn(&cf, "12bc94785251297abfafddf1565100da"), 0)
   1960  1.1  christos         || !TEST_BN_eq(cf, EC_GROUP_get0_cofactor(group)))
   1961  1.1  christos         goto err;
   1962  1.1  christos     ret = 1;
   1963  1.1  christos  err:
   1964  1.1  christos     BN_free(cf);
   1965  1.1  christos     EC_GROUP_free(group);
   1966  1.1  christos     return ret;
   1967  1.1  christos }
   1968  1.1  christos 
   1969  1.1  christos /*-
   1970  1.1  christos  * For named curves, test that:
   1971  1.1  christos  * - the lib correctly computes the cofactor if passed a NULL or zero cofactor
   1972  1.1  christos  * - a nonsensical cofactor throws an error (negative test)
   1973  1.1  christos  * - nonsensical orders throw errors (negative tests)
   1974  1.1  christos  */
   1975  1.1  christos static int cardinality_test(int n)
   1976  1.1  christos {
   1977  1.1  christos     int ret = 0;
   1978  1.1  christos     int nid = curves[n].nid;
   1979  1.1  christos     BN_CTX *ctx = NULL;
   1980  1.1  christos     EC_GROUP *g1 = NULL, *g2 = NULL;
   1981  1.1  christos     EC_POINT *g2_gen = NULL;
   1982  1.1  christos     BIGNUM *g1_p = NULL, *g1_a = NULL, *g1_b = NULL, *g1_x = NULL, *g1_y = NULL,
   1983  1.1  christos            *g1_order = NULL, *g1_cf = NULL, *g2_cf = NULL;
   1984  1.1  christos 
   1985  1.1  christos     TEST_info("Curve %s cardinality test", OBJ_nid2sn(nid));
   1986  1.1  christos 
   1987  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new())
   1988  1.1  christos         || !TEST_ptr(g1 = EC_GROUP_new_by_curve_name(nid))
   1989  1.1  christos         || !TEST_ptr(g2 = EC_GROUP_new(EC_GROUP_method_of(g1)))) {
   1990  1.1  christos         EC_GROUP_free(g1);
   1991  1.1  christos         EC_GROUP_free(g2);
   1992  1.1  christos         BN_CTX_free(ctx);
   1993  1.1  christos         return 0;
   1994  1.1  christos     }
   1995  1.1  christos 
   1996  1.1  christos     BN_CTX_start(ctx);
   1997  1.1  christos     g1_p = BN_CTX_get(ctx);
   1998  1.1  christos     g1_a = BN_CTX_get(ctx);
   1999  1.1  christos     g1_b = BN_CTX_get(ctx);
   2000  1.1  christos     g1_x = BN_CTX_get(ctx);
   2001  1.1  christos     g1_y = BN_CTX_get(ctx);
   2002  1.1  christos     g1_order = BN_CTX_get(ctx);
   2003  1.1  christos     g1_cf = BN_CTX_get(ctx);
   2004  1.1  christos 
   2005  1.1  christos     if (!TEST_ptr(g2_cf = BN_CTX_get(ctx))
   2006  1.1  christos         /* pull out the explicit curve parameters */
   2007  1.1  christos         || !TEST_true(EC_GROUP_get_curve(g1, g1_p, g1_a, g1_b, ctx))
   2008  1.1  christos         || !TEST_true(EC_POINT_get_affine_coordinates(g1,
   2009  1.1  christos                       EC_GROUP_get0_generator(g1), g1_x, g1_y, ctx))
   2010  1.1  christos         || !TEST_true(BN_copy(g1_order, EC_GROUP_get0_order(g1)))
   2011  1.1  christos         || !TEST_true(EC_GROUP_get_cofactor(g1, g1_cf, ctx))
   2012  1.1  christos         /* construct g2 manually with g1 parameters */
   2013  1.1  christos         || !TEST_true(EC_GROUP_set_curve(g2, g1_p, g1_a, g1_b, ctx))
   2014  1.1  christos         || !TEST_ptr(g2_gen = EC_POINT_new(g2))
   2015  1.1  christos         || !TEST_true(EC_POINT_set_affine_coordinates(g2, g2_gen, g1_x, g1_y, ctx))
   2016  1.1  christos         /* pass NULL cofactor: lib should compute it */
   2017  1.1  christos         || !TEST_true(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL))
   2018  1.1  christos         || !TEST_true(EC_GROUP_get_cofactor(g2, g2_cf, ctx))
   2019  1.1  christos         || !TEST_BN_eq(g1_cf, g2_cf)
   2020  1.1  christos         /* pass zero cofactor: lib should compute it */
   2021  1.1  christos         || !TEST_true(BN_set_word(g2_cf, 0))
   2022  1.1  christos         || !TEST_true(EC_GROUP_set_generator(g2, g2_gen, g1_order, g2_cf))
   2023  1.1  christos         || !TEST_true(EC_GROUP_get_cofactor(g2, g2_cf, ctx))
   2024  1.1  christos         || !TEST_BN_eq(g1_cf, g2_cf)
   2025  1.1  christos         /* negative test for invalid cofactor */
   2026  1.1  christos         || !TEST_true(BN_set_word(g2_cf, 0))
   2027  1.1  christos         || !TEST_true(BN_sub(g2_cf, g2_cf, BN_value_one()))
   2028  1.1  christos         || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, g2_cf))
   2029  1.1  christos         /* negative test for NULL order */
   2030  1.1  christos         || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, NULL, NULL))
   2031  1.1  christos         /* negative test for zero order */
   2032  1.1  christos         || !TEST_true(BN_set_word(g1_order, 0))
   2033  1.1  christos         || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL))
   2034  1.1  christos         /* negative test for negative order */
   2035  1.1  christos         || !TEST_true(BN_set_word(g2_cf, 0))
   2036  1.1  christos         || !TEST_true(BN_sub(g2_cf, g2_cf, BN_value_one()))
   2037  1.1  christos         || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL))
   2038  1.1  christos         /* negative test for too large order */
   2039  1.1  christos         || !TEST_true(BN_lshift(g1_order, g1_p, 2))
   2040  1.1  christos         || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL)))
   2041  1.1  christos         goto err;
   2042  1.1  christos     ret = 1;
   2043  1.1  christos  err:
   2044  1.1  christos     EC_POINT_free(g2_gen);
   2045  1.1  christos     EC_GROUP_free(g1);
   2046  1.1  christos     EC_GROUP_free(g2);
   2047  1.1  christos     BN_CTX_end(ctx);
   2048  1.1  christos     BN_CTX_free(ctx);
   2049  1.1  christos     return ret;
   2050  1.1  christos }
   2051  1.1  christos 
   2052  1.1  christos /*
   2053  1.1  christos  * Helper for ec_point_hex2point_test
   2054  1.1  christos  *
   2055  1.1  christos  * Self-tests EC_POINT_point2hex() against EC_POINT_hex2point() for the given
   2056  1.1  christos  * (group,P) pair.
   2057  1.1  christos  *
   2058  1.1  christos  * If P is NULL use point at infinity.
   2059  1.1  christos  */
   2060  1.1  christos static ossl_inline
   2061  1.1  christos int ec_point_hex2point_test_helper(const EC_GROUP *group, const EC_POINT *P,
   2062  1.1  christos                                    point_conversion_form_t form,
   2063  1.1  christos                                    BN_CTX *bnctx)
   2064  1.1  christos {
   2065  1.1  christos     int ret = 0;
   2066  1.1  christos     EC_POINT *Q = NULL, *Pinf = NULL;
   2067  1.1  christos     char *hex = NULL;
   2068  1.1  christos 
   2069  1.1  christos     if (P == NULL) {
   2070  1.1  christos         /* If P is NULL use point at infinity. */
   2071  1.1  christos         if (!TEST_ptr(Pinf = EC_POINT_new(group))
   2072  1.1  christos                 || !TEST_true(EC_POINT_set_to_infinity(group, Pinf)))
   2073  1.1  christos             goto err;
   2074  1.1  christos         P = Pinf;
   2075  1.1  christos     }
   2076  1.1  christos 
   2077  1.1  christos     if (!TEST_ptr(hex = EC_POINT_point2hex(group, P, form, bnctx))
   2078  1.1  christos             || !TEST_ptr(Q = EC_POINT_hex2point(group, hex, NULL, bnctx))
   2079  1.1  christos             || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, bnctx)))
   2080  1.1  christos         goto err;
   2081  1.1  christos 
   2082  1.1  christos     /*
   2083  1.1  christos      * The next check is most likely superfluous, as EC_POINT_cmp should already
   2084  1.1  christos      * cover this.
   2085  1.1  christos      * Nonetheless it increases the test coverage for EC_POINT_is_at_infinity,
   2086  1.1  christos      * so we include it anyway!
   2087  1.1  christos      */
   2088  1.1  christos     if (Pinf != NULL
   2089  1.1  christos             && !TEST_true(EC_POINT_is_at_infinity(group, Q)))
   2090  1.1  christos         goto err;
   2091  1.1  christos 
   2092  1.1  christos     ret = 1;
   2093  1.1  christos 
   2094  1.1  christos  err:
   2095  1.1  christos     EC_POINT_free(Pinf);
   2096  1.1  christos     OPENSSL_free(hex);
   2097  1.1  christos     EC_POINT_free(Q);
   2098  1.1  christos 
   2099  1.1  christos     return ret;
   2100  1.1  christos }
   2101  1.1  christos 
   2102  1.1  christos /*
   2103  1.1  christos  * This test self-validates EC_POINT_hex2point() and EC_POINT_point2hex()
   2104  1.1  christos  */
   2105  1.1  christos static int ec_point_hex2point_test(int id)
   2106  1.1  christos {
   2107  1.1  christos     int ret = 0, nid;
   2108  1.1  christos     EC_GROUP *group = NULL;
   2109  1.1  christos     const EC_POINT *G = NULL;
   2110  1.1  christos     EC_POINT *P = NULL;
   2111  1.1  christos     BN_CTX * bnctx = NULL;
   2112  1.1  christos 
   2113  1.1  christos     /* Do some setup */
   2114  1.1  christos     nid = curves[id].nid;
   2115  1.1  christos     if (!TEST_ptr(bnctx = BN_CTX_new())
   2116  1.1  christos             || !TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))
   2117  1.1  christos             || !TEST_ptr(G = EC_GROUP_get0_generator(group))
   2118  1.1  christos             || !TEST_ptr(P = EC_POINT_dup(G, group)))
   2119  1.1  christos         goto err;
   2120  1.1  christos 
   2121  1.1  christos     if (!TEST_true(ec_point_hex2point_test_helper(group, P,
   2122  1.1  christos                                                   POINT_CONVERSION_COMPRESSED,
   2123  1.1  christos                                                   bnctx))
   2124  1.1  christos             || !TEST_true(ec_point_hex2point_test_helper(group, NULL,
   2125  1.1  christos                                                          POINT_CONVERSION_COMPRESSED,
   2126  1.1  christos                                                          bnctx))
   2127  1.1  christos             || !TEST_true(ec_point_hex2point_test_helper(group, P,
   2128  1.1  christos                                                          POINT_CONVERSION_UNCOMPRESSED,
   2129  1.1  christos                                                          bnctx))
   2130  1.1  christos             || !TEST_true(ec_point_hex2point_test_helper(group, NULL,
   2131  1.1  christos                                                          POINT_CONVERSION_UNCOMPRESSED,
   2132  1.1  christos                                                          bnctx))
   2133  1.1  christos             || !TEST_true(ec_point_hex2point_test_helper(group, P,
   2134  1.1  christos                                                          POINT_CONVERSION_HYBRID,
   2135  1.1  christos                                                          bnctx))
   2136  1.1  christos             || !TEST_true(ec_point_hex2point_test_helper(group, NULL,
   2137  1.1  christos                                                          POINT_CONVERSION_HYBRID,
   2138  1.1  christos                                                          bnctx)))
   2139  1.1  christos         goto err;
   2140  1.1  christos 
   2141  1.1  christos     ret = 1;
   2142  1.1  christos 
   2143  1.1  christos  err:
   2144  1.1  christos     EC_POINT_free(P);
   2145  1.1  christos     EC_GROUP_free(group);
   2146  1.1  christos     BN_CTX_free(bnctx);
   2147  1.1  christos 
   2148  1.1  christos     return ret;
   2149  1.1  christos }
   2150  1.1  christos 
   2151  1.1  christos /*
   2152  1.1  christos  * check the EC_METHOD respects the supplied EC_GROUP_set_generator G
   2153  1.1  christos  */
   2154  1.1  christos static int custom_generator_test(int id)
   2155  1.1  christos {
   2156  1.1  christos     int ret = 0, nid, bsize;
   2157  1.1  christos     EC_GROUP *group = NULL;
   2158  1.1  christos     EC_POINT *G2 = NULL, *Q1 = NULL, *Q2 = NULL;
   2159  1.1  christos     BN_CTX *ctx = NULL;
   2160  1.1  christos     BIGNUM *k = NULL;
   2161  1.1  christos     unsigned char *b1 = NULL, *b2 = NULL;
   2162  1.1  christos 
   2163  1.1  christos     /* Do some setup */
   2164  1.1  christos     nid = curves[id].nid;
   2165  1.1  christos     TEST_note("Curve %s", OBJ_nid2sn(nid));
   2166  1.1  christos     if (!TEST_ptr(ctx = BN_CTX_new()))
   2167  1.1  christos         return 0;
   2168  1.1  christos 
   2169  1.1  christos     BN_CTX_start(ctx);
   2170  1.1  christos 
   2171  1.1  christos     if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(nid)))
   2172  1.1  christos         goto err;
   2173  1.1  christos 
   2174  1.1  christos     /* expected byte length of encoded points */
   2175  1.1  christos     bsize = (EC_GROUP_get_degree(group) + 7) / 8;
   2176  1.1  christos     bsize = 2 * bsize + 1;
   2177  1.1  christos 
   2178  1.1  christos     if (!TEST_ptr(k = BN_CTX_get(ctx))
   2179  1.1  christos         /* fetch a testing scalar k != 0,1 */
   2180  1.1  christos         || !TEST_true(BN_rand(k, EC_GROUP_order_bits(group) - 1,
   2181  1.1  christos                               BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY))
   2182  1.1  christos         /* make k even */
   2183  1.1  christos         || !TEST_true(BN_clear_bit(k, 0))
   2184  1.1  christos         || !TEST_ptr(G2 = EC_POINT_new(group))
   2185  1.1  christos         || !TEST_ptr(Q1 = EC_POINT_new(group))
   2186  1.1  christos         /* Q1 := kG */
   2187  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q1, k, NULL, NULL, ctx))
   2188  1.1  christos         /* pull out the bytes of that */
   2189  1.1  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q1,
   2190  1.1  christos                                            POINT_CONVERSION_UNCOMPRESSED, NULL,
   2191  1.1  christos                                            0, ctx), bsize)
   2192  1.1  christos         || !TEST_ptr(b1 = OPENSSL_malloc(bsize))
   2193  1.1  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q1,
   2194  1.1  christos                                            POINT_CONVERSION_UNCOMPRESSED, b1,
   2195  1.1  christos                                            bsize, ctx), bsize)
   2196  1.1  christos         /* new generator is G2 := 2G */
   2197  1.1  christos         || !TEST_true(EC_POINT_dbl(group, G2, EC_GROUP_get0_generator(group),
   2198  1.1  christos                                    ctx))
   2199  1.1  christos         || !TEST_true(EC_GROUP_set_generator(group, G2,
   2200  1.1  christos                                              EC_GROUP_get0_order(group),
   2201  1.1  christos                                              EC_GROUP_get0_cofactor(group)))
   2202  1.1  christos         || !TEST_ptr(Q2 = EC_POINT_new(group))
   2203  1.1  christos         || !TEST_true(BN_rshift1(k, k))
   2204  1.1  christos         /* Q2 := k/2 G2 */
   2205  1.1  christos         || !TEST_true(EC_POINT_mul(group, Q2, k, NULL, NULL, ctx))
   2206  1.1  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q2,
   2207  1.1  christos                                            POINT_CONVERSION_UNCOMPRESSED, NULL,
   2208  1.1  christos                                            0, ctx), bsize)
   2209  1.1  christos         || !TEST_ptr(b2 = OPENSSL_malloc(bsize))
   2210  1.1  christos         || !TEST_int_eq(EC_POINT_point2oct(group, Q2,
   2211  1.1  christos                                            POINT_CONVERSION_UNCOMPRESSED, b2,
   2212  1.1  christos                                            bsize, ctx), bsize)
   2213  1.1  christos         /* Q1 = kG = k/2 G2 = Q2 should hold */
   2214  1.1  christos         || !TEST_int_eq(CRYPTO_memcmp(b1, b2, bsize), 0))
   2215  1.1  christos         goto err;
   2216  1.1  christos 
   2217  1.1  christos     ret = 1;
   2218  1.1  christos 
   2219  1.1  christos  err:
   2220  1.1  christos     BN_CTX_end(ctx);
   2221  1.1  christos     EC_POINT_free(Q1);
   2222  1.1  christos     EC_POINT_free(Q2);
   2223  1.1  christos     EC_POINT_free(G2);
   2224  1.1  christos     EC_GROUP_free(group);
   2225  1.1  christos     BN_CTX_free(ctx);
   2226  1.1  christos     OPENSSL_free(b1);
   2227  1.1  christos     OPENSSL_free(b2);
   2228  1.1  christos 
   2229  1.1  christos     return ret;
   2230  1.1  christos }
   2231  1.1  christos 
   2232  1.1  christos #endif /* OPENSSL_NO_EC */
   2233  1.1  christos 
   2234  1.1  christos int setup_tests(void)
   2235  1.1  christos {
   2236  1.1  christos #ifndef OPENSSL_NO_EC
   2237  1.1  christos     crv_len = EC_get_builtin_curves(NULL, 0);
   2238  1.1  christos     if (!TEST_ptr(curves = OPENSSL_malloc(sizeof(*curves) * crv_len))
   2239  1.1  christos         || !TEST_true(EC_get_builtin_curves(curves, crv_len)))
   2240  1.1  christos         return 0;
   2241  1.1  christos 
   2242  1.1  christos     ADD_TEST(parameter_test);
   2243  1.1  christos     ADD_TEST(cofactor_range_test);
   2244  1.1  christos     ADD_ALL_TESTS(cardinality_test, crv_len);
   2245  1.1  christos     ADD_TEST(prime_field_tests);
   2246  1.1  christos # ifndef OPENSSL_NO_EC2M
   2247  1.1  christos     ADD_TEST(hybrid_point_encoding_test);
   2248  1.1  christos     ADD_TEST(char2_field_tests);
   2249  1.1  christos     ADD_ALL_TESTS(char2_curve_test, OSSL_NELEM(char2_curve_tests));
   2250  1.1  christos # endif
   2251  1.1  christos # ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
   2252  1.1  christos     ADD_ALL_TESTS(nistp_single_test, OSSL_NELEM(nistp_tests_params));
   2253  1.1  christos     ADD_TEST(underflow_test);
   2254  1.1  christos # endif
   2255  1.1  christos     ADD_ALL_TESTS(internal_curve_test, crv_len);
   2256  1.1  christos     ADD_ALL_TESTS(internal_curve_test_method, crv_len);
   2257  1.1  christos 
   2258  1.1  christos     ADD_ALL_TESTS(check_named_curve_from_ecparameters, crv_len);
   2259  1.1  christos     ADD_ALL_TESTS(ec_point_hex2point_test, crv_len);
   2260  1.1  christos     ADD_ALL_TESTS(custom_generator_test, crv_len);
   2261  1.1  christos #endif /* OPENSSL_NO_EC */
   2262  1.1  christos     return 1;
   2263  1.1  christos }
   2264  1.1  christos 
   2265  1.1  christos void cleanup_tests(void)
   2266  1.1  christos {
   2267  1.1  christos #ifndef OPENSSL_NO_EC
   2268  1.1  christos     OPENSSL_free(curves);
   2269  1.1  christos #endif
   2270  1.1  christos }
   2271