bntest.c 89.5 KB
Newer Older
R
Rich Salz 已提交
1
/*
2
 * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
R
Rich Salz 已提交
5 6 7
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
8
 */
R
Rich Salz 已提交
9 10
#include <assert.h>
#include <errno.h>
11 12
#include <stdio.h>
#include <string.h>
R
Rich Salz 已提交
13
#include <ctype.h>
14

15
#include <openssl/bn.h>
R
Rich Salz 已提交
16
#include <openssl/crypto.h>
17
#include <openssl/err.h>
R
Rich Salz 已提交
18
#include <openssl/rand.h>
19 20
#include "internal/nelem.h"
#include "internal/numbers.h"
R
Rich Salz 已提交
21
#include "testutil.h"
22

23 24 25
#ifdef OPENSSL_SYS_WINDOWS
# define strcasecmp _stricmp
#endif
26

R
Rich Salz 已提交
27 28 29 30 31
/*
 * Things in boring, not in openssl.  TODO we should add them.
 */
#define HAVE_BN_PADDED 0
#define HAVE_BN_SQRT 0
32

R
Rich Salz 已提交
33 34 35 36
typedef struct filetest_st {
    const char *name;
    int (*func)(STANZA *s);
} FILETEST;
37

R
Rich Salz 已提交
38 39 40 41 42
typedef struct mpitest_st {
    const char *base10;
    const char *mpi;
    size_t mpi_len;
} MPITEST;
43

R
Rich Salz 已提交
44 45 46
static const int NUM0 = 100;           /* number of tests */
static const int NUM1 = 50;            /* additional tests for some functions */
static BN_CTX *ctx;
47

R
Rich Salz 已提交
48 49 50
/*
 * Polynomial coefficients used in GFM tests.
 */
D
Dr. Stephen Henson 已提交
51
#ifndef OPENSSL_NO_EC2M
R
Rich Salz 已提交
52 53
static int p0[] = { 163, 7, 6, 3, 0, -1 };
static int p1[] = { 193, 15, 0, -1 };
D
Dr. Stephen Henson 已提交
54
#endif
55

R
Rich Salz 已提交
56 57 58 59 60 61 62
/*
 * Look for |key| in the stanza and return it or NULL if not found.
 */
static const char *findattr(STANZA *s, const char *key)
{
    int i = s->numpairs;
    PAIR *pp = s->pairs;
63

R
Rich Salz 已提交
64 65 66 67 68
    for ( ; --i >= 0; pp++)
        if (strcasecmp(pp->key, key) == 0)
            return pp->value;
    return NULL;
}
69

F
FdaSilvaYY 已提交
70 71 72 73 74 75 76 77 78 79 80 81
/*
 * Parse BIGNUM from sparse hex-strings, return |BN_hex2bn| result.
 */
static int parse_bigBN(BIGNUM **out, const char *bn_strings[])
{
    char *bigstring = glue_strings(bn_strings, NULL);
    int ret = BN_hex2bn(out, bigstring);

    OPENSSL_free(bigstring);
    return ret;
}

R
Rich Salz 已提交
82 83 84 85 86 87 88 89
/*
 * Parse BIGNUM, return number of bytes parsed.
 */
static int parseBN(BIGNUM **out, const char *in)
{
    *out = NULL;
    return BN_hex2bn(out, in);
}
90

R
Rich Salz 已提交
91 92 93 94 95
static int parsedecBN(BIGNUM **out, const char *in)
{
    *out = NULL;
    return BN_dec2bn(out, in);
}
96

R
Rich Salz 已提交
97 98 99 100
static BIGNUM *getBN(STANZA *s, const char *attribute)
{
    const char *hex;
    BIGNUM *ret = NULL;
D
David Benjamin 已提交
101

R
Rich Salz 已提交
102
    if ((hex = findattr(s, attribute)) == NULL) {
103
        TEST_error("%s:%d: Can't find %s", s->test_file, s->start, attribute);
R
Rich Salz 已提交
104 105
        return NULL;
    }
106

R
Rich Salz 已提交
107
    if (parseBN(&ret, hex) != (int)strlen(hex)) {
R
Rich Salz 已提交
108
        TEST_error("Could not decode '%s'", hex);
R
Rich Salz 已提交
109 110 111 112
        return NULL;
    }
    return ret;
}
113

R
Rich Salz 已提交
114 115
static int getint(STANZA *s, int *out, const char *attribute)
{
R
Rich Salz 已提交
116
    BIGNUM *ret;
R
Rich Salz 已提交
117 118
    BN_ULONG word;
    int st = 0;
119

R
Rich Salz 已提交
120 121
    if (!TEST_ptr(ret = getBN(s, attribute))
            || !TEST_ulong_le(word = BN_get_word(ret), INT_MAX))
122 123
        goto err;

R
Rich Salz 已提交
124 125
    *out = (int)word;
    st = 1;
126
 err:
R
Rich Salz 已提交
127 128 129
    BN_free(ret);
    return st;
}
130

R
Rich Salz 已提交
131 132 133 134
static int equalBN(const char *op, const BIGNUM *expected, const BIGNUM *actual)
{
    if (BN_cmp(expected, actual) == 0)
        return 1;
135

136 137
    TEST_error("unexpected %s value", op);
    TEST_BN_eq(expected, actual);
R
Rich Salz 已提交
138
    return 0;
139
}
140

R
Rich Salz 已提交
141 142 143 144 145 146 147
/*
 * Return a "random" flag for if a BN should be negated.
 */
static int rand_neg(void)
{
    static unsigned int neg = 0;
    static int sign[8] = { 0, 0, 0, 1, 1, 0, 1, 1 };
148

R
Rich Salz 已提交
149
    return sign[(neg++) % 8];
150
}
151

B
Billy Brumley 已提交
152 153 154 155 156 157 158 159 160 161 162
static int test_swap(void)
{
    BIGNUM *a = NULL, *b = NULL, *c = NULL, *d = NULL;
    int top, cond, st = 0;

    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new()))
        goto err;

S
Shane Lontis 已提交
163 164 165 166 167
    if (!(TEST_true(BN_bntest_rand(a, 1024, 1, 0))
            && TEST_true(BN_bntest_rand(b, 1024, 1, 0))
            && TEST_ptr(BN_copy(c, a))
            && TEST_ptr(BN_copy(d, b))))
        goto err;
168
    top = BN_num_bits(a) / BN_BITS2;
B
Billy Brumley 已提交
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224

    /* regular swap */
    BN_swap(a, b);
    if (!equalBN("swap", a, d)
            || !equalBN("swap", b, c))
        goto err;

    /* conditional swap: true */
    cond = 1;
    BN_consttime_swap(cond, a, b, top);
    if (!equalBN("cswap true", a, c)
            || !equalBN("cswap true", b, d))
        goto err;

    /* conditional swap: false */
    cond = 0;
    BN_consttime_swap(cond, a, b, top);
    if (!equalBN("cswap false", a, c)
            || !equalBN("cswap false", b, d))
        goto err;

    /* same tests but checking flag swap */
    BN_set_flags(a, BN_FLG_CONSTTIME);

    BN_swap(a, b);
    if (!equalBN("swap, flags", a, d)
            || !equalBN("swap, flags", b, c)
            || !TEST_true(BN_get_flags(b, BN_FLG_CONSTTIME))
            || !TEST_false(BN_get_flags(a, BN_FLG_CONSTTIME)))
        goto err;

    cond = 1;
    BN_consttime_swap(cond, a, b, top);
    if (!equalBN("cswap true, flags", a, c)
            || !equalBN("cswap true, flags", b, d)
            || !TEST_true(BN_get_flags(a, BN_FLG_CONSTTIME))
            || !TEST_false(BN_get_flags(b, BN_FLG_CONSTTIME)))
        goto err;

    cond = 0;
    BN_consttime_swap(cond, a, b, top);
    if (!equalBN("cswap false, flags", a, c)
            || !equalBN("cswap false, flags", b, d)
            || !TEST_true(BN_get_flags(a, BN_FLG_CONSTTIME))
            || !TEST_false(BN_get_flags(b, BN_FLG_CONSTTIME)))
        goto err;

    st = 1;
 err:
    BN_free(a);
    BN_free(b);
    BN_free(c);
    BN_free(d);
    return st;
}

225
static int test_sub(void)
226
{
R
Rich Salz 已提交
227 228
    BIGNUM *a = NULL, *b = NULL, *c = NULL;
    int i, st = 0;
229

R
Rich Salz 已提交
230 231 232 233
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b = BN_new())
            || !TEST_ptr(c = BN_new()))
        goto err;
234

R
Rich Salz 已提交
235 236
    for (i = 0; i < NUM0 + NUM1; i++) {
        if (i < NUM1) {
S
Shane Lontis 已提交
237 238 239 240
            if (!(TEST_true(BN_bntest_rand(a, 512, 0, 0)))
                    && TEST_ptr(BN_copy(b, a))
                    && TEST_int_ne(BN_set_bit(a, i), 0)
                    && TEST_true(BN_add_word(b, i)))
R
Rich Salz 已提交
241
                goto err;
242
        } else {
S
Shane Lontis 已提交
243 244
            if (!TEST_true(BN_bntest_rand(b, 400 + i - NUM1, 0, 0)))
                goto err;
245 246
            BN_set_negative(a, rand_neg());
            BN_set_negative(b, rand_neg());
247
        }
S
Shane Lontis 已提交
248 249 250 251
        if (!(TEST_true(BN_sub(c, a, b))
                && TEST_true(BN_add(c, c, b))
                && TEST_true(BN_sub(c, c, a))
                && TEST_BN_eq_zero(c)))
R
Rich Salz 已提交
252
            goto err;
253
    }
R
Rich Salz 已提交
254
    st = 1;
255
 err:
256 257 258
    BN_free(a);
    BN_free(b);
    BN_free(c);
R
Rich Salz 已提交
259
    return st;
260
}
261

262
static int test_div_recip(void)
263
{
R
Rich Salz 已提交
264 265 266
    BIGNUM *a = NULL, *b = NULL, *c = NULL, *d = NULL, *e = NULL;
    BN_RECP_CTX *recp = NULL;
    int st = 0, i;
267

R
Rich Salz 已提交
268 269 270 271 272 273 274
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new())
            || !TEST_ptr(e = BN_new())
            || !TEST_ptr(recp = BN_RECP_CTX_new()))
        goto err;
275

R
Rich Salz 已提交
276 277
    for (i = 0; i < NUM0 + NUM1; i++) {
        if (i < NUM1) {
S
Shane Lontis 已提交
278 279 280 281 282 283 284 285 286
            if (!(TEST_true(BN_bntest_rand(a, 400, 0, 0))
                    && TEST_ptr(BN_copy(b, a))
                    && TEST_true(BN_lshift(a, a, i))
                    && TEST_true(BN_add_word(a, i))))
                goto err;
        } else {
            if (!(TEST_true(BN_bntest_rand(b, 50 + 3 * (i - NUM1), 0, 0))))
                goto err;
        }
287 288
        BN_set_negative(a, rand_neg());
        BN_set_negative(b, rand_neg());
S
Shane Lontis 已提交
289 290 291 292 293 294
        if (!(TEST_true(BN_RECP_CTX_set(recp, b, ctx))
                && TEST_true(BN_div_recp(d, c, a, recp, ctx))
                && TEST_true(BN_mul(e, d, b, ctx))
                && TEST_true(BN_add(d, e, c))
                && TEST_true(BN_sub(d, d, a))
                && TEST_BN_eq_zero(d)))
R
Rich Salz 已提交
295
            goto err;
296
    }
R
Rich Salz 已提交
297
    st = 1;
298
 err:
299 300 301 302 303 304
    BN_free(a);
    BN_free(b);
    BN_free(c);
    BN_free(d);
    BN_free(e);
    BN_RECP_CTX_free(recp);
R
Rich Salz 已提交
305
    return st;
306
}
307

308
static int test_mod(void)
309
{
R
Rich Salz 已提交
310 311
    BIGNUM *a = NULL, *b = NULL, *c = NULL, *d = NULL, *e = NULL;
    int st = 0, i;
312

R
Rich Salz 已提交
313 314 315 316 317 318
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new())
            || !TEST_ptr(e = BN_new()))
        goto err;
319

S
Shane Lontis 已提交
320 321
    if (!(TEST_true(BN_bntest_rand(a, 1024, 0, 0))))
        goto err;
R
Rich Salz 已提交
322
    for (i = 0; i < NUM0; i++) {
S
Shane Lontis 已提交
323 324
        if (!(TEST_true(BN_bntest_rand(b, 450 + i * 10, 0, 0))))
            goto err;
325 326
        BN_set_negative(a, rand_neg());
        BN_set_negative(b, rand_neg());
S
Shane Lontis 已提交
327 328 329 330
        if (!(TEST_true(BN_mod(c, a, b, ctx))
                && TEST_true(BN_div(d, e, a, b, ctx))
                && TEST_true(BN_sub(e, e, c))
                && TEST_BN_eq_zero(e)))
R
Rich Salz 已提交
331
            goto err;
332
    }
R
Rich Salz 已提交
333
    st = 1;
334
 err:
335 336 337 338 339
    BN_free(a);
    BN_free(b);
    BN_free(c);
    BN_free(d);
    BN_free(e);
R
Rich Salz 已提交
340
    return st;
341
}
342

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
static const char *bn1strings[] = {
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFF00",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "00000000000000000000000000000000000000000000000000FFFFFFFFFFFFFF",
    NULL
};

static const char *bn2strings[] = {
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
    "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFF0000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "0000000000000000000000000000000000000000000000000000000000000000",
    "000000000000000000000000000000000000000000FFFFFFFFFFFFFF00000000",
    NULL
};

R
Rich Salz 已提交
383 384 385 386
/*
 * Test constant-time modular exponentiation with 1024-bit inputs, which on
 * x86_64 cause a different code branch to be taken.
 */
387
static int test_modexp_mont5(void)
388
{
R
Rich Salz 已提交
389 390 391 392
    BIGNUM *a = NULL, *p = NULL, *m = NULL, *d = NULL, *e = NULL;
    BIGNUM *b = NULL, *n = NULL, *c = NULL;
    BN_MONT_CTX *mont = NULL;
    int st = 0;
393

R
Rich Salz 已提交
394 395 396 397 398 399 400 401 402 403
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(p = BN_new())
            || !TEST_ptr(m = BN_new())
            || !TEST_ptr(d = BN_new())
            || !TEST_ptr(e = BN_new())
            || !TEST_ptr(b = BN_new())
            || !TEST_ptr(n = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(mont = BN_MONT_CTX_new()))
        goto err;
404

S
Shane Lontis 已提交
405 406 407 408 409
    /* must be odd for montgomery */
    if (!(TEST_true(BN_bntest_rand(m, 1024, 0, 1))
            /* Zero exponent */
            && TEST_true(BN_bntest_rand(a, 1024, 0, 0))))
        goto err;
R
Rich Salz 已提交
410
    BN_zero(p);
S
Shane Lontis 已提交
411

R
Rich Salz 已提交
412 413
    if (!TEST_true(BN_mod_exp_mont_consttime(d, a, p, m, ctx, NULL)))
        goto err;
414
    if (!TEST_BN_eq_one(d))
R
Rich Salz 已提交
415
        goto err;
416

R
Rich Salz 已提交
417
    /* Regression test for carry bug in mulx4x_mont */
S
Shane Lontis 已提交
418
    if (!(TEST_true(BN_hex2bn(&a,
R
Rich Salz 已提交
419 420 421
        "7878787878787878787878787878787878787878787878787878787878787878"
        "7878787878787878787878787878787878787878787878787878787878787878"
        "7878787878787878787878787878787878787878787878787878787878787878"
S
Shane Lontis 已提交
422 423
        "7878787878787878787878787878787878787878787878787878787878787878"))
        && TEST_true(BN_hex2bn(&b,
R
Rich Salz 已提交
424 425 426
        "095D72C08C097BA488C5E439C655A192EAFB6380073D8C2664668EDDB4060744"
        "E16E57FB4EDB9AE10A0CEFCDC28A894F689A128379DB279D48A2E20849D68593"
        "9B7803BCF46CEBF5C533FB0DD35B080593DE5472E3FE5DB951B8BFF9B4CB8F03"
S
Shane Lontis 已提交
427 428
        "9CC638A5EE8CDD703719F8000E6A9F63BEED5F2FCD52FF293EA05A251BB4AB81"))
        && TEST_true(BN_hex2bn(&n,
R
Rich Salz 已提交
429 430 431
        "D78AF684E71DB0C39CFF4E64FB9DB567132CB9C50CC98009FEB820B26F2DED9B"
        "91B9B5E2B83AE0AE4EB4E0523CA726BFBE969B89FD754F674CE99118C3F2D1C5"
        "D81FDC7C54E02B60262B241D53C040E99E45826ECA37A804668E690E1AFC1CA4"
S
Shane Lontis 已提交
432 433 434 435 436 437 438
        "2C9A15D84D4954425F0B7642FC0BD9D7B24E2618D2DCC9B729D944BADACFDDAF"))))
        goto err;

    if (!(TEST_true(BN_MONT_CTX_set(mont, n, ctx))
            && TEST_true(BN_mod_mul_montgomery(c, a, b, mont, ctx))
            && TEST_true(BN_mod_mul_montgomery(d, b, a, mont, ctx))
            && TEST_BN_eq(c, d)))
R
Rich Salz 已提交
439
        goto err;
440

441
    /* Regression test for carry bug in sqr[x]8x_mont */
S
Shane Lontis 已提交
442 443 444
    if (!(TEST_true(parse_bigBN(&n, bn1strings))
            && TEST_true(parse_bigBN(&a, bn2strings))))
        goto err;
445
    BN_free(b);
S
Shane Lontis 已提交
446 447 448 449 450
    if (!(TEST_ptr(b = BN_dup(a))
            && TEST_true(BN_MONT_CTX_set(mont, n, ctx))
            && TEST_true(BN_mod_mul_montgomery(c, a, a, mont, ctx))
            && TEST_true(BN_mod_mul_montgomery(d, a, b, mont, ctx))
            && TEST_BN_eq(c, d)))
R
Rich Salz 已提交
451
        goto err;
452

453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
    /* Regression test for carry bug in bn_sqrx8x_internal */
    {
        static const char *ahex[] = {
                      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFEADBCFC4DAE7FFF908E92820306B",
            "9544D954000000006C0000000000000000000000000000000000000000000000",
            "00000000000000000000FF030202FFFFF8FFEBDBCFC4DAE7FFF908E92820306B",
            "9544D954000000006C000000FF0302030000000000FFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01FC00FF02FFFFFFFF",
            "00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FCFD",
            "FCFFFFFFFFFF000000000000000000FF0302030000000000FFFFFFFFFFFFFFFF",
            "FF00FCFDFDFF030202FF00000000FFFFFFFFFFFFFFFFFF00FCFDFCFFFFFFFFFF",
            NULL
F
FdaSilvaYY 已提交
469
        };
470 471 472 473 474 475 476 477 478 479 480 481 482 483
        static const char *nhex[] = {
                      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F8000000",
            "00000010000000006C0000000000000000000000000000000000000000000000",
            "00000000000000000000000000000000000000FFFFFFFFFFFFF8F8F8F8000000",
            "00000010000000006C000000000000000000000000FFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFF000000000000000000000000000000000000FFFFFFFFFFFFFFFF",
            "FFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            NULL
F
FdaSilvaYY 已提交
484 485
        };

S
Shane Lontis 已提交
486 487 488
        if (!(TEST_true(parse_bigBN(&a, ahex))
                && TEST_true(parse_bigBN(&n, nhex))))
            goto err;
489 490
    }
    BN_free(b);
S
Shane Lontis 已提交
491 492 493 494
    if (!(TEST_ptr(b = BN_dup(a))
            && TEST_true(BN_MONT_CTX_set(mont, n, ctx))))
        goto err;

495 496 497 498 499 500
    if (!TEST_true(BN_mod_mul_montgomery(c, a, a, mont, ctx))
            || !TEST_true(BN_mod_mul_montgomery(d, a, b, mont, ctx))
            || !TEST_BN_eq(c, d))
        goto err;

    /* Regression test for bug in BN_from_montgomery_word */
S
Shane Lontis 已提交
501
    if (!(TEST_true(BN_hex2bn(&a,
502 503
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
S
Shane Lontis 已提交
504 505
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"))
         && TEST_true(BN_hex2bn(&n,
506
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
S
Shane Lontis 已提交
507 508 509
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"))
        && TEST_true(BN_MONT_CTX_set(mont, n, ctx))
        && TEST_false(BN_mod_mul_montgomery(d, a, a, mont, ctx))))
510 511
        goto err;

512
    /* Regression test for bug in rsaz_1024_mul_avx2 */
S
Shane Lontis 已提交
513
    if (!(TEST_true(BN_hex2bn(&a,
514 515 516
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
S
Shane Lontis 已提交
517 518
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2020202020DF"))
        && TEST_true(BN_hex2bn(&b,
519 520 521
        "2020202020202020202020202020202020202020202020202020202020202020"
        "2020202020202020202020202020202020202020202020202020202020202020"
        "20202020202020FF202020202020202020202020202020202020202020202020"
S
Shane Lontis 已提交
522 523
        "2020202020202020202020202020202020202020202020202020202020202020"))
        && TEST_true(BN_hex2bn(&n,
524 525 526
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
S
Shane Lontis 已提交
527 528 529 530 531
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2020202020FF"))
        && TEST_true(BN_MONT_CTX_set(mont, n, ctx))
        && TEST_true(BN_mod_exp_mont_consttime(c, a, b, n, ctx, mont))
        && TEST_true(BN_mod_exp_mont(d, a, b, n, ctx, mont))
        && TEST_BN_eq(c, d)))
532 533
        goto err;

534 535 536 537
    /*
     * rsaz_1024_mul_avx2 expects fully-reduced inputs.
     * BN_mod_exp_mont_consttime should reduce the input first.
     */
S
Shane Lontis 已提交
538
    if (!(TEST_true(BN_hex2bn(&a,
539 540 541
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
S
Shane Lontis 已提交
542 543
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2020202020DF"))
        && TEST_true(BN_hex2bn(&b,
544 545 546
        "1FA53F26F8811C58BE0357897AA5E165693230BC9DF5F01DFA6A2D59229EC69D"
        "9DE6A89C36E3B6957B22D6FAAD5A3C73AE587B710DBE92E83D3A9A3339A085CB"
        "B58F508CA4F837924BB52CC1698B7FDC2FD74362456A595A5B58E38E38E38E38"
S
Shane Lontis 已提交
547 548
        "E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E"))
        && TEST_true(BN_hex2bn(&n,
549 550 551
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
S
Shane Lontis 已提交
552 553 554 555
        "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2020202020DF"))
        && TEST_true(BN_MONT_CTX_set(mont, n, ctx))
        && TEST_true(BN_mod_exp_mont_consttime(c, a, b, n, ctx, mont))))
        goto err;
556 557 558 559
    BN_zero(d);
    if (!TEST_BN_eq(c, d))
        goto err;

R
Rich Salz 已提交
560
    /* Zero input */
S
Shane Lontis 已提交
561 562
    if (!TEST_true(BN_bntest_rand(p, 1024, 0, 0)))
        goto err;
R
Rich Salz 已提交
563
    BN_zero(a);
R
Rich Salz 已提交
564
    if (!TEST_true(BN_mod_exp_mont_consttime(d, a, p, m, ctx, NULL))
565
            || !TEST_BN_eq_zero(d))
R
Rich Salz 已提交
566 567
        goto err;

R
Rich Salz 已提交
568 569 570 571 572
    /*
     * Craft an input whose Montgomery representation is 1, i.e., shorter
     * than the modulus m, in order to test the const time precomputation
     * scattering/gathering.
     */
S
Shane Lontis 已提交
573 574 575
    if (!(TEST_true(BN_one(a))
            && TEST_true(BN_MONT_CTX_set(mont, m, ctx))))
        goto err;
R
Rich Salz 已提交
576 577 578
    if (!TEST_true(BN_from_montgomery(e, a, mont, ctx))
            || !TEST_true(BN_mod_exp_mont_consttime(d, e, p, m, ctx, NULL))
            || !TEST_true(BN_mod_exp_simple(a, e, p, m, ctx))
579
            || !TEST_BN_eq(a, d))
R
Rich Salz 已提交
580 581
        goto err;

R
Rich Salz 已提交
582
    /* Finally, some regular test vectors. */
S
Shane Lontis 已提交
583 584 585 586
    if (!(TEST_true(BN_bntest_rand(e, 1024, 0, 0))
            && TEST_true(BN_mod_exp_mont_consttime(d, e, p, m, ctx, NULL))
            && TEST_true(BN_mod_exp_simple(a, e, p, m, ctx))
            && TEST_BN_eq(a, d)))
R
Rich Salz 已提交
587 588 589 590
        goto err;

    st = 1;

591
 err:
592 593
    BN_MONT_CTX_free(mont);
    BN_free(a);
R
Rich Salz 已提交
594 595
    BN_free(p);
    BN_free(m);
596
    BN_free(d);
R
Rich Salz 已提交
597 598
    BN_free(e);
    BN_free(b);
599
    BN_free(n);
R
Rich Salz 已提交
600
    BN_free(c);
R
Rich Salz 已提交
601
    return st;
602
}
603

R
Rich Salz 已提交
604
#ifndef OPENSSL_NO_EC2M
605
static int test_gf2m_add(void)
606
{
R
Rich Salz 已提交
607
    BIGNUM *a = NULL, *b = NULL, *c = NULL;
R
Rich Salz 已提交
608
    int i, st = 0;
609

R
Rich Salz 已提交
610 611 612 613
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b = BN_new())
            || !TEST_ptr(c = BN_new()))
        goto err;
614

R
Rich Salz 已提交
615
    for (i = 0; i < NUM0; i++) {
S
Shane Lontis 已提交
616 617 618
        if (!(TEST_true(BN_rand(a, 512, 0, 0))
                && TEST_ptr(BN_copy(b, BN_value_one()))))
            goto err;
619 620
        BN_set_negative(a, rand_neg());
        BN_set_negative(b, rand_neg());
S
Shane Lontis 已提交
621 622 623 624
        if (!(TEST_true(BN_GF2m_add(c, a, b))
                /* Test that two added values have the correct parity. */
                && TEST_false((BN_is_odd(a) && BN_is_odd(c))
                        || (!BN_is_odd(a) && !BN_is_odd(c)))))
R
Rich Salz 已提交
625
            goto err;
S
Shane Lontis 已提交
626 627 628
        if (!(TEST_true(BN_GF2m_add(c, c, c))
                /* Test that c + c = 0. */
                && TEST_BN_eq_zero(c)))
R
Rich Salz 已提交
629
            goto err;
630
    }
R
Rich Salz 已提交
631 632
    st = 1;
 err:
633 634 635
    BN_free(a);
    BN_free(b);
    BN_free(c);
R
Rich Salz 已提交
636
    return st;
637
}
638

639
static int test_gf2m_mod(void)
640
{
R
Rich Salz 已提交
641
    BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL, *e = NULL;
R
Rich Salz 已提交
642
    int i, j, st = 0;
643

R
Rich Salz 已提交
644 645 646 647 648 649 650
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b[0] = BN_new())
            || !TEST_ptr(b[1] = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new())
            || !TEST_ptr(e = BN_new()))
        goto err;
651

S
Shane Lontis 已提交
652 653 654
    if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
            && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
        goto err;
655

R
Rich Salz 已提交
656
    for (i = 0; i < NUM0; i++) {
S
Shane Lontis 已提交
657 658
        if (!TEST_true(BN_bntest_rand(a, 1024, 0, 0)))
            goto err;
R
Rich Salz 已提交
659
        for (j = 0; j < 2; j++) {
S
Shane Lontis 已提交
660 661 662 663 664
            if (!(TEST_true(BN_GF2m_mod(c, a, b[j]))
                    && TEST_true(BN_GF2m_add(d, a, c))
                    && TEST_true(BN_GF2m_mod(e, d, b[j]))
                    /* Test that a + (a mod p) mod p == 0. */
                    && TEST_BN_eq_zero(e)))
R
Rich Salz 已提交
665
                goto err;
666 667
        }
    }
R
Rich Salz 已提交
668 669
    st = 1;
 err:
670
    BN_free(a);
R
Rich Salz 已提交
671 672
    BN_free(b[0]);
    BN_free(b[1]);
673 674 675
    BN_free(c);
    BN_free(d);
    BN_free(e);
R
Rich Salz 已提交
676
    return st;
677
}
678

679
static int test_gf2m_mul(void)
680
{
R
Rich Salz 已提交
681 682
    BIGNUM *a, *b[2] = {NULL, NULL}, *c = NULL, *d = NULL;
    BIGNUM *e = NULL, *f = NULL, *g = NULL, *h = NULL;
R
Rich Salz 已提交
683
    int i, j, st = 0;
R
Rich Salz 已提交
684 685 686 687 688 689 690 691 692 693 694

    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b[0] = BN_new())
            || !TEST_ptr(b[1] = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new())
            || !TEST_ptr(e = BN_new())
            || !TEST_ptr(f = BN_new())
            || !TEST_ptr(g = BN_new())
            || !TEST_ptr(h = BN_new()))
        goto err;
695

S
Shane Lontis 已提交
696 697 698
    if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
            && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
        goto err;
699

R
Rich Salz 已提交
700
    for (i = 0; i < NUM0; i++) {
S
Shane Lontis 已提交
701 702 703 704
        if (!(TEST_true(BN_bntest_rand(a, 1024, 0, 0))
                && TEST_true(BN_bntest_rand(c, 1024, 0, 0))
                && TEST_true(BN_bntest_rand(d, 1024, 0, 0))))
            goto err;
R
Rich Salz 已提交
705
        for (j = 0; j < 2; j++) {
S
Shane Lontis 已提交
706 707 708 709 710 711 712 713
            if (!(TEST_true(BN_GF2m_mod_mul(e, a, c, b[j], ctx))
                    && TEST_true(BN_GF2m_add(f, a, d))
                    && TEST_true(BN_GF2m_mod_mul(g, f, c, b[j], ctx))
                    && TEST_true(BN_GF2m_mod_mul(h, d, c, b[j], ctx))
                    && TEST_true(BN_GF2m_add(f, e, g))
                    && TEST_true(BN_GF2m_add(f, f, h))
                    /* Test that (a+d)*c = a*c + d*c. */
                    && TEST_BN_eq_zero(f)))
R
Rich Salz 已提交
714
                goto err;
715
        }
716
    }
R
Rich Salz 已提交
717
    st = 1;
R
Rich Salz 已提交
718

R
Rich Salz 已提交
719
 err:
720
    BN_free(a);
R
Rich Salz 已提交
721 722
    BN_free(b[0]);
    BN_free(b[1]);
723 724 725
    BN_free(c);
    BN_free(d);
    BN_free(e);
R
Rich Salz 已提交
726 727 728 729
    BN_free(f);
    BN_free(g);
    BN_free(h);
    return st;
730
}
731

732
static int test_gf2m_sqr(void)
733
{
R
Rich Salz 已提交
734
    BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
R
Rich Salz 已提交
735
    int i, j, st = 0;
736

R
Rich Salz 已提交
737 738 739 740 741 742
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b[0] = BN_new())
            || !TEST_ptr(b[1] = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new()))
        goto err;
743

S
Shane Lontis 已提交
744 745 746
    if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
            && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
        goto err;
747

R
Rich Salz 已提交
748
    for (i = 0; i < NUM0; i++) {
S
Shane Lontis 已提交
749 750
        if (!TEST_true(BN_bntest_rand(a, 1024, 0, 0)))
                goto err;
R
Rich Salz 已提交
751
        for (j = 0; j < 2; j++) {
S
Shane Lontis 已提交
752 753 754 755 756 757
            if (!(TEST_true(BN_GF2m_mod_sqr(c, a, b[j], ctx))
                    && TEST_true(BN_copy(d, a))
                    && TEST_true(BN_GF2m_mod_mul(d, a, d, b[j], ctx))
                    && TEST_true(BN_GF2m_add(d, c, d))
                    /* Test that a*a = a^2. */
                    && TEST_BN_eq_zero(d)))
R
Rich Salz 已提交
758
                goto err;
759 760
        }
    }
R
Rich Salz 已提交
761 762
    st = 1;
 err:
763
    BN_free(a);
R
Rich Salz 已提交
764 765
    BN_free(b[0]);
    BN_free(b[1]);
766 767
    BN_free(c);
    BN_free(d);
R
Rich Salz 已提交
768
    return st;
769 770
}

771
static int test_gf2m_modinv(void)
772
{
R
Rich Salz 已提交
773
    BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
R
Rich Salz 已提交
774
    int i, j, st = 0;
775

R
Rich Salz 已提交
776 777 778 779 780 781
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b[0] = BN_new())
            || !TEST_ptr(b[1] = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new()))
        goto err;
782

S
Shane Lontis 已提交
783 784 785
    if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
            && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
        goto err;
786

R
Rich Salz 已提交
787
    for (i = 0; i < NUM0; i++) {
S
Shane Lontis 已提交
788 789
        if (!TEST_true(BN_bntest_rand(a, 512, 0, 0)))
            goto err;
790
        for (j = 0; j < 2; j++) {
S
Shane Lontis 已提交
791 792 793 794
            if (!(TEST_true(BN_GF2m_mod_inv(c, a, b[j], ctx))
                    && TEST_true(BN_GF2m_mod_mul(d, a, c, b[j], ctx))
                    /* Test that ((1/a)*a) = 1. */
                    && TEST_BN_eq_one(d)))
795 796 797
                goto err;
        }
    }
R
Rich Salz 已提交
798
    st = 1;
799 800 801 802 803 804
 err:
    BN_free(a);
    BN_free(b[0]);
    BN_free(b[1]);
    BN_free(c);
    BN_free(d);
R
Rich Salz 已提交
805
    return st;
806 807
}

808
static int test_gf2m_moddiv(void)
809
{
R
Rich Salz 已提交
810 811
    BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
    BIGNUM *e = NULL, *f = NULL;
R
Rich Salz 已提交
812
    int i, j, st = 0;
813

R
Rich Salz 已提交
814 815 816 817 818 819 820 821
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b[0] = BN_new())
            || !TEST_ptr(b[1] = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new())
            || !TEST_ptr(e = BN_new())
            || !TEST_ptr(f = BN_new()))
        goto err;
822

S
Shane Lontis 已提交
823 824 825
    if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
            && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
        goto err;
826

R
Rich Salz 已提交
827
    for (i = 0; i < NUM0; i++) {
S
Shane Lontis 已提交
828 829 830
        if (!(TEST_true(BN_bntest_rand(a, 512, 0, 0))
                && TEST_true(BN_bntest_rand(c, 512, 0, 0))))
            goto err;
831
        for (j = 0; j < 2; j++) {
S
Shane Lontis 已提交
832 833 834 835 836
            if (!(TEST_true(BN_GF2m_mod_div(d, a, c, b[j], ctx))
                    && TEST_true(BN_GF2m_mod_mul(e, d, c, b[j], ctx))
                    && TEST_true(BN_GF2m_mod_div(f, a, e, b[j], ctx))
                    /* Test that ((a/c)*c)/a = 1. */
                    && TEST_BN_eq_one(f)))
837 838 839
                goto err;
        }
    }
R
Rich Salz 已提交
840
    st = 1;
841 842 843 844 845 846 847 848
 err:
    BN_free(a);
    BN_free(b[0]);
    BN_free(b[1]);
    BN_free(c);
    BN_free(d);
    BN_free(e);
    BN_free(f);
R
Rich Salz 已提交
849
    return st;
850 851
}

852
static int test_gf2m_modexp(void)
853
{
R
Rich Salz 已提交
854 855
    BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
    BIGNUM *e = NULL, *f = NULL;
R
Rich Salz 已提交
856
    int i, j, st = 0;
857

R
Rich Salz 已提交
858 859 860 861 862 863 864 865
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b[0] = BN_new())
            || !TEST_ptr(b[1] = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new())
            || !TEST_ptr(e = BN_new())
            || !TEST_ptr(f = BN_new()))
        goto err;
866

S
Shane Lontis 已提交
867 868 869
    if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
            && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
        goto err;
870

R
Rich Salz 已提交
871
    for (i = 0; i < NUM0; i++) {
S
Shane Lontis 已提交
872 873 874 875
        if (!(TEST_true(BN_bntest_rand(a, 512, 0, 0))
                && TEST_true(BN_bntest_rand(c, 512, 0, 0))
                && TEST_true(BN_bntest_rand(d, 512, 0, 0))))
            goto err;
876
        for (j = 0; j < 2; j++) {
S
Shane Lontis 已提交
877 878 879 880 881 882 883 884
            if (!(TEST_true(BN_GF2m_mod_exp(e, a, c, b[j], ctx))
                    && TEST_true(BN_GF2m_mod_exp(f, a, d, b[j], ctx))
                    && TEST_true(BN_GF2m_mod_mul(e, e, f, b[j], ctx))
                    && TEST_true(BN_add(f, c, d))
                    && TEST_true(BN_GF2m_mod_exp(f, a, f, b[j], ctx))
                    && TEST_true(BN_GF2m_add(f, e, f))
                    /* Test that a^(c+d)=a^c*a^d. */
                    && TEST_BN_eq_zero(f)))
885 886 887
                goto err;
        }
    }
R
Rich Salz 已提交
888
    st = 1;
889 890 891 892 893 894 895 896
 err:
    BN_free(a);
    BN_free(b[0]);
    BN_free(b[1]);
    BN_free(c);
    BN_free(d);
    BN_free(e);
    BN_free(f);
R
Rich Salz 已提交
897
    return st;
898 899
}

900
static int test_gf2m_modsqrt(void)
901
{
R
Rich Salz 已提交
902 903
    BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
    BIGNUM *e = NULL, *f = NULL;
R
Rich Salz 已提交
904
    int i, j, st = 0;
905

R
Rich Salz 已提交
906 907 908 909 910 911 912 913
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b[0] = BN_new())
            || !TEST_ptr(b[1] = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new())
            || !TEST_ptr(e = BN_new())
            || !TEST_ptr(f = BN_new()))
        goto err;
914

S
Shane Lontis 已提交
915 916 917
    if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
            && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
        goto err;
918

R
Rich Salz 已提交
919
    for (i = 0; i < NUM0; i++) {
S
Shane Lontis 已提交
920 921 922
        if (!TEST_true(BN_bntest_rand(a, 512, 0, 0)))
            goto err;

923
        for (j = 0; j < 2; j++) {
S
Shane Lontis 已提交
924 925 926 927 928 929
            if (!(TEST_true(BN_GF2m_mod(c, a, b[j]))
                    && TEST_true(BN_GF2m_mod_sqrt(d, a, b[j], ctx))
                    && TEST_true(BN_GF2m_mod_sqr(e, d, b[j], ctx))
                    && TEST_true(BN_GF2m_add(f, c, e))
                    /* Test that d^2 = a, where d = sqrt(a). */
                    && TEST_BN_eq_zero(f)))
930 931 932
                goto err;
        }
    }
R
Rich Salz 已提交
933
    st = 1;
934 935 936 937 938 939 940 941
 err:
    BN_free(a);
    BN_free(b[0]);
    BN_free(b[1]);
    BN_free(c);
    BN_free(d);
    BN_free(e);
    BN_free(f);
R
Rich Salz 已提交
942
    return st;
943 944
}

945
static int test_gf2m_modsolvequad(void)
946
{
R
Rich Salz 已提交
947 948
    BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
    BIGNUM *e = NULL;
R
Rich Salz 已提交
949
    int i, j, s = 0, t, st = 0;
950

R
Rich Salz 已提交
951 952 953 954 955 956 957
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b[0] = BN_new())
            || !TEST_ptr(b[1] = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new())
            || !TEST_ptr(e = BN_new()))
        goto err;
958

S
Shane Lontis 已提交
959 960 961
    if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
            && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
        goto err;
962

R
Rich Salz 已提交
963
    for (i = 0; i < NUM0; i++) {
S
Shane Lontis 已提交
964 965
        if (!TEST_true(BN_bntest_rand(a, 512, 0, 0)))
            goto err;
966 967 968 969
        for (j = 0; j < 2; j++) {
            t = BN_GF2m_mod_solve_quad(c, a, b[j], ctx);
            if (t) {
                s++;
S
Shane Lontis 已提交
970 971 972 973 974 975 976 977 978
                if (!(TEST_true(BN_GF2m_mod_sqr(d, c, b[j], ctx))
                        && TEST_true(BN_GF2m_add(d, c, d))
                        && TEST_true(BN_GF2m_mod(e, a, b[j]))
                        && TEST_true(BN_GF2m_add(e, e, d))
                        /*
                         * Test that solution of quadratic c
                         * satisfies c^2 + c = a.
                         */
                        && TEST_BN_eq_zero(e)))
979 980 981 982
                    goto err;
            }
        }
    }
R
Rich Salz 已提交
983 984
    if (!TEST_int_ge(s, 0)) {
        TEST_info("%d tests found no roots; probably an error", NUM0);
985 986
        goto err;
    }
R
Rich Salz 已提交
987
    st = 1;
988 989 990 991 992 993 994
 err:
    BN_free(a);
    BN_free(b[0]);
    BN_free(b[1]);
    BN_free(c);
    BN_free(d);
    BN_free(e);
R
Rich Salz 已提交
995
    return st;
996
}
997
#endif
R
Rich Salz 已提交
998

999
static int test_kronecker(void)
1000
{
R
Rich Salz 已提交
1001 1002
    BIGNUM *a = NULL, *b = NULL, *r = NULL, *t = NULL;
    int i, legendre, kronecker, st = 0;
R
Rich Salz 已提交
1003

R
Rich Salz 已提交
1004 1005 1006 1007
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b = BN_new())
            || !TEST_ptr(r = BN_new())
            || !TEST_ptr(t = BN_new()))
R
Rich Salz 已提交
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
        goto err;

    /*
     * We test BN_kronecker(a, b, ctx) just for b odd (Jacobi symbol). In
     * this case we know that if b is prime, then BN_kronecker(a, b, ctx) is
     * congruent to $a^{(b-1)/2}$, modulo $b$ (Legendre symbol). So we
     * generate a random prime b and compare these values for a number of
     * random a's.  (That is, we run the Solovay-Strassen primality test to
     * confirm that b is prime, except that we don't want to test whether b
     * is prime but whether BN_kronecker works.)
     */

R
Rich Salz 已提交
1020
    if (!TEST_true(BN_generate_prime_ex(b, 512, 0, NULL, NULL, NULL)))
R
Rich Salz 已提交
1021
        goto err;
1022
    BN_set_negative(b, rand_neg());
R
Rich Salz 已提交
1023 1024

    for (i = 0; i < NUM0; i++) {
R
Rich Salz 已提交
1025
        if (!TEST_true(BN_bntest_rand(a, 512, 0, 0)))
R
Rich Salz 已提交
1026
            goto err;
1027
        BN_set_negative(a, rand_neg());
R
Rich Salz 已提交
1028 1029

        /* t := (|b|-1)/2  (note that b is odd) */
R
Rich Salz 已提交
1030
        if (!TEST_true(BN_copy(t, b)))
R
Rich Salz 已提交
1031
            goto err;
1032
        BN_set_negative(t, 0);
R
Rich Salz 已提交
1033
        if (!TEST_true(BN_sub_word(t, 1)))
R
Rich Salz 已提交
1034
            goto err;
R
Rich Salz 已提交
1035
        if (!TEST_true(BN_rshift1(t, t)))
R
Rich Salz 已提交
1036 1037
            goto err;
        /* r := a^t mod b */
1038
        BN_set_negative(b, 0);
R
Rich Salz 已提交
1039

R
Rich Salz 已提交
1040
        if (!TEST_true(BN_mod_exp_recp(r, a, t, b, ctx)))
R
Rich Salz 已提交
1041
            goto err;
1042
        BN_set_negative(b, 1);
R
Rich Salz 已提交
1043 1044 1045 1046 1047 1048

        if (BN_is_word(r, 1))
            legendre = 1;
        else if (BN_is_zero(r))
            legendre = 0;
        else {
R
Rich Salz 已提交
1049
            if (!TEST_true(BN_add_word(r, 1)))
R
Rich Salz 已提交
1050
                goto err;
R
Rich Salz 已提交
1051 1052
            if (!TEST_int_eq(BN_ucmp(r, b), 0)) {
                TEST_info("Legendre symbol computation failed");
R
Rich Salz 已提交
1053 1054 1055 1056 1057
                goto err;
            }
            legendre = -1;
        }

R
Rich Salz 已提交
1058
        if (!TEST_int_ge(kronecker = BN_kronecker(a, b, ctx), -1))
R
Rich Salz 已提交
1059 1060
            goto err;
        /* we actually need BN_kronecker(a, |b|) */
1061
        if (BN_is_negative(a) && BN_is_negative(b))
R
Rich Salz 已提交
1062 1063
            kronecker = -kronecker;

R
Rich Salz 已提交
1064
        if (!TEST_int_eq(legendre, kronecker))
R
Rich Salz 已提交
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
            goto err;
    }

    st = 1;
 err:
    BN_free(a);
    BN_free(b);
    BN_free(r);
    BN_free(t);
    return st;
}

static int file_sum(STANZA *s)
{
R
Rich Salz 已提交
1079
    BIGNUM *a = NULL, *b = NULL, *sum = NULL, *ret = NULL;
R
Rich Salz 已提交
1080 1081 1082
    BN_ULONG b_word;
    int st = 0;

R
Rich Salz 已提交
1083 1084 1085 1086
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(b = getBN(s, "B"))
            || !TEST_ptr(sum = getBN(s, "Sum"))
            || !TEST_ptr(ret = BN_new()))
R
Rich Salz 已提交
1087 1088
        goto err;

R
Rich Salz 已提交
1089
    if (!TEST_true(BN_add(ret, a, b))
R
Rich Salz 已提交
1090
            || !equalBN("A + B", sum, ret)
R
Rich Salz 已提交
1091
            || !TEST_true(BN_sub(ret, sum, a))
R
Rich Salz 已提交
1092
            || !equalBN("Sum - A", b, ret)
R
Rich Salz 已提交
1093
            || !TEST_true(BN_sub(ret, sum, b))
R
Rich Salz 已提交
1094 1095 1096 1097 1098 1099 1100 1101
            || !equalBN("Sum - B", a, ret))
        goto err;

    /*
     * Test that the functions work when |r| and |a| point to the same BIGNUM,
     * or when |r| and |b| point to the same BIGNUM.
     * TODO: Test where all of |r|, |a|, and |b| point to the same BIGNUM.
     */
R
Rich Salz 已提交
1102 1103
    if (!TEST_true(BN_copy(ret, a))
            || !TEST_true(BN_add(ret, ret, b))
R
Rich Salz 已提交
1104
            || !equalBN("A + B (r is a)", sum, ret)
R
Rich Salz 已提交
1105 1106
            || !TEST_true(BN_copy(ret, b))
            || !TEST_true(BN_add(ret, a, ret))
R
Rich Salz 已提交
1107
            || !equalBN("A + B (r is b)", sum, ret)
R
Rich Salz 已提交
1108 1109
            || !TEST_true(BN_copy(ret, sum))
            || !TEST_true(BN_sub(ret, ret, a))
R
Rich Salz 已提交
1110
            || !equalBN("Sum - A (r is a)", b, ret)
R
Rich Salz 已提交
1111 1112
            || !TEST_true(BN_copy(ret, a))
            || !TEST_true(BN_sub(ret, sum, ret))
R
Rich Salz 已提交
1113
            || !equalBN("Sum - A (r is b)", b, ret)
R
Rich Salz 已提交
1114 1115
            || !TEST_true(BN_copy(ret, sum))
            || !TEST_true(BN_sub(ret, ret, b))
R
Rich Salz 已提交
1116
            || !equalBN("Sum - B (r is a)", a, ret)
R
Rich Salz 已提交
1117 1118
            || !TEST_true(BN_copy(ret, b))
            || !TEST_true(BN_sub(ret, sum, ret))
R
Rich Salz 已提交
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129
            || !equalBN("Sum - B (r is b)", a, ret))
        goto err;

    /*
     * Test BN_uadd() and BN_usub() with the prerequisites they are
     * documented as having. Note that these functions are frequently used
     * when the prerequisites don't hold. In those cases, they are supposed
     * to work as if the prerequisite hold, but we don't test that yet.
     * TODO: test that.
     */
    if (!BN_is_negative(a) && !BN_is_negative(b) && BN_cmp(a, b) >= 0) {
R
Rich Salz 已提交
1130
        if (!TEST_true(BN_uadd(ret, a, b))
R
Rich Salz 已提交
1131
                || !equalBN("A +u B", sum, ret)
R
Rich Salz 已提交
1132
                || !TEST_true(BN_usub(ret, sum, a))
R
Rich Salz 已提交
1133
                || !equalBN("Sum -u A", b, ret)
R
Rich Salz 已提交
1134
                || !TEST_true(BN_usub(ret, sum, b))
R
Rich Salz 已提交
1135 1136 1137 1138 1139 1140 1141
                || !equalBN("Sum -u B", a, ret))
            goto err;
        /*
         * Test that the functions work when |r| and |a| point to the same
         * BIGNUM, or when |r| and |b| point to the same BIGNUM.
         * TODO: Test where all of |r|, |a|, and |b| point to the same BIGNUM.
         */
R
Rich Salz 已提交
1142 1143
        if (!TEST_true(BN_copy(ret, a))
                || !TEST_true(BN_uadd(ret, ret, b))
R
Rich Salz 已提交
1144
                || !equalBN("A +u B (r is a)", sum, ret)
R
Rich Salz 已提交
1145 1146
                || !TEST_true(BN_copy(ret, b))
                || !TEST_true(BN_uadd(ret, a, ret))
R
Rich Salz 已提交
1147
                || !equalBN("A +u B (r is b)", sum, ret)
R
Rich Salz 已提交
1148 1149
                || !TEST_true(BN_copy(ret, sum))
                || !TEST_true(BN_usub(ret, ret, a))
R
Rich Salz 已提交
1150
                || !equalBN("Sum -u A (r is a)", b, ret)
R
Rich Salz 已提交
1151 1152
                || !TEST_true(BN_copy(ret, a))
                || !TEST_true(BN_usub(ret, sum, ret))
R
Rich Salz 已提交
1153
                || !equalBN("Sum -u A (r is b)", b, ret)
R
Rich Salz 已提交
1154 1155
                || !TEST_true(BN_copy(ret, sum))
                || !TEST_true(BN_usub(ret, ret, b))
R
Rich Salz 已提交
1156
                || !equalBN("Sum -u B (r is a)", a, ret)
R
Rich Salz 已提交
1157 1158
                || !TEST_true(BN_copy(ret, b))
                || !TEST_true(BN_usub(ret, sum, ret))
R
Rich Salz 已提交
1159 1160 1161 1162 1163 1164 1165 1166 1167
                || !equalBN("Sum -u B (r is b)", a, ret))
            goto err;
    }

    /*
     * Test with BN_add_word() and BN_sub_word() if |b| is small enough.
     */
    b_word = BN_get_word(b);
    if (!BN_is_negative(b) && b_word != (BN_ULONG)-1) {
R
Rich Salz 已提交
1168 1169
        if (!TEST_true(BN_copy(ret, a))
                || !TEST_true(BN_add_word(ret, b_word))
R
Rich Salz 已提交
1170
                || !equalBN("A + B (word)", sum, ret)
R
Rich Salz 已提交
1171 1172
                || !TEST_true(BN_copy(ret, sum))
                || !TEST_true(BN_sub_word(ret, b_word))
R
Rich Salz 已提交
1173 1174 1175 1176 1177
                || !equalBN("Sum - B (word)", a, ret))
            goto err;
    }
    st = 1;

1178
 err:
R
Rich Salz 已提交
1179 1180 1181 1182 1183 1184 1185 1186 1187
    BN_free(a);
    BN_free(b);
    BN_free(sum);
    BN_free(ret);
    return st;
}

static int file_lshift1(STANZA *s)
{
R
Rich Salz 已提交
1188 1189
    BIGNUM *a = NULL, *lshift1 = NULL, *zero = NULL, *ret = NULL;
    BIGNUM *two = NULL, *remainder = NULL;
R
Rich Salz 已提交
1190 1191
    int st = 0;

R
Rich Salz 已提交
1192 1193 1194 1195 1196 1197
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(lshift1 = getBN(s, "LShift1"))
            || !TEST_ptr(zero = BN_new())
            || !TEST_ptr(ret = BN_new())
            || !TEST_ptr(two = BN_new())
            || !TEST_ptr(remainder = BN_new()))
R
Rich Salz 已提交
1198 1199 1200 1201
        goto err;

    BN_zero(zero);

R
Rich Salz 已提交
1202 1203
    if (!TEST_true(BN_set_word(two, 2))
            || !TEST_true(BN_add(ret, a, a))
R
Rich Salz 已提交
1204
            || !equalBN("A + A", lshift1, ret)
R
Rich Salz 已提交
1205
            || !TEST_true(BN_mul(ret, a, two, ctx))
R
Rich Salz 已提交
1206
            || !equalBN("A * 2", lshift1, ret)
R
Rich Salz 已提交
1207
            || !TEST_true(BN_div(ret, remainder, lshift1, two, ctx))
R
Rich Salz 已提交
1208 1209
            || !equalBN("LShift1 / 2", a, ret)
            || !equalBN("LShift1 % 2", zero, remainder)
R
Rich Salz 已提交
1210
            || !TEST_true(BN_lshift1(ret, a))
R
Rich Salz 已提交
1211
            || !equalBN("A << 1", lshift1, ret)
R
Rich Salz 已提交
1212
            || !TEST_true(BN_rshift1(ret, lshift1))
R
Rich Salz 已提交
1213
            || !equalBN("LShift >> 1", a, ret)
R
Rich Salz 已提交
1214
            || !TEST_true(BN_rshift1(ret, lshift1))
R
Rich Salz 已提交
1215 1216 1217 1218
            || !equalBN("LShift >> 1", a, ret))
        goto err;

    /* Set the LSB to 1 and test rshift1 again. */
R
Rich Salz 已提交
1219 1220
    if (!TEST_true(BN_set_bit(lshift1, 0))
            || !TEST_true(BN_div(ret, NULL /* rem */ , lshift1, two, ctx))
R
Rich Salz 已提交
1221
            || !equalBN("(LShift1 | 1) / 2", a, ret)
R
Rich Salz 已提交
1222
            || !TEST_true(BN_rshift1(ret, lshift1))
R
Rich Salz 已提交
1223 1224 1225 1226
            || !equalBN("(LShift | 1) >> 1", a, ret))
        goto err;

    st = 1;
1227
 err:
R
Rich Salz 已提交
1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239
    BN_free(a);
    BN_free(lshift1);
    BN_free(zero);
    BN_free(ret);
    BN_free(two);
    BN_free(remainder);

    return st;
}

static int file_lshift(STANZA *s)
{
R
Rich Salz 已提交
1240 1241
    BIGNUM *a = NULL, *lshift = NULL, *ret = NULL;
    int n = 0, st = 0;
R
Rich Salz 已提交
1242

R
Rich Salz 已提交
1243 1244
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(lshift = getBN(s, "LShift"))
M
Matt Caswell 已提交
1245 1246 1247
            || !TEST_ptr(ret = BN_new())
            || !getint(s, &n, "N"))
        goto err;
R
Rich Salz 已提交
1248

R
Rich Salz 已提交
1249
    if (!TEST_true(BN_lshift(ret, a, n))
R
Rich Salz 已提交
1250
            || !equalBN("A << N", lshift, ret)
R
Rich Salz 已提交
1251
            || !TEST_true(BN_rshift(ret, lshift, n))
R
Rich Salz 已提交
1252 1253 1254 1255
            || !equalBN("A >> N", a, ret))
        goto err;

    st = 1;
1256
 err:
R
Rich Salz 已提交
1257 1258 1259 1260 1261 1262 1263 1264
    BN_free(a);
    BN_free(lshift);
    BN_free(ret);
    return st;
}

static int file_rshift(STANZA *s)
{
R
Rich Salz 已提交
1265 1266
    BIGNUM *a = NULL, *rshift = NULL, *ret = NULL;
    int n = 0, st = 0;
R
Rich Salz 已提交
1267

R
Rich Salz 已提交
1268 1269 1270 1271
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(rshift = getBN(s, "RShift"))
            || !TEST_ptr(ret = BN_new())
            || !getint(s, &n, "N"))
R
Rich Salz 已提交
1272 1273
        goto err;

R
Rich Salz 已提交
1274
    if (!TEST_true(BN_rshift(ret, a, n))
R
Rich Salz 已提交
1275
            || !equalBN("A >> N", rshift, ret))
R
Rich Salz 已提交
1276
        goto err;
1277 1278 1279

    /* If N == 1, try with rshift1 as well */
    if (n == 1) {
R
Rich Salz 已提交
1280
        if (!TEST_true(BN_rshift1(ret, a))
1281
                || !equalBN("A >> 1 (rshift1)", rshift, ret))
R
Rich Salz 已提交
1282
            goto err;
1283
    }
R
Rich Salz 已提交
1284
    st = 1;
R
Rich Salz 已提交
1285

1286
 err:
R
Rich Salz 已提交
1287 1288 1289
    BN_free(a);
    BN_free(rshift);
    BN_free(ret);
R
Rich Salz 已提交
1290
    return st;
R
Rich Salz 已提交
1291 1292 1293 1294
}

static int file_square(STANZA *s)
{
R
Rich Salz 已提交
1295 1296
    BIGNUM *a = NULL, *square = NULL, *zero = NULL, *ret = NULL;
    BIGNUM *remainder = NULL, *tmp = NULL;
R
Rich Salz 已提交
1297 1298
    int st = 0;

R
Rich Salz 已提交
1299 1300 1301 1302 1303
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(square = getBN(s, "Square"))
            || !TEST_ptr(zero = BN_new())
            || !TEST_ptr(ret = BN_new())
            || !TEST_ptr(remainder = BN_new()))
R
Rich Salz 已提交
1304 1305 1306
        goto err;

    BN_zero(zero);
R
Rich Salz 已提交
1307
    if (!TEST_true(BN_sqr(ret, a, ctx))
R
Rich Salz 已提交
1308
            || !equalBN("A^2", square, ret)
R
Rich Salz 已提交
1309
            || !TEST_true(BN_mul(ret, a, a, ctx))
R
Rich Salz 已提交
1310
            || !equalBN("A * A", square, ret)
R
Rich Salz 已提交
1311
            || !TEST_true(BN_div(ret, remainder, square, a, ctx))
R
Rich Salz 已提交
1312 1313 1314 1315 1316 1317
            || !equalBN("Square / A", a, ret)
            || !equalBN("Square % A", zero, remainder))
        goto err;

#if HAVE_BN_SQRT
    BN_set_negative(a, 0);
R
Rich Salz 已提交
1318
    if (!TEST_true(BN_sqrt(ret, square, ctx))
R
Rich Salz 已提交
1319 1320 1321 1322
            || !equalBN("sqrt(Square)", a, ret))
        goto err;

    /* BN_sqrt should fail on non-squares and negative numbers. */
1323 1324 1325
    if (!TEST_BN_eq_zero(square)) {
        if (!TEST_ptr(tmp = BN_new())
                || !TEST_true(BN_copy(tmp, square)))
R
Rich Salz 已提交
1326 1327 1328
            goto err;
        BN_set_negative(tmp, 1);

R
Rich Salz 已提交
1329
        if (!TEST_int_eq(BN_sqrt(ret, tmp, ctx), 0))
R
Rich Salz 已提交
1330 1331 1332 1333 1334 1335
            goto err;
        ERR_clear_error();

        BN_set_negative(tmp, 0);
        if (BN_add(tmp, tmp, BN_value_one()))
            goto err;
R
Rich Salz 已提交
1336
        if (!TEST_int_eq(BN_sqrt(ret, tmp, ctx)))
R
Rich Salz 已提交
1337 1338 1339 1340 1341 1342
            goto err;
        ERR_clear_error();
    }
#endif

    st = 1;
1343
 err:
R
Rich Salz 已提交
1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354
    BN_free(a);
    BN_free(square);
    BN_free(zero);
    BN_free(ret);
    BN_free(remainder);
    BN_free(tmp);
    return st;
}

static int file_product(STANZA *s)
{
R
Rich Salz 已提交
1355 1356
    BIGNUM *a = NULL, *b = NULL, *product = NULL, *ret = NULL;
    BIGNUM *remainder = NULL, *zero = NULL;
R
Rich Salz 已提交
1357 1358
    int st = 0;

R
Rich Salz 已提交
1359 1360 1361 1362 1363 1364
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(b = getBN(s, "B"))
            || !TEST_ptr(product = getBN(s, "Product"))
            || !TEST_ptr(ret = BN_new())
            || !TEST_ptr(remainder = BN_new())
            || !TEST_ptr(zero = BN_new()))
R
Rich Salz 已提交
1365 1366 1367 1368
        goto err;

    BN_zero(zero);

R
Rich Salz 已提交
1369
    if (!TEST_true(BN_mul(ret, a, b, ctx))
R
Rich Salz 已提交
1370
            || !equalBN("A * B", product, ret)
R
Rich Salz 已提交
1371
            || !TEST_true(BN_div(ret, remainder, product, a, ctx))
R
Rich Salz 已提交
1372 1373
            || !equalBN("Product / A", b, ret)
            || !equalBN("Product % A", zero, remainder)
R
Rich Salz 已提交
1374
            || !TEST_true(BN_div(ret, remainder, product, b, ctx))
R
Rich Salz 已提交
1375 1376 1377 1378 1379
            || !equalBN("Product / B", a, ret)
            || !equalBN("Product % B", zero, remainder))
        goto err;

    st = 1;
1380
 err:
R
Rich Salz 已提交
1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391
    BN_free(a);
    BN_free(b);
    BN_free(product);
    BN_free(ret);
    BN_free(remainder);
    BN_free(zero);
    return st;
}

static int file_quotient(STANZA *s)
{
R
Rich Salz 已提交
1392 1393
    BIGNUM *a = NULL, *b = NULL, *quotient = NULL, *remainder = NULL;
    BIGNUM *ret = NULL, *ret2 = NULL, *nnmod = NULL;
R
Rich Salz 已提交
1394 1395 1396
    BN_ULONG b_word, ret_word;
    int st = 0;

R
Rich Salz 已提交
1397 1398 1399 1400 1401 1402 1403
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(b = getBN(s, "B"))
            || !TEST_ptr(quotient = getBN(s, "Quotient"))
            || !TEST_ptr(remainder = getBN(s, "Remainder"))
            || !TEST_ptr(ret = BN_new())
            || !TEST_ptr(ret2 = BN_new())
            || !TEST_ptr(nnmod = BN_new()))
R
Rich Salz 已提交
1404 1405
        goto err;

R
Rich Salz 已提交
1406
    if (!TEST_true(BN_div(ret, ret2, a, b, ctx))
R
Rich Salz 已提交
1407 1408
            || !equalBN("A / B", quotient, ret)
            || !equalBN("A % B", remainder, ret2)
R
Rich Salz 已提交
1409 1410
            || !TEST_true(BN_mul(ret, quotient, b, ctx))
            || !TEST_true(BN_add(ret, ret, remainder))
R
Rich Salz 已提交
1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
            || !equalBN("Quotient * B + Remainder", a, ret))
        goto err;

    /*
     * Test with BN_mod_word() and BN_div_word() if the divisor is
     * small enough.
     */
    b_word = BN_get_word(b);
    if (!BN_is_negative(b) && b_word != (BN_ULONG)-1) {
        BN_ULONG remainder_word = BN_get_word(remainder);

        assert(remainder_word != (BN_ULONG)-1);
R
Rich Salz 已提交
1423
        if (!TEST_ptr(BN_copy(ret, a)))
R
Rich Salz 已提交
1424 1425 1426 1427
            goto err;
        ret_word = BN_div_word(ret, b_word);
        if (ret_word != remainder_word) {
#ifdef BN_DEC_FMT1
R
Rich Salz 已提交
1428 1429
            TEST_error(
                    "Got A %% B (word) = " BN_DEC_FMT1 ", wanted " BN_DEC_FMT1,
R
Rich Salz 已提交
1430 1431
                    ret_word, remainder_word);
#else
R
Rich Salz 已提交
1432
            TEST_error("Got A %% B (word) mismatch");
R
Rich Salz 已提交
1433 1434 1435 1436 1437 1438 1439 1440 1441
#endif
            goto err;
        }
        if (!equalBN ("A / B (word)", quotient, ret))
            goto err;

        ret_word = BN_mod_word(a, b_word);
        if (ret_word != remainder_word) {
#ifdef BN_DEC_FMT1
R
Rich Salz 已提交
1442 1443
            TEST_error(
                    "Got A %% B (word) = " BN_DEC_FMT1 ", wanted " BN_DEC_FMT1 "",
R
Rich Salz 已提交
1444 1445
                    ret_word, remainder_word);
#else
R
Rich Salz 已提交
1446
            TEST_error("Got A %% B (word) mismatch");
R
Rich Salz 已提交
1447 1448 1449 1450 1451 1452 1453
#endif
            goto err;
        }
    }

    /* Test BN_nnmod. */
    if (!BN_is_negative(b)) {
R
Rich Salz 已提交
1454 1455 1456 1457
        if (!TEST_true(BN_copy(nnmod, remainder))
                || (BN_is_negative(nnmod)
                        && !TEST_true(BN_add(nnmod, nnmod, b)))
                || !TEST_true(BN_nnmod(ret, a, b, ctx))
R
Rich Salz 已提交
1458 1459 1460 1461 1462
                || !equalBN("A % B (non-negative)", nnmod, ret))
            goto err;
    }

    st = 1;
1463
 err:
R
Rich Salz 已提交
1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475
    BN_free(a);
    BN_free(b);
    BN_free(quotient);
    BN_free(remainder);
    BN_free(ret);
    BN_free(ret2);
    BN_free(nnmod);
    return st;
}

static int file_modmul(STANZA *s)
{
R
Rich Salz 已提交
1476
    BIGNUM *a = NULL, *b = NULL, *m = NULL, *mod_mul = NULL, *ret = NULL;
R
Rich Salz 已提交
1477 1478
    int st = 0;

R
Rich Salz 已提交
1479 1480 1481 1482 1483
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(b = getBN(s, "B"))
            || !TEST_ptr(m = getBN(s, "M"))
            || !TEST_ptr(mod_mul = getBN(s, "ModMul"))
            || !TEST_ptr(ret = BN_new()))
R
Rich Salz 已提交
1484 1485
        goto err;

R
Rich Salz 已提交
1486
    if (!TEST_true(BN_mod_mul(ret, a, b, m, ctx))
R
Rich Salz 已提交
1487 1488 1489 1490 1491 1492 1493 1494
            || !equalBN("A * B (mod M)", mod_mul, ret))
        goto err;

    if (BN_is_odd(m)) {
        /* Reduce |a| and |b| and test the Montgomery version. */
        BN_MONT_CTX *mont = BN_MONT_CTX_new();
        BIGNUM *a_tmp = BN_new();
        BIGNUM *b_tmp = BN_new();
R
Rich Salz 已提交
1495

R
Rich Salz 已提交
1496
        if (mont == NULL || a_tmp == NULL || b_tmp == NULL
R
Rich Salz 已提交
1497 1498 1499 1500 1501 1502 1503 1504 1505
                || !TEST_true(BN_MONT_CTX_set(mont, m, ctx))
                || !TEST_true(BN_nnmod(a_tmp, a, m, ctx))
                || !TEST_true(BN_nnmod(b_tmp, b, m, ctx))
                || !TEST_true(BN_to_montgomery(a_tmp, a_tmp, mont, ctx))
                || !TEST_true(BN_to_montgomery(b_tmp, b_tmp, mont, ctx))
                || !TEST_true(BN_mod_mul_montgomery(ret, a_tmp, b_tmp,
                                                    mont, ctx))
                || !TEST_true(BN_from_montgomery(ret, ret, mont, ctx))
                || !equalBN("A * B (mod M) (mont)", mod_mul, ret))
R
Rich Salz 已提交
1506
            st = 0;
R
Rich Salz 已提交
1507
        else
R
Rich Salz 已提交
1508 1509 1510 1511 1512 1513 1514 1515 1516
            st = 1;
        BN_MONT_CTX_free(mont);
        BN_free(a_tmp);
        BN_free(b_tmp);
        if (st == 0)
            goto err;
    }

    st = 1;
1517
 err:
R
Rich Salz 已提交
1518 1519 1520 1521 1522 1523 1524 1525 1526 1527
    BN_free(a);
    BN_free(b);
    BN_free(m);
    BN_free(mod_mul);
    BN_free(ret);
    return st;
}

static int file_modexp(STANZA *s)
{
R
Rich Salz 已提交
1528 1529
    BIGNUM *a = NULL, *e = NULL, *m = NULL, *mod_exp = NULL, *ret = NULL;
    BIGNUM *b = NULL, *c = NULL, *d = NULL;
R
Rich Salz 已提交
1530 1531
    int st = 0;

R
Rich Salz 已提交
1532 1533 1534 1535 1536 1537
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(e = getBN(s, "E"))
            || !TEST_ptr(m = getBN(s, "M"))
            || !TEST_ptr(mod_exp = getBN(s, "ModExp"))
            || !TEST_ptr(ret = BN_new())
            || !TEST_ptr(d = BN_new()))
R
Rich Salz 已提交
1538 1539
        goto err;

R
Rich Salz 已提交
1540
    if (!TEST_true(BN_mod_exp(ret, a, e, m, ctx))
R
Rich Salz 已提交
1541 1542 1543 1544
            || !equalBN("A ^ E (mod M)", mod_exp, ret))
        goto err;

    if (BN_is_odd(m)) {
R
Rich Salz 已提交
1545
        if (!TEST_true(BN_mod_exp_mont(ret, a, e, m, ctx, NULL))
R
Rich Salz 已提交
1546
                || !equalBN("A ^ E (mod M) (mont)", mod_exp, ret)
R
Rich Salz 已提交
1547 1548
                || !TEST_true(BN_mod_exp_mont_consttime(ret, a, e, m,
                                                        ctx, NULL))
R
Rich Salz 已提交
1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562
                || !equalBN("A ^ E (mod M) (mont const", mod_exp, ret))
            goto err;
    }

    /* Regression test for carry propagation bug in sqr8x_reduction */
    BN_hex2bn(&a, "050505050505");
    BN_hex2bn(&b, "02");
    BN_hex2bn(&c,
        "4141414141414141414141274141414141414141414141414141414141414141"
        "4141414141414141414141414141414141414141414141414141414141414141"
        "4141414141414141414141800000000000000000000000000000000000000000"
        "0000000000000000000000000000000000000000000000000000000000000000"
        "0000000000000000000000000000000000000000000000000000000000000000"
        "0000000000000000000000000000000000000000000000000000000001");
1563 1564 1565
    if (!TEST_true(BN_mod_exp(d, a, b, c, ctx))
        || !TEST_true(BN_mul(e, a, a, ctx))
        || !TEST_BN_eq(d, e))
R
Rich Salz 已提交
1566 1567 1568
        goto err;

    st = 1;
1569
 err:
R
Rich Salz 已提交
1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582
    BN_free(a);
    BN_free(b);
    BN_free(c);
    BN_free(d);
    BN_free(e);
    BN_free(m);
    BN_free(mod_exp);
    BN_free(ret);
    return st;
}

static int file_exp(STANZA *s)
{
R
Rich Salz 已提交
1583
    BIGNUM *a = NULL, *e = NULL, *exp = NULL, *ret = NULL;
R
Rich Salz 已提交
1584 1585
    int st = 0;

R
Rich Salz 已提交
1586 1587 1588 1589
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(e = getBN(s, "E"))
            || !TEST_ptr(exp = getBN(s, "Exp"))
            || !TEST_ptr(ret = BN_new()))
R
Rich Salz 已提交
1590 1591
        goto err;

R
Rich Salz 已提交
1592
    if (!TEST_true(BN_exp(ret, a, e, ctx))
R
Rich Salz 已提交
1593 1594 1595 1596
            || !equalBN("A ^ E", exp, ret))
        goto err;

    st = 1;
1597
 err:
R
Rich Salz 已提交
1598 1599 1600 1601 1602 1603 1604 1605 1606
    BN_free(a);
    BN_free(e);
    BN_free(exp);
    BN_free(ret);
    return st;
}

static int file_modsqrt(STANZA *s)
{
R
Rich Salz 已提交
1607
    BIGNUM *a = NULL, *p = NULL, *mod_sqrt = NULL, *ret = NULL, *ret2 = NULL;
R
Rich Salz 已提交
1608 1609
    int st = 0;

R
Rich Salz 已提交
1610 1611 1612 1613 1614
    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(p = getBN(s, "P"))
            || !TEST_ptr(mod_sqrt = getBN(s, "ModSqrt"))
            || !TEST_ptr(ret = BN_new())
            || !TEST_ptr(ret2 = BN_new()))
R
Rich Salz 已提交
1615 1616 1617
        goto err;

    /* There are two possible answers. */
R
Rich Salz 已提交
1618 1619
    if (!TEST_true(BN_mod_sqrt(ret, a, p, ctx))
            || !TEST_true(BN_sub(ret2, p, ret)))
R
Rich Salz 已提交
1620 1621
        goto err;

R
Rich Salz 已提交
1622
    /* The first condition should NOT be a test. */
R
Rich Salz 已提交
1623 1624 1625 1626 1627
    if (BN_cmp(ret2, mod_sqrt) != 0
            && !equalBN("sqrt(A) (mod P)", mod_sqrt, ret))
        goto err;

    st = 1;
1628
 err:
R
Rich Salz 已提交
1629 1630 1631 1632 1633 1634 1635 1636
    BN_free(a);
    BN_free(p);
    BN_free(mod_sqrt);
    BN_free(ret);
    BN_free(ret2);
    return st;
}

1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660
static int file_gcd(STANZA *s)
{
    BIGNUM *a = NULL, *b = NULL, *gcd = NULL, *ret = NULL;
    int st = 0;

    if (!TEST_ptr(a = getBN(s, "A"))
            || !TEST_ptr(b = getBN(s, "B"))
            || !TEST_ptr(gcd = getBN(s, "GCD"))
            || !TEST_ptr(ret = BN_new()))
        goto err;

    if (!TEST_true(BN_gcd(ret, a, b, ctx))
            || !equalBN("gcd(A,B)", gcd, ret))
        goto err;

    st = 1;
 err:
    BN_free(a);
    BN_free(b);
    BN_free(gcd);
    BN_free(ret);
    return st;
}

1661
static int test_bn2padded(void)
R
Rich Salz 已提交
1662 1663 1664 1665 1666 1667 1668 1669 1670
{
#if HAVE_BN_PADDED
    uint8_t zeros[256], out[256], reference[128];
    BIGNUM *n = BN_new();
    int st = 0;

    /* Test edge case at 0. */
    if (n == NULL)
        goto err;
R
Rich Salz 已提交
1671
    if (!TEST_true(BN_bn2bin_padded(NULL, 0, n)))
R
Rich Salz 已提交
1672 1673
        goto err;
    memset(out, -1, sizeof(out));
R
Rich Salz 已提交
1674
    if (!TEST_true(BN_bn2bin_padded(out, sizeof(out)), n))
R
Rich Salz 已提交
1675 1676
        goto err;
    memset(zeros, 0, sizeof(zeros));
R
Rich Salz 已提交
1677
    if (!TEST_mem_eq(zeros, sizeof(zeros), out, sizeof(out)))
R
Rich Salz 已提交
1678 1679 1680 1681
        goto err;

    /* Test a random numbers at various byte lengths. */
    for (size_t bytes = 128 - 7; bytes <= 128; bytes++) {
1682 1683
# define TOP_BIT_ON 0
# define BOTTOM_BIT_NOTOUCH 0
R
Rich Salz 已提交
1684
        if (!TEST_true(BN_rand(n, bytes * 8, TOP_BIT_ON, BOTTOM_BIT_NOTOUCH)))
R
Rich Salz 已提交
1685
            goto err;
R
Rich Salz 已提交
1686 1687
        if (!TEST_int_eq(BN_num_bytes(n),A) bytes
                || TEST_int_eq(BN_bn2bin(n, reference), bytes))
R
Rich Salz 已提交
1688 1689
            goto err;
        /* Empty buffer should fail. */
R
Rich Salz 已提交
1690
        if (!TEST_int_eq(BN_bn2bin_padded(NULL, 0, n)), 0)
R
Rich Salz 已提交
1691 1692
            goto err;
        /* One byte short should fail. */
R
Rich Salz 已提交
1693
        if (BN_bn2bin_padded(out, bytes - 1, n))
R
Rich Salz 已提交
1694 1695
            goto err;
        /* Exactly right size should encode. */
R
Rich Salz 已提交
1696 1697
        if (!TEST_true(BN_bn2bin_padded(out, bytes, n))
                || TEST_mem_eq(out, bytes, reference, bytes))
R
Rich Salz 已提交
1698 1699
            goto err;
        /* Pad up one byte extra. */
R
Rich Salz 已提交
1700 1701 1702
        if (!TEST_true(BN_bn2bin_padded(out, bytes + 1, n))
                || !TEST_mem_eq(out + 1, bytes, reference, bytes)
                || !TEST_mem_eq(out, 1, zeros, 1))
R
Rich Salz 已提交
1703 1704
            goto err;
        /* Pad up to 256. */
R
Rich Salz 已提交
1705 1706 1707 1708 1709
        if (!TEST_true(BN_bn2bin_padded(out, sizeof(out)), n)
                || !TEST_mem_eq(out + sizeof(out) - bytes, bytes,
                                reference, bytes)
                || !TEST_mem_eq(out, sizseof(out) - bytes,
                                zeros, sizeof(out) - bytes))
R
Rich Salz 已提交
1710 1711 1712 1713
            goto err;
    }

    st = 1;
1714
 err:
R
Rich Salz 已提交
1715 1716 1717 1718 1719 1720 1721
    BN_free(n);
    return st;
#else
    return ctx != NULL;
#endif
}

1722
static int test_dec2bn(void)
R
Rich Salz 已提交
1723 1724 1725 1726
{
    BIGNUM *bn = NULL;
    int st = 0;

R
Rich Salz 已提交
1727
    if (!TEST_int_eq(parsedecBN(&bn, "0"), 1)
1728 1729 1730 1731 1732
            || !TEST_BN_eq_word(bn, 0)
            || !TEST_BN_eq_zero(bn)
            || !TEST_BN_le_zero(bn)
            || !TEST_BN_ge_zero(bn)
            || !TEST_BN_even(bn))
R
Rich Salz 已提交
1733 1734
        goto err;
    BN_free(bn);
1735
    bn = NULL;
R
Rich Salz 已提交
1736

R
Rich Salz 已提交
1737
    if (!TEST_int_eq(parsedecBN(&bn, "256"), 3)
1738 1739 1740 1741 1742
            || !TEST_BN_eq_word(bn, 256)
            || !TEST_BN_ge_zero(bn)
            || !TEST_BN_gt_zero(bn)
            || !TEST_BN_ne_zero(bn)
            || !TEST_BN_even(bn))
R
Rich Salz 已提交
1743 1744
        goto err;
    BN_free(bn);
1745
    bn = NULL;
R
Rich Salz 已提交
1746

R
Rich Salz 已提交
1747
    if (!TEST_int_eq(parsedecBN(&bn, "-42"), 3)
1748 1749 1750 1751 1752
            || !TEST_BN_abs_eq_word(bn, 42)
            || !TEST_BN_lt_zero(bn)
            || !TEST_BN_le_zero(bn)
            || !TEST_BN_ne_zero(bn)
            || !TEST_BN_even(bn))
R
Rich Salz 已提交
1753 1754
        goto err;
    BN_free(bn);
1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766
    bn = NULL;

    if (!TEST_int_eq(parsedecBN(&bn, "1"), 1)
            || !TEST_BN_eq_word(bn, 1)
            || !TEST_BN_ne_zero(bn)
            || !TEST_BN_gt_zero(bn)
            || !TEST_BN_ge_zero(bn)
            || !TEST_BN_eq_one(bn)
            || !TEST_BN_odd(bn))
        goto err;
    BN_free(bn);
    bn = NULL;
R
Rich Salz 已提交
1767

R
Rich Salz 已提交
1768
    if (!TEST_int_eq(parsedecBN(&bn, "-0"), 2)
1769 1770 1771 1772
            || !TEST_BN_eq_zero(bn)
            || !TEST_BN_ge_zero(bn)
            || !TEST_BN_le_zero(bn)
            || !TEST_BN_even(bn))
R
Rich Salz 已提交
1773 1774
        goto err;
    BN_free(bn);
1775
    bn = NULL;
R
Rich Salz 已提交
1776

R
Rich Salz 已提交
1777
    if (!TEST_int_eq(parsedecBN(&bn, "42trailing garbage is ignored"), 2)
1778 1779 1780 1781 1782
            || !TEST_BN_abs_eq_word(bn, 42)
            || !TEST_BN_ge_zero(bn)
            || !TEST_BN_gt_zero(bn)
            || !TEST_BN_ne_zero(bn)
            || !TEST_BN_even(bn))
R
Rich Salz 已提交
1783 1784 1785
        goto err;

    st = 1;
1786
 err:
R
Rich Salz 已提交
1787 1788 1789 1790
    BN_free(bn);
    return st;
}

1791
static int test_hex2bn(void)
R
Rich Salz 已提交
1792 1793
{
    BIGNUM *bn = NULL;
R
Rich Salz 已提交
1794
    int st = 0;
R
Rich Salz 已提交
1795

R
Rich Salz 已提交
1796
    if (!TEST_int_eq(parseBN(&bn, "0"), 1)
1797 1798 1799
            || !TEST_BN_eq_zero(bn)
            || !TEST_BN_ge_zero(bn)
            || !TEST_BN_even(bn))
R
Rich Salz 已提交
1800 1801
        goto err;
    BN_free(bn);
1802
    bn = NULL;
R
Rich Salz 已提交
1803

R
Rich Salz 已提交
1804
    if (!TEST_int_eq(parseBN(&bn, "256"), 3)
1805 1806 1807 1808 1809
            || !TEST_BN_eq_word(bn, 0x256)
            || !TEST_BN_ge_zero(bn)
            || !TEST_BN_gt_zero(bn)
            || !TEST_BN_ne_zero(bn)
            || !TEST_BN_even(bn))
R
Rich Salz 已提交
1810 1811
        goto err;
    BN_free(bn);
1812
    bn = NULL;
R
Rich Salz 已提交
1813

R
Rich Salz 已提交
1814
    if (!TEST_int_eq(parseBN(&bn, "-42"), 3)
1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829
            || !TEST_BN_abs_eq_word(bn, 0x42)
            || !TEST_BN_lt_zero(bn)
            || !TEST_BN_le_zero(bn)
            || !TEST_BN_ne_zero(bn)
            || !TEST_BN_even(bn))
        goto err;
    BN_free(bn);
    bn = NULL;

    if (!TEST_int_eq(parseBN(&bn, "cb"), 2)
            || !TEST_BN_eq_word(bn, 0xCB)
            || !TEST_BN_ge_zero(bn)
            || !TEST_BN_gt_zero(bn)
            || !TEST_BN_ne_zero(bn)
            || !TEST_BN_odd(bn))
R
Rich Salz 已提交
1830 1831
        goto err;
    BN_free(bn);
1832
    bn = NULL;
R
Rich Salz 已提交
1833

R
Rich Salz 已提交
1834
    if (!TEST_int_eq(parseBN(&bn, "-0"), 2)
1835 1836 1837 1838
            || !TEST_BN_eq_zero(bn)
            || !TEST_BN_ge_zero(bn)
            || !TEST_BN_le_zero(bn)
            || !TEST_BN_even(bn))
R
Rich Salz 已提交
1839 1840
        goto err;
    BN_free(bn);
1841
    bn = NULL;
R
Rich Salz 已提交
1842

R
Rich Salz 已提交
1843
    if (!TEST_int_eq(parseBN(&bn, "abctrailing garbage is ignored"), 3)
1844 1845 1846 1847 1848
            || !TEST_BN_eq_word(bn, 0xabc)
            || !TEST_BN_ge_zero(bn)
            || !TEST_BN_gt_zero(bn)
            || !TEST_BN_ne_zero(bn)
            || !TEST_BN_even(bn))
R
Rich Salz 已提交
1849 1850 1851
        goto err;
    st = 1;

1852
 err:
R
Rich Salz 已提交
1853 1854 1855 1856
    BN_free(bn);
    return st;
}

1857
static int test_asc2bn(void)
R
Rich Salz 已提交
1858
{
R
Rich Salz 已提交
1859
    BIGNUM *bn = NULL;
R
Rich Salz 已提交
1860 1861
    int st = 0;

R
Rich Salz 已提交
1862
    if (!TEST_ptr(bn = BN_new()))
R
Rich Salz 已提交
1863 1864
        goto err;

R
Rich Salz 已提交
1865
    if (!TEST_true(BN_asc2bn(&bn, "0"))
1866 1867
            || !TEST_BN_eq_zero(bn)
            || !TEST_BN_ge_zero(bn))
R
Rich Salz 已提交
1868 1869
        goto err;

R
Rich Salz 已提交
1870
    if (!TEST_true(BN_asc2bn(&bn, "256"))
1871 1872
            || !TEST_BN_eq_word(bn, 256)
            || !TEST_BN_ge_zero(bn))
R
Rich Salz 已提交
1873 1874
        goto err;

R
Rich Salz 已提交
1875
    if (!TEST_true(BN_asc2bn(&bn, "-42"))
1876 1877
            || !TEST_BN_abs_eq_word(bn, 42)
            || !TEST_BN_lt_zero(bn))
R
Rich Salz 已提交
1878 1879
        goto err;

R
Rich Salz 已提交
1880
    if (!TEST_true(BN_asc2bn(&bn, "0x1234"))
1881 1882
            || !TEST_BN_eq_word(bn, 0x1234)
            || !TEST_BN_ge_zero(bn))
R
Rich Salz 已提交
1883 1884
        goto err;

R
Rich Salz 已提交
1885
    if (!TEST_true(BN_asc2bn(&bn, "0X1234"))
1886 1887
            || !TEST_BN_eq_word(bn, 0x1234)
            || !TEST_BN_ge_zero(bn))
R
Rich Salz 已提交
1888 1889
        goto err;

R
Rich Salz 已提交
1890
    if (!TEST_true(BN_asc2bn(&bn, "-0xabcd"))
1891 1892
            || !TEST_BN_abs_eq_word(bn, 0xabcd)
            || !TEST_BN_lt_zero(bn))
R
Rich Salz 已提交
1893 1894
        goto err;

R
Rich Salz 已提交
1895
    if (!TEST_true(BN_asc2bn(&bn, "-0"))
1896 1897
            || !TEST_BN_eq_zero(bn)
            || !TEST_BN_ge_zero(bn))
R
Rich Salz 已提交
1898 1899 1900
        goto err;

    if (!TEST_true(BN_asc2bn(&bn, "123trailing garbage is ignored"))
1901 1902
            || !TEST_BN_eq_word(bn, 123)
            || !TEST_BN_ge_zero(bn))
R
Rich Salz 已提交
1903 1904 1905
        goto err;

    st = 1;
1906
 err:
R
Rich Salz 已提交
1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919
    BN_free(bn);
    return st;
}

static const MPITEST kMPITests[] = {
    {"0", "\x00\x00\x00\x00", 4},
    {"1", "\x00\x00\x00\x01\x01", 5},
    {"-1", "\x00\x00\x00\x01\x81", 5},
    {"128", "\x00\x00\x00\x02\x00\x80", 6},
    {"256", "\x00\x00\x00\x02\x01\x00", 6},
    {"-256", "\x00\x00\x00\x02\x81\x00", 6},
};

R
Rich Salz 已提交
1920
static int test_mpi(int i)
R
Rich Salz 已提交
1921 1922
{
    uint8_t scratch[8];
R
Rich Salz 已提交
1923
    const MPITEST *test = &kMPITests[i];
R
Rich Salz 已提交
1924
    size_t mpi_len, mpi_len2;
R
Rich Salz 已提交
1925
    BIGNUM *bn = NULL;
R
Rich Salz 已提交
1926 1927 1928
    BIGNUM *bn2 = NULL;
    int st = 0;

R
Rich Salz 已提交
1929 1930 1931 1932 1933 1934
    if (!TEST_ptr(bn = BN_new())
            || !TEST_true(BN_asc2bn(&bn, test->base10)))
        goto err;
    mpi_len = BN_bn2mpi(bn, NULL);
    if (!TEST_size_t_le(mpi_len, sizeof(scratch)))
        goto err;
R
Rich Salz 已提交
1935

R
Rich Salz 已提交
1936 1937 1938
    if (!TEST_size_t_eq(mpi_len2 = BN_bn2mpi(bn, scratch), mpi_len)
            || !TEST_mem_eq(test->mpi, test->mpi_len, scratch, mpi_len))
        goto err;
R
Rich Salz 已提交
1939

R
Rich Salz 已提交
1940 1941
    if (!TEST_ptr(bn2 = BN_mpi2bn(scratch, mpi_len, NULL)))
        goto err;
R
Rich Salz 已提交
1942

1943
    if (!TEST_BN_eq(bn, bn2)) {
R
Rich Salz 已提交
1944
        BN_free(bn2);
R
Rich Salz 已提交
1945
        goto err;
R
Rich Salz 已提交
1946
    }
R
Rich Salz 已提交
1947
    BN_free(bn2);
R
Rich Salz 已提交
1948 1949

    st = 1;
1950
 err:
R
Rich Salz 已提交
1951 1952
    BN_free(bn);
    return st;
1953
}
B
Bodo Möller 已提交
1954

1955
static int test_rand(void)
1956
{
R
Rich Salz 已提交
1957
    BIGNUM *bn = NULL;
R
Rich Salz 已提交
1958
    int st = 0;
1959

R
Rich Salz 已提交
1960
    if (!TEST_ptr(bn = BN_new()))
R
Rich Salz 已提交
1961
        return 0;
1962

R
Rich Salz 已提交
1963 1964 1965 1966
    /* Test BN_rand for degenerate cases with |top| and |bottom| parameters. */
    if (!TEST_false(BN_rand(bn, 0, 0 /* top */ , 0 /* bottom */ ))
            || !TEST_false(BN_rand(bn, 0, 1 /* top */ , 1 /* bottom */ ))
            || !TEST_true(BN_rand(bn, 1, 0 /* top */ , 0 /* bottom */ ))
1967
            || !TEST_BN_eq_one(bn)
R
Rich Salz 已提交
1968 1969
            || !TEST_false(BN_rand(bn, 1, 1 /* top */ , 0 /* bottom */ ))
            || !TEST_true(BN_rand(bn, 1, -1 /* top */ , 1 /* bottom */ ))
1970
            || !TEST_BN_eq_one(bn)
R
Rich Salz 已提交
1971
            || !TEST_true(BN_rand(bn, 2, 1 /* top */ , 0 /* bottom */ ))
1972
            || !TEST_BN_eq_word(bn, 3))
R
Rich Salz 已提交
1973
        goto err;
1974

R
Rich Salz 已提交
1975
    st = 1;
1976
 err:
R
Rich Salz 已提交
1977 1978 1979 1980
    BN_free(bn);
    return st;
}

P
Pauli 已提交
1981 1982
/*
 * Run some statistical tests to provide a degree confidence that the
1983 1984
 * BN_rand_range() function works as expected.  The test cases and
 * critical values are generated by the bn_rand_range script.
P
Pauli 已提交
1985
 *
1986 1987 1988
 * Each individual test is a Chi^2 goodness of fit for a specified number
 * of samples and range.  The samples are assumed to be independent and
 * that they are from a discrete uniform distribution.
P
Pauli 已提交
1989
 *
1990 1991 1992 1993
 * Some of these individual tests are expected to fail, the success/failure
 * of each is an independent Bernoulli trial.  The number of such successes
 * will form a binomial distribution.  The count of the successes is compared
 * against a precomputed critical value to determine the overall outcome.
P
Pauli 已提交
1994
 */
1995
struct rand_range_case {
P
Pauli 已提交
1996 1997 1998 1999 2000
    unsigned int range;
    unsigned int iterations;
    double critical;
};

2001 2002 2003
#include "bn_rand_range.h"

static int test_rand_range_single(size_t n)
P
Pauli 已提交
2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032
{
    const unsigned int range = rand_range_cases[n].range;
    const unsigned int iterations = rand_range_cases[n].iterations;
    const double critical = rand_range_cases[n].critical;
    const double expected = iterations / (double)range;
    double sum = 0;
    BIGNUM *rng = NULL, *val = NULL;
    size_t *counts;
    unsigned int i, v;
    int res = 0;

    if (!TEST_ptr(counts = OPENSSL_zalloc(sizeof(*counts) * range))
        || !TEST_ptr(rng = BN_new())
        || !TEST_ptr(val = BN_new())
        || !TEST_true(BN_set_word(rng, range)))
        goto err;
    for (i = 0; i < iterations; i++) {
        if (!TEST_true(BN_rand_range(val, rng))
            || !TEST_uint_lt(v = (unsigned int)BN_get_word(val), range))
            goto err;
        counts[v]++;
    }

    for (i = 0; i < range; i++) {
        const double delta = counts[i] - expected;
        sum += delta * delta;
    }
    sum /= expected;

2033 2034 2035 2036 2037 2038 2039 2040
    if (sum > critical) {
        TEST_info("Chi^2 test negative %.4f > %4.f", sum, critical);
        TEST_note("test case %zu  range %u  iterations %u", n + 1, range,
                  iterations);
        goto err;
    }

    res = 1;
P
Pauli 已提交
2041 2042 2043 2044 2045 2046 2047
err:
    BN_free(rng);
    BN_free(val);
    OPENSSL_free(counts);
    return res;
}

2048 2049 2050 2051 2052 2053 2054 2055 2056
static int test_rand_range(void)
{
    int n_success = 0;
    size_t i;

    for (i = 0; i < OSSL_NELEM(rand_range_cases); i++)
        n_success += test_rand_range_single(i);
    if (TEST_int_ge(n_success, binomial_critical))
        return 1;
V
Veres Lajos 已提交
2057
    TEST_note("This test is expected to fail by chance 0.01%% of the time.");
2058 2059 2060
    return 0;
}

2061
static int test_negzero(void)
R
Rich Salz 已提交
2062
{
R
Rich Salz 已提交
2063
    BIGNUM *a = NULL, *b = NULL, *c = NULL, *d = NULL;
R
Rich Salz 已提交
2064 2065 2066
    BIGNUM *numerator = NULL, *denominator = NULL;
    int consttime, st = 0;

R
Rich Salz 已提交
2067 2068 2069 2070
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b = BN_new())
            || !TEST_ptr(c = BN_new())
            || !TEST_ptr(d = BN_new()))
R
Rich Salz 已提交
2071 2072 2073
        goto err;

    /* Test that BN_mul never gives negative zero. */
R
Rich Salz 已提交
2074
    if (!TEST_true(BN_set_word(a, 1)))
R
Rich Salz 已提交
2075 2076 2077
        goto err;
    BN_set_negative(a, 1);
    BN_zero(b);
R
Rich Salz 已提交
2078
    if (!TEST_true(BN_mul(c, a, b, ctx)))
R
Rich Salz 已提交
2079
        goto err;
2080 2081
    if (!TEST_BN_eq_zero(c)
            || !TEST_BN_ge_zero(c))
R
Rich Salz 已提交
2082 2083 2084
        goto err;

    for (consttime = 0; consttime < 2; consttime++) {
R
Rich Salz 已提交
2085 2086
        if (!TEST_ptr(numerator = BN_new())
                || !TEST_ptr(denominator = BN_new()))
2087
            goto err;
R
Rich Salz 已提交
2088 2089 2090 2091 2092
        if (consttime) {
            BN_set_flags(numerator, BN_FLG_CONSTTIME);
            BN_set_flags(denominator, BN_FLG_CONSTTIME);
        }
        /* Test that BN_div never gives negative zero in the quotient. */
R
Rich Salz 已提交
2093 2094
        if (!TEST_true(BN_set_word(numerator, 1))
                || !TEST_true(BN_set_word(denominator, 2)))
2095
            goto err;
R
Rich Salz 已提交
2096
        BN_set_negative(numerator, 1);
R
Rich Salz 已提交
2097
        if (!TEST_true(BN_div(a, b, numerator, denominator, ctx))
2098 2099
                || !TEST_BN_eq_zero(a)
                || !TEST_BN_ge_zero(a))
2100 2101
            goto err;

R
Rich Salz 已提交
2102
        /* Test that BN_div never gives negative zero in the remainder. */
R
Rich Salz 已提交
2103 2104
        if (!TEST_true(BN_set_word(denominator, 1))
                || !TEST_true(BN_div(a, b, numerator, denominator, ctx))
2105 2106
                || !TEST_BN_eq_zero(b)
                || !TEST_BN_ge_zero(b))
2107
            goto err;
R
Rich Salz 已提交
2108 2109 2110 2111
        BN_free(numerator);
        BN_free(denominator);
        numerator = denominator = NULL;
    }
2112

R
Rich Salz 已提交
2113 2114 2115
    /* Test that BN_set_negative will not produce a negative zero. */
    BN_zero(a);
    BN_set_negative(a, 1);
R
Rich Salz 已提交
2116
    if (BN_is_negative(a))
R
Rich Salz 已提交
2117 2118
        goto err;
    st = 1;
R
Rich Salz 已提交
2119

2120
 err:
R
Rich Salz 已提交
2121 2122
    BN_free(a);
    BN_free(b);
R
Rich Salz 已提交
2123 2124 2125 2126 2127
    BN_free(c);
    BN_free(d);
    BN_free(numerator);
    BN_free(denominator);
    return st;
2128
}
2129

2130
static int test_badmod(void)
2131
{
R
Rich Salz 已提交
2132 2133
    BIGNUM *a = NULL, *b = NULL, *zero = NULL;
    BN_MONT_CTX *mont = NULL;
R
Rich Salz 已提交
2134
    int st = 0;
2135

R
Rich Salz 已提交
2136 2137 2138 2139
    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b = BN_new())
            || !TEST_ptr(zero = BN_new())
            || !TEST_ptr(mont = BN_MONT_CTX_new()))
2140
        goto err;
R
Rich Salz 已提交
2141
    BN_zero(zero);
2142

R
Rich Salz 已提交
2143
    if (!TEST_false(BN_div(a, b, BN_value_one(), zero, ctx)))
R
Rich Salz 已提交
2144 2145
        goto err;
    ERR_clear_error();
2146

R
Rich Salz 已提交
2147
    if (!TEST_false(BN_mod_mul(a, BN_value_one(), BN_value_one(), zero, ctx)))
R
Rich Salz 已提交
2148 2149
        goto err;
    ERR_clear_error();
2150

R
Rich Salz 已提交
2151
    if (!TEST_false(BN_mod_exp(a, BN_value_one(), BN_value_one(), zero, ctx)))
R
Rich Salz 已提交
2152 2153
        goto err;
    ERR_clear_error();
2154

R
Rich Salz 已提交
2155 2156
    if (!TEST_false(BN_mod_exp_mont(a, BN_value_one(), BN_value_one(),
                                    zero, ctx, NULL)))
R
Rich Salz 已提交
2157 2158
        goto err;
    ERR_clear_error();
2159

R
Rich Salz 已提交
2160
    if (!TEST_false(BN_mod_exp_mont_consttime(a, BN_value_one(), BN_value_one(),
2161
                                              zero, ctx, NULL)))
R
Rich Salz 已提交
2162 2163
        goto err;
    ERR_clear_error();
2164

R
Rich Salz 已提交
2165
    if (!TEST_false(BN_MONT_CTX_set(mont, zero, ctx)))
R
Rich Salz 已提交
2166 2167
        goto err;
    ERR_clear_error();
2168

R
Rich Salz 已提交
2169
    /* Some operations also may not be used with an even modulus. */
R
Rich Salz 已提交
2170
    if (!TEST_true(BN_set_word(b, 16)))
R
Rich Salz 已提交
2171
        goto err;
2172

R
Rich Salz 已提交
2173
    if (!TEST_false(BN_MONT_CTX_set(mont, b, ctx)))
R
Rich Salz 已提交
2174 2175
        goto err;
    ERR_clear_error();
2176

R
Rich Salz 已提交
2177 2178
    if (!TEST_false(BN_mod_exp_mont(a, BN_value_one(), BN_value_one(),
                                    b, ctx, NULL)))
R
Rich Salz 已提交
2179 2180 2181
        goto err;
    ERR_clear_error();

R
Rich Salz 已提交
2182
    if (!TEST_false(BN_mod_exp_mont_consttime(a, BN_value_one(), BN_value_one(),
2183
                                              b, ctx, NULL)))
R
Rich Salz 已提交
2184 2185 2186 2187
        goto err;
    ERR_clear_error();

    st = 1;
2188
 err:
R
Rich Salz 已提交
2189
    BN_free(a);
R
Rich Salz 已提交
2190 2191 2192 2193
    BN_free(b);
    BN_free(zero);
    BN_MONT_CTX_free(mont);
    return st;
2194 2195
}

2196
static int test_expmodzero(void)
2197
{
R
Rich Salz 已提交
2198
    BIGNUM *a = NULL, *r = NULL, *zero = NULL;
R
Rich Salz 已提交
2199
    int st = 0;
2200

R
Rich Salz 已提交
2201 2202 2203
    if (!TEST_ptr(zero = BN_new())
            || !TEST_ptr(a = BN_new())
            || !TEST_ptr(r = BN_new()))
2204
        goto err;
R
Rich Salz 已提交
2205 2206
    BN_zero(zero);

R
Rich Salz 已提交
2207
    if (!TEST_true(BN_mod_exp(r, a, zero, BN_value_one(), NULL))
2208
            || !TEST_BN_eq_zero(r)
R
Rich Salz 已提交
2209 2210
            || !TEST_true(BN_mod_exp_mont(r, a, zero, BN_value_one(),
                                          NULL, NULL))
2211
            || !TEST_BN_eq_zero(r)
R
Rich Salz 已提交
2212 2213 2214
            || !TEST_true(BN_mod_exp_mont_consttime(r, a, zero,
                                                    BN_value_one(),
                                                    NULL, NULL))
2215
            || !TEST_BN_eq_zero(r)
R
Rich Salz 已提交
2216 2217
            || !TEST_true(BN_mod_exp_mont_word(r, 42, zero,
                                               BN_value_one(), NULL, NULL))
2218
            || !TEST_BN_eq_zero(r))
2219 2220
        goto err;

R
Rich Salz 已提交
2221
    st = 1;
2222
 err:
R
Rich Salz 已提交
2223 2224 2225 2226
    BN_free(zero);
    BN_free(a);
    BN_free(r);
    return st;
2227 2228
}

2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267
static int test_expmodone(void)
{
    int ret = 0, i;
    BIGNUM *r = BN_new();
    BIGNUM *a = BN_new();
    BIGNUM *p = BN_new();
    BIGNUM *m = BN_new();

    if (!TEST_ptr(r)
            || !TEST_ptr(a)
            || !TEST_ptr(p)
            || !TEST_ptr(p)
            || !TEST_ptr(m)
            || !TEST_true(BN_set_word(a, 1))
            || !TEST_true(BN_set_word(p, 0))
            || !TEST_true(BN_set_word(m, 1)))
        goto err;

    /* Calculate r = 1 ^ 0 mod 1, and check the result is always 0 */
    for (i = 0; i < 2; i++) {
        if (!TEST_true(BN_mod_exp(r, a, p, m, NULL))
                || !TEST_BN_eq_zero(r)
                || !TEST_true(BN_mod_exp_mont(r, a, p, m, NULL, NULL))
                || !TEST_BN_eq_zero(r)
                || !TEST_true(BN_mod_exp_mont_consttime(r, a, p, m, NULL, NULL))
                || !TEST_BN_eq_zero(r)
                || !TEST_true(BN_mod_exp_mont_word(r, 1, p, m, NULL, NULL))
                || !TEST_BN_eq_zero(r)
                || !TEST_true(BN_mod_exp_simple(r, a, p, m, NULL))
                || !TEST_BN_eq_zero(r)
                || !TEST_true(BN_mod_exp_recp(r, a, p, m, NULL))
                || !TEST_BN_eq_zero(r))
            goto err;
        /* Repeat for r = 1 ^ 0 mod -1 */
        if (i == 0)
            BN_set_negative(m, 1);
    }

    ret = 1;
2268
 err:
2269 2270 2271 2272 2273 2274 2275
    BN_free(r);
    BN_free(a);
    BN_free(p);
    BN_free(m);
    return ret;
}

2276
static int test_smallprime(int kBits)
D
David Benjamin 已提交
2277
{
R
Rich Salz 已提交
2278
    BIGNUM *r;
R
Rich Salz 已提交
2279
    int st = 0;
D
David Benjamin 已提交
2280

2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306
    if (!TEST_ptr(r = BN_new()))
        goto err;

    if (kBits <= 1) {
        if (!TEST_false(BN_generate_prime_ex(r, kBits, 0,
                                             NULL, NULL, NULL)))
            goto err;
    } else {
        if (!TEST_true(BN_generate_prime_ex(r, kBits, 0,
                                            NULL, NULL, NULL))
                || !TEST_int_eq(BN_num_bits(r), kBits))
            goto err;
    }

    st = 1;
 err:
    BN_free(r);
    return st;
}

static int test_smallsafeprime(int kBits)
{
    BIGNUM *r;
    int st = 0;

    if (!TEST_ptr(r = BN_new()))
R
Rich Salz 已提交
2307
        goto err;
D
David Benjamin 已提交
2308

2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319
    if (kBits <= 5 && kBits != 3) {
        if (!TEST_false(BN_generate_prime_ex(r, kBits, 1,
                                             NULL, NULL, NULL)))
            goto err;
    } else {
        if (!TEST_true(BN_generate_prime_ex(r, kBits, 1,
                                            NULL, NULL, NULL))
                || !TEST_int_eq(BN_num_bits(r), kBits))
            goto err;
    }

R
Rich Salz 已提交
2320
    st = 1;
2321
 err:
R
Rich Salz 已提交
2322 2323 2324
    BN_free(r);
    return st;
}
D
David Benjamin 已提交
2325

2326 2327 2328
static int primes[] = { 2, 3, 5, 7, 17863 };

static int test_is_prime(int i)
A
Adam Langley 已提交
2329 2330
{
    int ret = 0;
R
Rich Salz 已提交
2331
    BIGNUM *r = NULL;
2332
    int trial;
A
Adam Langley 已提交
2333

2334
    if (!TEST_ptr(r = BN_new()))
A
Adam Langley 已提交
2335 2336
        goto err;

2337 2338
    for (trial = 0; trial <= 1; ++trial) {
        if (!TEST_true(BN_set_word(r, primes[i]))
K
Kurt Roeckx 已提交
2339
                || !TEST_int_eq(BN_check_prime(r, ctx, NULL),
2340 2341 2342 2343
                                1))
            goto err;
    }

A
Adam Langley 已提交
2344
    ret = 1;
2345
 err:
2346 2347 2348
    BN_free(r);
    return ret;
}
A
Adam Langley 已提交
2349

2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362
static int not_primes[] = { -1, 0, 1, 4 };

static int test_not_prime(int i)
{
    int ret = 0;
    BIGNUM *r = NULL;
    int trial;

    if (!TEST_ptr(r = BN_new()))
        goto err;

    for (trial = 0; trial <= 1; ++trial) {
        if (!TEST_true(BN_set_word(r, not_primes[i]))
K
Kurt Roeckx 已提交
2363
                || !TEST_false(BN_check_prime(r, ctx, NULL)))
2364 2365 2366 2367
            goto err;
    }

    ret = 1;
2368
 err:
A
Adam Langley 已提交
2369 2370 2371 2372
    BN_free(r);
    return ret;
}

2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458
static int test_ctx_set_ct_flag(BN_CTX *c)
{
    int st = 0;
    size_t i;
    BIGNUM *b[15];

    BN_CTX_start(c);
    for (i = 0; i < OSSL_NELEM(b); i++) {
        if (!TEST_ptr(b[i] = BN_CTX_get(c)))
            goto err;
        if (i % 2 == 1)
            BN_set_flags(b[i], BN_FLG_CONSTTIME);
    }

    st = 1;
 err:
    BN_CTX_end(c);
    return st;
}

static int test_ctx_check_ct_flag(BN_CTX *c)
{
    int st = 0;
    size_t i;
    BIGNUM *b[30];

    BN_CTX_start(c);
    for (i = 0; i < OSSL_NELEM(b); i++) {
        if (!TEST_ptr(b[i] = BN_CTX_get(c)))
            goto err;
        if (!TEST_false(BN_get_flags(b[i], BN_FLG_CONSTTIME)))
            goto err;
    }

    st = 1;
 err:
    BN_CTX_end(c);
    return st;
}

static int test_ctx_consttime_flag(void)
{
    /*-
     * The constant-time flag should not "leak" among BN_CTX frames:
     *
     * - test_ctx_set_ct_flag() starts a frame in the given BN_CTX and
     *   sets the BN_FLG_CONSTTIME flag on some of the BIGNUMs obtained
     *   from the frame before ending it.
     * - test_ctx_check_ct_flag() then starts a new frame and gets a
     *   number of BIGNUMs from it. In absence of leaks, none of the
     *   BIGNUMs in the new frame should have BN_FLG_CONSTTIME set.
     *
     * In actual BN_CTX usage inside libcrypto the leak could happen at
     * any depth level in the BN_CTX stack, with varying results
     * depending on the patterns of sibling trees of nested function
     * calls sharing the same BN_CTX object, and the effect of
     * unintended BN_FLG_CONSTTIME on the called BN_* functions.
     *
     * This simple unit test abstracts away this complexity and verifies
     * that the leak does not happen between two sibling functions
     * sharing the same BN_CTX object at the same level of nesting.
     *
     */
    BN_CTX *nctx = NULL;
    BN_CTX *sctx = NULL;
    size_t i = 0;
    int st = 0;

    if (!TEST_ptr(nctx = BN_CTX_new())
            || !TEST_ptr(sctx = BN_CTX_secure_new()))
        goto err;

    for (i = 0; i < 2; i++) {
        BN_CTX *c = i == 0 ? nctx : sctx;
        if (!TEST_true(test_ctx_set_ct_flag(c))
                || !TEST_true(test_ctx_check_ct_flag(c)))
            goto err;
    }

    st = 1;
 err:
    BN_CTX_free(nctx);
    BN_CTX_free(sctx);
    return st;
}

2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486
static int test_gcd_prime(void)
{
    BIGNUM *a = NULL, *b = NULL, *gcd = NULL;
    int i, st = 0;

    if (!TEST_ptr(a = BN_new())
            || !TEST_ptr(b = BN_new())
            || !TEST_ptr(gcd = BN_new()))
        goto err;

    if (!TEST_true(BN_generate_prime_ex(a, 1024, 0, NULL, NULL, NULL)))
            goto err;
    for (i = 0; i < NUM0; i++) {
        if (!TEST_true(BN_generate_prime_ex(b, 1024, 0,
                                            NULL, NULL, NULL))
                || !TEST_true(BN_gcd(gcd, a, b, ctx))
                || !TEST_true(BN_is_one(gcd)))
            goto err;
    }

    st = 1;
 err:
    BN_free(a);
    BN_free(b);
    BN_free(gcd);
    return st;
}

2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768
typedef struct mod_exp_test_st
{
  const char *base;
  const char *exp;
  const char *mod;
  const char *res;
} MOD_EXP_TEST;

static const MOD_EXP_TEST ModExpTests[] = {
   /* original test vectors for rsaz_512_sqr bug, by OSS-Fuzz */
   {
       "1166180238001879113042182292626169621106255558914000595999312084"
       "4627946820899490684928760491249738643524880720584249698100907201"
       "002086675047927600340800371",
       "8000000000000000000000000000000000000000000000000000000000000000"
       "0000000000000000000000000000000000000000000000000000000000000000"
       "00000000",
       "1340780792684523720980737645613191762604395855615117867483316354"
       "3294276330515137663421134775482798690129946803802212663956180562"
       "088664022929883876655300863",
       "8243904058268085430037326628480645845409758077568738532059032482"
       "8294114415890603594730158120426756266457928475330450251339773498"
       "26758407619521544102068438"
   },
   {
       "4974270041410803822078866696159586946995877618987010219312844726"
       "0284386121835740784990869050050504348861513337232530490826340663"
       "197278031692737429054",
       "4974270041410803822078866696159586946995877428188754995041148539"
       "1663243362592271353668158565195557417149981094324650322556843202"
       "946445882670777892608",
       "1340780716511420227215592830971452482815377482627251725537099028"
       "4429769497230131760206012644403029349547320953206103351725462999"
       "947509743623340557059752191",
       "5296244594780707015616522701706118082963369547253192207884519362"
       "1767869984947542695665420219028522815539559194793619684334900442"
       "49304558011362360473525933"
   },
   /* test vectors for rsaz_512_srq bug, with rcx/rbx=1 */
   {   /* between first and second iteration */
       "5148719036160389201525610950887605325980251964889646556085286545"
       "3931548809178823413169359635978762036512397113080988070677858033"
       "36463909753993540214027190",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between second and third iteration */
       "8908340854353752577419678771330460827942371434853054158622636544"
       "8151360109722890949471912566649465436296659601091730745087014189"
       "2672764191218875181826063",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between third and fourth iteration */
       "3427446396505596330634350984901719674479522569002785244080234738"
       "4288743635435746136297299366444548736533053717416735379073185344"
       "26985272974404612945608761",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between fourth and fifth iteration */
       "3472743044917564564078857826111874560045331237315597383869652985"
       "6919870028890895988478351133601517365908445058405433832718206902"
       "4088133164805266956353542",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between fifth and sixth iteration */
       "3608632990153469264412378349742339216742409743898601587274768025"
       "0110772032985643555192767717344946174122842255204082586753499651"
       "14483434992887431333675068",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between sixth and seventh iteration */
       "8455374370234070242910508226941981520235709767260723212165264877"
       "8689064388017521524568434328264431772644802567028663962962025746"
       "9283458217850119569539086",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between seventh and eighth iteration */
       "5155371529688532178421209781159131443543419764974688878527112131"
       "7446518205609427412336183157918981038066636807317733319323257603"
       "04416292040754017461076359",
       "1005585594745694782468051874865438459560952436544429503329267108"
       "2791323022555160232601405723625177570767523893639864538140315412"
       "108959927459825236754563832",
       "1005585594745694782468051874865438459560952436544429503329267108"
       "2791323022555160232601405723625177570767523893639864538140315412"
       "108959927459825236754563833",
       "1"
   },
   /* test vectors for rsaz_512_srq bug, with rcx/rbx=2 */
   {   /* between first and second iteration */
       "3155666506033786929967309937640790361084670559125912405342594979"
       "4345142818528956285490897841406338022378565972533508820577760065"
       "58494345853302083699912572",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between second and third iteration */
       "3789819583801342198190405714582958759005991915505282362397087750"
       "4213544724644823098843135685133927198668818185338794377239590049"
       "41019388529192775771488319",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between third and forth iteration */
       "4695752552040706867080542538786056470322165281761525158189220280"
       "4025547447667484759200742764246905647644662050122968912279199065"
       "48065034299166336940507214",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between forth and fifth iteration */
       "2159140240970485794188159431017382878636879856244045329971239574"
       "8919691133560661162828034323196457386059819832804593989740268964"
       "74502911811812651475927076",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between fifth and sixth iteration */
       "5239312332984325668414624633307915097111691815000872662334695514"
       "5436533521392362443557163429336808208137221322444780490437871903"
       "99972784701334569424519255",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between sixth and seventh iteration */
       "1977953647322612860406858017869125467496941904523063466791308891"
       "1172796739058531929470539758361774569875505293428856181093904091"
       "33788264851714311303725089",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042158",
       "6703903964971298549787012499102923063739682910296196688861780721"
       "8608820150367734884009371490834517138450159290932430254268769414"
       "05973284973216824503042159",
       "1"
   },
   {   /* between seventh and eighth iteration */
       "6456987954117763835533395796948878140715006860263624787492985786"
       "8514630216966738305923915688821526449499763719943997120302368211"
       "04813318117996225041943964",
       "1340780792994259709957402499820584612747936582059239337772356144"
       "3721764030073546976801874298166903427690031858186486050853753882"
       "811946551499689575296532556",
       "1340780792994259709957402499820584612747936582059239337772356144"
       "3721764030073546976801874298166903427690031858186486050853753882"
       "811946551499689575296532557",
       "1"
   }
};

static int test_mod_exp(int i)
{
    const MOD_EXP_TEST *test = &ModExpTests[i];
    int res = 0;
    BIGNUM* result = NULL;
    BIGNUM *base = NULL, *exponent = NULL, *modulo = NULL;
    char *s = NULL;

    if (!TEST_ptr(result = BN_new())
            || !TEST_true(BN_dec2bn(&base, test->base))
            || !TEST_true(BN_dec2bn(&exponent, test->exp))
            || !TEST_true(BN_dec2bn(&modulo, test->mod)))
        goto err;

    if (!TEST_int_eq(BN_mod_exp(result, base, exponent, modulo, ctx), 1))
        goto err;

    if (!TEST_ptr(s = BN_bn2dec(result)))
        goto err;

    if (!TEST_mem_eq(s, strlen(s), test->res, strlen(test->res)))
        goto err;

    res = 1;

 err:
    OPENSSL_free(s);
    BN_free(result);
    BN_free(base);
    BN_free(exponent);
    BN_free(modulo);
    return res;
}

static int test_mod_exp_consttime(int i)
{
    const MOD_EXP_TEST *test = &ModExpTests[i];
    int res = 0;
    BIGNUM* result = NULL;
    BIGNUM *base = NULL, *exponent = NULL, *modulo = NULL;
    char *s = NULL;

    if (!TEST_ptr(result = BN_new())
            || !TEST_true(BN_dec2bn(&base, test->base))
            || !TEST_true(BN_dec2bn(&exponent, test->exp))
            || !TEST_true(BN_dec2bn(&modulo, test->mod)))
        goto err;

    BN_set_flags(base, BN_FLG_CONSTTIME);
    BN_set_flags(exponent, BN_FLG_CONSTTIME);
    BN_set_flags(modulo, BN_FLG_CONSTTIME);

    if (!TEST_int_eq(BN_mod_exp(result, base, exponent, modulo, ctx), 1))
        goto err;

    if (!TEST_ptr(s = BN_bn2dec(result)))
        goto err;

    if (!TEST_mem_eq(s, strlen(s), test->res, strlen(test->res)))
        goto err;

    res = 1;

 err:
    OPENSSL_free(s);
    BN_free(result);
    BN_free(base);
    BN_free(exponent);
    BN_free(modulo);
    return res;
}

R
Rich Salz 已提交
2769
static int file_test_run(STANZA *s)
2770
{
R
Rich Salz 已提交
2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782
    static const FILETEST filetests[] = {
        {"Sum", file_sum},
        {"LShift1", file_lshift1},
        {"LShift", file_lshift},
        {"RShift", file_rshift},
        {"Square", file_square},
        {"Product", file_product},
        {"Quotient", file_quotient},
        {"ModMul", file_modmul},
        {"ModExp", file_modexp},
        {"Exp", file_exp},
        {"ModSqrt", file_modsqrt},
2783
        {"GCD", file_gcd},
R
Rich Salz 已提交
2784 2785 2786
    };
    int numtests = OSSL_NELEM(filetests);
    const FILETEST *tp = filetests;
2787

R
Rich Salz 已提交
2788
    for ( ; --numtests >= 0; tp++) {
R
Rich Salz 已提交
2789 2790
        if (findattr(s, tp->name) != NULL) {
            if (!tp->func(s)) {
2791 2792
                TEST_info("%s:%d: Failed %s test",
                          s->test_file, s->start, tp->name);
R
Rich Salz 已提交
2793 2794 2795 2796
                return 0;
            }
            return 1;
        }
2797
    }
2798
    TEST_info("%s:%d: Unknown test", s->test_file, s->start);
R
Rich Salz 已提交
2799
    return 0;
2800
}
2801

R
Rich Salz 已提交
2802
static int run_file_tests(int i)
2803
{
2804
    STANZA *s = NULL;
2805
    char *testfile = test_get_argument(i);
2806
    int c;
2807

2808
    if (!TEST_ptr(s = OPENSSL_zalloc(sizeof(*s))))
R
Rich Salz 已提交
2809
        return 0;
2810
    if (!test_start_file(s, testfile)) {
2811 2812 2813
        OPENSSL_free(s);
        return 0;
    }
R
Rich Salz 已提交
2814

R
Rich Salz 已提交
2815
    /* Read test file. */
2816 2817
    while (!BIO_eof(s->fp) && test_readstanza(s)) {
        if (s->numpairs == 0)
R
Rich Salz 已提交
2818
            continue;
2819 2820 2821 2822
        if (!file_test_run(s))
            s->errors++;
        s->numtests++;
        test_clearstanza(s);
2823
    }
2824 2825 2826
    test_end_file(s);
    c = s->errors;
    OPENSSL_free(s);
R
Rich Salz 已提交
2827

2828
    return c == 0;
2829
}
2830

2831 2832 2833 2834 2835 2836 2837
typedef enum OPTION_choice {
    OPT_ERR = -1,
    OPT_EOF = 0,
    OPT_STOCHASTIC_TESTS,
    OPT_TEST_ENUM
} OPTION_CHOICE;

2838 2839 2840 2841
const OPTIONS *test_get_options(void)
{
    static const OPTIONS test_options[] = {
        OPT_TEST_OPTIONS_WITH_EXTRA_USAGE("[file...]\n"),
2842
        { "stochastic", OPT_STOCHASTIC_TESTS, '-', "Run stochastic tests" },
2843 2844 2845 2846 2847 2848
        { OPT_HELP_STR, 1, '-',
          "file\tFile to run tests on. Normal tests are not run\n" },
        { NULL }
    };
    return test_options;
}
R
Rich Salz 已提交
2849

2850
int setup_tests(void)
2851
{
2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863
    OPTION_CHOICE o;
    int n, stochastic = 0;

    while ((o = opt_next()) != OPT_EOF) {
        switch (o) {
        case OPT_STOCHASTIC_TESTS:
            stochastic = 1;
            break;
        case OPT_TEST_CASES:
           break;
        default:
        case OPT_ERR:
2864
            return 0;
2865 2866 2867
        }
    }
    n  = test_get_argument_count();
R
Rich Salz 已提交
2868

R
Rich Salz 已提交
2869
    if (!TEST_ptr(ctx = BN_CTX_new()))
2870
        return 0;
R
Rich Salz 已提交
2871

2872
    if (n == 0) {
R
Rich Salz 已提交
2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886
        ADD_TEST(test_sub);
        ADD_TEST(test_div_recip);
        ADD_TEST(test_mod);
        ADD_TEST(test_modexp_mont5);
        ADD_TEST(test_kronecker);
        ADD_TEST(test_rand);
        ADD_TEST(test_bn2padded);
        ADD_TEST(test_dec2bn);
        ADD_TEST(test_hex2bn);
        ADD_TEST(test_asc2bn);
        ADD_ALL_TESTS(test_mpi, (int)OSSL_NELEM(kMPITests));
        ADD_TEST(test_negzero);
        ADD_TEST(test_badmod);
        ADD_TEST(test_expmodzero);
2887
        ADD_TEST(test_expmodone);
2888 2889
        ADD_ALL_TESTS(test_smallprime, 16);
        ADD_ALL_TESTS(test_smallsafeprime, 16);
B
Billy Brumley 已提交
2890
        ADD_TEST(test_swap);
2891
        ADD_TEST(test_ctx_consttime_flag);
R
Rich Salz 已提交
2892
#ifndef OPENSSL_NO_EC2M
R
Rich Salz 已提交
2893 2894 2895 2896 2897 2898 2899 2900 2901
        ADD_TEST(test_gf2m_add);
        ADD_TEST(test_gf2m_mod);
        ADD_TEST(test_gf2m_mul);
        ADD_TEST(test_gf2m_sqr);
        ADD_TEST(test_gf2m_modinv);
        ADD_TEST(test_gf2m_moddiv);
        ADD_TEST(test_gf2m_modexp);
        ADD_TEST(test_gf2m_modsqrt);
        ADD_TEST(test_gf2m_modsolvequad);
R
Rich Salz 已提交
2902
#endif
2903 2904
        ADD_ALL_TESTS(test_is_prime, (int)OSSL_NELEM(primes));
        ADD_ALL_TESTS(test_not_prime, (int)OSSL_NELEM(not_primes));
2905
        ADD_TEST(test_gcd_prime);
2906 2907
        ADD_ALL_TESTS(test_mod_exp, (int)OSSL_NELEM(ModExpTests));
        ADD_ALL_TESTS(test_mod_exp_consttime, (int)OSSL_NELEM(ModExpTests));
2908 2909
        if (stochastic)
            ADD_TEST(test_rand_range);
R
Rich Salz 已提交
2910
    } else {
2911
        ADD_ALL_TESTS(run_file_tests, n);
R
Rich Salz 已提交
2912
    }
2913 2914
    return 1;
}
R
Rich Salz 已提交
2915

2916 2917
void cleanup_tests(void)
{
R
Rich Salz 已提交
2918
    BN_CTX_free(ctx);
2919
}