BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
{
    bn_check_top(b);
    if (a == b)
        return a;
    if (bn_wexpand(a, b->top) == NULL)
        return NULL;
    if (b->top > 0)
        memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);
    a->top = b->top;
    a->neg = b->neg;
    bn_check_top(a);
    return a;
}
['static int prime_field_tests(void)\n{\n    BN_CTX *ctx = NULL;\n    BIGNUM *p = NULL, *a = NULL, *b = NULL, *scalar3 = NULL;\n    EC_GROUP *group = NULL, *tmp = NULL;\n    EC_GROUP *P_160 = NULL, *P_192 = NULL, *P_224 = NULL,\n             *P_256 = NULL, *P_384 = NULL, *P_521 = NULL;\n    EC_POINT *P = NULL, *Q = NULL, *R = NULL;\n    BIGNUM *x = NULL, *y = NULL, *z = NULL, *yplusone = NULL;\n    const EC_POINT *points[4];\n    const BIGNUM *scalars[4];\n    unsigned char buf[100];\n    size_t i, len, r = 0;\n    int k;\n    if (!TEST_ptr(ctx = BN_CTX_new())\n        || !TEST_ptr(p = BN_new())\n        || !TEST_ptr(a = BN_new())\n        || !TEST_ptr(b = BN_new())\n        || !TEST_true(BN_hex2bn(&p, "17"))\n        || !TEST_true(BN_hex2bn(&a, "1"))\n        || !TEST_true(BN_hex2bn(&b, "1"))\n        || !TEST_ptr(group = EC_GROUP_new(EC_GFp_mont_method()))\n        || !TEST_true(EC_GROUP_set_curve_GFp(group, p, a, b, ctx))\n        || !TEST_ptr(tmp = EC_GROUP_new(EC_GROUP_method_of(group)))\n        || !TEST_true(EC_GROUP_copy(tmp, group)))\n        goto err;\n    EC_GROUP_free(group);\n    group = tmp;\n    tmp = NULL;\n    if (!TEST_true(EC_GROUP_get_curve_GFp(group, p, a, b, ctx)))\n        goto err;\n    BIO_printf(bio_out,\n            "Curve defined by Weierstrass equation\\n"\n            "     y^2 = x^3 + a*x + b  (mod 0x");\n    BN_print(bio_out, p);\n    BIO_printf(bio_out, ")\\n     a = 0x");\n    BN_print(bio_out, a);\n    BIO_printf(bio_out, "\\n     b = 0x");\n    BN_print(bio_out, b);\n    BIO_printf(bio_out, "\\n");\n    buf[0] = 0;\n    if (!TEST_ptr(P = EC_POINT_new(group))\n        || !TEST_ptr(Q = EC_POINT_new(group))\n        || !TEST_ptr(R = EC_POINT_new(group))\n        || !TEST_true(EC_POINT_set_to_infinity(group, P))\n        || !TEST_true(EC_POINT_is_at_infinity(group, P))\n        || !TEST_true(EC_POINT_oct2point(group, Q, buf, 1, ctx))\n        || !TEST_true(EC_POINT_add(group, P, P, Q, ctx))\n        || !TEST_true(EC_POINT_is_at_infinity(group, P))\n        || !TEST_ptr(x = BN_new())\n        || !TEST_ptr(y = BN_new())\n        || !TEST_ptr(z = BN_new())\n        || !TEST_ptr(yplusone = BN_new())\n        || !TEST_true(BN_hex2bn(&x, "D"))\n        || !TEST_true(EC_POINT_set_compressed_coordinates_GFp(group, Q, x, 1,\n                                                              ctx)))\n        goto err;\n    if (!TEST_int_gt(EC_POINT_is_on_curve(group, Q, ctx), 0)) {\n        if (!TEST_true(EC_POINT_get_affine_coordinates_GFp(group, Q, x, y,\n                                                           ctx)))\n            goto err;\n        BIO_printf(bio_err, "Point is not on curve: x = 0x");\n        BN_print_fp(stderr, x);\n        BIO_printf(bio_err, ", y = 0x");\n        BN_print_fp(stderr, y);\n        BIO_printf(bio_err, "\\n");\n        goto err;\n    }\n    BIO_printf(bio_out, "A cyclic subgroup:\\n");\n    k = 100;\n    do {\n        if (!TEST_int_ne(k--, 0))\n            goto err;\n        if (EC_POINT_is_at_infinity(group, P)) {\n            BIO_printf(bio_out, "     point at infinity\\n");\n        } else {\n            if (!TEST_true(EC_POINT_get_affine_coordinates_GFp(group, P, x, y,\n                                                               ctx)))\n                goto err;\n            BIO_printf(bio_out, "     x = 0x");\n            BN_print(bio_out, x);\n            BIO_printf(bio_out, ", y = 0x");\n            BN_print(bio_out, y);\n            BIO_printf(bio_out, "\\n");\n        }\n        if (!TEST_true(EC_POINT_copy(R, P))\n            || !TEST_true(EC_POINT_add(group, P, P, Q, ctx)))\n            goto err;\n    } while (!EC_POINT_is_at_infinity(group, P));\n    if (!TEST_true(EC_POINT_add(group, P, Q, R, ctx))\n        || !TEST_true(EC_POINT_is_at_infinity(group, P)))\n        goto err;\n    len =\n        EC_POINT_point2oct(group, Q, POINT_CONVERSION_COMPRESSED, buf,\n                           sizeof buf, ctx);\n    if (!TEST_size_t_ne(len, 0)\n        || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))\n        || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))\n        goto err;\n    BIO_printf(bio_out, "Generator as octet string, compressed form:\\n     ");\n    for (i = 0; i < len; i++)\n        BIO_printf(bio_out, "%02X", buf[i]);\n    len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_UNCOMPRESSED,\n                             buf, sizeof buf, ctx);\n    if (!TEST_size_t_ne(len, 0)\n        || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))\n        || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))\n        goto err;\n    BIO_printf(bio_out, "\\nGenerator as octet string, uncompressed form:\\n"\n                        "     ");\n    for (i = 0; i < len; i++)\n        BIO_printf(bio_out, "%02X", buf[i]);\n    len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_HYBRID,\n                             buf, sizeof buf, ctx);\n    if (!TEST_size_t_ne(len, 0)\n        || !TEST_true(EC_POINT_oct2point(group, P, buf, len, ctx))\n        || !TEST_int_eq(0, EC_POINT_cmp(group, P, Q, ctx)))\n        goto err;\n    BIO_printf(bio_out, "\\nGenerator as octet string, hybrid form:\\n     ");\n    for (i = 0; i < len; i++)\n        BIO_printf(bio_out, "%02X", buf[i]);\n    if (!TEST_true(EC_POINT_get_Jprojective_coordinates_GFp(group, R, x, y, z,\n                                                            ctx)))\n        goto err;\n    BIO_printf(bio_out,\n               "\\nA representation of the inverse of that generator in\\n"\n               "Jacobian projective coordinates:\\n"\n               "     X = 0x");\n    BN_print(bio_out, x);\n    BIO_printf(bio_out, ", Y = 0x");\n    BN_print(bio_out, y);\n    BIO_printf(bio_out, ", Z = 0x");\n    BN_print(bio_out, z);\n    BIO_printf(bio_out, "\\n");\n    if (!TEST_true(EC_POINT_invert(group, P, ctx))\n        || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx))\n        || !TEST_true(BN_hex2bn(&p,                         "FFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF"))\n        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))\n        || !TEST_true(BN_hex2bn(&a,                         "FFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC"))\n        || !TEST_true(BN_hex2bn(&b,                         "1C97BEFC"\n                                    "54BD7A8B65ACF89F81D4D4ADC565FA45"))\n        || !TEST_true(EC_GROUP_set_curve_GFp(group, p, a, b, ctx))\n        || !TEST_true(BN_hex2bn(&x,                         "4A96B568"\n                                    "8EF573284664698968C38BB913CBFC82"))\n        || !TEST_true(BN_hex2bn(&y,                         "23a62855"\n                                    "3168947d59dcc912042351377ac5fb32"))\n        || !TEST_true(BN_add(yplusone, y, BN_value_one()))\n        || !TEST_false(EC_POINT_set_affine_coordinates_GFp(group, P, x,\n                                                           yplusone, ctx))\n        || !TEST_true(EC_POINT_set_affine_coordinates_GFp(group, P, x, y, ctx))\n        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)\n        || !TEST_true(BN_hex2bn(&z,                       "0100000000"\n                                    "000000000001F4C8F927AED3CA752257"))\n        || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))\n        || !TEST_true(EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)))\n        goto err;\n    BIO_printf(bio_out, "\\nSEC2 curve secp160r1 -- Generator:\\n     x = 0x");\n    BN_print(bio_out, x);\n    BIO_printf(bio_out, "\\n     y = 0x");\n    BN_print(bio_out, y);\n    BIO_printf(bio_out, "\\n");\n    if (!TEST_true(BN_hex2bn(&z,                         "23a62855"\n                                 "3168947d59dcc912042351377ac5fb32"))\n        || !TEST_int_eq(0, BN_cmp(y, z))\n        || !TEST_int_eq(EC_GROUP_get_degree(group), 160)\n        || !group_order_tests(group)\n        || !TEST_ptr(P_160 = EC_GROUP_new(EC_GROUP_method_of(group)))\n        || !TEST_true(EC_GROUP_copy(P_160, group))\n        || !TEST_true(BN_hex2bn(&p,                 "FFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF"))\n        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))\n        || !TEST_true(BN_hex2bn(&a,                 "FFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"))\n        || !TEST_true(BN_hex2bn(&b,                 "64210519E59C80E7"\n                                    "0FA7E9AB72243049FEB8DEECC146B9B1"))\n        || !TEST_true(EC_GROUP_set_curve_GFp(group, p, a, b, ctx))\n        || !TEST_true(BN_hex2bn(&x,                 "188DA80EB03090F6"\n                                    "7CBF20EB43A18800F4FF0AFD82FF1012"))\n        || !TEST_true(EC_POINT_set_compressed_coordinates_GFp(group, P, x, 1,\n                                                              ctx))\n        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)\n        || !TEST_true(BN_hex2bn(&z,                 "FFFFFFFFFFFFFFFF"\n                                    "FFFFFFFF99DEF836146BC9B1B4D22831"))\n        || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))\n        || !TEST_true(EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)))\n        goto err;\n    BIO_printf(bio_out, "\\nNIST curve P-192 -- Generator:\\n     x = 0x");\n    BN_print(bio_out, x);\n    BIO_printf(bio_out, "\\n     y = 0x");\n    BN_print(bio_out, y);\n    BIO_printf(bio_out, "\\n");\n    if (!TEST_true(BN_hex2bn(&z,                 "07192B95FFC8DA78"\n                                 "631011ED6B24CDD573F977A11E794811"))\n        || !TEST_int_eq(0, BN_cmp(y, z))\n        || !TEST_true(BN_add(yplusone, y, BN_value_one()))\n        || !TEST_false(EC_POINT_set_affine_coordinates_GFp(group, P, x,\n                                                           yplusone, ctx))\n        || !TEST_int_eq(EC_GROUP_get_degree(group), 192)\n        || !group_order_tests(group)\n        || !TEST_ptr(P_192 = EC_GROUP_new(EC_GROUP_method_of(group)))\n        || !TEST_true(EC_GROUP_copy(P_192, group))\n        || !TEST_true(BN_hex2bn(&p,         "FFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFF000000000000000000000001"))\n        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))\n        || !TEST_true(BN_hex2bn(&a,         "FFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE"))\n        || !TEST_true(BN_hex2bn(&b,         "B4050A850C04B3ABF5413256"\n                                    "5044B0B7D7BFD8BA270B39432355FFB4"))\n        || !TEST_true(EC_GROUP_set_curve_GFp(group, p, a, b, ctx))\n        || !TEST_true(BN_hex2bn(&x,         "B70E0CBD6BB4BF7F321390B9"\n                                    "4A03C1D356C21122343280D6115C1D21"))\n        || !TEST_true(EC_POINT_set_compressed_coordinates_GFp(group, P, x, 0,\n                                                              ctx))\n        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)\n        || !TEST_true(BN_hex2bn(&z,         "FFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFF16A2E0B8F03E13DD29455C5C2A3D"))\n        || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))\n        || !TEST_true(EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)))\n        goto err;\n    BIO_printf(bio_out, "\\nNIST curve P-224 -- Generator:\\n     x = 0x");\n    BN_print(bio_out, x);\n    BIO_printf(bio_out, "\\n     y = 0x");\n    BN_print(bio_out, y);\n    BIO_printf(bio_out, "\\n");\n    if (!TEST_true(BN_hex2bn(&z,         "BD376388B5F723FB4C22DFE6"\n                                 "CD4375A05A07476444D5819985007E34"))\n        || !TEST_int_eq(0, BN_cmp(y, z))\n        || !TEST_true(BN_add(yplusone, y, BN_value_one()))\n        || !TEST_false(EC_POINT_set_affine_coordinates_GFp(group, P, x,\n                                                           yplusone, ctx))\n        || !TEST_int_eq(EC_GROUP_get_degree(group), 224)\n        || !group_order_tests(group)\n        || !TEST_ptr(P_224 = EC_GROUP_new(EC_GROUP_method_of(group)))\n        || !TEST_true(EC_GROUP_copy(P_224, group))\n        || !TEST_true(BN_hex2bn(&p, "FFFFFFFF000000010000000000000000"\n                                    "00000000FFFFFFFFFFFFFFFFFFFFFFFF"))\n        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))\n        || !TEST_true(BN_hex2bn(&a, "FFFFFFFF000000010000000000000000"\n                                    "00000000FFFFFFFFFFFFFFFFFFFFFFFC"))\n        || !TEST_true(BN_hex2bn(&b, "5AC635D8AA3A93E7B3EBBD55769886BC"\n                                    "651D06B0CC53B0F63BCE3C3E27D2604B"))\n        || !TEST_true(EC_GROUP_set_curve_GFp(group, p, a, b, ctx))\n        || !TEST_true(BN_hex2bn(&x, "6B17D1F2E12C4247F8BCE6E563A440F2"\n                                    "77037D812DEB33A0F4A13945D898C296"))\n        || !TEST_true(EC_POINT_set_compressed_coordinates_GFp(group, P, x, 1,\n                                                              ctx))\n        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)\n        || !TEST_true(BN_hex2bn(&z, "FFFFFFFF00000000FFFFFFFFFFFFFFFF"\n                                    "BCE6FAADA7179E84F3B9CAC2FC632551"))\n        || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))\n        || !TEST_true(EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)))\n        goto err;\n    BIO_printf(bio_out, "\\nNIST curve P-256 -- Generator:\\n     x = 0x");\n    BN_print(bio_out, x);\n    BIO_printf(bio_out, "\\n     y = 0x");\n    BN_print(bio_out, y);\n    BIO_printf(bio_out, "\\n");\n    if (!TEST_true(BN_hex2bn(&z, "4FE342E2FE1A7F9B8EE7EB4A7C0F9E16"\n                                 "2BCE33576B315ECECBB6406837BF51F5"))\n        || !TEST_int_eq(0, BN_cmp(y, z))\n        || !TEST_true(BN_add(yplusone, y, BN_value_one()))\n        || !TEST_false(EC_POINT_set_affine_coordinates_GFp(group, P, x,\n                                                           yplusone, ctx))\n        || !TEST_int_eq(EC_GROUP_get_degree(group), 256)\n        || !group_order_tests(group)\n        || !TEST_ptr(P_256 = EC_GROUP_new(EC_GROUP_method_of(group)))\n        || !TEST_true(EC_GROUP_copy(P_256, group))\n        || !TEST_true(BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"\n                                    "FFFFFFFF0000000000000000FFFFFFFF"))\n        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))\n        || !TEST_true(BN_hex2bn(&a, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"\n                                    "FFFFFFFF0000000000000000FFFFFFFC"))\n        || !TEST_true(BN_hex2bn(&b, "B3312FA7E23EE7E4988E056BE3F82D19"\n                                    "181D9C6EFE8141120314088F5013875A"\n                                    "C656398D8A2ED19D2A85C8EDD3EC2AEF"))\n        || !TEST_true(EC_GROUP_set_curve_GFp(group, p, a, b, ctx))\n        || !TEST_true(BN_hex2bn(&x, "AA87CA22BE8B05378EB1C71EF320AD74"\n                                    "6E1D3B628BA79B9859F741E082542A38"\n                                    "5502F25DBF55296C3A545E3872760AB7"))\n        || !TEST_true(EC_POINT_set_compressed_coordinates_GFp(group, P, x, 1,\n                                                              ctx))\n        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)\n        || !TEST_true(BN_hex2bn(&z, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFC7634D81F4372DDF"\n                                    "581A0DB248B0A77AECEC196ACCC52973"))\n        || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))\n        || !TEST_true(EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)))\n        goto err;\n    BIO_printf(bio_out, "\\nNIST curve P-384 -- Generator:\\n     x = 0x");\n    BN_print(bio_out, x);\n    BIO_printf(bio_out, "\\n     y = 0x");\n    BN_print(bio_out, y);\n    BIO_printf(bio_out, "\\n");\n    if (!TEST_true(BN_hex2bn(&z, "3617DE4A96262C6F5D9E98BF9292DC29"\n                                 "F8F41DBD289A147CE9DA3113B5F0B8C0"\n                                 "0A60B1CE1D7E819D7A431D7C90EA0E5F"))\n        || !TEST_int_eq(0, BN_cmp(y, z))\n        || !TEST_true(BN_add(yplusone, y, BN_value_one()))\n        || !TEST_false(EC_POINT_set_affine_coordinates_GFp(group, P, x,\n                                                           yplusone, ctx))\n        || !TEST_int_eq(EC_GROUP_get_degree(group), 384)\n        || !group_order_tests(group)\n        || !TEST_ptr(P_384 = EC_GROUP_new(EC_GROUP_method_of(group)))\n        || !TEST_true(EC_GROUP_copy(P_384, group))\n        || !TEST_true(BN_hex2bn(&p,                              "1FF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"))\n        || !TEST_int_eq(1, BN_is_prime_ex(p, BN_prime_checks, ctx, NULL))\n        || !TEST_true(BN_hex2bn(&a,                              "1FF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC"))\n        || !TEST_true(BN_hex2bn(&b,                              "051"\n                                    "953EB9618E1C9A1F929A21A0B68540EE"\n                                    "A2DA725B99B315F3B8B489918EF109E1"\n                                    "56193951EC7E937B1652C0BD3BB1BF07"\n                                    "3573DF883D2C34F1EF451FD46B503F00"))\n        || !TEST_true(EC_GROUP_set_curve_GFp(group, p, a, b, ctx))\n        || !TEST_true(BN_hex2bn(&x,                               "C6"\n                                    "858E06B70404E9CD9E3ECB662395B442"\n                                    "9C648139053FB521F828AF606B4D3DBA"\n                                    "A14B5E77EFE75928FE1DC127A2FFA8DE"\n                                    "3348B3C1856A429BF97E7E31C2E5BD66"))\n        || !TEST_true(EC_POINT_set_compressed_coordinates_GFp(group, P, x, 0,\n                                                              ctx))\n        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)\n        || !TEST_true(BN_hex2bn(&z,                              "1FF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\n                                    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA"\n                                    "51868783BF2F966B7FCC0148F709A5D0"\n                                    "3BB5C9B8899C47AEBB6FB71E91386409"))\n        || !TEST_true(EC_GROUP_set_generator(group, P, z, BN_value_one()))\n        || !TEST_true(EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)))\n        goto err;\n    BIO_printf(bio_out, "\\nNIST curve P-521 -- Generator:\\n     x = 0x");\n    BN_print(bio_out, x);\n    BIO_printf(bio_out, "\\n     y = 0x");\n    BN_print(bio_out, y);\n    BIO_printf(bio_out, "\\n");\n    if (!TEST_true(BN_hex2bn(&z,                              "118"\n                                 "39296A789A3BC0045C8A5FB42C7D1BD9"\n                                 "98F54449579B446817AFBD17273E662C"\n                                 "97EE72995EF42640C550B9013FAD0761"\n                                 "353C7086A272C24088BE94769FD16650"))\n        || !TEST_int_eq(0, BN_cmp(y, z))\n        || !TEST_true(BN_add(yplusone, y, BN_value_one()))\n        || !TEST_false(EC_POINT_set_affine_coordinates_GFp(group, P, x,\n                                                           yplusone, ctx))\n        || !TEST_int_eq(EC_GROUP_get_degree(group), 521)\n        || !group_order_tests(group)\n        || !TEST_ptr(P_521 = EC_GROUP_new(EC_GROUP_method_of(group)))\n        || !TEST_true(EC_GROUP_copy(P_521, group))\n        || !TEST_true(EC_POINT_set_affine_coordinates_GFp(group, P, x, y, ctx))\n        || !TEST_true(EC_POINT_copy(Q, P))\n        || !TEST_false(EC_POINT_is_at_infinity(group, Q))\n        || !TEST_true(EC_POINT_dbl(group, P, P, ctx))\n        || !TEST_int_gt(EC_POINT_is_on_curve(group, P, ctx), 0)\n        || !TEST_true(EC_POINT_invert(group, Q, ctx))\n        || !TEST_true(EC_POINT_add(group, R, P, Q, ctx))\n        || !TEST_true(EC_POINT_add(group, R, R, Q, ctx))\n        || !TEST_true(EC_POINT_is_at_infinity(group, R))\n        || !TEST_false(EC_POINT_is_at_infinity(group, Q)))\n        goto err;\n    points[0] = Q;\n    points[1] = Q;\n    points[2] = Q;\n    points[3] = Q;\n    if (!TEST_true(EC_GROUP_get_order(group, z, ctx))\n        || !TEST_true(BN_add(y, z, BN_value_one()))\n        || !TEST_false(BN_is_odd(y))\n        || !TEST_true(BN_rshift1(y, y)))\n        goto err;\n    scalars[0] = y;\n    scalars[1] = y;\n    BIO_printf(bio_out, "combined multiplication ...");\n    if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))\n        || !TEST_true(EC_POINTs_mul(group, R, z, 2, points, scalars, ctx))\n        || !TEST_int_eq(0, EC_POINT_cmp(group, P, R, ctx))\n        || !TEST_int_eq(0, EC_POINT_cmp(group, R, Q, ctx))\n        || !TEST_true(BN_pseudo_rand(y, BN_num_bits(y), 0, 0))\n        || !TEST_true(BN_add(z, z, y)))\n        goto err;\n    BN_set_negative(z, 1);\n    scalars[0] = y;\n    scalars[1] = z;\n    if (!TEST_true(EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx))\n        || !TEST_true(EC_POINT_is_at_infinity(group, P))\n        || !TEST_true(BN_pseudo_rand(x, BN_num_bits(y) - 1, 0, 0))\n        || !TEST_true(BN_add(z, x, y)))\n        goto err;\n    BN_set_negative(z, 1);\n    scalars[0] = x;\n    scalars[1] = y;\n    scalars[2] = z;\n    if (!TEST_ptr(scalar3 = BN_new()))\n        goto err;\n    BN_zero(scalar3);\n    scalars[3] = scalar3;\n    if (!TEST_true(EC_POINTs_mul(group, P, NULL, 4, points, scalars, ctx))\n        || !TEST_true(EC_POINT_is_at_infinity(group, P)))\n        goto err;\n    BIO_printf(bio_out, " ok\\n\\n");\n    r = 1;\nerr:\n    BN_CTX_free(ctx);\n    BN_free(p);\n    BN_free(a);\n    BN_free(b);\n    EC_GROUP_free(group);\n    EC_GROUP_free(tmp);\n    EC_POINT_free(P);\n    EC_POINT_free(Q);\n    EC_POINT_free(R);\n    BN_free(x);\n    BN_free(y);\n    BN_free(z);\n    BN_free(yplusone);\n    BN_free(scalar3);\n    EC_GROUP_free(P_160);\n    EC_GROUP_free(P_192);\n    EC_GROUP_free(P_224);\n    EC_GROUP_free(P_256);\n    EC_GROUP_free(P_384);\n    EC_GROUP_free(P_521);\n    return r;\n}', "int BN_hex2bn(BIGNUM **bn, const char *a)\n{\n    BIGNUM *ret = NULL;\n    BN_ULONG l = 0;\n    int neg = 0, h, m, i, j, k, c;\n    int num;\n    if ((a == NULL) || (*a == '\\0'))\n        return (0);\n    if (*a == '-') {\n        neg = 1;\n        a++;\n    }\n    for (i = 0; i <= (INT_MAX/4) && isxdigit((unsigned char)a[i]); i++)\n        continue;\n    if (i == 0 || i > INT_MAX/4)\n        goto err;\n    num = i + neg;\n    if (bn == NULL)\n        return (num);\n    if (*bn == NULL) {\n        if ((ret = BN_new()) == NULL)\n            return (0);\n    } else {\n        ret = *bn;\n        BN_zero(ret);\n    }\n    if (bn_expand(ret, i * 4) == NULL)\n        goto err;\n    j = i;\n    m = 0;\n    h = 0;\n    while (j > 0) {\n        m = ((BN_BYTES * 2) <= j) ? (BN_BYTES * 2) : j;\n        l = 0;\n        for (;;) {\n            c = a[j - m];\n            k = OPENSSL_hexchar2int(c);\n            if (k < 0)\n                k = 0;\n            l = (l << 4) | k;\n            if (--m <= 0) {\n                ret->d[h++] = l;\n                break;\n            }\n        }\n        j -= (BN_BYTES * 2);\n    }\n    ret->top = h;\n    bn_correct_top(ret);\n    *bn = ret;\n    bn_check_top(ret);\n    if (ret->top != 0)\n        ret->neg = neg;\n    return (num);\n err:\n    if (*bn == NULL)\n        BN_free(ret);\n    return (0);\n}", 'int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group,\n                                            EC_POINT *point, const BIGNUM *x,\n                                            int y_bit, BN_CTX *ctx)\n{\n    if (group->meth->point_set_compressed_coordinates == 0\n        && !(group->meth->flags & EC_FLAGS_DEFAULT_OCT)) {\n        ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP,\n              ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);\n        return 0;\n    }\n    if (group->meth != point->meth) {\n        ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP,\n              EC_R_INCOMPATIBLE_OBJECTS);\n        return 0;\n    }\n    if (group->meth->flags & EC_FLAGS_DEFAULT_OCT) {\n        if (group->meth->field_type == NID_X9_62_prime_field)\n            return ec_GFp_simple_set_compressed_coordinates(group, point, x,\n                                                            y_bit, ctx);\n        else\n#ifdef OPENSSL_NO_EC2M\n        {\n            ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP,\n                  EC_R_GF2M_NOT_SUPPORTED);\n            return 0;\n        }\n#else\n            return ec_GF2m_simple_set_compressed_coordinates(group, point, x,\n                                                             y_bit, ctx);\n#endif\n    }\n    return group->meth->point_set_compressed_coordinates(group, point, x,\n                                                         y_bit, ctx);\n}', 'int ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *group,\n                                             EC_POINT *point,\n                                             const BIGNUM *x_, int y_bit,\n                                             BN_CTX *ctx)\n{\n    BN_CTX *new_ctx = NULL;\n    BIGNUM *tmp1, *tmp2, *x, *y;\n    int ret = 0;\n    ERR_clear_error();\n    if (ctx == NULL) {\n        ctx = new_ctx = BN_CTX_new();\n        if (ctx == NULL)\n            return 0;\n    }\n    y_bit = (y_bit != 0);\n    BN_CTX_start(ctx);\n    tmp1 = BN_CTX_get(ctx);\n    tmp2 = BN_CTX_get(ctx);\n    x = BN_CTX_get(ctx);\n    y = BN_CTX_get(ctx);\n    if (y == NULL)\n        goto err;\n    if (!BN_nnmod(x, x_, group->field, ctx))\n        goto err;\n    if (group->meth->field_decode == 0) {\n        if (!group->meth->field_sqr(group, tmp2, x_, ctx))\n            goto err;\n        if (!group->meth->field_mul(group, tmp1, tmp2, x_, ctx))\n            goto err;\n    } else {\n        if (!BN_mod_sqr(tmp2, x_, group->field, ctx))\n            goto err;\n        if (!BN_mod_mul(tmp1, tmp2, x_, group->field, ctx))\n            goto err;\n    }\n    if (group->a_is_minus3) {\n        if (!BN_mod_lshift1_quick(tmp2, x, group->field))\n            goto err;\n        if (!BN_mod_add_quick(tmp2, tmp2, x, group->field))\n            goto err;\n        if (!BN_mod_sub_quick(tmp1, tmp1, tmp2, group->field))\n            goto err;\n    } else {\n        if (group->meth->field_decode) {\n            if (!group->meth->field_decode(group, tmp2, group->a, ctx))\n                goto err;\n            if (!BN_mod_mul(tmp2, tmp2, x, group->field, ctx))\n                goto err;\n        } else {\n            if (!group->meth->field_mul(group, tmp2, group->a, x, ctx))\n                goto err;\n        }\n        if (!BN_mod_add_quick(tmp1, tmp1, tmp2, group->field))\n            goto err;\n    }\n    if (group->meth->field_decode) {\n        if (!group->meth->field_decode(group, tmp2, group->b, ctx))\n            goto err;\n        if (!BN_mod_add_quick(tmp1, tmp1, tmp2, group->field))\n            goto err;\n    } else {\n        if (!BN_mod_add_quick(tmp1, tmp1, group->b, group->field))\n            goto err;\n    }\n    if (!BN_mod_sqrt(y, tmp1, group->field, ctx)) {\n        unsigned long err = ERR_peek_last_error();\n        if (ERR_GET_LIB(err) == ERR_LIB_BN\n            && ERR_GET_REASON(err) == BN_R_NOT_A_SQUARE) {\n            ERR_clear_error();\n            ECerr(EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES,\n                  EC_R_INVALID_COMPRESSED_POINT);\n        } else\n            ECerr(EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES,\n                  ERR_R_BN_LIB);\n        goto err;\n    }\n    if (y_bit != BN_is_odd(y)) {\n        if (BN_is_zero(y)) {\n            int kron;\n            kron = BN_kronecker(x, group->field, ctx);\n            if (kron == -2)\n                goto err;\n            if (kron == 1)\n                ECerr(EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES,\n                      EC_R_INVALID_COMPRESSION_BIT);\n            else\n                ECerr(EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES,\n                      EC_R_INVALID_COMPRESSED_POINT);\n            goto err;\n        }\n        if (!BN_usub(y, group->field, y))\n            goto err;\n    }\n    if (y_bit != BN_is_odd(y)) {\n        ECerr(EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES,\n              ERR_R_INTERNAL_ERROR);\n        goto err;\n    }\n    if (!EC_POINT_set_affine_coordinates_GFp(group, point, x, y, ctx))\n        goto err;\n    ret = 1;\n err:\n    BN_CTX_end(ctx);\n    BN_CTX_free(new_ctx);\n    return ret;\n}', 'int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx)\n{\n    if (!(BN_mod(r, m, d, ctx)))\n        return 0;\n    if (!r->neg)\n        return 1;\n    return (d->neg ? BN_sub : BN_add) (r, r, d);\n}', 'int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor,\n           BN_CTX *ctx)\n{\n    int norm_shift, i, loop;\n    BIGNUM *tmp, wnum, *snum, *sdiv, *res;\n    BN_ULONG *resp, *wnump;\n    BN_ULONG d0, d1;\n    int num_n, div_n;\n    int no_branch = 0;\n    if ((num->top > 0 && num->d[num->top - 1] == 0) ||\n        (divisor->top > 0 && divisor->d[divisor->top - 1] == 0)) {\n        BNerr(BN_F_BN_DIV, BN_R_NOT_INITIALIZED);\n        return 0;\n    }\n    bn_check_top(num);\n    bn_check_top(divisor);\n    if ((BN_get_flags(num, BN_FLG_CONSTTIME) != 0)\n        || (BN_get_flags(divisor, BN_FLG_CONSTTIME) != 0)) {\n        no_branch = 1;\n    }\n    bn_check_top(dv);\n    bn_check_top(rm);\n    if (BN_is_zero(divisor)) {\n        BNerr(BN_F_BN_DIV, BN_R_DIV_BY_ZERO);\n        return (0);\n    }\n    if (!no_branch && BN_ucmp(num, divisor) < 0) {\n        if (rm != NULL) {\n            if (BN_copy(rm, num) == NULL)\n                return (0);\n        }\n        if (dv != NULL)\n            BN_zero(dv);\n        return (1);\n    }\n    BN_CTX_start(ctx);\n    tmp = BN_CTX_get(ctx);\n    snum = BN_CTX_get(ctx);\n    sdiv = BN_CTX_get(ctx);\n    if (dv == NULL)\n        res = BN_CTX_get(ctx);\n    else\n        res = dv;\n    if (sdiv == NULL || res == NULL || tmp == NULL || snum == NULL)\n        goto err;\n    norm_shift = BN_BITS2 - ((BN_num_bits(divisor)) % BN_BITS2);\n    if (!(BN_lshift(sdiv, divisor, norm_shift)))\n        goto err;\n    sdiv->neg = 0;\n    norm_shift += BN_BITS2;\n    if (!(BN_lshift(snum, num, norm_shift)))\n        goto err;\n    snum->neg = 0;\n    if (no_branch) {\n        if (snum->top <= sdiv->top + 1) {\n            if (bn_wexpand(snum, sdiv->top + 2) == NULL)\n                goto err;\n            for (i = snum->top; i < sdiv->top + 2; i++)\n                snum->d[i] = 0;\n            snum->top = sdiv->top + 2;\n        } else {\n            if (bn_wexpand(snum, snum->top + 1) == NULL)\n                goto err;\n            snum->d[snum->top] = 0;\n            snum->top++;\n        }\n    }\n    div_n = sdiv->top;\n    num_n = snum->top;\n    loop = num_n - div_n;\n    wnum.neg = 0;\n    wnum.d = &(snum->d[loop]);\n    wnum.top = div_n;\n    wnum.dmax = snum->dmax - loop;\n    d0 = sdiv->d[div_n - 1];\n    d1 = (div_n == 1) ? 0 : sdiv->d[div_n - 2];\n    wnump = &(snum->d[num_n - 1]);\n    if (!bn_wexpand(res, (loop + 1)))\n        goto err;\n    res->neg = (num->neg ^ divisor->neg);\n    res->top = loop - no_branch;\n    resp = &(res->d[loop - 1]);\n    if (!bn_wexpand(tmp, (div_n + 1)))\n        goto err;\n    if (!no_branch) {\n        if (BN_ucmp(&wnum, sdiv) >= 0) {\n            bn_clear_top2max(&wnum);\n            bn_sub_words(wnum.d, wnum.d, sdiv->d, div_n);\n            *resp = 1;\n        } else\n            res->top--;\n    }\n    resp++;\n    if (res->top == 0)\n        res->neg = 0;\n    else\n        resp--;\n    for (i = 0; i < loop - 1; i++, wnump--) {\n        BN_ULONG q, l0;\n# if defined(BN_DIV3W) && !defined(OPENSSL_NO_ASM)\n        BN_ULONG bn_div_3_words(BN_ULONG *, BN_ULONG, BN_ULONG);\n        q = bn_div_3_words(wnump, d1, d0);\n# else\n        BN_ULONG n0, n1, rem = 0;\n        n0 = wnump[0];\n        n1 = wnump[-1];\n        if (n0 == d0)\n            q = BN_MASK2;\n        else {\n#  ifdef BN_LLONG\n            BN_ULLONG t2;\n#   if defined(BN_LLONG) && defined(BN_DIV2W) && !defined(bn_div_words)\n            q = (BN_ULONG)(((((BN_ULLONG) n0) << BN_BITS2) | n1) / d0);\n#   else\n            q = bn_div_words(n0, n1, d0);\n#   endif\n#   ifndef REMAINDER_IS_ALREADY_CALCULATED\n            rem = (n1 - q * d0) & BN_MASK2;\n#   endif\n            t2 = (BN_ULLONG) d1 *q;\n            for (;;) {\n                if (t2 <= ((((BN_ULLONG) rem) << BN_BITS2) | wnump[-2]))\n                    break;\n                q--;\n                rem += d0;\n                if (rem < d0)\n                    break;\n                t2 -= d1;\n            }\n#  else\n            BN_ULONG t2l, t2h;\n            q = bn_div_words(n0, n1, d0);\n#   ifndef REMAINDER_IS_ALREADY_CALCULATED\n            rem = (n1 - q * d0) & BN_MASK2;\n#   endif\n#   if defined(BN_UMULT_LOHI)\n            BN_UMULT_LOHI(t2l, t2h, d1, q);\n#   elif defined(BN_UMULT_HIGH)\n            t2l = d1 * q;\n            t2h = BN_UMULT_HIGH(d1, q);\n#   else\n            {\n                BN_ULONG ql, qh;\n                t2l = LBITS(d1);\n                t2h = HBITS(d1);\n                ql = LBITS(q);\n                qh = HBITS(q);\n                mul64(t2l, t2h, ql, qh);\n            }\n#   endif\n            for (;;) {\n                if ((t2h < rem) || ((t2h == rem) && (t2l <= wnump[-2])))\n                    break;\n                q--;\n                rem += d0;\n                if (rem < d0)\n                    break;\n                if (t2l < d1)\n                    t2h--;\n                t2l -= d1;\n            }\n#  endif\n        }\n# endif\n        l0 = bn_mul_words(tmp->d, sdiv->d, div_n, q);\n        tmp->d[div_n] = l0;\n        wnum.d--;\n        if (bn_sub_words(wnum.d, wnum.d, tmp->d, div_n + 1)) {\n            q--;\n            if (bn_add_words(wnum.d, wnum.d, sdiv->d, div_n))\n                (*wnump)++;\n        }\n        resp--;\n        *resp = q;\n    }\n    bn_correct_top(snum);\n    if (rm != NULL) {\n        int neg = num->neg;\n        BN_rshift(rm, snum, norm_shift);\n        if (!BN_is_zero(rm))\n            rm->neg = neg;\n        bn_check_top(rm);\n    }\n    if (no_branch)\n        bn_correct_top(res);\n    BN_CTX_end(ctx);\n    return (1);\n err:\n    bn_check_top(rm);\n    BN_CTX_end(ctx);\n    return (0);\n}', 'BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)\n{\n    bn_check_top(b);\n    if (a == b)\n        return a;\n    if (bn_wexpand(a, b->top) == NULL)\n        return NULL;\n    if (b->top > 0)\n        memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);\n    a->top = b->top;\n    a->neg = b->neg;\n    bn_check_top(a);\n    return a;\n}', 'BIGNUM *bn_wexpand(BIGNUM *a, int words)\n{\n    return (words <= a->dmax) ? a : bn_expand2(a, words);\n}']