Blame test/ectest.c

Packit Service 084de1
/*
Packit Service 084de1
 * Copyright 2001-2019 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
Packit Service 084de1
 *
Packit Service 084de1
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
 * this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
 * in the file LICENSE in the source distribution or at
Packit Service 084de1
 * https://www.openssl.org/source/license.html
Packit Service 084de1
 */
Packit Service 084de1
Packit Service 084de1
#include "internal/nelem.h"
Packit Service 084de1
#include "testutil.h"
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_EC
Packit Service 084de1
# include <openssl/ec.h>
Packit Service 084de1
# ifndef OPENSSL_NO_ENGINE
Packit Service 084de1
#  include <openssl/engine.h>
Packit Service 084de1
# endif
Packit Service 084de1
# include <openssl/err.h>
Packit Service 084de1
# include <openssl/obj_mac.h>
Packit Service 084de1
# include <openssl/objects.h>
Packit Service 084de1
# include <openssl/rand.h>
Packit Service 084de1
# include <openssl/bn.h>
Packit Service 084de1
# include <openssl/opensslconf.h>
Packit Service 084de1
Packit Service 084de1
static size_t crv_len = 0;
Packit Service 084de1
static EC_builtin_curve *curves = NULL;
Packit Service 084de1
Packit Service 084de1
/* test multiplication with group order, long and negative scalars */
Packit Service 084de1
static int group_order_tests(EC_GROUP *group)
Packit Service 084de1
{
Packit Service 084de1
    BIGNUM *n1 = NULL, *n2 = NULL, *order = NULL;
Packit Service 084de1
    EC_POINT *P = NULL, *Q = NULL, *R = NULL, *S = NULL;
Packit Service 084de1
    const EC_POINT *G = NULL;
Packit Service 084de1
    BN_CTX *ctx = NULL;
Packit Service 084de1
    int i = 0, r = 0;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(n1 = BN_new())
Packit Service 084de1
        || !TEST_ptr(n2 = BN_new())
Packit Service 084de1
        || !TEST_ptr(order = BN_new())
Packit Service 084de1
        || !TEST_ptr(ctx = BN_CTX_new())
Packit Service 084de1
        || !TEST_ptr(G = EC_GROUP_get0_generator(group))
Packit Service 084de1
        || !TEST_ptr(P = EC_POINT_new(group))
Packit Service 084de1
        || !TEST_ptr(Q = EC_POINT_new(group))
Packit Service 084de1
        || !TEST_ptr(R = EC_POINT_new(group))
Packit Service 084de1
        || !TEST_ptr(S = EC_POINT_new(group)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_true(EC_GROUP_get_order(group, order, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_mul(group, Q, order, NULL, NULL, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_is_at_infinity(group, Q))
Packit Service 084de1
        || !TEST_true(EC_GROUP_precompute_mult(group, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_mul(group, Q, order, NULL, NULL, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_is_at_infinity(group, Q))
Packit Service 084de1
        || !TEST_true(EC_POINT_copy(P, G))
Packit Service 084de1
        || !TEST_true(BN_one(n1))
Packit Service 084de1
        || !TEST_true(EC_POINT_mul(group, Q, n1, NULL, NULL, ctx))
Packit Service 084de1
        || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx))
Packit Service 084de1
        || !TEST_true(BN_sub(n1, order, n1))
Packit Service 084de1
        || !TEST_true(EC_POINT_mul(group, Q, n1, NULL, NULL, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_invert(group, Q, ctx))
Packit Service 084de1
        || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    for (i = 1; i <= 2; i++) {
Packit Service 084de1
        const BIGNUM *scalars[6];
Packit Service 084de1
        const EC_POINT *points[6];
Packit Service 084de1
Packit Service 084de1
        if (!TEST_true(BN_set_word(n1, i))
Packit Service 084de1
            /*
Packit Service 084de1
             * If i == 1, P will be the predefined generator for which
Packit Service 084de1
             * EC_GROUP_precompute_mult has set up precomputation.
Packit Service 084de1
             */
Packit Service 084de1
            || !TEST_true(EC_POINT_mul(group, P, n1, NULL, NULL, ctx))
Packit Service 084de1
            || (i == 1 && !TEST_int_eq(0, EC_POINT_cmp(group, P, G, ctx)))
Packit Service 084de1
            || !TEST_true(BN_one(n1))
Packit Service 084de1
            /* n1 = 1 - order */
Packit Service 084de1
            || !TEST_true(BN_sub(n1, n1, order))
Packit Service 084de1
            || !TEST_true(EC_POINT_mul(group, Q, NULL, P, n1, ctx))
Packit Service 084de1
            || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx))
Packit Service 084de1
Packit Service 084de1
            /* n2 = 1 + order */
Packit Service 084de1
            || !TEST_true(BN_add(n2, order, BN_value_one()))
Packit Service 084de1
            || !TEST_true(EC_POINT_mul(group, Q, NULL, P, n2, ctx))
Packit Service 084de1
            || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx))
Packit Service 084de1
Packit Service 084de1
            /* n2 = (1 - order) * (1 + order) = 1 - order^2 */
Packit Service 084de1
            || !TEST_true(BN_mul(n2, n1, n2, ctx))
Packit Service 084de1
            || !TEST_true(EC_POINT_mul(group, Q, NULL, P, n2, ctx))
Packit Service 084de1
            || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, ctx)))
Packit Service 084de1
            goto err;
Packit Service 084de1
Packit Service 084de1
        /* n2 = order^2 - 1 */
Packit Service 084de1
        BN_set_negative(n2, 0);
Packit Service 084de1
        if (!TEST_true(EC_POINT_mul(group, Q, NULL, P, n2, ctx))
Packit Service 084de1
            /* Add P to verify the result. */
Packit Service 084de1
            || !TEST_true(EC_POINT_add(group, Q, Q, P, ctx))
Packit Service 084de1
            || !TEST_true(EC_POINT_is_at_infinity(group, Q))
Packit Service 084de1
Packit Service 084de1
            /* Exercise EC_POINTs_mul, including corner cases. */
Packit Service 084de1
            || !TEST_false(EC_POINT_is_at_infinity(group, P)))
Packit Service 084de1
            goto err;
Packit Service 084de1
Packit Service 084de1
        scalars[0] = scalars[1] = BN_value_one();
Packit Service 084de1
        points[0]  = points[1]  = P;
Packit Service 084de1
Packit Service 084de1
        if (!TEST_true(EC_POINTs_mul(group, R, NULL, 2, points, scalars, ctx))
Packit Service 084de1
            || !TEST_true(EC_POINT_dbl(group, S, points[0], ctx))
Packit Service 084de1
            || !TEST_int_eq(0, EC_POINT_cmp(group, R, S, ctx)))
Packit Service 084de1
            goto err;
Packit Service 084de1
Packit Service 084de1
        scalars[0] = n1;
Packit Service 084de1
        points[0] = Q;          /* => infinity */
Packit Service 084de1
        scalars[1] = n2;
Packit Service 084de1
        points[1] = P;          /* => -P */
Packit Service 084de1
        scalars[2] = n1;
Packit Service 084de1
        points[2] = Q;          /* => infinity */
Packit Service 084de1
        scalars[3] = n2;
Packit Service 084de1
        points[3] = Q;          /* => infinity */
Packit Service 084de1
        scalars[4] = n1;
Packit Service 084de1
        points[4] = P;          /* => P */
Packit Service 084de1
        scalars[5] = n2;
Packit Service 084de1
        points[5] = Q;          /* => infinity */
Packit Service 084de1
        if (!TEST_true(EC_POINTs_mul(group, P, NULL, 6, points, scalars, ctx))
Packit Service 084de1
            || !TEST_true(EC_POINT_is_at_infinity(group, P)))
Packit Service 084de1
            goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    r = 1;
Packit Service 084de1
err:
Packit Service 084de1
    if (r == 0 && i != 0)
Packit Service 084de1
        TEST_info(i == 1 ? "allowing precomputation" :
Packit Service 084de1
                           "without precomputation");
Packit Service 084de1
    EC_POINT_free(P);
Packit Service 084de1
    EC_POINT_free(Q);
Packit Service 084de1
    EC_POINT_free(R);
Packit Service 084de1
    EC_POINT_free(S);
Packit Service 084de1
    BN_free(n1);
Packit Service 084de1
    BN_free(n2);
Packit Service 084de1
    BN_free(order);
Packit Service 084de1
    BN_CTX_free(ctx);
Packit Service 084de1
    return r;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int prime_field_tests(void)
Packit Service 084de1
{
Packit Service 084de1
    BN_CTX *ctx = NULL;
Packit Service 084de1
    BIGNUM *p = NULL, *a = NULL, *b = NULL, *scalar3 = NULL;
Packit Service 084de1
    EC_GROUP *group = NULL, *tmp = NULL;
Packit Service 084de1
    EC_GROUP *P_160 = NULL, *P_192 = NULL, *P_224 = NULL,
Packit Service 084de1
             *P_256 = NULL, *P_384 = NULL, *P_521 = NULL;
Packit Service 084de1
    EC_POINT *P = NULL, *Q = NULL, *R = NULL;
Packit Service 084de1
    BIGNUM *x = NULL, *y = NULL, *z = NULL, *yplusone = NULL;
Packit Service 084de1
    const EC_POINT *points[4];
Packit Service 084de1
    const BIGNUM *scalars[4];
Packit Service 084de1
    unsigned char buf[100];
Packit Service 084de1
    size_t len, r = 0;
Packit Service 084de1
    int k;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(ctx = BN_CTX_new())
Packit Service 084de1
        || !TEST_ptr(p = BN_new())
Packit Service 084de1
        || !TEST_ptr(a = BN_new())
Packit Service 084de1
        || !TEST_ptr(b = BN_new())
Packit Service 084de1
        /*
Packit Service 084de1
         * applications should use EC_GROUP_new_curve_GFp so
Packit Service 084de1
         * that the library gets to choose the EC_METHOD
Packit Service 084de1
         */
Packit Service 084de1
        || !TEST_ptr(group = EC_GROUP_new(EC_GFp_mont_method()))
Packit Service 084de1
        || !TEST_ptr(tmp = EC_GROUP_new(EC_GROUP_method_of(group)))
Packit Service 084de1
        || !TEST_true(EC_GROUP_copy(tmp, group)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    EC_GROUP_free(group);
Packit Service 084de1
    group = tmp;
Packit Service 084de1
    tmp = NULL;
Packit Service 084de1
Packit Service 084de1
    buf[0] = 0;
Packit Service 084de1
    if (!TEST_ptr(P = EC_POINT_new(group))
Packit Service 084de1
        || !TEST_ptr(Q = EC_POINT_new(group))
Packit Service 084de1
        || !TEST_ptr(R = EC_POINT_new(group))
Packit Service 084de1
        || !TEST_ptr(x = BN_new())
Packit Service 084de1
        || !TEST_ptr(y = BN_new())
Packit Service 084de1
        || !TEST_ptr(z = BN_new())
Packit Service 084de1
        || !TEST_ptr(yplusone = BN_new()))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    /* Curve P-224 (FIPS PUB 186-2, App. 6) */
Packit Service 084de1
Packit Service 084de1
    if (!TEST_true(BN_hex2bn(&p,         "FFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFF000000000000000000000001"))
Packit Service 084de1
        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&a,         "FFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE"))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&b,         "B4050A850C04B3ABF5413256"
Packit Service 084de1
                                    "5044B0B7D7BFD8BA270B39432355FFB4"))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&x,         "B70E0CBD6BB4BF7F321390B9"
Packit Service 084de1
                                    "4A03C1D356C21122343280D6115C1D21"))
Packit Service 084de1
        || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 0, ctx))
Packit Service 084de1
        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&z,         "FFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFF16A2E0B8F03E13DD29455C5C2A3D"))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
Packit Service 084de1
        || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    TEST_info("NIST curve P-224 -- Generator");
Packit Service 084de1
    test_output_bignum("x", x);
Packit Service 084de1
    test_output_bignum("y", y);
Packit Service 084de1
    /* G_y value taken from the standard: */
Packit Service 084de1
    if (!TEST_true(BN_hex2bn(&z,         "BD376388B5F723FB4C22DFE6"
Packit Service 084de1
                                 "CD4375A05A07476444D5819985007E34"))
Packit Service 084de1
        || !TEST_BN_eq(y, z)
Packit Service 084de1
        || !TEST_true(BN_add(yplusone, y, BN_value_one()))
Packit Service 084de1
    /*
Packit Service 084de1
     * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
Packit Service 084de1
     * and therefore setting the coordinates should fail.
Packit Service 084de1
     */
Packit Service 084de1
        || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
Packit Service 084de1
                                                       ctx))
Packit Service 084de1
        || !TEST_int_eq(EC_GROUP_get_degree(group), 224)
Packit Service 084de1
        || !group_order_tests(group)
Packit Service 084de1
        || !TEST_ptr(P_224 = EC_GROUP_new(EC_GROUP_method_of(group)))
Packit Service 084de1
        || !TEST_true(EC_GROUP_copy(P_224, group))
Packit Service 084de1
Packit Service 084de1
    /* Curve P-256 (FIPS PUB 186-2, App. 6) */
Packit Service 084de1
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&p, "FFFFFFFF000000010000000000000000"
Packit Service 084de1
                                    "00000000FFFFFFFFFFFFFFFFFFFFFFFF"))
Packit Service 084de1
        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&a, "FFFFFFFF000000010000000000000000"
Packit Service 084de1
                                    "00000000FFFFFFFFFFFFFFFFFFFFFFFC"))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&b, "5AC635D8AA3A93E7B3EBBD55769886BC"
Packit Service 084de1
                                    "651D06B0CC53B0F63BCE3C3E27D2604B"))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
Packit Service 084de1
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&x, "6B17D1F2E12C4247F8BCE6E563A440F2"
Packit Service 084de1
                                    "77037D812DEB33A0F4A13945D898C296"))
Packit Service 084de1
        || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 1, ctx))
Packit Service 084de1
        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&z, "FFFFFFFF00000000FFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "BCE6FAADA7179E84F3B9CAC2FC632551"))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
Packit Service 084de1
        || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    TEST_info("NIST curve P-256 -- Generator");
Packit Service 084de1
    test_output_bignum("x", x);
Packit Service 084de1
    test_output_bignum("y", y);
Packit Service 084de1
    /* G_y value taken from the standard: */
Packit Service 084de1
    if (!TEST_true(BN_hex2bn(&z, "4FE342E2FE1A7F9B8EE7EB4A7C0F9E16"
Packit Service 084de1
                                 "2BCE33576B315ECECBB6406837BF51F5"))
Packit Service 084de1
        || !TEST_BN_eq(y, z)
Packit Service 084de1
        || !TEST_true(BN_add(yplusone, y, BN_value_one()))
Packit Service 084de1
    /*
Packit Service 084de1
     * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
Packit Service 084de1
     * and therefore setting the coordinates should fail.
Packit Service 084de1
     */
Packit Service 084de1
        || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
Packit Service 084de1
                                                       ctx))
Packit Service 084de1
        || !TEST_int_eq(EC_GROUP_get_degree(group), 256)
Packit Service 084de1
        || !group_order_tests(group)
Packit Service 084de1
        || !TEST_ptr(P_256 = EC_GROUP_new(EC_GROUP_method_of(group)))
Packit Service 084de1
        || !TEST_true(EC_GROUP_copy(P_256, group))
Packit Service 084de1
Packit Service 084de1
    /* Curve P-384 (FIPS PUB 186-2, App. 6) */
Packit Service 084de1
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"
Packit Service 084de1
                                    "FFFFFFFF0000000000000000FFFFFFFF"))
Packit Service 084de1
        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&a, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"
Packit Service 084de1
                                    "FFFFFFFF0000000000000000FFFFFFFC"))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&b, "B3312FA7E23EE7E4988E056BE3F82D19"
Packit Service 084de1
                                    "181D9C6EFE8141120314088F5013875A"
Packit Service 084de1
                                    "C656398D8A2ED19D2A85C8EDD3EC2AEF"))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
Packit Service 084de1
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&x, "AA87CA22BE8B05378EB1C71EF320AD74"
Packit Service 084de1
                                    "6E1D3B628BA79B9859F741E082542A38"
Packit Service 084de1
                                    "5502F25DBF55296C3A545E3872760AB7"))
Packit Service 084de1
        || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 1, ctx))
Packit Service 084de1
        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&z, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFC7634D81F4372DDF"
Packit Service 084de1
                                    "581A0DB248B0A77AECEC196ACCC52973"))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
Packit Service 084de1
        || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    TEST_info("NIST curve P-384 -- Generator");
Packit Service 084de1
    test_output_bignum("x", x);
Packit Service 084de1
    test_output_bignum("y", y);
Packit Service 084de1
    /* G_y value taken from the standard: */
Packit Service 084de1
    if (!TEST_true(BN_hex2bn(&z, "3617DE4A96262C6F5D9E98BF9292DC29"
Packit Service 084de1
                                 "F8F41DBD289A147CE9DA3113B5F0B8C0"
Packit Service 084de1
                                 "0A60B1CE1D7E819D7A431D7C90EA0E5F"))
Packit Service 084de1
        || !TEST_BN_eq(y, z)
Packit Service 084de1
        || !TEST_true(BN_add(yplusone, y, BN_value_one()))
Packit Service 084de1
    /*
Packit Service 084de1
     * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
Packit Service 084de1
     * and therefore setting the coordinates should fail.
Packit Service 084de1
     */
Packit Service 084de1
        || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
Packit Service 084de1
                                                       ctx))
Packit Service 084de1
        || !TEST_int_eq(EC_GROUP_get_degree(group), 384)
Packit Service 084de1
        || !group_order_tests(group)
Packit Service 084de1
        || !TEST_ptr(P_384 = EC_GROUP_new(EC_GROUP_method_of(group)))
Packit Service 084de1
        || !TEST_true(EC_GROUP_copy(P_384, group))
Packit Service 084de1
Packit Service 084de1
    /* Curve P-521 (FIPS PUB 186-2, App. 6) */
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&p,                              "1FF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"))
Packit Service 084de1
        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&a,                              "1FF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC"))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&b,                              "051"
Packit Service 084de1
                                    "953EB9618E1C9A1F929A21A0B68540EE"
Packit Service 084de1
                                    "A2DA725B99B315F3B8B489918EF109E1"
Packit Service 084de1
                                    "56193951EC7E937B1652C0BD3BB1BF07"
Packit Service 084de1
                                    "3573DF883D2C34F1EF451FD46B503F00"))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_curve(group, p, a, b, ctx))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&x,                               "C6"
Packit Service 084de1
                                    "858E06B70404E9CD9E3ECB662395B442"
Packit Service 084de1
                                    "9C648139053FB521F828AF606B4D3DBA"
Packit Service 084de1
                                    "A14B5E77EFE75928FE1DC127A2FFA8DE"
Packit Service 084de1
                                    "3348B3C1856A429BF97E7E31C2E5BD66"))
Packit Service 084de1
        || !TEST_true(EC_POINT_set_compressed_coordinates(group, P, x, 0, ctx))
Packit Service 084de1
        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&z,                              "1FF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 084de1
                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA"
Packit Service 084de1
                                    "51868783BF2F966B7FCC0148F709A5D0"
Packit Service 084de1
                                    "3BB5C9B8899C47AEBB6FB71E91386409"))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))
Packit Service 084de1
        || !TEST_true(EC_POINT_get_affine_coordinates(group, P, x, y, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    TEST_info("NIST curve P-521 -- Generator");
Packit Service 084de1
    test_output_bignum("x", x);
Packit Service 084de1
    test_output_bignum("y", y);
Packit Service 084de1
    /* G_y value taken from the standard: */
Packit Service 084de1
    if (!TEST_true(BN_hex2bn(&z,                              "118"
Packit Service 084de1
                                 "39296A789A3BC0045C8A5FB42C7D1BD9"
Packit Service 084de1
                                 "98F54449579B446817AFBD17273E662C"
Packit Service 084de1
                                 "97EE72995EF42640C550B9013FAD0761"
Packit Service 084de1
                                 "353C7086A272C24088BE94769FD16650"))
Packit Service 084de1
        || !TEST_BN_eq(y, z)
Packit Service 084de1
        || !TEST_true(BN_add(yplusone, y, BN_value_one()))
Packit Service 084de1
    /*
Packit Service 084de1
     * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
Packit Service 084de1
     * and therefore setting the coordinates should fail.
Packit Service 084de1
     */
Packit Service 084de1
        || !TEST_false(EC_POINT_set_affine_coordinates(group, P, x, yplusone,
Packit Service 084de1
                                                       ctx))
Packit Service 084de1
        || !TEST_int_eq(EC_GROUP_get_degree(group), 521)
Packit Service 084de1
        || !group_order_tests(group)
Packit Service 084de1
        || !TEST_ptr(P_521 = EC_GROUP_new(EC_GROUP_method_of(group)))
Packit Service 084de1
        || !TEST_true(EC_GROUP_copy(P_521, group))
Packit Service 084de1
Packit Service 084de1
    /* more tests using the last curve */
Packit Service 084de1
Packit Service 084de1
    /* Restore the point that got mangled in the (x, y + 1) test. */
Packit Service 084de1
        || !TEST_true(EC_POINT_set_affine_coordinates(group, P, x, y, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_copy(Q, P))
Packit Service 084de1
        || !TEST_false(EC_POINT_is_at_infinity(group, Q))
Packit Service 084de1
        || !TEST_true(EC_POINT_dbl(group, P, P, ctx))
Packit Service 084de1
        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)
Packit Service 084de1
        || !TEST_true(EC_POINT_invert(group, Q, ctx))       /* P = -2Q */
Packit Service 084de1
        || !TEST_true(EC_POINT_add(group, R, P, Q, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_add(group, R, R, Q, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_is_at_infinity(group, R))    /* R = P + 2Q */
Packit Service 084de1
        || !TEST_false(EC_POINT_is_at_infinity(group, Q)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    points[0] = Q;
Packit Service 084de1
    points[1] = Q;
Packit Service 084de1
    points[2] = Q;
Packit Service 084de1
    points[3] = Q;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_true(EC_GROUP_get_order(group, z, ctx))
Packit Service 084de1
        || !TEST_true(BN_add(y, z, BN_value_one()))
Packit Service 084de1
        || !TEST_BN_even(y)
Packit Service 084de1
        || !TEST_true(BN_rshift1(y, y)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    scalars[0] = y;         /* (group order + 1)/2, so y*Q + y*Q = Q */
Packit Service 084de1
    scalars[1] = y;
Packit Service 084de1
Packit Service 084de1
    TEST_note("combined multiplication ...");
Packit Service 084de1
Packit Service 084de1
    /* z is still the group order */
Packit Service 084de1
    if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINTs_mul(group, R, z, 2, points, scalars, ctx))
Packit Service 084de1
        || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx))
Packit Service 084de1
        || !TEST_int_eq(0, EC_POINT_cmp(group, R, Q, ctx))
Packit Service 084de1
        || !TEST_true(BN_rand(y, BN_num_bits(y), 0, 0))
Packit Service 084de1
        || !TEST_true(BN_add(z, z, y)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    BN_set_negative(z, 1);
Packit Service 084de1
    scalars[0] = y;
Packit Service 084de1
    scalars[1] = z;         /* z = -(order + y) */
Packit Service 084de1
Packit Service 084de1
    if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_is_at_infinity(group, P))
Packit Service 084de1
        || !TEST_true(BN_rand(x, BN_num_bits(y) - 1, 0, 0))
Packit Service 084de1
        || !TEST_true(BN_add(z, x, y)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    BN_set_negative(z, 1);
Packit Service 084de1
    scalars[0] = x;
Packit Service 084de1
    scalars[1] = y;
Packit Service 084de1
    scalars[2] = z;         /* z = -(x+y) */
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(scalar3 = BN_new()))
Packit Service 084de1
        goto err;
Packit Service 084de1
    BN_zero(scalar3);
Packit Service 084de1
    scalars[3] = scalar3;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_true(EC_POINTs_mul(group, P, NULL, 4, points, scalars, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_is_at_infinity(group, P)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    TEST_note(" ok\n");
Packit Service 084de1
Packit Service 084de1
Packit Service 084de1
    r = 1;
Packit Service 084de1
err:
Packit Service 084de1
    BN_CTX_free(ctx);
Packit Service 084de1
    BN_free(p);
Packit Service 084de1
    BN_free(a);
Packit Service 084de1
    BN_free(b);
Packit Service 084de1
    EC_GROUP_free(group);
Packit Service 084de1
    EC_GROUP_free(tmp);
Packit Service 084de1
    EC_POINT_free(P);
Packit Service 084de1
    EC_POINT_free(Q);
Packit Service 084de1
    EC_POINT_free(R);
Packit Service 084de1
    BN_free(x);
Packit Service 084de1
    BN_free(y);
Packit Service 084de1
    BN_free(z);
Packit Service 084de1
    BN_free(yplusone);
Packit Service 084de1
    BN_free(scalar3);
Packit Service 084de1
Packit Service 084de1
    EC_GROUP_free(P_224);
Packit Service 084de1
    EC_GROUP_free(P_256);
Packit Service 084de1
    EC_GROUP_free(P_384);
Packit Service 084de1
    EC_GROUP_free(P_521);
Packit Service 084de1
    return r;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int internal_curve_test(int n)
Packit Service 084de1
{
Packit Service 084de1
    EC_GROUP *group = NULL;
Packit Service 084de1
    int nid = curves[n].nid;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))) {
Packit Service 084de1
        TEST_info("EC_GROUP_new_curve_name() failed with curve %s\n",
Packit Service 084de1
                  OBJ_nid2sn(nid));
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    if (!TEST_true(EC_GROUP_check(group, NULL))) {
Packit Service 084de1
        TEST_info("EC_GROUP_check() failed with curve %s\n", OBJ_nid2sn(nid));
Packit Service 084de1
        EC_GROUP_free(group);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    EC_GROUP_free(group);
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int internal_curve_test_method(int n)
Packit Service 084de1
{
Packit Service 084de1
    int r, nid = curves[n].nid;
Packit Service 084de1
    EC_GROUP *group;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))) {
Packit Service 084de1
        TEST_info("Curve %s failed\n", OBJ_nid2sn(nid));
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    r = group_order_tests(group);
Packit Service 084de1
    EC_GROUP_free(group);
Packit Service 084de1
    return r;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
Packit Service 084de1
/*
Packit Service 084de1
 * nistp_test_params contains magic numbers for testing our optimized
Packit Service 084de1
 * implementations of several NIST curves with characteristic > 3.
Packit Service 084de1
 */
Packit Service 084de1
struct nistp_test_params {
Packit Service 084de1
    const EC_METHOD *(*meth) (void);
Packit Service 084de1
    int degree;
Packit Service 084de1
    /*
Packit Service 084de1
     * Qx, Qy and D are taken from
Packit Service 084de1
     * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf
Packit Service 084de1
     * Otherwise, values are standard curve parameters from FIPS 180-3
Packit Service 084de1
     */
Packit Service 084de1
    const char *p, *a, *b, *Qx, *Qy, *Gx, *Gy, *order, *d;
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
static const struct nistp_test_params nistp_tests_params[] = {
Packit Service 084de1
    {
Packit Service 084de1
     /* P-224 */
Packit Service 084de1
     EC_GFp_nistp224_method,
Packit Service 084de1
     224,
Packit Service 084de1
     /* p */
Packit Service 084de1
     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
Packit Service 084de1
     /* a */
Packit Service 084de1
     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
Packit Service 084de1
     /* b */
Packit Service 084de1
     "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
Packit Service 084de1
     /* Qx */
Packit Service 084de1
     "E84FB0B8E7000CB657D7973CF6B42ED78B301674276DF744AF130B3E",
Packit Service 084de1
     /* Qy */
Packit Service 084de1
     "4376675C6FC5612C21A0FF2D2A89D2987DF7A2BC52183B5982298555",
Packit Service 084de1
     /* Gx */
Packit Service 084de1
     "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
Packit Service 084de1
     /* Gy */
Packit Service 084de1
     "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",
Packit Service 084de1
     /* order */
Packit Service 084de1
     "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
Packit Service 084de1
     /* d */
Packit Service 084de1
     "3F0C488E987C80BE0FEE521F8D90BE6034EC69AE11CA72AA777481E8",
Packit Service 084de1
     },
Packit Service 084de1
    {
Packit Service 084de1
     /* P-256 */
Packit Service 084de1
     EC_GFp_nistp256_method,
Packit Service 084de1
     256,
Packit Service 084de1
     /* p */
Packit Service 084de1
     "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
Packit Service 084de1
     /* a */
Packit Service 084de1
     "ffffffff00000001000000000000000000000000fffffffffffffffffffffffc",
Packit Service 084de1
     /* b */
Packit Service 084de1
     "5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b",
Packit Service 084de1
     /* Qx */
Packit Service 084de1
     "b7e08afdfe94bad3f1dc8c734798ba1c62b3a0ad1e9ea2a38201cd0889bc7a19",
Packit Service 084de1
     /* Qy */
Packit Service 084de1
     "3603f747959dbf7a4bb226e41928729063adc7ae43529e61b563bbc606cc5e09",
Packit Service 084de1
     /* Gx */
Packit Service 084de1
     "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
Packit Service 084de1
     /* Gy */
Packit Service 084de1
     "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
Packit Service 084de1
     /* order */
Packit Service 084de1
     "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
Packit Service 084de1
     /* d */
Packit Service 084de1
     "c477f9f65c22cce20657faa5b2d1d8122336f851a508a1ed04e479c34985bf96",
Packit Service 084de1
     },
Packit Service 084de1
    {
Packit Service 084de1
     /* P-521 */
Packit Service 084de1
     EC_GFp_nistp521_method,
Packit Service 084de1
     521,
Packit Service 084de1
     /* p */
Packit Service 084de1
                                                                  "1ff"
Packit Service 084de1
     "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
Packit Service 084de1
     "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
Packit Service 084de1
     /* a */
Packit Service 084de1
                                                                  "1ff"
Packit Service 084de1
     "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
Packit Service 084de1
     "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc",
Packit Service 084de1
     /* b */
Packit Service 084de1
                                                                  "051"
Packit Service 084de1
     "953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e1"
Packit Service 084de1
     "56193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00",
Packit Service 084de1
     /* Qx */
Packit Service 084de1
                                                                 "0098"
Packit Service 084de1
     "e91eef9a68452822309c52fab453f5f117c1da8ed796b255e9ab8f6410cca16e"
Packit Service 084de1
     "59df403a6bdc6ca467a37056b1e54b3005d8ac030decfeb68df18b171885d5c4",
Packit Service 084de1
     /* Qy */
Packit Service 084de1
                                                                 "0164"
Packit Service 084de1
     "350c321aecfc1cca1ba4364c9b15656150b4b78d6a48d7d28e7f31985ef17be8"
Packit Service 084de1
     "554376b72900712c4b83ad668327231526e313f5f092999a4632fd50d946bc2e",
Packit Service 084de1
     /* Gx */
Packit Service 084de1
                                                                   "c6"
Packit Service 084de1
     "858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dba"
Packit Service 084de1
     "a14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
Packit Service 084de1
     /* Gy */
Packit Service 084de1
                                                                  "118"
Packit Service 084de1
     "39296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c"
Packit Service 084de1
     "97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
Packit Service 084de1
     /* order */
Packit Service 084de1
                                                                  "1ff"
Packit Service 084de1
     "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"
Packit Service 084de1
     "51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
Packit Service 084de1
     /* d */
Packit Service 084de1
                                                                 "0100"
Packit Service 084de1
     "085f47b8e1b8b11b7eb33028c0b2888e304bfc98501955b45bba1478dc184eee"
Packit Service 084de1
     "df09b86a5f7c21994406072787205e69a63709fe35aa93ba333514b24f961722",
Packit Service 084de1
     },
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
static int nistp_single_test(int idx)
Packit Service 084de1
{
Packit Service 084de1
    const struct nistp_test_params *test = nistp_tests_params + idx;
Packit Service 084de1
    BN_CTX *ctx = NULL;
Packit Service 084de1
    BIGNUM *p = NULL, *a = NULL, *b = NULL, *x = NULL, *y = NULL;
Packit Service 084de1
    BIGNUM *n = NULL, *m = NULL, *order = NULL, *yplusone = NULL;
Packit Service 084de1
    EC_GROUP *NISTP = NULL;
Packit Service 084de1
    EC_POINT *G = NULL, *P = NULL, *Q = NULL, *Q_CHECK = NULL;
Packit Service 084de1
    int r = 0;
Packit Service 084de1
Packit Service 084de1
    TEST_note("NIST curve P-%d (optimised implementation):",
Packit Service 084de1
              test->degree);
Packit Service 084de1
    if (!TEST_ptr(ctx = BN_CTX_new())
Packit Service 084de1
        || !TEST_ptr(p = BN_new())
Packit Service 084de1
        || !TEST_ptr(a = BN_new())
Packit Service 084de1
        || !TEST_ptr(b = BN_new())
Packit Service 084de1
        || !TEST_ptr(x = BN_new())
Packit Service 084de1
        || !TEST_ptr(y = BN_new())
Packit Service 084de1
        || !TEST_ptr(m = BN_new())
Packit Service 084de1
        || !TEST_ptr(n = BN_new())
Packit Service 084de1
        || !TEST_ptr(order = BN_new())
Packit Service 084de1
        || !TEST_ptr(yplusone = BN_new())
Packit Service 084de1
Packit Service 084de1
        || !TEST_ptr(NISTP = EC_GROUP_new(test->meth()))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&p, test->p))
Packit Service 084de1
        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&a, test->a))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&b, test->b))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_curve(NISTP, p, a, b, ctx))
Packit Service 084de1
        || !TEST_ptr(G = EC_POINT_new(NISTP))
Packit Service 084de1
        || !TEST_ptr(P = EC_POINT_new(NISTP))
Packit Service 084de1
        || !TEST_ptr(Q = EC_POINT_new(NISTP))
Packit Service 084de1
        || !TEST_ptr(Q_CHECK = EC_POINT_new(NISTP))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&x, test->Qx))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&y, test->Qy))
Packit Service 084de1
        || !TEST_true(BN_add(yplusone, y, BN_value_one()))
Packit Service 084de1
    /*
Packit Service 084de1
     * When (x, y) is on the curve, (x, y + 1) is, as it happens, not,
Packit Service 084de1
     * and therefore setting the coordinates should fail.
Packit Service 084de1
     */
Packit Service 084de1
        || !TEST_false(EC_POINT_set_affine_coordinates(NISTP, Q_CHECK, x,
Packit Service 084de1
                                                       yplusone, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_set_affine_coordinates(NISTP, Q_CHECK, x, y,
Packit Service 084de1
                                                      ctx))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&x, test->Gx))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&y, test->Gy))
Packit Service 084de1
        || !TEST_true(EC_POINT_set_affine_coordinates(NISTP, G, x, y, ctx))
Packit Service 084de1
        || !TEST_true(BN_hex2bn(&order, test->order))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(NISTP, G, order, BN_value_one()))
Packit Service 084de1
        || !TEST_int_eq(EC_GROUP_get_degree(NISTP), test->degree))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    TEST_note("NIST test vectors ... ");
Packit Service 084de1
    if (!TEST_true(BN_hex2bn(&n, test->d)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    /* fixed point multiplication */
Packit Service 084de1
    EC_POINT_mul(NISTP, Q, n, NULL, NULL, ctx);
Packit Service 084de1
    if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    /* random point multiplication */
Packit Service 084de1
    EC_POINT_mul(NISTP, Q, NULL, G, n, ctx);
Packit Service 084de1
    if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx))
Packit Service 084de1
Packit Service 084de1
        /* set generator to P = 2*G, where G is the standard generator */
Packit Service 084de1
        || !TEST_true(EC_POINT_dbl(NISTP, P, G, ctx))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(NISTP, P, order, BN_value_one()))
Packit Service 084de1
        /* set the scalar to m=n/2, where n is the NIST test scalar */
Packit Service 084de1
        || !TEST_true(BN_rshift(m, n, 1)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    /* test the non-standard generator */
Packit Service 084de1
    /* fixed point multiplication */
Packit Service 084de1
    EC_POINT_mul(NISTP, Q, m, NULL, NULL, ctx);
Packit Service 084de1
    if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    /* random point multiplication */
Packit Service 084de1
    EC_POINT_mul(NISTP, Q, NULL, P, m, ctx);
Packit Service 084de1
    if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx))
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * We have not performed precomputation so have_precompute mult should be
Packit Service 084de1
     * false
Packit Service 084de1
     */
Packit Service 084de1
        || !TEST_false(EC_GROUP_have_precompute_mult(NISTP))
Packit Service 084de1
Packit Service 084de1
    /* now repeat all tests with precomputation */
Packit Service 084de1
        || !TEST_true(EC_GROUP_precompute_mult(NISTP, ctx))
Packit Service 084de1
        || !TEST_true(EC_GROUP_have_precompute_mult(NISTP)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    /* fixed point multiplication */
Packit Service 084de1
    EC_POINT_mul(NISTP, Q, m, NULL, NULL, ctx);
Packit Service 084de1
    if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    /* random point multiplication */
Packit Service 084de1
    EC_POINT_mul(NISTP, Q, NULL, P, m, ctx);
Packit Service 084de1
    if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx))
Packit Service 084de1
Packit Service 084de1
    /* reset generator */
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(NISTP, G, order, BN_value_one())))
Packit Service 084de1
        goto err;
Packit Service 084de1
    /* fixed point multiplication */
Packit Service 084de1
    EC_POINT_mul(NISTP, Q, n, NULL, NULL, ctx);
Packit Service 084de1
    if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    /* random point multiplication */
Packit Service 084de1
    EC_POINT_mul(NISTP, Q, NULL, G, n, ctx);
Packit Service 084de1
    if (!TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    /* regression test for felem_neg bug */
Packit Service 084de1
    if (!TEST_true(BN_set_word(m, 32))
Packit Service 084de1
        || !TEST_true(BN_set_word(n, 31))
Packit Service 084de1
        || !TEST_true(EC_POINT_copy(P, G))
Packit Service 084de1
        || !TEST_true(EC_POINT_invert(NISTP, P, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_mul(NISTP, Q, m, P, n, ctx))
Packit Service 084de1
        || !TEST_int_eq(0, EC_POINT_cmp(NISTP, Q, G, ctx)))
Packit Service 084de1
      goto err;
Packit Service 084de1
Packit Service 084de1
    r = group_order_tests(NISTP);
Packit Service 084de1
err:
Packit Service 084de1
    EC_GROUP_free(NISTP);
Packit Service 084de1
    EC_POINT_free(G);
Packit Service 084de1
    EC_POINT_free(P);
Packit Service 084de1
    EC_POINT_free(Q);
Packit Service 084de1
    EC_POINT_free(Q_CHECK);
Packit Service 084de1
    BN_free(n);
Packit Service 084de1
    BN_free(m);
Packit Service 084de1
    BN_free(p);
Packit Service 084de1
    BN_free(a);
Packit Service 084de1
    BN_free(b);
Packit Service 084de1
    BN_free(x);
Packit Service 084de1
    BN_free(y);
Packit Service 084de1
    BN_free(order);
Packit Service 084de1
    BN_free(yplusone);
Packit Service 084de1
    BN_CTX_free(ctx);
Packit Service 084de1
    return r;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Tests a point known to cause an incorrect underflow in an old version of
Packit Service 084de1
 * ecp_nist521.c
Packit Service 084de1
 */
Packit Service 084de1
static int underflow_test(void)
Packit Service 084de1
{
Packit Service 084de1
    BN_CTX *ctx = NULL;
Packit Service 084de1
    EC_GROUP *grp = NULL;
Packit Service 084de1
    EC_POINT *P = NULL, *Q = NULL, *R = NULL;
Packit Service 084de1
    BIGNUM *x1 = NULL, *y1 = NULL, *z1 = NULL, *x2 = NULL, *y2 = NULL;
Packit Service 084de1
    BIGNUM *k = NULL;
Packit Service 084de1
    int testresult = 0;
Packit Service 084de1
    const char *x1str =
Packit Service 084de1
        "1534f0077fffffe87e9adcfe000000000000000000003e05a21d2400002e031b1f4"
Packit Service 084de1
        "b80000c6fafa4f3c1288798d624a247b5e2ffffffffffffffefe099241900004";
Packit Service 084de1
    const char *p521m1 =
Packit Service 084de1
        "1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
Packit Service 084de1
        "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe";
Packit Service 084de1
Packit Service 084de1
    ctx = BN_CTX_new();
Packit Service 084de1
    if (!TEST_ptr(ctx))
Packit Service 084de1
        return 0;
Packit Service 084de1
Packit Service 084de1
    BN_CTX_start(ctx);
Packit Service 084de1
    x1 = BN_CTX_get(ctx);
Packit Service 084de1
    y1 = BN_CTX_get(ctx);
Packit Service 084de1
    z1 = BN_CTX_get(ctx);
Packit Service 084de1
    x2 = BN_CTX_get(ctx);
Packit Service 084de1
    y2 = BN_CTX_get(ctx);
Packit Service 084de1
    k = BN_CTX_get(ctx);
Packit Service 084de1
    if (!TEST_ptr(k))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    grp = EC_GROUP_new_by_curve_name(NID_secp521r1);
Packit Service 084de1
    P = EC_POINT_new(grp);
Packit Service 084de1
    Q = EC_POINT_new(grp);
Packit Service 084de1
    R = EC_POINT_new(grp);
Packit Service 084de1
    if (!TEST_ptr(grp) || !TEST_ptr(P) || !TEST_ptr(Q) || !TEST_ptr(R))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_int_gt(BN_hex2bn(&x1, x1str), 0)
Packit Service 084de1
            || !TEST_int_gt(BN_hex2bn(&y1, p521m1), 0)
Packit Service 084de1
            || !TEST_int_gt(BN_hex2bn(&z1, p521m1), 0)
Packit Service 084de1
            || !TEST_int_gt(BN_hex2bn(&k, "02"), 0)
Packit Service 084de1
            || !TEST_true(EC_POINT_set_Jprojective_coordinates_GFp(grp, P, x1,
Packit Service 084de1
                                                                   y1, z1, ctx))
Packit Service 084de1
            || !TEST_true(EC_POINT_mul(grp, Q, NULL, P, k, ctx))
Packit Service 084de1
            || !TEST_true(EC_POINT_get_affine_coordinates(grp, Q, x1, y1, ctx))
Packit Service 084de1
            || !TEST_true(EC_POINT_dbl(grp, R, P, ctx))
Packit Service 084de1
            || !TEST_true(EC_POINT_get_affine_coordinates(grp, R, x2, y2, ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_int_eq(BN_cmp(x1, x2), 0)
Packit Service 084de1
            || !TEST_int_eq(BN_cmp(y1, y2), 0))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    testresult = 1;
Packit Service 084de1
Packit Service 084de1
 err:
Packit Service 084de1
    BN_CTX_end(ctx);
Packit Service 084de1
    EC_POINT_free(P);
Packit Service 084de1
    EC_POINT_free(Q);
Packit Service 084de1
    EC_POINT_free(R);
Packit Service 084de1
    EC_GROUP_free(grp);
Packit Service 084de1
    BN_CTX_free(ctx);
Packit Service 084de1
Packit Service 084de1
    return testresult;
Packit Service 084de1
}
Packit Service 084de1
# endif
Packit Service 084de1
Packit Service 084de1
static const unsigned char p521_named[] = {
Packit Service 084de1
    0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x23,
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
static const unsigned char p521_explicit[] = {
Packit Service 084de1
    0x30, 0x82, 0x01, 0xc3, 0x02, 0x01, 0x01, 0x30, 0x4d, 0x06, 0x07, 0x2a,
Packit Service 084de1
    0x86, 0x48, 0xce, 0x3d, 0x01, 0x01, 0x02, 0x42, 0x01, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0x30, 0x81, 0x9f, 0x04, 0x42, 0x01, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xfc, 0x04, 0x42, 0x00, 0x51, 0x95, 0x3e, 0xb9, 0x61, 0x8e, 0x1c, 0x9a,
Packit Service 084de1
    0x1f, 0x92, 0x9a, 0x21, 0xa0, 0xb6, 0x85, 0x40, 0xee, 0xa2, 0xda, 0x72,
Packit Service 084de1
    0x5b, 0x99, 0xb3, 0x15, 0xf3, 0xb8, 0xb4, 0x89, 0x91, 0x8e, 0xf1, 0x09,
Packit Service 084de1
    0xe1, 0x56, 0x19, 0x39, 0x51, 0xec, 0x7e, 0x93, 0x7b, 0x16, 0x52, 0xc0,
Packit Service 084de1
    0xbd, 0x3b, 0xb1, 0xbf, 0x07, 0x35, 0x73, 0xdf, 0x88, 0x3d, 0x2c, 0x34,
Packit Service 084de1
    0xf1, 0xef, 0x45, 0x1f, 0xd4, 0x6b, 0x50, 0x3f, 0x00, 0x03, 0x15, 0x00,
Packit Service 084de1
    0xd0, 0x9e, 0x88, 0x00, 0x29, 0x1c, 0xb8, 0x53, 0x96, 0xcc, 0x67, 0x17,
Packit Service 084de1
    0x39, 0x32, 0x84, 0xaa, 0xa0, 0xda, 0x64, 0xba, 0x04, 0x81, 0x85, 0x04,
Packit Service 084de1
    0x00, 0xc6, 0x85, 0x8e, 0x06, 0xb7, 0x04, 0x04, 0xe9, 0xcd, 0x9e, 0x3e,
Packit Service 084de1
    0xcb, 0x66, 0x23, 0x95, 0xb4, 0x42, 0x9c, 0x64, 0x81, 0x39, 0x05, 0x3f,
Packit Service 084de1
    0xb5, 0x21, 0xf8, 0x28, 0xaf, 0x60, 0x6b, 0x4d, 0x3d, 0xba, 0xa1, 0x4b,
Packit Service 084de1
    0x5e, 0x77, 0xef, 0xe7, 0x59, 0x28, 0xfe, 0x1d, 0xc1, 0x27, 0xa2, 0xff,
Packit Service 084de1
    0xa8, 0xde, 0x33, 0x48, 0xb3, 0xc1, 0x85, 0x6a, 0x42, 0x9b, 0xf9, 0x7e,
Packit Service 084de1
    0x7e, 0x31, 0xc2, 0xe5, 0xbd, 0x66, 0x01, 0x18, 0x39, 0x29, 0x6a, 0x78,
Packit Service 084de1
    0x9a, 0x3b, 0xc0, 0x04, 0x5c, 0x8a, 0x5f, 0xb4, 0x2c, 0x7d, 0x1b, 0xd9,
Packit Service 084de1
    0x98, 0xf5, 0x44, 0x49, 0x57, 0x9b, 0x44, 0x68, 0x17, 0xaf, 0xbd, 0x17,
Packit Service 084de1
    0x27, 0x3e, 0x66, 0x2c, 0x97, 0xee, 0x72, 0x99, 0x5e, 0xf4, 0x26, 0x40,
Packit Service 084de1
    0xc5, 0x50, 0xb9, 0x01, 0x3f, 0xad, 0x07, 0x61, 0x35, 0x3c, 0x70, 0x86,
Packit Service 084de1
    0xa2, 0x72, 0xc2, 0x40, 0x88, 0xbe, 0x94, 0x76, 0x9f, 0xd1, 0x66, 0x50,
Packit Service 084de1
    0x02, 0x42, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
Packit Service 084de1
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,
Packit Service 084de1
    0x51, 0x86, 0x87, 0x83, 0xbf, 0x2f, 0x96, 0x6b, 0x7f, 0xcc, 0x01, 0x48,
Packit Service 084de1
    0xf7, 0x09, 0xa5, 0xd0, 0x3b, 0xb5, 0xc9, 0xb8, 0x89, 0x9c, 0x47, 0xae,
Packit Service 084de1
    0xbb, 0x6f, 0xb7, 0x1e, 0x91, 0x38, 0x64, 0x09, 0x02, 0x01, 0x01,
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Sometime we cannot compare nids for equality, as the built-in curve table
Packit Service 084de1
 * includes aliases with different names for the same curve.
Packit Service 084de1
 *
Packit Service 084de1
 * This function returns TRUE (1) if the checked nids are identical, or if they
Packit Service 084de1
 * alias to the same curve. FALSE (0) otherwise.
Packit Service 084de1
 */
Packit Service 084de1
static ossl_inline
Packit Service 084de1
int are_ec_nids_compatible(int n1d, int n2d)
Packit Service 084de1
{
Packit Service 084de1
    int ret = 0;
Packit Service 084de1
    switch (n1d) {
Packit Service 084de1
# ifndef OPENSSL_NO_EC2M
Packit Service 084de1
        case NID_sect113r1:
Packit Service 084de1
        case NID_wap_wsg_idm_ecid_wtls4:
Packit Service 084de1
            ret = (n2d == NID_sect113r1 || n2d == NID_wap_wsg_idm_ecid_wtls4);
Packit Service 084de1
            break;
Packit Service 084de1
        case NID_sect163k1:
Packit Service 084de1
        case NID_wap_wsg_idm_ecid_wtls3:
Packit Service 084de1
            ret = (n2d == NID_sect163k1 || n2d == NID_wap_wsg_idm_ecid_wtls3);
Packit Service 084de1
            break;
Packit Service 084de1
        case NID_sect233k1:
Packit Service 084de1
        case NID_wap_wsg_idm_ecid_wtls10:
Packit Service 084de1
            ret = (n2d == NID_sect233k1 || n2d == NID_wap_wsg_idm_ecid_wtls10);
Packit Service 084de1
            break;
Packit Service 084de1
        case NID_sect233r1:
Packit Service 084de1
        case NID_wap_wsg_idm_ecid_wtls11:
Packit Service 084de1
            ret = (n2d == NID_sect233r1 || n2d == NID_wap_wsg_idm_ecid_wtls11);
Packit Service 084de1
            break;
Packit Service 084de1
        case NID_X9_62_c2pnb163v1:
Packit Service 084de1
        case NID_wap_wsg_idm_ecid_wtls5:
Packit Service 084de1
            ret = (n2d == NID_X9_62_c2pnb163v1
Packit Service 084de1
                   || n2d == NID_wap_wsg_idm_ecid_wtls5);
Packit Service 084de1
            break;
Packit Service 084de1
# endif /* OPENSSL_NO_EC2M */
Packit Service 084de1
        case NID_secp112r1:
Packit Service 084de1
        case NID_wap_wsg_idm_ecid_wtls6:
Packit Service 084de1
            ret = (n2d == NID_secp112r1 || n2d == NID_wap_wsg_idm_ecid_wtls6);
Packit Service 084de1
            break;
Packit Service 084de1
        case NID_secp160r2:
Packit Service 084de1
        case NID_wap_wsg_idm_ecid_wtls7:
Packit Service 084de1
            ret = (n2d == NID_secp160r2 || n2d == NID_wap_wsg_idm_ecid_wtls7);
Packit Service 084de1
            break;
Packit Service 084de1
# ifdef OPENSSL_NO_EC_NISTP_64_GCC_128
Packit Service 084de1
        case NID_secp224r1:
Packit Service 084de1
        case NID_wap_wsg_idm_ecid_wtls12:
Packit Service 084de1
            ret = (n2d == NID_secp224r1 || n2d == NID_wap_wsg_idm_ecid_wtls12);
Packit Service 084de1
            break;
Packit Service 084de1
# else
Packit Service 084de1
        /*
Packit Service 084de1
         * For SEC P-224 we want to ensure that the SECP nid is returned, as
Packit Service 084de1
         * that is associated with a specialized method.
Packit Service 084de1
         */
Packit Service 084de1
        case NID_wap_wsg_idm_ecid_wtls12:
Packit Service 084de1
            ret = (n2d == NID_secp224r1);
Packit Service 084de1
            break;
Packit Service 084de1
# endif /* def(OPENSSL_NO_EC_NISTP_64_GCC_128) */
Packit Service 084de1
Packit Service 084de1
        default:
Packit Service 084de1
            ret = (n1d == n2d);
Packit Service 084de1
    }
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * This checks that EC_GROUP_bew_from_ecparameters() returns a "named"
Packit Service 084de1
 * EC_GROUP for built-in curves.
Packit Service 084de1
 *
Packit Service 084de1
 * Note that it is possible to retrieve an alternative alias that does not match
Packit Service 084de1
 * the original nid.
Packit Service 084de1
 *
Packit Service 084de1
 * Ensure that the OPENSSL_EC_EXPLICIT_CURVE ASN1 flag is set.
Packit Service 084de1
 */
Packit Service 084de1
static int check_named_curve_from_ecparameters(int id)
Packit Service 084de1
{
Packit Service 084de1
    int ret = 0, nid, tnid;
Packit Service 084de1
    EC_GROUP *group = NULL, *tgroup = NULL, *tmpg = NULL;
Packit Service 084de1
    const EC_POINT *group_gen = NULL;
Packit Service 084de1
    EC_POINT *other_gen = NULL;
Packit Service 084de1
    BIGNUM *group_cofactor = NULL, *other_cofactor = NULL;
Packit Service 084de1
    BIGNUM *other_gen_x = NULL, *other_gen_y = NULL;
Packit Service 084de1
    const BIGNUM *group_order = NULL;
Packit Service 084de1
    BIGNUM *other_order = NULL;
Packit Service 084de1
    BN_CTX *bn_ctx = NULL;
Packit Service 084de1
    static const unsigned char invalid_seed[] = "THIS IS NOT A VALID SEED";
Packit Service 084de1
    static size_t invalid_seed_len = sizeof(invalid_seed);
Packit Service 084de1
    ECPARAMETERS *params = NULL, *other_params = NULL;
Packit Service 084de1
    EC_GROUP *g_ary[8] = {NULL};
Packit Service 084de1
    EC_GROUP **g_next = &g_ary[0];
Packit Service 084de1
    ECPARAMETERS *p_ary[8] = {NULL};
Packit Service 084de1
    ECPARAMETERS **p_next = &p_ary[0];
Packit Service 084de1
Packit Service 084de1
    /* Do some setup */
Packit Service 084de1
    nid = curves[id].nid;
Packit Service 084de1
    TEST_note("Curve %s", OBJ_nid2sn(nid));
Packit Service 084de1
    if (!TEST_ptr(bn_ctx = BN_CTX_new()))
Packit Service 084de1
        return ret;
Packit Service 084de1
    BN_CTX_start(bn_ctx);
Packit Service 084de1
Packit Service 084de1
    if (/* Allocations */
Packit Service 084de1
        !TEST_ptr(group_cofactor = BN_CTX_get(bn_ctx))
Packit Service 084de1
        || !TEST_ptr(other_gen_x = BN_CTX_get(bn_ctx))
Packit Service 084de1
        || !TEST_ptr(other_gen_y = BN_CTX_get(bn_ctx))
Packit Service 084de1
        || !TEST_ptr(other_order = BN_CTX_get(bn_ctx))
Packit Service 084de1
        || !TEST_ptr(other_cofactor = BN_CTX_get(bn_ctx))
Packit Service 084de1
        /* Generate reference group and params */
Packit Service 084de1
        || !TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))
Packit Service 084de1
        || !TEST_ptr(params = EC_GROUP_get_ecparameters(group, NULL))
Packit Service 084de1
        || !TEST_ptr(group_gen = EC_GROUP_get0_generator(group))
Packit Service 084de1
        || !TEST_ptr(group_order = EC_GROUP_get0_order(group))
Packit Service 084de1
        || !TEST_true(EC_GROUP_get_cofactor(group, group_cofactor, NULL))
Packit Service 084de1
        /* compute `other_*` values */
Packit Service 084de1
        || !TEST_ptr(tmpg = EC_GROUP_dup(group))
Packit Service 084de1
        || !TEST_ptr(other_gen = EC_POINT_dup(group_gen, group))
Packit Service 084de1
        || !TEST_true(EC_POINT_add(group, other_gen, group_gen, group_gen, NULL))
Packit Service 084de1
        || !TEST_true(EC_POINT_get_affine_coordinates(group, other_gen,
Packit Service 084de1
                      other_gen_x, other_gen_y, bn_ctx))
Packit Service 084de1
        || !TEST_true(BN_copy(other_order, group_order))
Packit Service 084de1
        || !TEST_true(BN_add_word(other_order, 1))
Packit Service 084de1
        || !TEST_true(BN_copy(other_cofactor, group_cofactor))
Packit Service 084de1
        || !TEST_true(BN_add_word(other_cofactor, 1)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    EC_POINT_free(other_gen);
Packit Service 084de1
    other_gen = NULL;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(other_gen = EC_POINT_new(tmpg))
Packit Service 084de1
        || !TEST_true(EC_POINT_set_affine_coordinates(tmpg, other_gen,
Packit Service 084de1
                                                      other_gen_x, other_gen_y,
Packit Service 084de1
                                                      bn_ctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * ###########################
Packit Service 084de1
     * # Actual tests start here #
Packit Service 084de1
     * ###########################
Packit Service 084de1
     */
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Creating a group from built-in explicit parameters returns a
Packit Service 084de1
     * "named" EC_GROUP
Packit Service 084de1
     */
Packit Service 084de1
    if (!TEST_ptr(tgroup = *g_next++ = EC_GROUP_new_from_ecparameters(params))
Packit Service 084de1
        || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef))
Packit Service 084de1
        goto err;
Packit Service 084de1
    /*
Packit Service 084de1
     * We cannot always guarantee the names match, as the built-in table
Packit Service 084de1
     * contains aliases for the same curve with different names.
Packit Service 084de1
     */
Packit Service 084de1
    if (!TEST_true(are_ec_nids_compatible(nid, tnid))) {
Packit Service 084de1
        TEST_info("nid = %s, tnid = %s", OBJ_nid2sn(nid), OBJ_nid2sn(tnid));
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
    /* Ensure that the OPENSSL_EC_EXPLICIT_CURVE ASN1 flag is set. */
Packit Service 084de1
    if (!TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup), OPENSSL_EC_EXPLICIT_CURVE))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * An invalid seed in the parameters should be ignored: expect a "named"
Packit Service 084de1
     * group.
Packit Service 084de1
     */
Packit Service 084de1
    if (!TEST_int_eq(EC_GROUP_set_seed(tmpg, invalid_seed, invalid_seed_len),
Packit Service 084de1
                     invalid_seed_len)
Packit Service 084de1
            || !TEST_ptr(other_params = *p_next++ =
Packit Service 084de1
                         EC_GROUP_get_ecparameters(tmpg, NULL))
Packit Service 084de1
            || !TEST_ptr(tgroup = *g_next++ =
Packit Service 084de1
                          EC_GROUP_new_from_ecparameters(other_params))
Packit Service 084de1
            || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
Packit Service 084de1
            || !TEST_true(are_ec_nids_compatible(nid, tnid))
Packit Service 084de1
            || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
Packit Service 084de1
                            OPENSSL_EC_EXPLICIT_CURVE)) {
Packit Service 084de1
        TEST_info("nid = %s, tnid = %s", OBJ_nid2sn(nid), OBJ_nid2sn(tnid));
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * A null seed in the parameters should be ignored, as it is optional:
Packit Service 084de1
     * expect a "named" group.
Packit Service 084de1
     */
Packit Service 084de1
    if (!TEST_int_eq(EC_GROUP_set_seed(tmpg, NULL, 0), 1)
Packit Service 084de1
            || !TEST_ptr(other_params = *p_next++ =
Packit Service 084de1
                         EC_GROUP_get_ecparameters(tmpg, NULL))
Packit Service 084de1
            || !TEST_ptr(tgroup = *g_next++ =
Packit Service 084de1
                          EC_GROUP_new_from_ecparameters(other_params))
Packit Service 084de1
            || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
Packit Service 084de1
            || !TEST_true(are_ec_nids_compatible(nid, tnid))
Packit Service 084de1
            || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
Packit Service 084de1
                            OPENSSL_EC_EXPLICIT_CURVE)) {
Packit Service 084de1
        TEST_info("nid = %s, tnid = %s", OBJ_nid2sn(nid), OBJ_nid2sn(tnid));
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Check that changing any of the generator parameters does not yield a
Packit Service 084de1
     * match with the built-in curves
Packit Service 084de1
     */
Packit Service 084de1
    if (/* Other gen, same group order & cofactor */
Packit Service 084de1
        !TEST_true(EC_GROUP_set_generator(tmpg, other_gen, group_order,
Packit Service 084de1
                                          group_cofactor))
Packit Service 084de1
        || !TEST_ptr(other_params = *p_next++ =
Packit Service 084de1
                     EC_GROUP_get_ecparameters(tmpg, NULL))
Packit Service 084de1
        || !TEST_ptr(tgroup = *g_next++ =
Packit Service 084de1
                      EC_GROUP_new_from_ecparameters(other_params))
Packit Service 084de1
        || !TEST_int_eq((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
Packit Service 084de1
        /* Same gen & cofactor, different order */
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, other_order,
Packit Service 084de1
                                             group_cofactor))
Packit Service 084de1
        || !TEST_ptr(other_params = *p_next++ =
Packit Service 084de1
                     EC_GROUP_get_ecparameters(tmpg, NULL))
Packit Service 084de1
        || !TEST_ptr(tgroup = *g_next++ =
Packit Service 084de1
                      EC_GROUP_new_from_ecparameters(other_params))
Packit Service 084de1
        || !TEST_int_eq((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
Packit Service 084de1
        /* The order is not an optional field, so this should fail */
Packit Service 084de1
        || !TEST_false(EC_GROUP_set_generator(tmpg, group_gen, NULL,
Packit Service 084de1
                                              group_cofactor))
Packit Service 084de1
        /* Check that a wrong cofactor is ignored, and we still match */
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, group_order,
Packit Service 084de1
                                             other_cofactor))
Packit Service 084de1
        || !TEST_ptr(other_params = *p_next++ =
Packit Service 084de1
                     EC_GROUP_get_ecparameters(tmpg, NULL))
Packit Service 084de1
        || !TEST_ptr(tgroup = *g_next++ =
Packit Service 084de1
                      EC_GROUP_new_from_ecparameters(other_params))
Packit Service 084de1
        || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
Packit Service 084de1
        || !TEST_true(are_ec_nids_compatible(nid, tnid))
Packit Service 084de1
        || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
Packit Service 084de1
                        OPENSSL_EC_EXPLICIT_CURVE)
Packit Service 084de1
        /* Check that if the cofactor is not set then it still matches */
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, group_order,
Packit Service 084de1
                                             NULL))
Packit Service 084de1
        || !TEST_ptr(other_params = *p_next++ =
Packit Service 084de1
                     EC_GROUP_get_ecparameters(tmpg, NULL))
Packit Service 084de1
        || !TEST_ptr(tgroup = *g_next++ =
Packit Service 084de1
                      EC_GROUP_new_from_ecparameters(other_params))
Packit Service 084de1
        || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
Packit Service 084de1
        || !TEST_true(are_ec_nids_compatible(nid, tnid))
Packit Service 084de1
        || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
Packit Service 084de1
                        OPENSSL_EC_EXPLICIT_CURVE)
Packit Service 084de1
        /* check that restoring the generator passes */
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(tmpg, group_gen, group_order,
Packit Service 084de1
                                             group_cofactor))
Packit Service 084de1
        || !TEST_ptr(other_params = *p_next++ =
Packit Service 084de1
                     EC_GROUP_get_ecparameters(tmpg, NULL))
Packit Service 084de1
        || !TEST_ptr(tgroup = *g_next++ =
Packit Service 084de1
                      EC_GROUP_new_from_ecparameters(other_params))
Packit Service 084de1
        || !TEST_int_ne((tnid = EC_GROUP_get_curve_name(tgroup)), NID_undef)
Packit Service 084de1
        || !TEST_true(are_ec_nids_compatible(nid, tnid))
Packit Service 084de1
        || !TEST_int_eq(EC_GROUP_get_asn1_flag(tgroup),
Packit Service 084de1
                        OPENSSL_EC_EXPLICIT_CURVE))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    ret = 1;
Packit Service 084de1
err:
Packit Service 084de1
    for (g_next = &g_ary[0]; g_next < g_ary + OSSL_NELEM(g_ary); g_next++)
Packit Service 084de1
        EC_GROUP_free(*g_next);
Packit Service 084de1
    for (p_next = &p_ary[0]; p_next < p_ary + OSSL_NELEM(g_ary); p_next++)
Packit Service 084de1
        ECPARAMETERS_free(*p_next);
Packit Service 084de1
    ECPARAMETERS_free(params);
Packit Service 084de1
    EC_POINT_free(other_gen);
Packit Service 084de1
    EC_GROUP_free(tmpg);
Packit Service 084de1
    EC_GROUP_free(group);
Packit Service 084de1
    BN_CTX_end(bn_ctx);
Packit Service 084de1
    BN_CTX_free(bn_ctx);
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int parameter_test(void)
Packit Service 084de1
{
Packit Service 084de1
    EC_GROUP *group = NULL, *group2 = NULL;
Packit Service 084de1
    ECPARAMETERS *ecparameters = NULL;
Packit Service 084de1
    unsigned char *buf = NULL;
Packit Service 084de1
    int r = 0, len;
Packit Service 084de1
Packit Service 084de1
    /* must use a curve without a special group method */
Packit Service 084de1
    if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(NID_secp256k1))
Packit Service 084de1
        || !TEST_ptr(ecparameters = EC_GROUP_get_ecparameters(group, NULL))
Packit Service 084de1
        || !TEST_ptr(group2 = EC_GROUP_new_from_ecparameters(ecparameters))
Packit Service 084de1
        || !TEST_int_eq(EC_GROUP_cmp(group, group2, NULL), 0))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    EC_GROUP_free(group);
Packit Service 084de1
    group = NULL;
Packit Service 084de1
Packit Service 084de1
    /* Test the named curve encoding, which should be default. */
Packit Service 084de1
    if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(NID_secp521r1))
Packit Service 084de1
        || !TEST_true((len = i2d_ECPKParameters(group, &buf)) >= 0)
Packit Service 084de1
        || !TEST_mem_eq(buf, len, p521_named, sizeof(p521_named)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    OPENSSL_free(buf);
Packit Service 084de1
    buf = NULL;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Test the explicit encoding. P-521 requires correctly zero-padding the
Packit Service 084de1
     * curve coefficients.
Packit Service 084de1
     */
Packit Service 084de1
    EC_GROUP_set_asn1_flag(group, OPENSSL_EC_EXPLICIT_CURVE);
Packit Service 084de1
    if (!TEST_true((len = i2d_ECPKParameters(group, &buf)) >= 0)
Packit Service 084de1
        || !TEST_mem_eq(buf, len, p521_explicit, sizeof(p521_explicit)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    r = 1;
Packit Service 084de1
err:
Packit Service 084de1
    EC_GROUP_free(group);
Packit Service 084de1
    EC_GROUP_free(group2);
Packit Service 084de1
    ECPARAMETERS_free(ecparameters);
Packit Service 084de1
    OPENSSL_free(buf);
Packit Service 084de1
    return r;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*-
Packit Service 084de1
 * random 256-bit explicit parameters curve, cofactor absent
Packit Service 084de1
 * order:    0x0c38d96a9f892b88772ec2e39614a82f4f (132 bit)
Packit Service 084de1
 * cofactor:   0x12bc94785251297abfafddf1565100da (125 bit)
Packit Service 084de1
 */
Packit Service 084de1
static const unsigned char params_cf_pass[] = {
Packit Service 084de1
    0x30, 0x81, 0xcd, 0x02, 0x01, 0x01, 0x30, 0x2c, 0x06, 0x07, 0x2a, 0x86,
Packit Service 084de1
    0x48, 0xce, 0x3d, 0x01, 0x01, 0x02, 0x21, 0x00, 0xe5, 0x00, 0x1f, 0xc5,
Packit Service 084de1
    0xca, 0x71, 0x9d, 0x8e, 0xf7, 0x07, 0x4b, 0x48, 0x37, 0xf9, 0x33, 0x2d,
Packit Service 084de1
    0x71, 0xbf, 0x79, 0xe7, 0xdc, 0x91, 0xc2, 0xff, 0xb6, 0x7b, 0xc3, 0x93,
Packit Service 084de1
    0x44, 0x88, 0xe6, 0x91, 0x30, 0x44, 0x04, 0x20, 0xe5, 0x00, 0x1f, 0xc5,
Packit Service 084de1
    0xca, 0x71, 0x9d, 0x8e, 0xf7, 0x07, 0x4b, 0x48, 0x37, 0xf9, 0x33, 0x2d,
Packit Service 084de1
    0x71, 0xbf, 0x79, 0xe7, 0xdc, 0x91, 0xc2, 0xff, 0xb6, 0x7b, 0xc3, 0x93,
Packit Service 084de1
    0x44, 0x88, 0xe6, 0x8e, 0x04, 0x20, 0x18, 0x8c, 0x59, 0x57, 0xc4, 0xbc,
Packit Service 084de1
    0x85, 0x57, 0xc3, 0x66, 0x9f, 0x89, 0xd5, 0x92, 0x0d, 0x7e, 0x42, 0x27,
Packit Service 084de1
    0x07, 0x64, 0xaa, 0x26, 0xed, 0x89, 0xc4, 0x09, 0x05, 0x4d, 0xc7, 0x23,
Packit Service 084de1
    0x47, 0xda, 0x04, 0x41, 0x04, 0x1b, 0x6b, 0x41, 0x0b, 0xf9, 0xfb, 0x77,
Packit Service 084de1
    0xfd, 0x50, 0xb7, 0x3e, 0x23, 0xa3, 0xec, 0x9a, 0x3b, 0x09, 0x31, 0x6b,
Packit Service 084de1
    0xfa, 0xf6, 0xce, 0x1f, 0xff, 0xeb, 0x57, 0x93, 0x24, 0x70, 0xf3, 0xf4,
Packit Service 084de1
    0xba, 0x7e, 0xfa, 0x86, 0x6e, 0x19, 0x89, 0xe3, 0x55, 0x6d, 0x5a, 0xe9,
Packit Service 084de1
    0xc0, 0x3d, 0xbc, 0xfb, 0xaf, 0xad, 0xd4, 0x7e, 0xa6, 0xe5, 0xfa, 0x1a,
Packit Service 084de1
    0x58, 0x07, 0x9e, 0x8f, 0x0d, 0x3b, 0xf7, 0x38, 0xca, 0x02, 0x11, 0x0c,
Packit Service 084de1
    0x38, 0xd9, 0x6a, 0x9f, 0x89, 0x2b, 0x88, 0x77, 0x2e, 0xc2, 0xe3, 0x96,
Packit Service 084de1
    0x14, 0xa8, 0x2f, 0x4f
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
/*-
Packit Service 084de1
 * random 256-bit explicit parameters curve, cofactor absent
Packit Service 084de1
 * order:    0x045a75c0c17228ebd9b169a10e34a22101 (131 bit)
Packit Service 084de1
 * cofactor:   0x2e134b4ede82649f67a2e559d361e5fe (126 bit)
Packit Service 084de1
 */
Packit Service 084de1
static const unsigned char params_cf_fail[] = {
Packit Service 084de1
    0x30, 0x81, 0xcd, 0x02, 0x01, 0x01, 0x30, 0x2c, 0x06, 0x07, 0x2a, 0x86,
Packit Service 084de1
    0x48, 0xce, 0x3d, 0x01, 0x01, 0x02, 0x21, 0x00, 0xc8, 0x95, 0x27, 0x37,
Packit Service 084de1
    0xe8, 0xe1, 0xfd, 0xcc, 0xf9, 0x6e, 0x0c, 0xa6, 0x21, 0xc1, 0x7d, 0x6b,
Packit Service 084de1
    0x9d, 0x44, 0x42, 0xea, 0x73, 0x4e, 0x04, 0xb6, 0xac, 0x62, 0x50, 0xd0,
Packit Service 084de1
    0x33, 0xc2, 0xea, 0x13, 0x30, 0x44, 0x04, 0x20, 0xc8, 0x95, 0x27, 0x37,
Packit Service 084de1
    0xe8, 0xe1, 0xfd, 0xcc, 0xf9, 0x6e, 0x0c, 0xa6, 0x21, 0xc1, 0x7d, 0x6b,
Packit Service 084de1
    0x9d, 0x44, 0x42, 0xea, 0x73, 0x4e, 0x04, 0xb6, 0xac, 0x62, 0x50, 0xd0,
Packit Service 084de1
    0x33, 0xc2, 0xea, 0x10, 0x04, 0x20, 0xbf, 0xa6, 0xa8, 0x05, 0x1d, 0x09,
Packit Service 084de1
    0xac, 0x70, 0x39, 0xbb, 0x4d, 0xb2, 0x90, 0x8a, 0x15, 0x41, 0x14, 0x1d,
Packit Service 084de1
    0x11, 0x86, 0x9f, 0x13, 0xa2, 0x63, 0x1a, 0xda, 0x95, 0x22, 0x4d, 0x02,
Packit Service 084de1
    0x15, 0x0a, 0x04, 0x41, 0x04, 0xaf, 0x16, 0x71, 0xf9, 0xc4, 0xc8, 0x59,
Packit Service 084de1
    0x1d, 0xa3, 0x6f, 0xe7, 0xc3, 0x57, 0xa1, 0xfa, 0x9f, 0x49, 0x7c, 0x11,
Packit Service 084de1
    0x27, 0x05, 0xa0, 0x7f, 0xff, 0xf9, 0xe0, 0xe7, 0x92, 0xdd, 0x9c, 0x24,
Packit Service 084de1
    0x8e, 0xc7, 0xb9, 0x52, 0x71, 0x3f, 0xbc, 0x7f, 0x6a, 0x9f, 0x35, 0x70,
Packit Service 084de1
    0xe1, 0x27, 0xd5, 0x35, 0x8a, 0x13, 0xfa, 0xa8, 0x33, 0x3e, 0xd4, 0x73,
Packit Service 084de1
    0x1c, 0x14, 0x58, 0x9e, 0xc7, 0x0a, 0x87, 0x65, 0x8d, 0x02, 0x11, 0x04,
Packit Service 084de1
    0x5a, 0x75, 0xc0, 0xc1, 0x72, 0x28, 0xeb, 0xd9, 0xb1, 0x69, 0xa1, 0x0e,
Packit Service 084de1
    0x34, 0xa2, 0x21, 0x01
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
/*-
Packit Service 084de1
 * Test two random 256-bit explicit parameters curves with absent cofactor.
Packit Service 084de1
 * The two curves are chosen to roughly straddle the bounds at which the lib
Packit Service 084de1
 * can compute the cofactor automatically, roughly 4*sqrt(p). So test that:
Packit Service 084de1
 *
Packit Service 084de1
 * - params_cf_pass: order is sufficiently close to p to compute cofactor
Packit Service 084de1
 * - params_cf_fail: order is too far away from p to compute cofactor
Packit Service 084de1
 *
Packit Service 084de1
 * For standards-compliant curves, cofactor is chosen as small as possible.
Packit Service 084de1
 * So you can see neither of these curves are fit for cryptographic use.
Packit Service 084de1
 *
Packit Service 084de1
 * Some standards even mandate an upper bound on the cofactor, e.g. SECG1 v2:
Packit Service 084de1
 * h <= 2**(t/8) where t is the security level of the curve, for which the lib
Packit Service 084de1
 * will always succeed in computing the cofactor. Neither of these curves
Packit Service 084de1
 * conform to that -- this is just robustness testing.
Packit Service 084de1
 */
Packit Service 084de1
static int cofactor_range_test(void)
Packit Service 084de1
{
Packit Service 084de1
    EC_GROUP *group = NULL;
Packit Service 084de1
    BIGNUM *cf = NULL;
Packit Service 084de1
    int ret = 0;
Packit Service 084de1
    const unsigned char *b1 = (const unsigned char *)params_cf_fail;
Packit Service 084de1
    const unsigned char *b2 = (const unsigned char *)params_cf_pass;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(group = d2i_ECPKParameters(NULL, &b1, sizeof(params_cf_fail)))
Packit Service 084de1
        || !TEST_BN_eq_zero(EC_GROUP_get0_cofactor(group))
Packit Service 084de1
        || !TEST_ptr(group = d2i_ECPKParameters(&group, &b2,
Packit Service 084de1
                                                sizeof(params_cf_pass)))
Packit Service 084de1
        || !TEST_int_gt(BN_hex2bn(&cf, "12bc94785251297abfafddf1565100da"), 0)
Packit Service 084de1
        || !TEST_BN_eq(cf, EC_GROUP_get0_cofactor(group)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    ret = 1;
Packit Service 084de1
 err:
Packit Service 084de1
    BN_free(cf);
Packit Service 084de1
    EC_GROUP_free(group);
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*-
Packit Service 084de1
 * For named curves, test that:
Packit Service 084de1
 * - the lib correctly computes the cofactor if passed a NULL or zero cofactor
Packit Service 084de1
 * - a nonsensical cofactor throws an error (negative test)
Packit Service 084de1
 * - nonsensical orders throw errors (negative tests)
Packit Service 084de1
 */
Packit Service 084de1
static int cardinality_test(int n)
Packit Service 084de1
{
Packit Service 084de1
    int ret = 0;
Packit Service 084de1
    int nid = curves[n].nid;
Packit Service 084de1
    BN_CTX *ctx = NULL;
Packit Service 084de1
    EC_GROUP *g1 = NULL, *g2 = NULL;
Packit Service 084de1
    EC_POINT *g2_gen = NULL;
Packit Service 084de1
    BIGNUM *g1_p = NULL, *g1_a = NULL, *g1_b = NULL, *g1_x = NULL, *g1_y = NULL,
Packit Service 084de1
           *g1_order = NULL, *g1_cf = NULL, *g2_cf = NULL;
Packit Service 084de1
Packit Service 084de1
    TEST_info("Curve %s cardinality test", OBJ_nid2sn(nid));
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(ctx = BN_CTX_new())
Packit Service 084de1
        || !TEST_ptr(g1 = EC_GROUP_new_by_curve_name(nid))
Packit Service 084de1
        || !TEST_ptr(g2 = EC_GROUP_new(EC_GROUP_method_of(g1)))) {
Packit Service 084de1
        EC_GROUP_free(g1);
Packit Service 084de1
        EC_GROUP_free(g2);
Packit Service 084de1
        BN_CTX_free(ctx);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    BN_CTX_start(ctx);
Packit Service 084de1
    g1_p = BN_CTX_get(ctx);
Packit Service 084de1
    g1_a = BN_CTX_get(ctx);
Packit Service 084de1
    g1_b = BN_CTX_get(ctx);
Packit Service 084de1
    g1_x = BN_CTX_get(ctx);
Packit Service 084de1
    g1_y = BN_CTX_get(ctx);
Packit Service 084de1
    g1_order = BN_CTX_get(ctx);
Packit Service 084de1
    g1_cf = BN_CTX_get(ctx);
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(g2_cf = BN_CTX_get(ctx))
Packit Service 084de1
        /* pull out the explicit curve parameters */
Packit Service 084de1
        || !TEST_true(EC_GROUP_get_curve(g1, g1_p, g1_a, g1_b, ctx))
Packit Service 084de1
        || !TEST_true(EC_POINT_get_affine_coordinates(g1,
Packit Service 084de1
                      EC_GROUP_get0_generator(g1), g1_x, g1_y, ctx))
Packit Service 084de1
        || !TEST_true(BN_copy(g1_order, EC_GROUP_get0_order(g1)))
Packit Service 084de1
        || !TEST_true(EC_GROUP_get_cofactor(g1, g1_cf, ctx))
Packit Service 084de1
        /* construct g2 manually with g1 parameters */
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_curve(g2, g1_p, g1_a, g1_b, ctx))
Packit Service 084de1
        || !TEST_ptr(g2_gen = EC_POINT_new(g2))
Packit Service 084de1
        || !TEST_true(EC_POINT_set_affine_coordinates(g2, g2_gen, g1_x, g1_y, ctx))
Packit Service 084de1
        /* pass NULL cofactor: lib should compute it */
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL))
Packit Service 084de1
        || !TEST_true(EC_GROUP_get_cofactor(g2, g2_cf, ctx))
Packit Service 084de1
        || !TEST_BN_eq(g1_cf, g2_cf)
Packit Service 084de1
        /* pass zero cofactor: lib should compute it */
Packit Service 084de1
        || !TEST_true(BN_set_word(g2_cf, 0))
Packit Service 084de1
        || !TEST_true(EC_GROUP_set_generator(g2, g2_gen, g1_order, g2_cf))
Packit Service 084de1
        || !TEST_true(EC_GROUP_get_cofactor(g2, g2_cf, ctx))
Packit Service 084de1
        || !TEST_BN_eq(g1_cf, g2_cf)
Packit Service 084de1
        /* negative test for invalid cofactor */
Packit Service 084de1
        || !TEST_true(BN_set_word(g2_cf, 0))
Packit Service 084de1
        || !TEST_true(BN_sub(g2_cf, g2_cf, BN_value_one()))
Packit Service 084de1
        || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, g2_cf))
Packit Service 084de1
        /* negative test for NULL order */
Packit Service 084de1
        || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, NULL, NULL))
Packit Service 084de1
        /* negative test for zero order */
Packit Service 084de1
        || !TEST_true(BN_set_word(g1_order, 0))
Packit Service 084de1
        || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL))
Packit Service 084de1
        /* negative test for negative order */
Packit Service 084de1
        || !TEST_true(BN_set_word(g2_cf, 0))
Packit Service 084de1
        || !TEST_true(BN_sub(g2_cf, g2_cf, BN_value_one()))
Packit Service 084de1
        || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL))
Packit Service 084de1
        /* negative test for too large order */
Packit Service 084de1
        || !TEST_true(BN_lshift(g1_order, g1_p, 2))
Packit Service 084de1
        || !TEST_false(EC_GROUP_set_generator(g2, g2_gen, g1_order, NULL)))
Packit Service 084de1
        goto err;
Packit Service 084de1
    ret = 1;
Packit Service 084de1
 err:
Packit Service 084de1
    EC_POINT_free(g2_gen);
Packit Service 084de1
    EC_GROUP_free(g1);
Packit Service 084de1
    EC_GROUP_free(g2);
Packit Service 084de1
    BN_CTX_end(ctx);
Packit Service 084de1
    BN_CTX_free(ctx);
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Helper for ec_point_hex2point_test
Packit Service 084de1
 *
Packit Service 084de1
 * Self-tests EC_POINT_point2hex() against EC_POINT_hex2point() for the given
Packit Service 084de1
 * (group,P) pair.
Packit Service 084de1
 *
Packit Service 084de1
 * If P is NULL use point at infinity.
Packit Service 084de1
 */
Packit Service 084de1
static ossl_inline
Packit Service 084de1
int ec_point_hex2point_test_helper(const EC_GROUP *group, const EC_POINT *P,
Packit Service 084de1
                                   point_conversion_form_t form,
Packit Service 084de1
                                   BN_CTX *bnctx)
Packit Service 084de1
{
Packit Service 084de1
    int ret = 0;
Packit Service 084de1
    EC_POINT *Q = NULL, *Pinf = NULL;
Packit Service 084de1
    char *hex = NULL;
Packit Service 084de1
Packit Service 084de1
    if (P == NULL) {
Packit Service 084de1
        /* If P is NULL use point at infinity. */
Packit Service 084de1
        if (!TEST_ptr(Pinf = EC_POINT_new(group))
Packit Service 084de1
                || !TEST_true(EC_POINT_set_to_infinity(group, Pinf)))
Packit Service 084de1
            goto err;
Packit Service 084de1
        P = Pinf;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(hex = EC_POINT_point2hex(group, P, form, bnctx))
Packit Service 084de1
            || !TEST_ptr(Q = EC_POINT_hex2point(group, hex, NULL, bnctx))
Packit Service 084de1
            || !TEST_int_eq(0, EC_POINT_cmp(group, Q, P, bnctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * The next check is most likely superfluous, as EC_POINT_cmp should already
Packit Service 084de1
     * cover this.
Packit Service 084de1
     * Nonetheless it increases the test coverage for EC_POINT_is_at_infinity,
Packit Service 084de1
     * so we include it anyway!
Packit Service 084de1
     */
Packit Service 084de1
    if (Pinf != NULL
Packit Service 084de1
            && !TEST_true(EC_POINT_is_at_infinity(group, Q)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    ret = 1;
Packit Service 084de1
Packit Service 084de1
 err:
Packit Service 084de1
    EC_POINT_free(Pinf);
Packit Service 084de1
    OPENSSL_free(hex);
Packit Service 084de1
    EC_POINT_free(Q);
Packit Service 084de1
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * This test self-validates EC_POINT_hex2point() and EC_POINT_point2hex()
Packit Service 084de1
 */
Packit Service 084de1
static int ec_point_hex2point_test(int id)
Packit Service 084de1
{
Packit Service 084de1
    int ret = 0, nid;
Packit Service 084de1
    EC_GROUP *group = NULL;
Packit Service 084de1
    const EC_POINT *G = NULL;
Packit Service 084de1
    EC_POINT *P = NULL;
Packit Service 084de1
    BN_CTX * bnctx = NULL;
Packit Service 084de1
Packit Service 084de1
    /* Do some setup */
Packit Service 084de1
    nid = curves[id].nid;
Packit Service 084de1
    if (!TEST_ptr(bnctx = BN_CTX_new())
Packit Service 084de1
            || !TEST_ptr(group = EC_GROUP_new_by_curve_name(nid))
Packit Service 084de1
            || !TEST_ptr(G = EC_GROUP_get0_generator(group))
Packit Service 084de1
            || !TEST_ptr(P = EC_POINT_dup(G, group)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_true(ec_point_hex2point_test_helper(group, P,
Packit Service 084de1
                                                  POINT_CONVERSION_COMPRESSED,
Packit Service 084de1
                                                  bnctx))
Packit Service 084de1
            || !TEST_true(ec_point_hex2point_test_helper(group, NULL,
Packit Service 084de1
                                                         POINT_CONVERSION_COMPRESSED,
Packit Service 084de1
                                                         bnctx))
Packit Service 084de1
            || !TEST_true(ec_point_hex2point_test_helper(group, P,
Packit Service 084de1
                                                         POINT_CONVERSION_UNCOMPRESSED,
Packit Service 084de1
                                                         bnctx))
Packit Service 084de1
            || !TEST_true(ec_point_hex2point_test_helper(group, NULL,
Packit Service 084de1
                                                         POINT_CONVERSION_UNCOMPRESSED,
Packit Service 084de1
                                                         bnctx))
Packit Service 084de1
            || !TEST_true(ec_point_hex2point_test_helper(group, P,
Packit Service 084de1
                                                         POINT_CONVERSION_HYBRID,
Packit Service 084de1
                                                         bnctx))
Packit Service 084de1
            || !TEST_true(ec_point_hex2point_test_helper(group, NULL,
Packit Service 084de1
                                                         POINT_CONVERSION_HYBRID,
Packit Service 084de1
                                                         bnctx)))
Packit Service 084de1
        goto err;
Packit Service 084de1
Packit Service 084de1
    ret = 1;
Packit Service 084de1
Packit Service 084de1
 err:
Packit Service 084de1
    EC_POINT_free(P);
Packit Service 084de1
    EC_GROUP_free(group);
Packit Service 084de1
    BN_CTX_free(bnctx);
Packit Service 084de1
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
#endif /* OPENSSL_NO_EC */
Packit Service 084de1
Packit Service 084de1
int setup_tests(void)
Packit Service 084de1
{
Packit Service 084de1
#ifndef OPENSSL_NO_EC
Packit Service 084de1
    crv_len = EC_get_builtin_curves(NULL, 0);
Packit Service 084de1
    if (!TEST_ptr(curves = OPENSSL_malloc(sizeof(*curves) * crv_len))
Packit Service 084de1
        || !TEST_true(EC_get_builtin_curves(curves, crv_len)))
Packit Service 084de1
        return 0;
Packit Service 084de1
Packit Service 084de1
    ADD_TEST(parameter_test);
Packit Service 084de1
    ADD_TEST(cofactor_range_test);
Packit Service 084de1
    ADD_ALL_TESTS(cardinality_test, crv_len);
Packit Service 084de1
    ADD_TEST(prime_field_tests);
Packit Service 084de1
# ifndef OPENSSL_NO_EC2M
Packit Service 084de1
    ADD_TEST(char2_field_tests);
Packit Service 084de1
    ADD_ALL_TESTS(char2_curve_test, OSSL_NELEM(char2_curve_tests));
Packit Service 084de1
# endif
Packit Service 084de1
# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
Packit Service 084de1
    ADD_ALL_TESTS(nistp_single_test, OSSL_NELEM(nistp_tests_params));
Packit Service 084de1
    ADD_TEST(underflow_test);
Packit Service 084de1
# endif
Packit Service 084de1
    ADD_ALL_TESTS(internal_curve_test, crv_len);
Packit Service 084de1
    ADD_ALL_TESTS(internal_curve_test_method, crv_len);
Packit Service 084de1
Packit Service 084de1
    ADD_ALL_TESTS(check_named_curve_from_ecparameters, crv_len);
Packit Service 084de1
    ADD_ALL_TESTS(ec_point_hex2point_test, crv_len);
Packit Service 084de1
#endif /* OPENSSL_NO_EC */
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
void cleanup_tests(void)
Packit Service 084de1
{
Packit Service 084de1
#ifndef OPENSSL_NO_EC
Packit Service 084de1
    OPENSSL_free(curves);
Packit Service 084de1
#endif
Packit Service 084de1
}