1*4724848cSchristos /*
2*4724848cSchristos * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
3*4724848cSchristos *
4*4724848cSchristos * Licensed under the OpenSSL license (the "License"). You may not use
5*4724848cSchristos * this file except in compliance with the License. You can obtain a copy
6*4724848cSchristos * in the file LICENSE in the source distribution or at
7*4724848cSchristos * https://www.openssl.org/source/license.html
8*4724848cSchristos */
9*4724848cSchristos #include <assert.h>
10*4724848cSchristos #include <errno.h>
11*4724848cSchristos #include <stdio.h>
12*4724848cSchristos #include <string.h>
13*4724848cSchristos #include <ctype.h>
14*4724848cSchristos
15*4724848cSchristos #include <openssl/bn.h>
16*4724848cSchristos #include <openssl/crypto.h>
17*4724848cSchristos #include <openssl/err.h>
18*4724848cSchristos #include <openssl/rand.h>
19*4724848cSchristos #include "internal/nelem.h"
20*4724848cSchristos #include "internal/numbers.h"
21*4724848cSchristos #include "testutil.h"
22*4724848cSchristos
23*4724848cSchristos #ifdef OPENSSL_SYS_WINDOWS
24*4724848cSchristos # define strcasecmp _stricmp
25*4724848cSchristos #endif
26*4724848cSchristos
27*4724848cSchristos /*
28*4724848cSchristos * Things in boring, not in openssl. TODO we should add them.
29*4724848cSchristos */
30*4724848cSchristos #define HAVE_BN_SQRT 0
31*4724848cSchristos
32*4724848cSchristos typedef struct filetest_st {
33*4724848cSchristos const char *name;
34*4724848cSchristos int (*func)(STANZA *s);
35*4724848cSchristos } FILETEST;
36*4724848cSchristos
37*4724848cSchristos typedef struct mpitest_st {
38*4724848cSchristos const char *base10;
39*4724848cSchristos const char *mpi;
40*4724848cSchristos size_t mpi_len;
41*4724848cSchristos } MPITEST;
42*4724848cSchristos
43*4724848cSchristos static const int NUM0 = 100; /* number of tests */
44*4724848cSchristos static const int NUM1 = 50; /* additional tests for some functions */
45*4724848cSchristos static BN_CTX *ctx;
46*4724848cSchristos
47*4724848cSchristos /*
48*4724848cSchristos * Polynomial coefficients used in GFM tests.
49*4724848cSchristos */
50*4724848cSchristos #ifndef OPENSSL_NO_EC2M
51*4724848cSchristos static int p0[] = { 163, 7, 6, 3, 0, -1 };
52*4724848cSchristos static int p1[] = { 193, 15, 0, -1 };
53*4724848cSchristos #endif
54*4724848cSchristos
55*4724848cSchristos /*
56*4724848cSchristos * Look for |key| in the stanza and return it or NULL if not found.
57*4724848cSchristos */
findattr(STANZA * s,const char * key)58*4724848cSchristos static const char *findattr(STANZA *s, const char *key)
59*4724848cSchristos {
60*4724848cSchristos int i = s->numpairs;
61*4724848cSchristos PAIR *pp = s->pairs;
62*4724848cSchristos
63*4724848cSchristos for ( ; --i >= 0; pp++)
64*4724848cSchristos if (strcasecmp(pp->key, key) == 0)
65*4724848cSchristos return pp->value;
66*4724848cSchristos return NULL;
67*4724848cSchristos }
68*4724848cSchristos
69*4724848cSchristos /*
70*4724848cSchristos * Parse BIGNUM from sparse hex-strings, return |BN_hex2bn| result.
71*4724848cSchristos */
parse_bigBN(BIGNUM ** out,const char * bn_strings[])72*4724848cSchristos static int parse_bigBN(BIGNUM **out, const char *bn_strings[])
73*4724848cSchristos {
74*4724848cSchristos char *bigstring = glue_strings(bn_strings, NULL);
75*4724848cSchristos int ret = BN_hex2bn(out, bigstring);
76*4724848cSchristos
77*4724848cSchristos OPENSSL_free(bigstring);
78*4724848cSchristos return ret;
79*4724848cSchristos }
80*4724848cSchristos
81*4724848cSchristos /*
82*4724848cSchristos * Parse BIGNUM, return number of bytes parsed.
83*4724848cSchristos */
parseBN(BIGNUM ** out,const char * in)84*4724848cSchristos static int parseBN(BIGNUM **out, const char *in)
85*4724848cSchristos {
86*4724848cSchristos *out = NULL;
87*4724848cSchristos return BN_hex2bn(out, in);
88*4724848cSchristos }
89*4724848cSchristos
parsedecBN(BIGNUM ** out,const char * in)90*4724848cSchristos static int parsedecBN(BIGNUM **out, const char *in)
91*4724848cSchristos {
92*4724848cSchristos *out = NULL;
93*4724848cSchristos return BN_dec2bn(out, in);
94*4724848cSchristos }
95*4724848cSchristos
getBN(STANZA * s,const char * attribute)96*4724848cSchristos static BIGNUM *getBN(STANZA *s, const char *attribute)
97*4724848cSchristos {
98*4724848cSchristos const char *hex;
99*4724848cSchristos BIGNUM *ret = NULL;
100*4724848cSchristos
101*4724848cSchristos if ((hex = findattr(s, attribute)) == NULL) {
102*4724848cSchristos TEST_error("%s:%d: Can't find %s", s->test_file, s->start, attribute);
103*4724848cSchristos return NULL;
104*4724848cSchristos }
105*4724848cSchristos
106*4724848cSchristos if (parseBN(&ret, hex) != (int)strlen(hex)) {
107*4724848cSchristos TEST_error("Could not decode '%s'", hex);
108*4724848cSchristos return NULL;
109*4724848cSchristos }
110*4724848cSchristos return ret;
111*4724848cSchristos }
112*4724848cSchristos
getint(STANZA * s,int * out,const char * attribute)113*4724848cSchristos static int getint(STANZA *s, int *out, const char *attribute)
114*4724848cSchristos {
115*4724848cSchristos BIGNUM *ret;
116*4724848cSchristos BN_ULONG word;
117*4724848cSchristos int st = 0;
118*4724848cSchristos
119*4724848cSchristos if (!TEST_ptr(ret = getBN(s, attribute))
120*4724848cSchristos || !TEST_ulong_le(word = BN_get_word(ret), INT_MAX))
121*4724848cSchristos goto err;
122*4724848cSchristos
123*4724848cSchristos *out = (int)word;
124*4724848cSchristos st = 1;
125*4724848cSchristos err:
126*4724848cSchristos BN_free(ret);
127*4724848cSchristos return st;
128*4724848cSchristos }
129*4724848cSchristos
equalBN(const char * op,const BIGNUM * expected,const BIGNUM * actual)130*4724848cSchristos static int equalBN(const char *op, const BIGNUM *expected, const BIGNUM *actual)
131*4724848cSchristos {
132*4724848cSchristos if (BN_cmp(expected, actual) == 0)
133*4724848cSchristos return 1;
134*4724848cSchristos
135*4724848cSchristos TEST_error("unexpected %s value", op);
136*4724848cSchristos TEST_BN_eq(expected, actual);
137*4724848cSchristos return 0;
138*4724848cSchristos }
139*4724848cSchristos
140*4724848cSchristos /*
141*4724848cSchristos * Return a "random" flag for if a BN should be negated.
142*4724848cSchristos */
rand_neg(void)143*4724848cSchristos static int rand_neg(void)
144*4724848cSchristos {
145*4724848cSchristos static unsigned int neg = 0;
146*4724848cSchristos static int sign[8] = { 0, 0, 0, 1, 1, 0, 1, 1 };
147*4724848cSchristos
148*4724848cSchristos return sign[(neg++) % 8];
149*4724848cSchristos }
150*4724848cSchristos
test_swap(void)151*4724848cSchristos static int test_swap(void)
152*4724848cSchristos {
153*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *c = NULL, *d = NULL;
154*4724848cSchristos int top, cond, st = 0;
155*4724848cSchristos
156*4724848cSchristos if (!TEST_ptr(a = BN_new())
157*4724848cSchristos || !TEST_ptr(b = BN_new())
158*4724848cSchristos || !TEST_ptr(c = BN_new())
159*4724848cSchristos || !TEST_ptr(d = BN_new()))
160*4724848cSchristos goto err;
161*4724848cSchristos
162*4724848cSchristos if (!(TEST_true(BN_bntest_rand(a, 1024, 1, 0))
163*4724848cSchristos && TEST_true(BN_bntest_rand(b, 1024, 1, 0))
164*4724848cSchristos && TEST_ptr(BN_copy(c, a))
165*4724848cSchristos && TEST_ptr(BN_copy(d, b))))
166*4724848cSchristos goto err;
167*4724848cSchristos top = BN_num_bits(a) / BN_BITS2;
168*4724848cSchristos
169*4724848cSchristos /* regular swap */
170*4724848cSchristos BN_swap(a, b);
171*4724848cSchristos if (!equalBN("swap", a, d)
172*4724848cSchristos || !equalBN("swap", b, c))
173*4724848cSchristos goto err;
174*4724848cSchristos
175*4724848cSchristos /* conditional swap: true */
176*4724848cSchristos cond = 1;
177*4724848cSchristos BN_consttime_swap(cond, a, b, top);
178*4724848cSchristos if (!equalBN("cswap true", a, c)
179*4724848cSchristos || !equalBN("cswap true", b, d))
180*4724848cSchristos goto err;
181*4724848cSchristos
182*4724848cSchristos /* conditional swap: false */
183*4724848cSchristos cond = 0;
184*4724848cSchristos BN_consttime_swap(cond, a, b, top);
185*4724848cSchristos if (!equalBN("cswap false", a, c)
186*4724848cSchristos || !equalBN("cswap false", b, d))
187*4724848cSchristos goto err;
188*4724848cSchristos
189*4724848cSchristos /* same tests but checking flag swap */
190*4724848cSchristos BN_set_flags(a, BN_FLG_CONSTTIME);
191*4724848cSchristos
192*4724848cSchristos BN_swap(a, b);
193*4724848cSchristos if (!equalBN("swap, flags", a, d)
194*4724848cSchristos || !equalBN("swap, flags", b, c)
195*4724848cSchristos || !TEST_true(BN_get_flags(b, BN_FLG_CONSTTIME))
196*4724848cSchristos || !TEST_false(BN_get_flags(a, BN_FLG_CONSTTIME)))
197*4724848cSchristos goto err;
198*4724848cSchristos
199*4724848cSchristos cond = 1;
200*4724848cSchristos BN_consttime_swap(cond, a, b, top);
201*4724848cSchristos if (!equalBN("cswap true, flags", a, c)
202*4724848cSchristos || !equalBN("cswap true, flags", b, d)
203*4724848cSchristos || !TEST_true(BN_get_flags(a, BN_FLG_CONSTTIME))
204*4724848cSchristos || !TEST_false(BN_get_flags(b, BN_FLG_CONSTTIME)))
205*4724848cSchristos goto err;
206*4724848cSchristos
207*4724848cSchristos cond = 0;
208*4724848cSchristos BN_consttime_swap(cond, a, b, top);
209*4724848cSchristos if (!equalBN("cswap false, flags", a, c)
210*4724848cSchristos || !equalBN("cswap false, flags", b, d)
211*4724848cSchristos || !TEST_true(BN_get_flags(a, BN_FLG_CONSTTIME))
212*4724848cSchristos || !TEST_false(BN_get_flags(b, BN_FLG_CONSTTIME)))
213*4724848cSchristos goto err;
214*4724848cSchristos
215*4724848cSchristos st = 1;
216*4724848cSchristos err:
217*4724848cSchristos BN_free(a);
218*4724848cSchristos BN_free(b);
219*4724848cSchristos BN_free(c);
220*4724848cSchristos BN_free(d);
221*4724848cSchristos return st;
222*4724848cSchristos }
223*4724848cSchristos
test_sub(void)224*4724848cSchristos static int test_sub(void)
225*4724848cSchristos {
226*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *c = NULL;
227*4724848cSchristos int i, st = 0;
228*4724848cSchristos
229*4724848cSchristos if (!TEST_ptr(a = BN_new())
230*4724848cSchristos || !TEST_ptr(b = BN_new())
231*4724848cSchristos || !TEST_ptr(c = BN_new()))
232*4724848cSchristos goto err;
233*4724848cSchristos
234*4724848cSchristos for (i = 0; i < NUM0 + NUM1; i++) {
235*4724848cSchristos if (i < NUM1) {
236*4724848cSchristos if (!(TEST_true(BN_bntest_rand(a, 512, 0, 0)))
237*4724848cSchristos && TEST_ptr(BN_copy(b, a))
238*4724848cSchristos && TEST_int_ne(BN_set_bit(a, i), 0)
239*4724848cSchristos && TEST_true(BN_add_word(b, i)))
240*4724848cSchristos goto err;
241*4724848cSchristos } else {
242*4724848cSchristos if (!TEST_true(BN_bntest_rand(b, 400 + i - NUM1, 0, 0)))
243*4724848cSchristos goto err;
244*4724848cSchristos BN_set_negative(a, rand_neg());
245*4724848cSchristos BN_set_negative(b, rand_neg());
246*4724848cSchristos }
247*4724848cSchristos if (!(TEST_true(BN_sub(c, a, b))
248*4724848cSchristos && TEST_true(BN_add(c, c, b))
249*4724848cSchristos && TEST_true(BN_sub(c, c, a))
250*4724848cSchristos && TEST_BN_eq_zero(c)))
251*4724848cSchristos goto err;
252*4724848cSchristos }
253*4724848cSchristos st = 1;
254*4724848cSchristos err:
255*4724848cSchristos BN_free(a);
256*4724848cSchristos BN_free(b);
257*4724848cSchristos BN_free(c);
258*4724848cSchristos return st;
259*4724848cSchristos }
260*4724848cSchristos
test_div_recip(void)261*4724848cSchristos static int test_div_recip(void)
262*4724848cSchristos {
263*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *c = NULL, *d = NULL, *e = NULL;
264*4724848cSchristos BN_RECP_CTX *recp = NULL;
265*4724848cSchristos int st = 0, i;
266*4724848cSchristos
267*4724848cSchristos if (!TEST_ptr(a = BN_new())
268*4724848cSchristos || !TEST_ptr(b = BN_new())
269*4724848cSchristos || !TEST_ptr(c = BN_new())
270*4724848cSchristos || !TEST_ptr(d = BN_new())
271*4724848cSchristos || !TEST_ptr(e = BN_new())
272*4724848cSchristos || !TEST_ptr(recp = BN_RECP_CTX_new()))
273*4724848cSchristos goto err;
274*4724848cSchristos
275*4724848cSchristos for (i = 0; i < NUM0 + NUM1; i++) {
276*4724848cSchristos if (i < NUM1) {
277*4724848cSchristos if (!(TEST_true(BN_bntest_rand(a, 400, 0, 0))
278*4724848cSchristos && TEST_ptr(BN_copy(b, a))
279*4724848cSchristos && TEST_true(BN_lshift(a, a, i))
280*4724848cSchristos && TEST_true(BN_add_word(a, i))))
281*4724848cSchristos goto err;
282*4724848cSchristos } else {
283*4724848cSchristos if (!(TEST_true(BN_bntest_rand(b, 50 + 3 * (i - NUM1), 0, 0))))
284*4724848cSchristos goto err;
285*4724848cSchristos }
286*4724848cSchristos BN_set_negative(a, rand_neg());
287*4724848cSchristos BN_set_negative(b, rand_neg());
288*4724848cSchristos if (!(TEST_true(BN_RECP_CTX_set(recp, b, ctx))
289*4724848cSchristos && TEST_true(BN_div_recp(d, c, a, recp, ctx))
290*4724848cSchristos && TEST_true(BN_mul(e, d, b, ctx))
291*4724848cSchristos && TEST_true(BN_add(d, e, c))
292*4724848cSchristos && TEST_true(BN_sub(d, d, a))
293*4724848cSchristos && TEST_BN_eq_zero(d)))
294*4724848cSchristos goto err;
295*4724848cSchristos }
296*4724848cSchristos st = 1;
297*4724848cSchristos err:
298*4724848cSchristos BN_free(a);
299*4724848cSchristos BN_free(b);
300*4724848cSchristos BN_free(c);
301*4724848cSchristos BN_free(d);
302*4724848cSchristos BN_free(e);
303*4724848cSchristos BN_RECP_CTX_free(recp);
304*4724848cSchristos return st;
305*4724848cSchristos }
306*4724848cSchristos
307*4724848cSchristos static struct {
308*4724848cSchristos int n, divisor, result, remainder;
309*4724848cSchristos } signed_mod_tests[] = {
310*4724848cSchristos { 10, 3, 3, 1 },
311*4724848cSchristos { -10, 3, -3, -1 },
312*4724848cSchristos { 10, -3, -3, 1 },
313*4724848cSchristos { -10, -3, 3, -1 },
314*4724848cSchristos };
315*4724848cSchristos
set_signed_bn(int value)316*4724848cSchristos static BIGNUM *set_signed_bn(int value)
317*4724848cSchristos {
318*4724848cSchristos BIGNUM *bn = BN_new();
319*4724848cSchristos
320*4724848cSchristos if (bn == NULL)
321*4724848cSchristos return NULL;
322*4724848cSchristos if (!BN_set_word(bn, value < 0 ? -value : value)) {
323*4724848cSchristos BN_free(bn);
324*4724848cSchristos return NULL;
325*4724848cSchristos }
326*4724848cSchristos BN_set_negative(bn, value < 0);
327*4724848cSchristos return bn;
328*4724848cSchristos }
329*4724848cSchristos
test_signed_mod_replace_ab(int n)330*4724848cSchristos static int test_signed_mod_replace_ab(int n)
331*4724848cSchristos {
332*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *c = NULL, *d = NULL;
333*4724848cSchristos int st = 0;
334*4724848cSchristos
335*4724848cSchristos if (!TEST_ptr(a = set_signed_bn(signed_mod_tests[n].n))
336*4724848cSchristos || !TEST_ptr(b = set_signed_bn(signed_mod_tests[n].divisor))
337*4724848cSchristos || !TEST_ptr(c = set_signed_bn(signed_mod_tests[n].result))
338*4724848cSchristos || !TEST_ptr(d = set_signed_bn(signed_mod_tests[n].remainder)))
339*4724848cSchristos goto err;
340*4724848cSchristos
341*4724848cSchristos if (TEST_true(BN_div(a, b, a, b, ctx))
342*4724848cSchristos && TEST_BN_eq(a, c)
343*4724848cSchristos && TEST_BN_eq(b, d))
344*4724848cSchristos st = 1;
345*4724848cSchristos err:
346*4724848cSchristos BN_free(a);
347*4724848cSchristos BN_free(b);
348*4724848cSchristos BN_free(c);
349*4724848cSchristos BN_free(d);
350*4724848cSchristos return st;
351*4724848cSchristos }
352*4724848cSchristos
test_signed_mod_replace_ba(int n)353*4724848cSchristos static int test_signed_mod_replace_ba(int n)
354*4724848cSchristos {
355*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *c = NULL, *d = NULL;
356*4724848cSchristos int st = 0;
357*4724848cSchristos
358*4724848cSchristos if (!TEST_ptr(a = set_signed_bn(signed_mod_tests[n].n))
359*4724848cSchristos || !TEST_ptr(b = set_signed_bn(signed_mod_tests[n].divisor))
360*4724848cSchristos || !TEST_ptr(c = set_signed_bn(signed_mod_tests[n].result))
361*4724848cSchristos || !TEST_ptr(d = set_signed_bn(signed_mod_tests[n].remainder)))
362*4724848cSchristos goto err;
363*4724848cSchristos
364*4724848cSchristos if (TEST_true(BN_div(b, a, a, b, ctx))
365*4724848cSchristos && TEST_BN_eq(b, c)
366*4724848cSchristos && TEST_BN_eq(a, d))
367*4724848cSchristos st = 1;
368*4724848cSchristos err:
369*4724848cSchristos BN_free(a);
370*4724848cSchristos BN_free(b);
371*4724848cSchristos BN_free(c);
372*4724848cSchristos BN_free(d);
373*4724848cSchristos return st;
374*4724848cSchristos }
375*4724848cSchristos
test_mod(void)376*4724848cSchristos static int test_mod(void)
377*4724848cSchristos {
378*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *c = NULL, *d = NULL, *e = NULL;
379*4724848cSchristos int st = 0, i;
380*4724848cSchristos
381*4724848cSchristos if (!TEST_ptr(a = BN_new())
382*4724848cSchristos || !TEST_ptr(b = BN_new())
383*4724848cSchristos || !TEST_ptr(c = BN_new())
384*4724848cSchristos || !TEST_ptr(d = BN_new())
385*4724848cSchristos || !TEST_ptr(e = BN_new()))
386*4724848cSchristos goto err;
387*4724848cSchristos
388*4724848cSchristos if (!(TEST_true(BN_bntest_rand(a, 1024, 0, 0))))
389*4724848cSchristos goto err;
390*4724848cSchristos for (i = 0; i < NUM0; i++) {
391*4724848cSchristos if (!(TEST_true(BN_bntest_rand(b, 450 + i * 10, 0, 0))))
392*4724848cSchristos goto err;
393*4724848cSchristos BN_set_negative(a, rand_neg());
394*4724848cSchristos BN_set_negative(b, rand_neg());
395*4724848cSchristos if (!(TEST_true(BN_mod(c, a, b, ctx))
396*4724848cSchristos && TEST_true(BN_div(d, e, a, b, ctx))
397*4724848cSchristos && TEST_BN_eq(e, c)
398*4724848cSchristos && TEST_true(BN_mul(c, d, b, ctx))
399*4724848cSchristos && TEST_true(BN_add(d, c, e))
400*4724848cSchristos && TEST_BN_eq(d, a)))
401*4724848cSchristos goto err;
402*4724848cSchristos }
403*4724848cSchristos st = 1;
404*4724848cSchristos err:
405*4724848cSchristos BN_free(a);
406*4724848cSchristos BN_free(b);
407*4724848cSchristos BN_free(c);
408*4724848cSchristos BN_free(d);
409*4724848cSchristos BN_free(e);
410*4724848cSchristos return st;
411*4724848cSchristos }
412*4724848cSchristos
413*4724848cSchristos static const char *bn1strings[] = {
414*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
415*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
416*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
417*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
418*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
419*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
420*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
421*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFF00",
422*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
423*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
424*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
425*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
426*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
427*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
428*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
429*4724848cSchristos "00000000000000000000000000000000000000000000000000FFFFFFFFFFFFFF",
430*4724848cSchristos NULL
431*4724848cSchristos };
432*4724848cSchristos
433*4724848cSchristos static const char *bn2strings[] = {
434*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
435*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
436*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
437*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
438*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
439*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
440*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
441*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFF0000000000",
442*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
443*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
444*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
445*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
446*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
447*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
448*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000",
449*4724848cSchristos "000000000000000000000000000000000000000000FFFFFFFFFFFFFF00000000",
450*4724848cSchristos NULL
451*4724848cSchristos };
452*4724848cSchristos
453*4724848cSchristos /*
454*4724848cSchristos * Test constant-time modular exponentiation with 1024-bit inputs, which on
455*4724848cSchristos * x86_64 cause a different code branch to be taken.
456*4724848cSchristos */
test_modexp_mont5(void)457*4724848cSchristos static int test_modexp_mont5(void)
458*4724848cSchristos {
459*4724848cSchristos BIGNUM *a = NULL, *p = NULL, *m = NULL, *d = NULL, *e = NULL;
460*4724848cSchristos BIGNUM *b = NULL, *n = NULL, *c = NULL;
461*4724848cSchristos BN_MONT_CTX *mont = NULL;
462*4724848cSchristos int st = 0;
463*4724848cSchristos
464*4724848cSchristos if (!TEST_ptr(a = BN_new())
465*4724848cSchristos || !TEST_ptr(p = BN_new())
466*4724848cSchristos || !TEST_ptr(m = BN_new())
467*4724848cSchristos || !TEST_ptr(d = BN_new())
468*4724848cSchristos || !TEST_ptr(e = BN_new())
469*4724848cSchristos || !TEST_ptr(b = BN_new())
470*4724848cSchristos || !TEST_ptr(n = BN_new())
471*4724848cSchristos || !TEST_ptr(c = BN_new())
472*4724848cSchristos || !TEST_ptr(mont = BN_MONT_CTX_new()))
473*4724848cSchristos goto err;
474*4724848cSchristos
475*4724848cSchristos /* must be odd for montgomery */
476*4724848cSchristos if (!(TEST_true(BN_bntest_rand(m, 1024, 0, 1))
477*4724848cSchristos /* Zero exponent */
478*4724848cSchristos && TEST_true(BN_bntest_rand(a, 1024, 0, 0))))
479*4724848cSchristos goto err;
480*4724848cSchristos BN_zero(p);
481*4724848cSchristos
482*4724848cSchristos if (!TEST_true(BN_mod_exp_mont_consttime(d, a, p, m, ctx, NULL)))
483*4724848cSchristos goto err;
484*4724848cSchristos if (!TEST_BN_eq_one(d))
485*4724848cSchristos goto err;
486*4724848cSchristos
487*4724848cSchristos /* Regression test for carry bug in mulx4x_mont */
488*4724848cSchristos if (!(TEST_true(BN_hex2bn(&a,
489*4724848cSchristos "7878787878787878787878787878787878787878787878787878787878787878"
490*4724848cSchristos "7878787878787878787878787878787878787878787878787878787878787878"
491*4724848cSchristos "7878787878787878787878787878787878787878787878787878787878787878"
492*4724848cSchristos "7878787878787878787878787878787878787878787878787878787878787878"))
493*4724848cSchristos && TEST_true(BN_hex2bn(&b,
494*4724848cSchristos "095D72C08C097BA488C5E439C655A192EAFB6380073D8C2664668EDDB4060744"
495*4724848cSchristos "E16E57FB4EDB9AE10A0CEFCDC28A894F689A128379DB279D48A2E20849D68593"
496*4724848cSchristos "9B7803BCF46CEBF5C533FB0DD35B080593DE5472E3FE5DB951B8BFF9B4CB8F03"
497*4724848cSchristos "9CC638A5EE8CDD703719F8000E6A9F63BEED5F2FCD52FF293EA05A251BB4AB81"))
498*4724848cSchristos && TEST_true(BN_hex2bn(&n,
499*4724848cSchristos "D78AF684E71DB0C39CFF4E64FB9DB567132CB9C50CC98009FEB820B26F2DED9B"
500*4724848cSchristos "91B9B5E2B83AE0AE4EB4E0523CA726BFBE969B89FD754F674CE99118C3F2D1C5"
501*4724848cSchristos "D81FDC7C54E02B60262B241D53C040E99E45826ECA37A804668E690E1AFC1CA4"
502*4724848cSchristos "2C9A15D84D4954425F0B7642FC0BD9D7B24E2618D2DCC9B729D944BADACFDDAF"))))
503*4724848cSchristos goto err;
504*4724848cSchristos
505*4724848cSchristos if (!(TEST_true(BN_MONT_CTX_set(mont, n, ctx))
506*4724848cSchristos && TEST_true(BN_mod_mul_montgomery(c, a, b, mont, ctx))
507*4724848cSchristos && TEST_true(BN_mod_mul_montgomery(d, b, a, mont, ctx))
508*4724848cSchristos && TEST_BN_eq(c, d)))
509*4724848cSchristos goto err;
510*4724848cSchristos
511*4724848cSchristos /* Regression test for carry bug in sqr[x]8x_mont */
512*4724848cSchristos if (!(TEST_true(parse_bigBN(&n, bn1strings))
513*4724848cSchristos && TEST_true(parse_bigBN(&a, bn2strings))))
514*4724848cSchristos goto err;
515*4724848cSchristos BN_free(b);
516*4724848cSchristos if (!(TEST_ptr(b = BN_dup(a))
517*4724848cSchristos && TEST_true(BN_MONT_CTX_set(mont, n, ctx))
518*4724848cSchristos && TEST_true(BN_mod_mul_montgomery(c, a, a, mont, ctx))
519*4724848cSchristos && TEST_true(BN_mod_mul_montgomery(d, a, b, mont, ctx))
520*4724848cSchristos && TEST_BN_eq(c, d)))
521*4724848cSchristos goto err;
522*4724848cSchristos
523*4724848cSchristos /* Regression test for carry bug in bn_sqrx8x_internal */
524*4724848cSchristos {
525*4724848cSchristos static const char *ahex[] = {
526*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
527*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
528*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
529*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
530*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFEADBCFC4DAE7FFF908E92820306B",
531*4724848cSchristos "9544D954000000006C0000000000000000000000000000000000000000000000",
532*4724848cSchristos "00000000000000000000FF030202FFFFF8FFEBDBCFC4DAE7FFF908E92820306B",
533*4724848cSchristos "9544D954000000006C000000FF0302030000000000FFFFFFFFFFFFFFFFFFFFFF",
534*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01FC00FF02FFFFFFFF",
535*4724848cSchristos "00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FCFD",
536*4724848cSchristos "FCFFFFFFFFFF000000000000000000FF0302030000000000FFFFFFFFFFFFFFFF",
537*4724848cSchristos "FF00FCFDFDFF030202FF00000000FFFFFFFFFFFFFFFFFF00FCFDFCFFFFFFFFFF",
538*4724848cSchristos NULL
539*4724848cSchristos };
540*4724848cSchristos static const char *nhex[] = {
541*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
542*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
543*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
544*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
545*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F8000000",
546*4724848cSchristos "00000010000000006C0000000000000000000000000000000000000000000000",
547*4724848cSchristos "00000000000000000000000000000000000000FFFFFFFFFFFFF8F8F8F8000000",
548*4724848cSchristos "00000010000000006C000000000000000000000000FFFFFFFFFFFFFFFFFFFFFF",
549*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
550*4724848cSchristos "00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
551*4724848cSchristos "FFFFFFFFFFFF000000000000000000000000000000000000FFFFFFFFFFFFFFFF",
552*4724848cSchristos "FFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
553*4724848cSchristos NULL
554*4724848cSchristos };
555*4724848cSchristos
556*4724848cSchristos if (!(TEST_true(parse_bigBN(&a, ahex))
557*4724848cSchristos && TEST_true(parse_bigBN(&n, nhex))))
558*4724848cSchristos goto err;
559*4724848cSchristos }
560*4724848cSchristos BN_free(b);
561*4724848cSchristos if (!(TEST_ptr(b = BN_dup(a))
562*4724848cSchristos && TEST_true(BN_MONT_CTX_set(mont, n, ctx))))
563*4724848cSchristos goto err;
564*4724848cSchristos
565*4724848cSchristos if (!TEST_true(BN_mod_mul_montgomery(c, a, a, mont, ctx))
566*4724848cSchristos || !TEST_true(BN_mod_mul_montgomery(d, a, b, mont, ctx))
567*4724848cSchristos || !TEST_BN_eq(c, d))
568*4724848cSchristos goto err;
569*4724848cSchristos
570*4724848cSchristos /* Regression test for bug in BN_from_montgomery_word */
571*4724848cSchristos if (!(TEST_true(BN_hex2bn(&a,
572*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
573*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
574*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"))
575*4724848cSchristos && TEST_true(BN_hex2bn(&n,
576*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
577*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"))
578*4724848cSchristos && TEST_true(BN_MONT_CTX_set(mont, n, ctx))
579*4724848cSchristos && TEST_false(BN_mod_mul_montgomery(d, a, a, mont, ctx))))
580*4724848cSchristos goto err;
581*4724848cSchristos
582*4724848cSchristos /* Regression test for bug in rsaz_1024_mul_avx2 */
583*4724848cSchristos if (!(TEST_true(BN_hex2bn(&a,
584*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
585*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
586*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
587*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2020202020DF"))
588*4724848cSchristos && TEST_true(BN_hex2bn(&b,
589*4724848cSchristos "2020202020202020202020202020202020202020202020202020202020202020"
590*4724848cSchristos "2020202020202020202020202020202020202020202020202020202020202020"
591*4724848cSchristos "20202020202020FF202020202020202020202020202020202020202020202020"
592*4724848cSchristos "2020202020202020202020202020202020202020202020202020202020202020"))
593*4724848cSchristos && TEST_true(BN_hex2bn(&n,
594*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
595*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
596*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
597*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2020202020FF"))
598*4724848cSchristos && TEST_true(BN_MONT_CTX_set(mont, n, ctx))
599*4724848cSchristos && TEST_true(BN_mod_exp_mont_consttime(c, a, b, n, ctx, mont))
600*4724848cSchristos && TEST_true(BN_mod_exp_mont(d, a, b, n, ctx, mont))
601*4724848cSchristos && TEST_BN_eq(c, d)))
602*4724848cSchristos goto err;
603*4724848cSchristos
604*4724848cSchristos /*
605*4724848cSchristos * rsaz_1024_mul_avx2 expects fully-reduced inputs.
606*4724848cSchristos * BN_mod_exp_mont_consttime should reduce the input first.
607*4724848cSchristos */
608*4724848cSchristos if (!(TEST_true(BN_hex2bn(&a,
609*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
610*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
611*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
612*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2020202020DF"))
613*4724848cSchristos && TEST_true(BN_hex2bn(&b,
614*4724848cSchristos "1FA53F26F8811C58BE0357897AA5E165693230BC9DF5F01DFA6A2D59229EC69D"
615*4724848cSchristos "9DE6A89C36E3B6957B22D6FAAD5A3C73AE587B710DBE92E83D3A9A3339A085CB"
616*4724848cSchristos "B58F508CA4F837924BB52CC1698B7FDC2FD74362456A595A5B58E38E38E38E38"
617*4724848cSchristos "E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E38E"))
618*4724848cSchristos && TEST_true(BN_hex2bn(&n,
619*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
620*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
621*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
622*4724848cSchristos "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2020202020DF"))
623*4724848cSchristos && TEST_true(BN_MONT_CTX_set(mont, n, ctx))
624*4724848cSchristos && TEST_true(BN_mod_exp_mont_consttime(c, a, b, n, ctx, mont))))
625*4724848cSchristos goto err;
626*4724848cSchristos BN_zero(d);
627*4724848cSchristos if (!TEST_BN_eq(c, d))
628*4724848cSchristos goto err;
629*4724848cSchristos
630*4724848cSchristos /*
631*4724848cSchristos * Regression test for overflow bug in bn_sqr_comba4/8 for
632*4724848cSchristos * mips-linux-gnu and mipsel-linux-gnu 32bit targets.
633*4724848cSchristos */
634*4724848cSchristos {
635*4724848cSchristos static const char *ehex[] = {
636*4724848cSchristos "95564994a96c45954227b845a1e99cb939d5a1da99ee91acc962396ae999a9ee",
637*4724848cSchristos "38603790448f2f7694c242a875f0cad0aae658eba085f312d2febbbd128dd2b5",
638*4724848cSchristos "8f7d1149f03724215d704344d0d62c587ae3c5939cba4b9b5f3dc5e8e911ef9a",
639*4724848cSchristos "5ce1a5a749a4989d0d8368f6e1f8cdf3a362a6c97fb02047ff152b480a4ad985",
640*4724848cSchristos "2d45efdf0770542992afca6a0590d52930434bba96017afbc9f99e112950a8b1",
641*4724848cSchristos "a359473ec376f329bdae6a19f503be6d4be7393c4e43468831234e27e3838680",
642*4724848cSchristos "b949390d2e416a3f9759e5349ab4c253f6f29f819a6fe4cbfd27ada34903300e",
643*4724848cSchristos "da021f62839f5878a36f1bc3085375b00fd5fa3e68d316c0fdace87a97558465",
644*4724848cSchristos NULL};
645*4724848cSchristos static const char *phex[] = {
646*4724848cSchristos "f95dc0f980fbd22e90caa5a387cc4a369f3f830d50dd321c40db8c09a7e1a241",
647*4724848cSchristos "a536e096622d3280c0c1ba849c1f4a79bf490f60006d081e8cf69960189f0d31",
648*4724848cSchristos "2cd9e17073a3fba7881b21474a13b334116cb2f5dbf3189a6de3515d0840f053",
649*4724848cSchristos "c776d3982d391b6d04d642dda5cc6d1640174c09875addb70595658f89efb439",
650*4724848cSchristos "dc6fbd55f903aadd307982d3f659207f265e1ec6271b274521b7a5e28e8fd7a5",
651*4724848cSchristos "5df089292820477802a43cf5b6b94e999e8c9944ddebb0d0e95a60f88cb7e813",
652*4724848cSchristos "ba110d20e1024774107dd02949031864923b3cb8c3f7250d6d1287b0a40db6a4",
653*4724848cSchristos "7bd5a469518eb65aa207ddc47d8c6e5fc8e0c105be8fc1d4b57b2e27540471d5",
654*4724848cSchristos NULL};
655*4724848cSchristos static const char *mhex[] = {
656*4724848cSchristos "fef15d5ce4625f1bccfbba49fc8439c72bf8202af039a2259678941b60bb4a8f",
657*4724848cSchristos "2987e965d58fd8cf86a856674d519763d0e1211cc9f8596971050d56d9b35db3",
658*4724848cSchristos "785866cfbca17cfdbed6060be3629d894f924a89fdc1efc624f80d41a22f1900",
659*4724848cSchristos "9503fcc3824ef62ccb9208430c26f2d8ceb2c63488ec4c07437aa4c96c43dd8b",
660*4724848cSchristos "9289ed00a712ff66ee195dc71f5e4ead02172b63c543d69baf495f5fd63ba7bc",
661*4724848cSchristos "c633bd309c016e37736da92129d0b053d4ab28d21ad7d8b6fab2a8bbdc8ee647",
662*4724848cSchristos "d2fbcf2cf426cf892e6f5639e0252993965dfb73ccd277407014ea784aaa280c",
663*4724848cSchristos "b7b03972bc8b0baa72360bdb44b82415b86b2f260f877791cd33ba8f2d65229b",
664*4724848cSchristos NULL};
665*4724848cSchristos
666*4724848cSchristos if (!TEST_true(parse_bigBN(&e, ehex))
667*4724848cSchristos || !TEST_true(parse_bigBN(&p, phex))
668*4724848cSchristos || !TEST_true(parse_bigBN(&m, mhex))
669*4724848cSchristos || !TEST_true(BN_mod_exp_mont_consttime(d, e, p, m, ctx, NULL))
670*4724848cSchristos || !TEST_true(BN_mod_exp_simple(a, e, p, m, ctx))
671*4724848cSchristos || !TEST_BN_eq(a, d))
672*4724848cSchristos goto err;
673*4724848cSchristos }
674*4724848cSchristos
675*4724848cSchristos /* Zero input */
676*4724848cSchristos if (!TEST_true(BN_bntest_rand(p, 1024, 0, 0)))
677*4724848cSchristos goto err;
678*4724848cSchristos BN_zero(a);
679*4724848cSchristos if (!TEST_true(BN_mod_exp_mont_consttime(d, a, p, m, ctx, NULL))
680*4724848cSchristos || !TEST_BN_eq_zero(d))
681*4724848cSchristos goto err;
682*4724848cSchristos
683*4724848cSchristos /*
684*4724848cSchristos * Craft an input whose Montgomery representation is 1, i.e., shorter
685*4724848cSchristos * than the modulus m, in order to test the const time precomputation
686*4724848cSchristos * scattering/gathering.
687*4724848cSchristos */
688*4724848cSchristos if (!(TEST_true(BN_one(a))
689*4724848cSchristos && TEST_true(BN_MONT_CTX_set(mont, m, ctx))))
690*4724848cSchristos goto err;
691*4724848cSchristos if (!TEST_true(BN_from_montgomery(e, a, mont, ctx))
692*4724848cSchristos || !TEST_true(BN_mod_exp_mont_consttime(d, e, p, m, ctx, NULL))
693*4724848cSchristos || !TEST_true(BN_mod_exp_simple(a, e, p, m, ctx))
694*4724848cSchristos || !TEST_BN_eq(a, d))
695*4724848cSchristos goto err;
696*4724848cSchristos
697*4724848cSchristos /* Finally, some regular test vectors. */
698*4724848cSchristos if (!(TEST_true(BN_bntest_rand(e, 1024, 0, 0))
699*4724848cSchristos && TEST_true(BN_mod_exp_mont_consttime(d, e, p, m, ctx, NULL))
700*4724848cSchristos && TEST_true(BN_mod_exp_simple(a, e, p, m, ctx))
701*4724848cSchristos && TEST_BN_eq(a, d)))
702*4724848cSchristos goto err;
703*4724848cSchristos
704*4724848cSchristos st = 1;
705*4724848cSchristos
706*4724848cSchristos err:
707*4724848cSchristos BN_MONT_CTX_free(mont);
708*4724848cSchristos BN_free(a);
709*4724848cSchristos BN_free(p);
710*4724848cSchristos BN_free(m);
711*4724848cSchristos BN_free(d);
712*4724848cSchristos BN_free(e);
713*4724848cSchristos BN_free(b);
714*4724848cSchristos BN_free(n);
715*4724848cSchristos BN_free(c);
716*4724848cSchristos return st;
717*4724848cSchristos }
718*4724848cSchristos
719*4724848cSchristos #ifndef OPENSSL_NO_EC2M
test_gf2m_add(void)720*4724848cSchristos static int test_gf2m_add(void)
721*4724848cSchristos {
722*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *c = NULL;
723*4724848cSchristos int i, st = 0;
724*4724848cSchristos
725*4724848cSchristos if (!TEST_ptr(a = BN_new())
726*4724848cSchristos || !TEST_ptr(b = BN_new())
727*4724848cSchristos || !TEST_ptr(c = BN_new()))
728*4724848cSchristos goto err;
729*4724848cSchristos
730*4724848cSchristos for (i = 0; i < NUM0; i++) {
731*4724848cSchristos if (!(TEST_true(BN_rand(a, 512, 0, 0))
732*4724848cSchristos && TEST_ptr(BN_copy(b, BN_value_one()))))
733*4724848cSchristos goto err;
734*4724848cSchristos BN_set_negative(a, rand_neg());
735*4724848cSchristos BN_set_negative(b, rand_neg());
736*4724848cSchristos if (!(TEST_true(BN_GF2m_add(c, a, b))
737*4724848cSchristos /* Test that two added values have the correct parity. */
738*4724848cSchristos && TEST_false((BN_is_odd(a) && BN_is_odd(c))
739*4724848cSchristos || (!BN_is_odd(a) && !BN_is_odd(c)))))
740*4724848cSchristos goto err;
741*4724848cSchristos if (!(TEST_true(BN_GF2m_add(c, c, c))
742*4724848cSchristos /* Test that c + c = 0. */
743*4724848cSchristos && TEST_BN_eq_zero(c)))
744*4724848cSchristos goto err;
745*4724848cSchristos }
746*4724848cSchristos st = 1;
747*4724848cSchristos err:
748*4724848cSchristos BN_free(a);
749*4724848cSchristos BN_free(b);
750*4724848cSchristos BN_free(c);
751*4724848cSchristos return st;
752*4724848cSchristos }
753*4724848cSchristos
test_gf2m_mod(void)754*4724848cSchristos static int test_gf2m_mod(void)
755*4724848cSchristos {
756*4724848cSchristos BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL, *e = NULL;
757*4724848cSchristos int i, j, st = 0;
758*4724848cSchristos
759*4724848cSchristos if (!TEST_ptr(a = BN_new())
760*4724848cSchristos || !TEST_ptr(b[0] = BN_new())
761*4724848cSchristos || !TEST_ptr(b[1] = BN_new())
762*4724848cSchristos || !TEST_ptr(c = BN_new())
763*4724848cSchristos || !TEST_ptr(d = BN_new())
764*4724848cSchristos || !TEST_ptr(e = BN_new()))
765*4724848cSchristos goto err;
766*4724848cSchristos
767*4724848cSchristos if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
768*4724848cSchristos && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
769*4724848cSchristos goto err;
770*4724848cSchristos
771*4724848cSchristos for (i = 0; i < NUM0; i++) {
772*4724848cSchristos if (!TEST_true(BN_bntest_rand(a, 1024, 0, 0)))
773*4724848cSchristos goto err;
774*4724848cSchristos for (j = 0; j < 2; j++) {
775*4724848cSchristos if (!(TEST_true(BN_GF2m_mod(c, a, b[j]))
776*4724848cSchristos && TEST_true(BN_GF2m_add(d, a, c))
777*4724848cSchristos && TEST_true(BN_GF2m_mod(e, d, b[j]))
778*4724848cSchristos /* Test that a + (a mod p) mod p == 0. */
779*4724848cSchristos && TEST_BN_eq_zero(e)))
780*4724848cSchristos goto err;
781*4724848cSchristos }
782*4724848cSchristos }
783*4724848cSchristos st = 1;
784*4724848cSchristos err:
785*4724848cSchristos BN_free(a);
786*4724848cSchristos BN_free(b[0]);
787*4724848cSchristos BN_free(b[1]);
788*4724848cSchristos BN_free(c);
789*4724848cSchristos BN_free(d);
790*4724848cSchristos BN_free(e);
791*4724848cSchristos return st;
792*4724848cSchristos }
793*4724848cSchristos
test_gf2m_mul(void)794*4724848cSchristos static int test_gf2m_mul(void)
795*4724848cSchristos {
796*4724848cSchristos BIGNUM *a, *b[2] = {NULL, NULL}, *c = NULL, *d = NULL;
797*4724848cSchristos BIGNUM *e = NULL, *f = NULL, *g = NULL, *h = NULL;
798*4724848cSchristos int i, j, st = 0;
799*4724848cSchristos
800*4724848cSchristos if (!TEST_ptr(a = BN_new())
801*4724848cSchristos || !TEST_ptr(b[0] = BN_new())
802*4724848cSchristos || !TEST_ptr(b[1] = BN_new())
803*4724848cSchristos || !TEST_ptr(c = BN_new())
804*4724848cSchristos || !TEST_ptr(d = BN_new())
805*4724848cSchristos || !TEST_ptr(e = BN_new())
806*4724848cSchristos || !TEST_ptr(f = BN_new())
807*4724848cSchristos || !TEST_ptr(g = BN_new())
808*4724848cSchristos || !TEST_ptr(h = BN_new()))
809*4724848cSchristos goto err;
810*4724848cSchristos
811*4724848cSchristos if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
812*4724848cSchristos && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
813*4724848cSchristos goto err;
814*4724848cSchristos
815*4724848cSchristos for (i = 0; i < NUM0; i++) {
816*4724848cSchristos if (!(TEST_true(BN_bntest_rand(a, 1024, 0, 0))
817*4724848cSchristos && TEST_true(BN_bntest_rand(c, 1024, 0, 0))
818*4724848cSchristos && TEST_true(BN_bntest_rand(d, 1024, 0, 0))))
819*4724848cSchristos goto err;
820*4724848cSchristos for (j = 0; j < 2; j++) {
821*4724848cSchristos if (!(TEST_true(BN_GF2m_mod_mul(e, a, c, b[j], ctx))
822*4724848cSchristos && TEST_true(BN_GF2m_add(f, a, d))
823*4724848cSchristos && TEST_true(BN_GF2m_mod_mul(g, f, c, b[j], ctx))
824*4724848cSchristos && TEST_true(BN_GF2m_mod_mul(h, d, c, b[j], ctx))
825*4724848cSchristos && TEST_true(BN_GF2m_add(f, e, g))
826*4724848cSchristos && TEST_true(BN_GF2m_add(f, f, h))
827*4724848cSchristos /* Test that (a+d)*c = a*c + d*c. */
828*4724848cSchristos && TEST_BN_eq_zero(f)))
829*4724848cSchristos goto err;
830*4724848cSchristos }
831*4724848cSchristos }
832*4724848cSchristos st = 1;
833*4724848cSchristos
834*4724848cSchristos err:
835*4724848cSchristos BN_free(a);
836*4724848cSchristos BN_free(b[0]);
837*4724848cSchristos BN_free(b[1]);
838*4724848cSchristos BN_free(c);
839*4724848cSchristos BN_free(d);
840*4724848cSchristos BN_free(e);
841*4724848cSchristos BN_free(f);
842*4724848cSchristos BN_free(g);
843*4724848cSchristos BN_free(h);
844*4724848cSchristos return st;
845*4724848cSchristos }
846*4724848cSchristos
test_gf2m_sqr(void)847*4724848cSchristos static int test_gf2m_sqr(void)
848*4724848cSchristos {
849*4724848cSchristos BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
850*4724848cSchristos int i, j, st = 0;
851*4724848cSchristos
852*4724848cSchristos if (!TEST_ptr(a = BN_new())
853*4724848cSchristos || !TEST_ptr(b[0] = BN_new())
854*4724848cSchristos || !TEST_ptr(b[1] = BN_new())
855*4724848cSchristos || !TEST_ptr(c = BN_new())
856*4724848cSchristos || !TEST_ptr(d = BN_new()))
857*4724848cSchristos goto err;
858*4724848cSchristos
859*4724848cSchristos if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
860*4724848cSchristos && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
861*4724848cSchristos goto err;
862*4724848cSchristos
863*4724848cSchristos for (i = 0; i < NUM0; i++) {
864*4724848cSchristos if (!TEST_true(BN_bntest_rand(a, 1024, 0, 0)))
865*4724848cSchristos goto err;
866*4724848cSchristos for (j = 0; j < 2; j++) {
867*4724848cSchristos if (!(TEST_true(BN_GF2m_mod_sqr(c, a, b[j], ctx))
868*4724848cSchristos && TEST_true(BN_copy(d, a))
869*4724848cSchristos && TEST_true(BN_GF2m_mod_mul(d, a, d, b[j], ctx))
870*4724848cSchristos && TEST_true(BN_GF2m_add(d, c, d))
871*4724848cSchristos /* Test that a*a = a^2. */
872*4724848cSchristos && TEST_BN_eq_zero(d)))
873*4724848cSchristos goto err;
874*4724848cSchristos }
875*4724848cSchristos }
876*4724848cSchristos st = 1;
877*4724848cSchristos err:
878*4724848cSchristos BN_free(a);
879*4724848cSchristos BN_free(b[0]);
880*4724848cSchristos BN_free(b[1]);
881*4724848cSchristos BN_free(c);
882*4724848cSchristos BN_free(d);
883*4724848cSchristos return st;
884*4724848cSchristos }
885*4724848cSchristos
test_gf2m_modinv(void)886*4724848cSchristos static int test_gf2m_modinv(void)
887*4724848cSchristos {
888*4724848cSchristos BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
889*4724848cSchristos int i, j, st = 0;
890*4724848cSchristos
891*4724848cSchristos if (!TEST_ptr(a = BN_new())
892*4724848cSchristos || !TEST_ptr(b[0] = BN_new())
893*4724848cSchristos || !TEST_ptr(b[1] = BN_new())
894*4724848cSchristos || !TEST_ptr(c = BN_new())
895*4724848cSchristos || !TEST_ptr(d = BN_new()))
896*4724848cSchristos goto err;
897*4724848cSchristos
898*4724848cSchristos if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
899*4724848cSchristos && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
900*4724848cSchristos goto err;
901*4724848cSchristos
902*4724848cSchristos for (i = 0; i < NUM0; i++) {
903*4724848cSchristos if (!TEST_true(BN_bntest_rand(a, 512, 0, 0)))
904*4724848cSchristos goto err;
905*4724848cSchristos for (j = 0; j < 2; j++) {
906*4724848cSchristos if (!(TEST_true(BN_GF2m_mod_inv(c, a, b[j], ctx))
907*4724848cSchristos && TEST_true(BN_GF2m_mod_mul(d, a, c, b[j], ctx))
908*4724848cSchristos /* Test that ((1/a)*a) = 1. */
909*4724848cSchristos && TEST_BN_eq_one(d)))
910*4724848cSchristos goto err;
911*4724848cSchristos }
912*4724848cSchristos }
913*4724848cSchristos st = 1;
914*4724848cSchristos err:
915*4724848cSchristos BN_free(a);
916*4724848cSchristos BN_free(b[0]);
917*4724848cSchristos BN_free(b[1]);
918*4724848cSchristos BN_free(c);
919*4724848cSchristos BN_free(d);
920*4724848cSchristos return st;
921*4724848cSchristos }
922*4724848cSchristos
test_gf2m_moddiv(void)923*4724848cSchristos static int test_gf2m_moddiv(void)
924*4724848cSchristos {
925*4724848cSchristos BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
926*4724848cSchristos BIGNUM *e = NULL, *f = NULL;
927*4724848cSchristos int i, j, st = 0;
928*4724848cSchristos
929*4724848cSchristos if (!TEST_ptr(a = BN_new())
930*4724848cSchristos || !TEST_ptr(b[0] = BN_new())
931*4724848cSchristos || !TEST_ptr(b[1] = BN_new())
932*4724848cSchristos || !TEST_ptr(c = BN_new())
933*4724848cSchristos || !TEST_ptr(d = BN_new())
934*4724848cSchristos || !TEST_ptr(e = BN_new())
935*4724848cSchristos || !TEST_ptr(f = BN_new()))
936*4724848cSchristos goto err;
937*4724848cSchristos
938*4724848cSchristos if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
939*4724848cSchristos && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
940*4724848cSchristos goto err;
941*4724848cSchristos
942*4724848cSchristos for (i = 0; i < NUM0; i++) {
943*4724848cSchristos if (!(TEST_true(BN_bntest_rand(a, 512, 0, 0))
944*4724848cSchristos && TEST_true(BN_bntest_rand(c, 512, 0, 0))))
945*4724848cSchristos goto err;
946*4724848cSchristos for (j = 0; j < 2; j++) {
947*4724848cSchristos if (!(TEST_true(BN_GF2m_mod_div(d, a, c, b[j], ctx))
948*4724848cSchristos && TEST_true(BN_GF2m_mod_mul(e, d, c, b[j], ctx))
949*4724848cSchristos && TEST_true(BN_GF2m_mod_div(f, a, e, b[j], ctx))
950*4724848cSchristos /* Test that ((a/c)*c)/a = 1. */
951*4724848cSchristos && TEST_BN_eq_one(f)))
952*4724848cSchristos goto err;
953*4724848cSchristos }
954*4724848cSchristos }
955*4724848cSchristos st = 1;
956*4724848cSchristos err:
957*4724848cSchristos BN_free(a);
958*4724848cSchristos BN_free(b[0]);
959*4724848cSchristos BN_free(b[1]);
960*4724848cSchristos BN_free(c);
961*4724848cSchristos BN_free(d);
962*4724848cSchristos BN_free(e);
963*4724848cSchristos BN_free(f);
964*4724848cSchristos return st;
965*4724848cSchristos }
966*4724848cSchristos
test_gf2m_modexp(void)967*4724848cSchristos static int test_gf2m_modexp(void)
968*4724848cSchristos {
969*4724848cSchristos BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
970*4724848cSchristos BIGNUM *e = NULL, *f = NULL;
971*4724848cSchristos int i, j, st = 0;
972*4724848cSchristos
973*4724848cSchristos if (!TEST_ptr(a = BN_new())
974*4724848cSchristos || !TEST_ptr(b[0] = BN_new())
975*4724848cSchristos || !TEST_ptr(b[1] = BN_new())
976*4724848cSchristos || !TEST_ptr(c = BN_new())
977*4724848cSchristos || !TEST_ptr(d = BN_new())
978*4724848cSchristos || !TEST_ptr(e = BN_new())
979*4724848cSchristos || !TEST_ptr(f = BN_new()))
980*4724848cSchristos goto err;
981*4724848cSchristos
982*4724848cSchristos if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
983*4724848cSchristos && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
984*4724848cSchristos goto err;
985*4724848cSchristos
986*4724848cSchristos for (i = 0; i < NUM0; i++) {
987*4724848cSchristos if (!(TEST_true(BN_bntest_rand(a, 512, 0, 0))
988*4724848cSchristos && TEST_true(BN_bntest_rand(c, 512, 0, 0))
989*4724848cSchristos && TEST_true(BN_bntest_rand(d, 512, 0, 0))))
990*4724848cSchristos goto err;
991*4724848cSchristos for (j = 0; j < 2; j++) {
992*4724848cSchristos if (!(TEST_true(BN_GF2m_mod_exp(e, a, c, b[j], ctx))
993*4724848cSchristos && TEST_true(BN_GF2m_mod_exp(f, a, d, b[j], ctx))
994*4724848cSchristos && TEST_true(BN_GF2m_mod_mul(e, e, f, b[j], ctx))
995*4724848cSchristos && TEST_true(BN_add(f, c, d))
996*4724848cSchristos && TEST_true(BN_GF2m_mod_exp(f, a, f, b[j], ctx))
997*4724848cSchristos && TEST_true(BN_GF2m_add(f, e, f))
998*4724848cSchristos /* Test that a^(c+d)=a^c*a^d. */
999*4724848cSchristos && TEST_BN_eq_zero(f)))
1000*4724848cSchristos goto err;
1001*4724848cSchristos }
1002*4724848cSchristos }
1003*4724848cSchristos st = 1;
1004*4724848cSchristos err:
1005*4724848cSchristos BN_free(a);
1006*4724848cSchristos BN_free(b[0]);
1007*4724848cSchristos BN_free(b[1]);
1008*4724848cSchristos BN_free(c);
1009*4724848cSchristos BN_free(d);
1010*4724848cSchristos BN_free(e);
1011*4724848cSchristos BN_free(f);
1012*4724848cSchristos return st;
1013*4724848cSchristos }
1014*4724848cSchristos
test_gf2m_modsqrt(void)1015*4724848cSchristos static int test_gf2m_modsqrt(void)
1016*4724848cSchristos {
1017*4724848cSchristos BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
1018*4724848cSchristos BIGNUM *e = NULL, *f = NULL;
1019*4724848cSchristos int i, j, st = 0;
1020*4724848cSchristos
1021*4724848cSchristos if (!TEST_ptr(a = BN_new())
1022*4724848cSchristos || !TEST_ptr(b[0] = BN_new())
1023*4724848cSchristos || !TEST_ptr(b[1] = BN_new())
1024*4724848cSchristos || !TEST_ptr(c = BN_new())
1025*4724848cSchristos || !TEST_ptr(d = BN_new())
1026*4724848cSchristos || !TEST_ptr(e = BN_new())
1027*4724848cSchristos || !TEST_ptr(f = BN_new()))
1028*4724848cSchristos goto err;
1029*4724848cSchristos
1030*4724848cSchristos if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
1031*4724848cSchristos && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
1032*4724848cSchristos goto err;
1033*4724848cSchristos
1034*4724848cSchristos for (i = 0; i < NUM0; i++) {
1035*4724848cSchristos if (!TEST_true(BN_bntest_rand(a, 512, 0, 0)))
1036*4724848cSchristos goto err;
1037*4724848cSchristos
1038*4724848cSchristos for (j = 0; j < 2; j++) {
1039*4724848cSchristos if (!(TEST_true(BN_GF2m_mod(c, a, b[j]))
1040*4724848cSchristos && TEST_true(BN_GF2m_mod_sqrt(d, a, b[j], ctx))
1041*4724848cSchristos && TEST_true(BN_GF2m_mod_sqr(e, d, b[j], ctx))
1042*4724848cSchristos && TEST_true(BN_GF2m_add(f, c, e))
1043*4724848cSchristos /* Test that d^2 = a, where d = sqrt(a). */
1044*4724848cSchristos && TEST_BN_eq_zero(f)))
1045*4724848cSchristos goto err;
1046*4724848cSchristos }
1047*4724848cSchristos }
1048*4724848cSchristos st = 1;
1049*4724848cSchristos err:
1050*4724848cSchristos BN_free(a);
1051*4724848cSchristos BN_free(b[0]);
1052*4724848cSchristos BN_free(b[1]);
1053*4724848cSchristos BN_free(c);
1054*4724848cSchristos BN_free(d);
1055*4724848cSchristos BN_free(e);
1056*4724848cSchristos BN_free(f);
1057*4724848cSchristos return st;
1058*4724848cSchristos }
1059*4724848cSchristos
test_gf2m_modsolvequad(void)1060*4724848cSchristos static int test_gf2m_modsolvequad(void)
1061*4724848cSchristos {
1062*4724848cSchristos BIGNUM *a = NULL, *b[2] = {NULL,NULL}, *c = NULL, *d = NULL;
1063*4724848cSchristos BIGNUM *e = NULL;
1064*4724848cSchristos int i, j, s = 0, t, st = 0;
1065*4724848cSchristos
1066*4724848cSchristos if (!TEST_ptr(a = BN_new())
1067*4724848cSchristos || !TEST_ptr(b[0] = BN_new())
1068*4724848cSchristos || !TEST_ptr(b[1] = BN_new())
1069*4724848cSchristos || !TEST_ptr(c = BN_new())
1070*4724848cSchristos || !TEST_ptr(d = BN_new())
1071*4724848cSchristos || !TEST_ptr(e = BN_new()))
1072*4724848cSchristos goto err;
1073*4724848cSchristos
1074*4724848cSchristos if (!(TEST_true(BN_GF2m_arr2poly(p0, b[0]))
1075*4724848cSchristos && TEST_true(BN_GF2m_arr2poly(p1, b[1]))))
1076*4724848cSchristos goto err;
1077*4724848cSchristos
1078*4724848cSchristos for (i = 0; i < NUM0; i++) {
1079*4724848cSchristos if (!TEST_true(BN_bntest_rand(a, 512, 0, 0)))
1080*4724848cSchristos goto err;
1081*4724848cSchristos for (j = 0; j < 2; j++) {
1082*4724848cSchristos t = BN_GF2m_mod_solve_quad(c, a, b[j], ctx);
1083*4724848cSchristos if (t) {
1084*4724848cSchristos s++;
1085*4724848cSchristos if (!(TEST_true(BN_GF2m_mod_sqr(d, c, b[j], ctx))
1086*4724848cSchristos && TEST_true(BN_GF2m_add(d, c, d))
1087*4724848cSchristos && TEST_true(BN_GF2m_mod(e, a, b[j]))
1088*4724848cSchristos && TEST_true(BN_GF2m_add(e, e, d))
1089*4724848cSchristos /*
1090*4724848cSchristos * Test that solution of quadratic c
1091*4724848cSchristos * satisfies c^2 + c = a.
1092*4724848cSchristos */
1093*4724848cSchristos && TEST_BN_eq_zero(e)))
1094*4724848cSchristos goto err;
1095*4724848cSchristos }
1096*4724848cSchristos }
1097*4724848cSchristos }
1098*4724848cSchristos if (!TEST_int_ge(s, 0)) {
1099*4724848cSchristos TEST_info("%d tests found no roots; probably an error", NUM0);
1100*4724848cSchristos goto err;
1101*4724848cSchristos }
1102*4724848cSchristos st = 1;
1103*4724848cSchristos err:
1104*4724848cSchristos BN_free(a);
1105*4724848cSchristos BN_free(b[0]);
1106*4724848cSchristos BN_free(b[1]);
1107*4724848cSchristos BN_free(c);
1108*4724848cSchristos BN_free(d);
1109*4724848cSchristos BN_free(e);
1110*4724848cSchristos return st;
1111*4724848cSchristos }
1112*4724848cSchristos #endif
1113*4724848cSchristos
test_kronecker(void)1114*4724848cSchristos static int test_kronecker(void)
1115*4724848cSchristos {
1116*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *r = NULL, *t = NULL;
1117*4724848cSchristos int i, legendre, kronecker, st = 0;
1118*4724848cSchristos
1119*4724848cSchristos if (!TEST_ptr(a = BN_new())
1120*4724848cSchristos || !TEST_ptr(b = BN_new())
1121*4724848cSchristos || !TEST_ptr(r = BN_new())
1122*4724848cSchristos || !TEST_ptr(t = BN_new()))
1123*4724848cSchristos goto err;
1124*4724848cSchristos
1125*4724848cSchristos /*
1126*4724848cSchristos * We test BN_kronecker(a, b, ctx) just for b odd (Jacobi symbol). In
1127*4724848cSchristos * this case we know that if b is prime, then BN_kronecker(a, b, ctx) is
1128*4724848cSchristos * congruent to $a^{(b-1)/2}$, modulo $b$ (Legendre symbol). So we
1129*4724848cSchristos * generate a random prime b and compare these values for a number of
1130*4724848cSchristos * random a's. (That is, we run the Solovay-Strassen primality test to
1131*4724848cSchristos * confirm that b is prime, except that we don't want to test whether b
1132*4724848cSchristos * is prime but whether BN_kronecker works.)
1133*4724848cSchristos */
1134*4724848cSchristos
1135*4724848cSchristos if (!TEST_true(BN_generate_prime_ex(b, 512, 0, NULL, NULL, NULL)))
1136*4724848cSchristos goto err;
1137*4724848cSchristos BN_set_negative(b, rand_neg());
1138*4724848cSchristos
1139*4724848cSchristos for (i = 0; i < NUM0; i++) {
1140*4724848cSchristos if (!TEST_true(BN_bntest_rand(a, 512, 0, 0)))
1141*4724848cSchristos goto err;
1142*4724848cSchristos BN_set_negative(a, rand_neg());
1143*4724848cSchristos
1144*4724848cSchristos /* t := (|b|-1)/2 (note that b is odd) */
1145*4724848cSchristos if (!TEST_true(BN_copy(t, b)))
1146*4724848cSchristos goto err;
1147*4724848cSchristos BN_set_negative(t, 0);
1148*4724848cSchristos if (!TEST_true(BN_sub_word(t, 1)))
1149*4724848cSchristos goto err;
1150*4724848cSchristos if (!TEST_true(BN_rshift1(t, t)))
1151*4724848cSchristos goto err;
1152*4724848cSchristos /* r := a^t mod b */
1153*4724848cSchristos BN_set_negative(b, 0);
1154*4724848cSchristos
1155*4724848cSchristos if (!TEST_true(BN_mod_exp_recp(r, a, t, b, ctx)))
1156*4724848cSchristos goto err;
1157*4724848cSchristos BN_set_negative(b, 1);
1158*4724848cSchristos
1159*4724848cSchristos if (BN_is_word(r, 1))
1160*4724848cSchristos legendre = 1;
1161*4724848cSchristos else if (BN_is_zero(r))
1162*4724848cSchristos legendre = 0;
1163*4724848cSchristos else {
1164*4724848cSchristos if (!TEST_true(BN_add_word(r, 1)))
1165*4724848cSchristos goto err;
1166*4724848cSchristos if (!TEST_int_eq(BN_ucmp(r, b), 0)) {
1167*4724848cSchristos TEST_info("Legendre symbol computation failed");
1168*4724848cSchristos goto err;
1169*4724848cSchristos }
1170*4724848cSchristos legendre = -1;
1171*4724848cSchristos }
1172*4724848cSchristos
1173*4724848cSchristos if (!TEST_int_ge(kronecker = BN_kronecker(a, b, ctx), -1))
1174*4724848cSchristos goto err;
1175*4724848cSchristos /* we actually need BN_kronecker(a, |b|) */
1176*4724848cSchristos if (BN_is_negative(a) && BN_is_negative(b))
1177*4724848cSchristos kronecker = -kronecker;
1178*4724848cSchristos
1179*4724848cSchristos if (!TEST_int_eq(legendre, kronecker))
1180*4724848cSchristos goto err;
1181*4724848cSchristos }
1182*4724848cSchristos
1183*4724848cSchristos st = 1;
1184*4724848cSchristos err:
1185*4724848cSchristos BN_free(a);
1186*4724848cSchristos BN_free(b);
1187*4724848cSchristos BN_free(r);
1188*4724848cSchristos BN_free(t);
1189*4724848cSchristos return st;
1190*4724848cSchristos }
1191*4724848cSchristos
file_sum(STANZA * s)1192*4724848cSchristos static int file_sum(STANZA *s)
1193*4724848cSchristos {
1194*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *sum = NULL, *ret = NULL;
1195*4724848cSchristos BN_ULONG b_word;
1196*4724848cSchristos int st = 0;
1197*4724848cSchristos
1198*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1199*4724848cSchristos || !TEST_ptr(b = getBN(s, "B"))
1200*4724848cSchristos || !TEST_ptr(sum = getBN(s, "Sum"))
1201*4724848cSchristos || !TEST_ptr(ret = BN_new()))
1202*4724848cSchristos goto err;
1203*4724848cSchristos
1204*4724848cSchristos if (!TEST_true(BN_add(ret, a, b))
1205*4724848cSchristos || !equalBN("A + B", sum, ret)
1206*4724848cSchristos || !TEST_true(BN_sub(ret, sum, a))
1207*4724848cSchristos || !equalBN("Sum - A", b, ret)
1208*4724848cSchristos || !TEST_true(BN_sub(ret, sum, b))
1209*4724848cSchristos || !equalBN("Sum - B", a, ret))
1210*4724848cSchristos goto err;
1211*4724848cSchristos
1212*4724848cSchristos /*
1213*4724848cSchristos * Test that the functions work when |r| and |a| point to the same BIGNUM,
1214*4724848cSchristos * or when |r| and |b| point to the same BIGNUM.
1215*4724848cSchristos * TODO: Test where all of |r|, |a|, and |b| point to the same BIGNUM.
1216*4724848cSchristos */
1217*4724848cSchristos if (!TEST_true(BN_copy(ret, a))
1218*4724848cSchristos || !TEST_true(BN_add(ret, ret, b))
1219*4724848cSchristos || !equalBN("A + B (r is a)", sum, ret)
1220*4724848cSchristos || !TEST_true(BN_copy(ret, b))
1221*4724848cSchristos || !TEST_true(BN_add(ret, a, ret))
1222*4724848cSchristos || !equalBN("A + B (r is b)", sum, ret)
1223*4724848cSchristos || !TEST_true(BN_copy(ret, sum))
1224*4724848cSchristos || !TEST_true(BN_sub(ret, ret, a))
1225*4724848cSchristos || !equalBN("Sum - A (r is a)", b, ret)
1226*4724848cSchristos || !TEST_true(BN_copy(ret, a))
1227*4724848cSchristos || !TEST_true(BN_sub(ret, sum, ret))
1228*4724848cSchristos || !equalBN("Sum - A (r is b)", b, ret)
1229*4724848cSchristos || !TEST_true(BN_copy(ret, sum))
1230*4724848cSchristos || !TEST_true(BN_sub(ret, ret, b))
1231*4724848cSchristos || !equalBN("Sum - B (r is a)", a, ret)
1232*4724848cSchristos || !TEST_true(BN_copy(ret, b))
1233*4724848cSchristos || !TEST_true(BN_sub(ret, sum, ret))
1234*4724848cSchristos || !equalBN("Sum - B (r is b)", a, ret))
1235*4724848cSchristos goto err;
1236*4724848cSchristos
1237*4724848cSchristos /*
1238*4724848cSchristos * Test BN_uadd() and BN_usub() with the prerequisites they are
1239*4724848cSchristos * documented as having. Note that these functions are frequently used
1240*4724848cSchristos * when the prerequisites don't hold. In those cases, they are supposed
1241*4724848cSchristos * to work as if the prerequisite hold, but we don't test that yet.
1242*4724848cSchristos * TODO: test that.
1243*4724848cSchristos */
1244*4724848cSchristos if (!BN_is_negative(a) && !BN_is_negative(b) && BN_cmp(a, b) >= 0) {
1245*4724848cSchristos if (!TEST_true(BN_uadd(ret, a, b))
1246*4724848cSchristos || !equalBN("A +u B", sum, ret)
1247*4724848cSchristos || !TEST_true(BN_usub(ret, sum, a))
1248*4724848cSchristos || !equalBN("Sum -u A", b, ret)
1249*4724848cSchristos || !TEST_true(BN_usub(ret, sum, b))
1250*4724848cSchristos || !equalBN("Sum -u B", a, ret))
1251*4724848cSchristos goto err;
1252*4724848cSchristos /*
1253*4724848cSchristos * Test that the functions work when |r| and |a| point to the same
1254*4724848cSchristos * BIGNUM, or when |r| and |b| point to the same BIGNUM.
1255*4724848cSchristos * TODO: Test where all of |r|, |a|, and |b| point to the same BIGNUM.
1256*4724848cSchristos */
1257*4724848cSchristos if (!TEST_true(BN_copy(ret, a))
1258*4724848cSchristos || !TEST_true(BN_uadd(ret, ret, b))
1259*4724848cSchristos || !equalBN("A +u B (r is a)", sum, ret)
1260*4724848cSchristos || !TEST_true(BN_copy(ret, b))
1261*4724848cSchristos || !TEST_true(BN_uadd(ret, a, ret))
1262*4724848cSchristos || !equalBN("A +u B (r is b)", sum, ret)
1263*4724848cSchristos || !TEST_true(BN_copy(ret, sum))
1264*4724848cSchristos || !TEST_true(BN_usub(ret, ret, a))
1265*4724848cSchristos || !equalBN("Sum -u A (r is a)", b, ret)
1266*4724848cSchristos || !TEST_true(BN_copy(ret, a))
1267*4724848cSchristos || !TEST_true(BN_usub(ret, sum, ret))
1268*4724848cSchristos || !equalBN("Sum -u A (r is b)", b, ret)
1269*4724848cSchristos || !TEST_true(BN_copy(ret, sum))
1270*4724848cSchristos || !TEST_true(BN_usub(ret, ret, b))
1271*4724848cSchristos || !equalBN("Sum -u B (r is a)", a, ret)
1272*4724848cSchristos || !TEST_true(BN_copy(ret, b))
1273*4724848cSchristos || !TEST_true(BN_usub(ret, sum, ret))
1274*4724848cSchristos || !equalBN("Sum -u B (r is b)", a, ret))
1275*4724848cSchristos goto err;
1276*4724848cSchristos }
1277*4724848cSchristos
1278*4724848cSchristos /*
1279*4724848cSchristos * Test with BN_add_word() and BN_sub_word() if |b| is small enough.
1280*4724848cSchristos */
1281*4724848cSchristos b_word = BN_get_word(b);
1282*4724848cSchristos if (!BN_is_negative(b) && b_word != (BN_ULONG)-1) {
1283*4724848cSchristos if (!TEST_true(BN_copy(ret, a))
1284*4724848cSchristos || !TEST_true(BN_add_word(ret, b_word))
1285*4724848cSchristos || !equalBN("A + B (word)", sum, ret)
1286*4724848cSchristos || !TEST_true(BN_copy(ret, sum))
1287*4724848cSchristos || !TEST_true(BN_sub_word(ret, b_word))
1288*4724848cSchristos || !equalBN("Sum - B (word)", a, ret))
1289*4724848cSchristos goto err;
1290*4724848cSchristos }
1291*4724848cSchristos st = 1;
1292*4724848cSchristos
1293*4724848cSchristos err:
1294*4724848cSchristos BN_free(a);
1295*4724848cSchristos BN_free(b);
1296*4724848cSchristos BN_free(sum);
1297*4724848cSchristos BN_free(ret);
1298*4724848cSchristos return st;
1299*4724848cSchristos }
1300*4724848cSchristos
file_lshift1(STANZA * s)1301*4724848cSchristos static int file_lshift1(STANZA *s)
1302*4724848cSchristos {
1303*4724848cSchristos BIGNUM *a = NULL, *lshift1 = NULL, *zero = NULL, *ret = NULL;
1304*4724848cSchristos BIGNUM *two = NULL, *remainder = NULL;
1305*4724848cSchristos int st = 0;
1306*4724848cSchristos
1307*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1308*4724848cSchristos || !TEST_ptr(lshift1 = getBN(s, "LShift1"))
1309*4724848cSchristos || !TEST_ptr(zero = BN_new())
1310*4724848cSchristos || !TEST_ptr(ret = BN_new())
1311*4724848cSchristos || !TEST_ptr(two = BN_new())
1312*4724848cSchristos || !TEST_ptr(remainder = BN_new()))
1313*4724848cSchristos goto err;
1314*4724848cSchristos
1315*4724848cSchristos BN_zero(zero);
1316*4724848cSchristos
1317*4724848cSchristos if (!TEST_true(BN_set_word(two, 2))
1318*4724848cSchristos || !TEST_true(BN_add(ret, a, a))
1319*4724848cSchristos || !equalBN("A + A", lshift1, ret)
1320*4724848cSchristos || !TEST_true(BN_mul(ret, a, two, ctx))
1321*4724848cSchristos || !equalBN("A * 2", lshift1, ret)
1322*4724848cSchristos || !TEST_true(BN_div(ret, remainder, lshift1, two, ctx))
1323*4724848cSchristos || !equalBN("LShift1 / 2", a, ret)
1324*4724848cSchristos || !equalBN("LShift1 % 2", zero, remainder)
1325*4724848cSchristos || !TEST_true(BN_lshift1(ret, a))
1326*4724848cSchristos || !equalBN("A << 1", lshift1, ret)
1327*4724848cSchristos || !TEST_true(BN_rshift1(ret, lshift1))
1328*4724848cSchristos || !equalBN("LShift >> 1", a, ret)
1329*4724848cSchristos || !TEST_true(BN_rshift1(ret, lshift1))
1330*4724848cSchristos || !equalBN("LShift >> 1", a, ret))
1331*4724848cSchristos goto err;
1332*4724848cSchristos
1333*4724848cSchristos /* Set the LSB to 1 and test rshift1 again. */
1334*4724848cSchristos if (!TEST_true(BN_set_bit(lshift1, 0))
1335*4724848cSchristos || !TEST_true(BN_div(ret, NULL /* rem */ , lshift1, two, ctx))
1336*4724848cSchristos || !equalBN("(LShift1 | 1) / 2", a, ret)
1337*4724848cSchristos || !TEST_true(BN_rshift1(ret, lshift1))
1338*4724848cSchristos || !equalBN("(LShift | 1) >> 1", a, ret))
1339*4724848cSchristos goto err;
1340*4724848cSchristos
1341*4724848cSchristos st = 1;
1342*4724848cSchristos err:
1343*4724848cSchristos BN_free(a);
1344*4724848cSchristos BN_free(lshift1);
1345*4724848cSchristos BN_free(zero);
1346*4724848cSchristos BN_free(ret);
1347*4724848cSchristos BN_free(two);
1348*4724848cSchristos BN_free(remainder);
1349*4724848cSchristos
1350*4724848cSchristos return st;
1351*4724848cSchristos }
1352*4724848cSchristos
file_lshift(STANZA * s)1353*4724848cSchristos static int file_lshift(STANZA *s)
1354*4724848cSchristos {
1355*4724848cSchristos BIGNUM *a = NULL, *lshift = NULL, *ret = NULL;
1356*4724848cSchristos int n = 0, st = 0;
1357*4724848cSchristos
1358*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1359*4724848cSchristos || !TEST_ptr(lshift = getBN(s, "LShift"))
1360*4724848cSchristos || !TEST_ptr(ret = BN_new())
1361*4724848cSchristos || !getint(s, &n, "N"))
1362*4724848cSchristos goto err;
1363*4724848cSchristos
1364*4724848cSchristos if (!TEST_true(BN_lshift(ret, a, n))
1365*4724848cSchristos || !equalBN("A << N", lshift, ret)
1366*4724848cSchristos || !TEST_true(BN_rshift(ret, lshift, n))
1367*4724848cSchristos || !equalBN("A >> N", a, ret))
1368*4724848cSchristos goto err;
1369*4724848cSchristos
1370*4724848cSchristos st = 1;
1371*4724848cSchristos err:
1372*4724848cSchristos BN_free(a);
1373*4724848cSchristos BN_free(lshift);
1374*4724848cSchristos BN_free(ret);
1375*4724848cSchristos return st;
1376*4724848cSchristos }
1377*4724848cSchristos
file_rshift(STANZA * s)1378*4724848cSchristos static int file_rshift(STANZA *s)
1379*4724848cSchristos {
1380*4724848cSchristos BIGNUM *a = NULL, *rshift = NULL, *ret = NULL;
1381*4724848cSchristos int n = 0, st = 0;
1382*4724848cSchristos
1383*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1384*4724848cSchristos || !TEST_ptr(rshift = getBN(s, "RShift"))
1385*4724848cSchristos || !TEST_ptr(ret = BN_new())
1386*4724848cSchristos || !getint(s, &n, "N"))
1387*4724848cSchristos goto err;
1388*4724848cSchristos
1389*4724848cSchristos if (!TEST_true(BN_rshift(ret, a, n))
1390*4724848cSchristos || !equalBN("A >> N", rshift, ret))
1391*4724848cSchristos goto err;
1392*4724848cSchristos
1393*4724848cSchristos /* If N == 1, try with rshift1 as well */
1394*4724848cSchristos if (n == 1) {
1395*4724848cSchristos if (!TEST_true(BN_rshift1(ret, a))
1396*4724848cSchristos || !equalBN("A >> 1 (rshift1)", rshift, ret))
1397*4724848cSchristos goto err;
1398*4724848cSchristos }
1399*4724848cSchristos st = 1;
1400*4724848cSchristos
1401*4724848cSchristos err:
1402*4724848cSchristos BN_free(a);
1403*4724848cSchristos BN_free(rshift);
1404*4724848cSchristos BN_free(ret);
1405*4724848cSchristos return st;
1406*4724848cSchristos }
1407*4724848cSchristos
file_square(STANZA * s)1408*4724848cSchristos static int file_square(STANZA *s)
1409*4724848cSchristos {
1410*4724848cSchristos BIGNUM *a = NULL, *square = NULL, *zero = NULL, *ret = NULL;
1411*4724848cSchristos BIGNUM *remainder = NULL, *tmp = NULL;
1412*4724848cSchristos int st = 0;
1413*4724848cSchristos
1414*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1415*4724848cSchristos || !TEST_ptr(square = getBN(s, "Square"))
1416*4724848cSchristos || !TEST_ptr(zero = BN_new())
1417*4724848cSchristos || !TEST_ptr(ret = BN_new())
1418*4724848cSchristos || !TEST_ptr(remainder = BN_new()))
1419*4724848cSchristos goto err;
1420*4724848cSchristos
1421*4724848cSchristos BN_zero(zero);
1422*4724848cSchristos if (!TEST_true(BN_sqr(ret, a, ctx))
1423*4724848cSchristos || !equalBN("A^2", square, ret)
1424*4724848cSchristos || !TEST_true(BN_mul(ret, a, a, ctx))
1425*4724848cSchristos || !equalBN("A * A", square, ret)
1426*4724848cSchristos || !TEST_true(BN_div(ret, remainder, square, a, ctx))
1427*4724848cSchristos || !equalBN("Square / A", a, ret)
1428*4724848cSchristos || !equalBN("Square % A", zero, remainder))
1429*4724848cSchristos goto err;
1430*4724848cSchristos
1431*4724848cSchristos #if HAVE_BN_SQRT
1432*4724848cSchristos BN_set_negative(a, 0);
1433*4724848cSchristos if (!TEST_true(BN_sqrt(ret, square, ctx))
1434*4724848cSchristos || !equalBN("sqrt(Square)", a, ret))
1435*4724848cSchristos goto err;
1436*4724848cSchristos
1437*4724848cSchristos /* BN_sqrt should fail on non-squares and negative numbers. */
1438*4724848cSchristos if (!TEST_BN_eq_zero(square)) {
1439*4724848cSchristos if (!TEST_ptr(tmp = BN_new())
1440*4724848cSchristos || !TEST_true(BN_copy(tmp, square)))
1441*4724848cSchristos goto err;
1442*4724848cSchristos BN_set_negative(tmp, 1);
1443*4724848cSchristos
1444*4724848cSchristos if (!TEST_int_eq(BN_sqrt(ret, tmp, ctx), 0))
1445*4724848cSchristos goto err;
1446*4724848cSchristos ERR_clear_error();
1447*4724848cSchristos
1448*4724848cSchristos BN_set_negative(tmp, 0);
1449*4724848cSchristos if (BN_add(tmp, tmp, BN_value_one()))
1450*4724848cSchristos goto err;
1451*4724848cSchristos if (!TEST_int_eq(BN_sqrt(ret, tmp, ctx)))
1452*4724848cSchristos goto err;
1453*4724848cSchristos ERR_clear_error();
1454*4724848cSchristos }
1455*4724848cSchristos #endif
1456*4724848cSchristos
1457*4724848cSchristos st = 1;
1458*4724848cSchristos err:
1459*4724848cSchristos BN_free(a);
1460*4724848cSchristos BN_free(square);
1461*4724848cSchristos BN_free(zero);
1462*4724848cSchristos BN_free(ret);
1463*4724848cSchristos BN_free(remainder);
1464*4724848cSchristos BN_free(tmp);
1465*4724848cSchristos return st;
1466*4724848cSchristos }
1467*4724848cSchristos
file_product(STANZA * s)1468*4724848cSchristos static int file_product(STANZA *s)
1469*4724848cSchristos {
1470*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *product = NULL, *ret = NULL;
1471*4724848cSchristos BIGNUM *remainder = NULL, *zero = NULL;
1472*4724848cSchristos int st = 0;
1473*4724848cSchristos
1474*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1475*4724848cSchristos || !TEST_ptr(b = getBN(s, "B"))
1476*4724848cSchristos || !TEST_ptr(product = getBN(s, "Product"))
1477*4724848cSchristos || !TEST_ptr(ret = BN_new())
1478*4724848cSchristos || !TEST_ptr(remainder = BN_new())
1479*4724848cSchristos || !TEST_ptr(zero = BN_new()))
1480*4724848cSchristos goto err;
1481*4724848cSchristos
1482*4724848cSchristos BN_zero(zero);
1483*4724848cSchristos
1484*4724848cSchristos if (!TEST_true(BN_mul(ret, a, b, ctx))
1485*4724848cSchristos || !equalBN("A * B", product, ret)
1486*4724848cSchristos || !TEST_true(BN_div(ret, remainder, product, a, ctx))
1487*4724848cSchristos || !equalBN("Product / A", b, ret)
1488*4724848cSchristos || !equalBN("Product % A", zero, remainder)
1489*4724848cSchristos || !TEST_true(BN_div(ret, remainder, product, b, ctx))
1490*4724848cSchristos || !equalBN("Product / B", a, ret)
1491*4724848cSchristos || !equalBN("Product % B", zero, remainder))
1492*4724848cSchristos goto err;
1493*4724848cSchristos
1494*4724848cSchristos st = 1;
1495*4724848cSchristos err:
1496*4724848cSchristos BN_free(a);
1497*4724848cSchristos BN_free(b);
1498*4724848cSchristos BN_free(product);
1499*4724848cSchristos BN_free(ret);
1500*4724848cSchristos BN_free(remainder);
1501*4724848cSchristos BN_free(zero);
1502*4724848cSchristos return st;
1503*4724848cSchristos }
1504*4724848cSchristos
file_quotient(STANZA * s)1505*4724848cSchristos static int file_quotient(STANZA *s)
1506*4724848cSchristos {
1507*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *quotient = NULL, *remainder = NULL;
1508*4724848cSchristos BIGNUM *ret = NULL, *ret2 = NULL, *nnmod = NULL;
1509*4724848cSchristos BN_ULONG b_word, ret_word;
1510*4724848cSchristos int st = 0;
1511*4724848cSchristos
1512*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1513*4724848cSchristos || !TEST_ptr(b = getBN(s, "B"))
1514*4724848cSchristos || !TEST_ptr(quotient = getBN(s, "Quotient"))
1515*4724848cSchristos || !TEST_ptr(remainder = getBN(s, "Remainder"))
1516*4724848cSchristos || !TEST_ptr(ret = BN_new())
1517*4724848cSchristos || !TEST_ptr(ret2 = BN_new())
1518*4724848cSchristos || !TEST_ptr(nnmod = BN_new()))
1519*4724848cSchristos goto err;
1520*4724848cSchristos
1521*4724848cSchristos if (!TEST_true(BN_div(ret, ret2, a, b, ctx))
1522*4724848cSchristos || !equalBN("A / B", quotient, ret)
1523*4724848cSchristos || !equalBN("A % B", remainder, ret2)
1524*4724848cSchristos || !TEST_true(BN_mul(ret, quotient, b, ctx))
1525*4724848cSchristos || !TEST_true(BN_add(ret, ret, remainder))
1526*4724848cSchristos || !equalBN("Quotient * B + Remainder", a, ret))
1527*4724848cSchristos goto err;
1528*4724848cSchristos
1529*4724848cSchristos /*
1530*4724848cSchristos * Test with BN_mod_word() and BN_div_word() if the divisor is
1531*4724848cSchristos * small enough.
1532*4724848cSchristos */
1533*4724848cSchristos b_word = BN_get_word(b);
1534*4724848cSchristos if (!BN_is_negative(b) && b_word != (BN_ULONG)-1) {
1535*4724848cSchristos BN_ULONG remainder_word = BN_get_word(remainder);
1536*4724848cSchristos
1537*4724848cSchristos assert(remainder_word != (BN_ULONG)-1);
1538*4724848cSchristos if (!TEST_ptr(BN_copy(ret, a)))
1539*4724848cSchristos goto err;
1540*4724848cSchristos ret_word = BN_div_word(ret, b_word);
1541*4724848cSchristos if (ret_word != remainder_word) {
1542*4724848cSchristos #ifdef BN_DEC_FMT1
1543*4724848cSchristos TEST_error(
1544*4724848cSchristos "Got A %% B (word) = " BN_DEC_FMT1 ", wanted " BN_DEC_FMT1,
1545*4724848cSchristos ret_word, remainder_word);
1546*4724848cSchristos #else
1547*4724848cSchristos TEST_error("Got A %% B (word) mismatch");
1548*4724848cSchristos #endif
1549*4724848cSchristos goto err;
1550*4724848cSchristos }
1551*4724848cSchristos if (!equalBN ("A / B (word)", quotient, ret))
1552*4724848cSchristos goto err;
1553*4724848cSchristos
1554*4724848cSchristos ret_word = BN_mod_word(a, b_word);
1555*4724848cSchristos if (ret_word != remainder_word) {
1556*4724848cSchristos #ifdef BN_DEC_FMT1
1557*4724848cSchristos TEST_error(
1558*4724848cSchristos "Got A %% B (word) = " BN_DEC_FMT1 ", wanted " BN_DEC_FMT1 "",
1559*4724848cSchristos ret_word, remainder_word);
1560*4724848cSchristos #else
1561*4724848cSchristos TEST_error("Got A %% B (word) mismatch");
1562*4724848cSchristos #endif
1563*4724848cSchristos goto err;
1564*4724848cSchristos }
1565*4724848cSchristos }
1566*4724848cSchristos
1567*4724848cSchristos /* Test BN_nnmod. */
1568*4724848cSchristos if (!BN_is_negative(b)) {
1569*4724848cSchristos if (!TEST_true(BN_copy(nnmod, remainder))
1570*4724848cSchristos || (BN_is_negative(nnmod)
1571*4724848cSchristos && !TEST_true(BN_add(nnmod, nnmod, b)))
1572*4724848cSchristos || !TEST_true(BN_nnmod(ret, a, b, ctx))
1573*4724848cSchristos || !equalBN("A % B (non-negative)", nnmod, ret))
1574*4724848cSchristos goto err;
1575*4724848cSchristos }
1576*4724848cSchristos
1577*4724848cSchristos st = 1;
1578*4724848cSchristos err:
1579*4724848cSchristos BN_free(a);
1580*4724848cSchristos BN_free(b);
1581*4724848cSchristos BN_free(quotient);
1582*4724848cSchristos BN_free(remainder);
1583*4724848cSchristos BN_free(ret);
1584*4724848cSchristos BN_free(ret2);
1585*4724848cSchristos BN_free(nnmod);
1586*4724848cSchristos return st;
1587*4724848cSchristos }
1588*4724848cSchristos
file_modmul(STANZA * s)1589*4724848cSchristos static int file_modmul(STANZA *s)
1590*4724848cSchristos {
1591*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *m = NULL, *mod_mul = NULL, *ret = NULL;
1592*4724848cSchristos int st = 0;
1593*4724848cSchristos
1594*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1595*4724848cSchristos || !TEST_ptr(b = getBN(s, "B"))
1596*4724848cSchristos || !TEST_ptr(m = getBN(s, "M"))
1597*4724848cSchristos || !TEST_ptr(mod_mul = getBN(s, "ModMul"))
1598*4724848cSchristos || !TEST_ptr(ret = BN_new()))
1599*4724848cSchristos goto err;
1600*4724848cSchristos
1601*4724848cSchristos if (!TEST_true(BN_mod_mul(ret, a, b, m, ctx))
1602*4724848cSchristos || !equalBN("A * B (mod M)", mod_mul, ret))
1603*4724848cSchristos goto err;
1604*4724848cSchristos
1605*4724848cSchristos if (BN_is_odd(m)) {
1606*4724848cSchristos /* Reduce |a| and |b| and test the Montgomery version. */
1607*4724848cSchristos BN_MONT_CTX *mont = BN_MONT_CTX_new();
1608*4724848cSchristos BIGNUM *a_tmp = BN_new();
1609*4724848cSchristos BIGNUM *b_tmp = BN_new();
1610*4724848cSchristos
1611*4724848cSchristos if (mont == NULL || a_tmp == NULL || b_tmp == NULL
1612*4724848cSchristos || !TEST_true(BN_MONT_CTX_set(mont, m, ctx))
1613*4724848cSchristos || !TEST_true(BN_nnmod(a_tmp, a, m, ctx))
1614*4724848cSchristos || !TEST_true(BN_nnmod(b_tmp, b, m, ctx))
1615*4724848cSchristos || !TEST_true(BN_to_montgomery(a_tmp, a_tmp, mont, ctx))
1616*4724848cSchristos || !TEST_true(BN_to_montgomery(b_tmp, b_tmp, mont, ctx))
1617*4724848cSchristos || !TEST_true(BN_mod_mul_montgomery(ret, a_tmp, b_tmp,
1618*4724848cSchristos mont, ctx))
1619*4724848cSchristos || !TEST_true(BN_from_montgomery(ret, ret, mont, ctx))
1620*4724848cSchristos || !equalBN("A * B (mod M) (mont)", mod_mul, ret))
1621*4724848cSchristos st = 0;
1622*4724848cSchristos else
1623*4724848cSchristos st = 1;
1624*4724848cSchristos BN_MONT_CTX_free(mont);
1625*4724848cSchristos BN_free(a_tmp);
1626*4724848cSchristos BN_free(b_tmp);
1627*4724848cSchristos if (st == 0)
1628*4724848cSchristos goto err;
1629*4724848cSchristos }
1630*4724848cSchristos
1631*4724848cSchristos st = 1;
1632*4724848cSchristos err:
1633*4724848cSchristos BN_free(a);
1634*4724848cSchristos BN_free(b);
1635*4724848cSchristos BN_free(m);
1636*4724848cSchristos BN_free(mod_mul);
1637*4724848cSchristos BN_free(ret);
1638*4724848cSchristos return st;
1639*4724848cSchristos }
1640*4724848cSchristos
file_modexp(STANZA * s)1641*4724848cSchristos static int file_modexp(STANZA *s)
1642*4724848cSchristos {
1643*4724848cSchristos BIGNUM *a = NULL, *e = NULL, *m = NULL, *mod_exp = NULL, *ret = NULL;
1644*4724848cSchristos BIGNUM *b = NULL, *c = NULL, *d = NULL;
1645*4724848cSchristos int st = 0;
1646*4724848cSchristos
1647*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1648*4724848cSchristos || !TEST_ptr(e = getBN(s, "E"))
1649*4724848cSchristos || !TEST_ptr(m = getBN(s, "M"))
1650*4724848cSchristos || !TEST_ptr(mod_exp = getBN(s, "ModExp"))
1651*4724848cSchristos || !TEST_ptr(ret = BN_new())
1652*4724848cSchristos || !TEST_ptr(d = BN_new()))
1653*4724848cSchristos goto err;
1654*4724848cSchristos
1655*4724848cSchristos if (!TEST_true(BN_mod_exp(ret, a, e, m, ctx))
1656*4724848cSchristos || !equalBN("A ^ E (mod M)", mod_exp, ret))
1657*4724848cSchristos goto err;
1658*4724848cSchristos
1659*4724848cSchristos if (BN_is_odd(m)) {
1660*4724848cSchristos if (!TEST_true(BN_mod_exp_mont(ret, a, e, m, ctx, NULL))
1661*4724848cSchristos || !equalBN("A ^ E (mod M) (mont)", mod_exp, ret)
1662*4724848cSchristos || !TEST_true(BN_mod_exp_mont_consttime(ret, a, e, m,
1663*4724848cSchristos ctx, NULL))
1664*4724848cSchristos || !equalBN("A ^ E (mod M) (mont const", mod_exp, ret))
1665*4724848cSchristos goto err;
1666*4724848cSchristos }
1667*4724848cSchristos
1668*4724848cSchristos /* Regression test for carry propagation bug in sqr8x_reduction */
1669*4724848cSchristos BN_hex2bn(&a, "050505050505");
1670*4724848cSchristos BN_hex2bn(&b, "02");
1671*4724848cSchristos BN_hex2bn(&c,
1672*4724848cSchristos "4141414141414141414141274141414141414141414141414141414141414141"
1673*4724848cSchristos "4141414141414141414141414141414141414141414141414141414141414141"
1674*4724848cSchristos "4141414141414141414141800000000000000000000000000000000000000000"
1675*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000"
1676*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000"
1677*4724848cSchristos "0000000000000000000000000000000000000000000000000000000001");
1678*4724848cSchristos if (!TEST_true(BN_mod_exp(d, a, b, c, ctx))
1679*4724848cSchristos || !TEST_true(BN_mul(e, a, a, ctx))
1680*4724848cSchristos || !TEST_BN_eq(d, e))
1681*4724848cSchristos goto err;
1682*4724848cSchristos
1683*4724848cSchristos st = 1;
1684*4724848cSchristos err:
1685*4724848cSchristos BN_free(a);
1686*4724848cSchristos BN_free(b);
1687*4724848cSchristos BN_free(c);
1688*4724848cSchristos BN_free(d);
1689*4724848cSchristos BN_free(e);
1690*4724848cSchristos BN_free(m);
1691*4724848cSchristos BN_free(mod_exp);
1692*4724848cSchristos BN_free(ret);
1693*4724848cSchristos return st;
1694*4724848cSchristos }
1695*4724848cSchristos
file_exp(STANZA * s)1696*4724848cSchristos static int file_exp(STANZA *s)
1697*4724848cSchristos {
1698*4724848cSchristos BIGNUM *a = NULL, *e = NULL, *exp = NULL, *ret = NULL;
1699*4724848cSchristos int st = 0;
1700*4724848cSchristos
1701*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1702*4724848cSchristos || !TEST_ptr(e = getBN(s, "E"))
1703*4724848cSchristos || !TEST_ptr(exp = getBN(s, "Exp"))
1704*4724848cSchristos || !TEST_ptr(ret = BN_new()))
1705*4724848cSchristos goto err;
1706*4724848cSchristos
1707*4724848cSchristos if (!TEST_true(BN_exp(ret, a, e, ctx))
1708*4724848cSchristos || !equalBN("A ^ E", exp, ret))
1709*4724848cSchristos goto err;
1710*4724848cSchristos
1711*4724848cSchristos st = 1;
1712*4724848cSchristos err:
1713*4724848cSchristos BN_free(a);
1714*4724848cSchristos BN_free(e);
1715*4724848cSchristos BN_free(exp);
1716*4724848cSchristos BN_free(ret);
1717*4724848cSchristos return st;
1718*4724848cSchristos }
1719*4724848cSchristos
file_modsqrt(STANZA * s)1720*4724848cSchristos static int file_modsqrt(STANZA *s)
1721*4724848cSchristos {
1722*4724848cSchristos BIGNUM *a = NULL, *p = NULL, *mod_sqrt = NULL, *ret = NULL, *ret2 = NULL;
1723*4724848cSchristos int st = 0;
1724*4724848cSchristos
1725*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1726*4724848cSchristos || !TEST_ptr(p = getBN(s, "P"))
1727*4724848cSchristos || !TEST_ptr(mod_sqrt = getBN(s, "ModSqrt"))
1728*4724848cSchristos || !TEST_ptr(ret = BN_new())
1729*4724848cSchristos || !TEST_ptr(ret2 = BN_new()))
1730*4724848cSchristos goto err;
1731*4724848cSchristos
1732*4724848cSchristos if (BN_is_negative(mod_sqrt)) {
1733*4724848cSchristos /* A negative testcase */
1734*4724848cSchristos if (!TEST_ptr_null(BN_mod_sqrt(ret, a, p, ctx)))
1735*4724848cSchristos goto err;
1736*4724848cSchristos
1737*4724848cSchristos st = 1;
1738*4724848cSchristos goto err;
1739*4724848cSchristos }
1740*4724848cSchristos
1741*4724848cSchristos /* There are two possible answers. */
1742*4724848cSchristos if (!TEST_ptr(BN_mod_sqrt(ret, a, p, ctx))
1743*4724848cSchristos || !TEST_true(BN_sub(ret2, p, ret)))
1744*4724848cSchristos goto err;
1745*4724848cSchristos
1746*4724848cSchristos /* The first condition should NOT be a test. */
1747*4724848cSchristos if (BN_cmp(ret2, mod_sqrt) != 0
1748*4724848cSchristos && !equalBN("sqrt(A) (mod P)", mod_sqrt, ret))
1749*4724848cSchristos goto err;
1750*4724848cSchristos
1751*4724848cSchristos st = 1;
1752*4724848cSchristos err:
1753*4724848cSchristos BN_free(a);
1754*4724848cSchristos BN_free(p);
1755*4724848cSchristos BN_free(mod_sqrt);
1756*4724848cSchristos BN_free(ret);
1757*4724848cSchristos BN_free(ret2);
1758*4724848cSchristos return st;
1759*4724848cSchristos }
1760*4724848cSchristos
file_gcd(STANZA * s)1761*4724848cSchristos static int file_gcd(STANZA *s)
1762*4724848cSchristos {
1763*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *gcd = NULL, *ret = NULL;
1764*4724848cSchristos int st = 0;
1765*4724848cSchristos
1766*4724848cSchristos if (!TEST_ptr(a = getBN(s, "A"))
1767*4724848cSchristos || !TEST_ptr(b = getBN(s, "B"))
1768*4724848cSchristos || !TEST_ptr(gcd = getBN(s, "GCD"))
1769*4724848cSchristos || !TEST_ptr(ret = BN_new()))
1770*4724848cSchristos goto err;
1771*4724848cSchristos
1772*4724848cSchristos if (!TEST_true(BN_gcd(ret, a, b, ctx))
1773*4724848cSchristos || !equalBN("gcd(A,B)", gcd, ret))
1774*4724848cSchristos goto err;
1775*4724848cSchristos
1776*4724848cSchristos st = 1;
1777*4724848cSchristos err:
1778*4724848cSchristos BN_free(a);
1779*4724848cSchristos BN_free(b);
1780*4724848cSchristos BN_free(gcd);
1781*4724848cSchristos BN_free(ret);
1782*4724848cSchristos return st;
1783*4724848cSchristos }
1784*4724848cSchristos
test_bn2padded(void)1785*4724848cSchristos static int test_bn2padded(void)
1786*4724848cSchristos {
1787*4724848cSchristos uint8_t zeros[256], out[256], reference[128];
1788*4724848cSchristos size_t bytes;
1789*4724848cSchristos BIGNUM *n;
1790*4724848cSchristos int st = 0;
1791*4724848cSchristos
1792*4724848cSchristos /* Test edge case at 0. */
1793*4724848cSchristos if (!TEST_ptr((n = BN_new())))
1794*4724848cSchristos goto err;
1795*4724848cSchristos if (!TEST_int_eq(BN_bn2binpad(n, NULL, 0), 0))
1796*4724848cSchristos goto err;
1797*4724848cSchristos memset(out, -1, sizeof(out));
1798*4724848cSchristos if (!TEST_int_eq(BN_bn2binpad(n, out, sizeof(out)), sizeof(out)))
1799*4724848cSchristos goto err;
1800*4724848cSchristos memset(zeros, 0, sizeof(zeros));
1801*4724848cSchristos if (!TEST_mem_eq(zeros, sizeof(zeros), out, sizeof(out)))
1802*4724848cSchristos goto err;
1803*4724848cSchristos
1804*4724848cSchristos /* Test a random numbers at various byte lengths. */
1805*4724848cSchristos for (bytes = 128 - 7; bytes <= 128; bytes++) {
1806*4724848cSchristos # define TOP_BIT_ON 0
1807*4724848cSchristos # define BOTTOM_BIT_NOTOUCH 0
1808*4724848cSchristos if (!TEST_true(BN_rand(n, bytes * 8, TOP_BIT_ON, BOTTOM_BIT_NOTOUCH)))
1809*4724848cSchristos goto err;
1810*4724848cSchristos if (!TEST_int_eq(BN_num_bytes(n), bytes)
1811*4724848cSchristos || !TEST_int_eq(BN_bn2bin(n, reference), bytes))
1812*4724848cSchristos goto err;
1813*4724848cSchristos /* Empty buffer should fail. */
1814*4724848cSchristos if (!TEST_int_eq(BN_bn2binpad(n, NULL, 0), -1))
1815*4724848cSchristos goto err;
1816*4724848cSchristos /* One byte short should fail. */
1817*4724848cSchristos if (!TEST_int_eq(BN_bn2binpad(n, out, bytes - 1), -1))
1818*4724848cSchristos goto err;
1819*4724848cSchristos /* Exactly right size should encode. */
1820*4724848cSchristos if (!TEST_int_eq(BN_bn2binpad(n, out, bytes), bytes)
1821*4724848cSchristos || !TEST_mem_eq(out, bytes, reference, bytes))
1822*4724848cSchristos goto err;
1823*4724848cSchristos /* Pad up one byte extra. */
1824*4724848cSchristos if (!TEST_int_eq(BN_bn2binpad(n, out, bytes + 1), bytes + 1)
1825*4724848cSchristos || !TEST_mem_eq(out + 1, bytes, reference, bytes)
1826*4724848cSchristos || !TEST_mem_eq(out, 1, zeros, 1))
1827*4724848cSchristos goto err;
1828*4724848cSchristos /* Pad up to 256. */
1829*4724848cSchristos if (!TEST_int_eq(BN_bn2binpad(n, out, sizeof(out)), sizeof(out))
1830*4724848cSchristos || !TEST_mem_eq(out + sizeof(out) - bytes, bytes,
1831*4724848cSchristos reference, bytes)
1832*4724848cSchristos || !TEST_mem_eq(out, sizeof(out) - bytes,
1833*4724848cSchristos zeros, sizeof(out) - bytes))
1834*4724848cSchristos goto err;
1835*4724848cSchristos }
1836*4724848cSchristos
1837*4724848cSchristos st = 1;
1838*4724848cSchristos err:
1839*4724848cSchristos BN_free(n);
1840*4724848cSchristos return st;
1841*4724848cSchristos }
1842*4724848cSchristos
test_dec2bn(void)1843*4724848cSchristos static int test_dec2bn(void)
1844*4724848cSchristos {
1845*4724848cSchristos BIGNUM *bn = NULL;
1846*4724848cSchristos int st = 0;
1847*4724848cSchristos
1848*4724848cSchristos if (!TEST_int_eq(parsedecBN(&bn, "0"), 1)
1849*4724848cSchristos || !TEST_BN_eq_word(bn, 0)
1850*4724848cSchristos || !TEST_BN_eq_zero(bn)
1851*4724848cSchristos || !TEST_BN_le_zero(bn)
1852*4724848cSchristos || !TEST_BN_ge_zero(bn)
1853*4724848cSchristos || !TEST_BN_even(bn))
1854*4724848cSchristos goto err;
1855*4724848cSchristos BN_free(bn);
1856*4724848cSchristos bn = NULL;
1857*4724848cSchristos
1858*4724848cSchristos if (!TEST_int_eq(parsedecBN(&bn, "256"), 3)
1859*4724848cSchristos || !TEST_BN_eq_word(bn, 256)
1860*4724848cSchristos || !TEST_BN_ge_zero(bn)
1861*4724848cSchristos || !TEST_BN_gt_zero(bn)
1862*4724848cSchristos || !TEST_BN_ne_zero(bn)
1863*4724848cSchristos || !TEST_BN_even(bn))
1864*4724848cSchristos goto err;
1865*4724848cSchristos BN_free(bn);
1866*4724848cSchristos bn = NULL;
1867*4724848cSchristos
1868*4724848cSchristos if (!TEST_int_eq(parsedecBN(&bn, "-42"), 3)
1869*4724848cSchristos || !TEST_BN_abs_eq_word(bn, 42)
1870*4724848cSchristos || !TEST_BN_lt_zero(bn)
1871*4724848cSchristos || !TEST_BN_le_zero(bn)
1872*4724848cSchristos || !TEST_BN_ne_zero(bn)
1873*4724848cSchristos || !TEST_BN_even(bn))
1874*4724848cSchristos goto err;
1875*4724848cSchristos BN_free(bn);
1876*4724848cSchristos bn = NULL;
1877*4724848cSchristos
1878*4724848cSchristos if (!TEST_int_eq(parsedecBN(&bn, "1"), 1)
1879*4724848cSchristos || !TEST_BN_eq_word(bn, 1)
1880*4724848cSchristos || !TEST_BN_ne_zero(bn)
1881*4724848cSchristos || !TEST_BN_gt_zero(bn)
1882*4724848cSchristos || !TEST_BN_ge_zero(bn)
1883*4724848cSchristos || !TEST_BN_eq_one(bn)
1884*4724848cSchristos || !TEST_BN_odd(bn))
1885*4724848cSchristos goto err;
1886*4724848cSchristos BN_free(bn);
1887*4724848cSchristos bn = NULL;
1888*4724848cSchristos
1889*4724848cSchristos if (!TEST_int_eq(parsedecBN(&bn, "-0"), 2)
1890*4724848cSchristos || !TEST_BN_eq_zero(bn)
1891*4724848cSchristos || !TEST_BN_ge_zero(bn)
1892*4724848cSchristos || !TEST_BN_le_zero(bn)
1893*4724848cSchristos || !TEST_BN_even(bn))
1894*4724848cSchristos goto err;
1895*4724848cSchristos BN_free(bn);
1896*4724848cSchristos bn = NULL;
1897*4724848cSchristos
1898*4724848cSchristos if (!TEST_int_eq(parsedecBN(&bn, "42trailing garbage is ignored"), 2)
1899*4724848cSchristos || !TEST_BN_abs_eq_word(bn, 42)
1900*4724848cSchristos || !TEST_BN_ge_zero(bn)
1901*4724848cSchristos || !TEST_BN_gt_zero(bn)
1902*4724848cSchristos || !TEST_BN_ne_zero(bn)
1903*4724848cSchristos || !TEST_BN_even(bn))
1904*4724848cSchristos goto err;
1905*4724848cSchristos
1906*4724848cSchristos st = 1;
1907*4724848cSchristos err:
1908*4724848cSchristos BN_free(bn);
1909*4724848cSchristos return st;
1910*4724848cSchristos }
1911*4724848cSchristos
test_hex2bn(void)1912*4724848cSchristos static int test_hex2bn(void)
1913*4724848cSchristos {
1914*4724848cSchristos BIGNUM *bn = NULL;
1915*4724848cSchristos int st = 0;
1916*4724848cSchristos
1917*4724848cSchristos if (!TEST_int_eq(parseBN(&bn, "0"), 1)
1918*4724848cSchristos || !TEST_BN_eq_zero(bn)
1919*4724848cSchristos || !TEST_BN_ge_zero(bn)
1920*4724848cSchristos || !TEST_BN_even(bn))
1921*4724848cSchristos goto err;
1922*4724848cSchristos BN_free(bn);
1923*4724848cSchristos bn = NULL;
1924*4724848cSchristos
1925*4724848cSchristos if (!TEST_int_eq(parseBN(&bn, "256"), 3)
1926*4724848cSchristos || !TEST_BN_eq_word(bn, 0x256)
1927*4724848cSchristos || !TEST_BN_ge_zero(bn)
1928*4724848cSchristos || !TEST_BN_gt_zero(bn)
1929*4724848cSchristos || !TEST_BN_ne_zero(bn)
1930*4724848cSchristos || !TEST_BN_even(bn))
1931*4724848cSchristos goto err;
1932*4724848cSchristos BN_free(bn);
1933*4724848cSchristos bn = NULL;
1934*4724848cSchristos
1935*4724848cSchristos if (!TEST_int_eq(parseBN(&bn, "-42"), 3)
1936*4724848cSchristos || !TEST_BN_abs_eq_word(bn, 0x42)
1937*4724848cSchristos || !TEST_BN_lt_zero(bn)
1938*4724848cSchristos || !TEST_BN_le_zero(bn)
1939*4724848cSchristos || !TEST_BN_ne_zero(bn)
1940*4724848cSchristos || !TEST_BN_even(bn))
1941*4724848cSchristos goto err;
1942*4724848cSchristos BN_free(bn);
1943*4724848cSchristos bn = NULL;
1944*4724848cSchristos
1945*4724848cSchristos if (!TEST_int_eq(parseBN(&bn, "cb"), 2)
1946*4724848cSchristos || !TEST_BN_eq_word(bn, 0xCB)
1947*4724848cSchristos || !TEST_BN_ge_zero(bn)
1948*4724848cSchristos || !TEST_BN_gt_zero(bn)
1949*4724848cSchristos || !TEST_BN_ne_zero(bn)
1950*4724848cSchristos || !TEST_BN_odd(bn))
1951*4724848cSchristos goto err;
1952*4724848cSchristos BN_free(bn);
1953*4724848cSchristos bn = NULL;
1954*4724848cSchristos
1955*4724848cSchristos if (!TEST_int_eq(parseBN(&bn, "-0"), 2)
1956*4724848cSchristos || !TEST_BN_eq_zero(bn)
1957*4724848cSchristos || !TEST_BN_ge_zero(bn)
1958*4724848cSchristos || !TEST_BN_le_zero(bn)
1959*4724848cSchristos || !TEST_BN_even(bn))
1960*4724848cSchristos goto err;
1961*4724848cSchristos BN_free(bn);
1962*4724848cSchristos bn = NULL;
1963*4724848cSchristos
1964*4724848cSchristos if (!TEST_int_eq(parseBN(&bn, "abctrailing garbage is ignored"), 3)
1965*4724848cSchristos || !TEST_BN_eq_word(bn, 0xabc)
1966*4724848cSchristos || !TEST_BN_ge_zero(bn)
1967*4724848cSchristos || !TEST_BN_gt_zero(bn)
1968*4724848cSchristos || !TEST_BN_ne_zero(bn)
1969*4724848cSchristos || !TEST_BN_even(bn))
1970*4724848cSchristos goto err;
1971*4724848cSchristos st = 1;
1972*4724848cSchristos
1973*4724848cSchristos err:
1974*4724848cSchristos BN_free(bn);
1975*4724848cSchristos return st;
1976*4724848cSchristos }
1977*4724848cSchristos
test_asc2bn(void)1978*4724848cSchristos static int test_asc2bn(void)
1979*4724848cSchristos {
1980*4724848cSchristos BIGNUM *bn = NULL;
1981*4724848cSchristos int st = 0;
1982*4724848cSchristos
1983*4724848cSchristos if (!TEST_ptr(bn = BN_new()))
1984*4724848cSchristos goto err;
1985*4724848cSchristos
1986*4724848cSchristos if (!TEST_true(BN_asc2bn(&bn, "0"))
1987*4724848cSchristos || !TEST_BN_eq_zero(bn)
1988*4724848cSchristos || !TEST_BN_ge_zero(bn))
1989*4724848cSchristos goto err;
1990*4724848cSchristos
1991*4724848cSchristos if (!TEST_true(BN_asc2bn(&bn, "256"))
1992*4724848cSchristos || !TEST_BN_eq_word(bn, 256)
1993*4724848cSchristos || !TEST_BN_ge_zero(bn))
1994*4724848cSchristos goto err;
1995*4724848cSchristos
1996*4724848cSchristos if (!TEST_true(BN_asc2bn(&bn, "-42"))
1997*4724848cSchristos || !TEST_BN_abs_eq_word(bn, 42)
1998*4724848cSchristos || !TEST_BN_lt_zero(bn))
1999*4724848cSchristos goto err;
2000*4724848cSchristos
2001*4724848cSchristos if (!TEST_true(BN_asc2bn(&bn, "0x1234"))
2002*4724848cSchristos || !TEST_BN_eq_word(bn, 0x1234)
2003*4724848cSchristos || !TEST_BN_ge_zero(bn))
2004*4724848cSchristos goto err;
2005*4724848cSchristos
2006*4724848cSchristos if (!TEST_true(BN_asc2bn(&bn, "0X1234"))
2007*4724848cSchristos || !TEST_BN_eq_word(bn, 0x1234)
2008*4724848cSchristos || !TEST_BN_ge_zero(bn))
2009*4724848cSchristos goto err;
2010*4724848cSchristos
2011*4724848cSchristos if (!TEST_true(BN_asc2bn(&bn, "-0xabcd"))
2012*4724848cSchristos || !TEST_BN_abs_eq_word(bn, 0xabcd)
2013*4724848cSchristos || !TEST_BN_lt_zero(bn))
2014*4724848cSchristos goto err;
2015*4724848cSchristos
2016*4724848cSchristos if (!TEST_true(BN_asc2bn(&bn, "-0"))
2017*4724848cSchristos || !TEST_BN_eq_zero(bn)
2018*4724848cSchristos || !TEST_BN_ge_zero(bn))
2019*4724848cSchristos goto err;
2020*4724848cSchristos
2021*4724848cSchristos if (!TEST_true(BN_asc2bn(&bn, "123trailing garbage is ignored"))
2022*4724848cSchristos || !TEST_BN_eq_word(bn, 123)
2023*4724848cSchristos || !TEST_BN_ge_zero(bn))
2024*4724848cSchristos goto err;
2025*4724848cSchristos
2026*4724848cSchristos st = 1;
2027*4724848cSchristos err:
2028*4724848cSchristos BN_free(bn);
2029*4724848cSchristos return st;
2030*4724848cSchristos }
2031*4724848cSchristos
2032*4724848cSchristos static const MPITEST kMPITests[] = {
2033*4724848cSchristos {"0", "\x00\x00\x00\x00", 4},
2034*4724848cSchristos {"1", "\x00\x00\x00\x01\x01", 5},
2035*4724848cSchristos {"-1", "\x00\x00\x00\x01\x81", 5},
2036*4724848cSchristos {"128", "\x00\x00\x00\x02\x00\x80", 6},
2037*4724848cSchristos {"256", "\x00\x00\x00\x02\x01\x00", 6},
2038*4724848cSchristos {"-256", "\x00\x00\x00\x02\x81\x00", 6},
2039*4724848cSchristos };
2040*4724848cSchristos
test_mpi(int i)2041*4724848cSchristos static int test_mpi(int i)
2042*4724848cSchristos {
2043*4724848cSchristos uint8_t scratch[8];
2044*4724848cSchristos const MPITEST *test = &kMPITests[i];
2045*4724848cSchristos size_t mpi_len, mpi_len2;
2046*4724848cSchristos BIGNUM *bn = NULL;
2047*4724848cSchristos BIGNUM *bn2 = NULL;
2048*4724848cSchristos int st = 0;
2049*4724848cSchristos
2050*4724848cSchristos if (!TEST_ptr(bn = BN_new())
2051*4724848cSchristos || !TEST_true(BN_asc2bn(&bn, test->base10)))
2052*4724848cSchristos goto err;
2053*4724848cSchristos mpi_len = BN_bn2mpi(bn, NULL);
2054*4724848cSchristos if (!TEST_size_t_le(mpi_len, sizeof(scratch)))
2055*4724848cSchristos goto err;
2056*4724848cSchristos
2057*4724848cSchristos if (!TEST_size_t_eq(mpi_len2 = BN_bn2mpi(bn, scratch), mpi_len)
2058*4724848cSchristos || !TEST_mem_eq(test->mpi, test->mpi_len, scratch, mpi_len))
2059*4724848cSchristos goto err;
2060*4724848cSchristos
2061*4724848cSchristos if (!TEST_ptr(bn2 = BN_mpi2bn(scratch, mpi_len, NULL)))
2062*4724848cSchristos goto err;
2063*4724848cSchristos
2064*4724848cSchristos if (!TEST_BN_eq(bn, bn2)) {
2065*4724848cSchristos BN_free(bn2);
2066*4724848cSchristos goto err;
2067*4724848cSchristos }
2068*4724848cSchristos BN_free(bn2);
2069*4724848cSchristos
2070*4724848cSchristos st = 1;
2071*4724848cSchristos err:
2072*4724848cSchristos BN_free(bn);
2073*4724848cSchristos return st;
2074*4724848cSchristos }
2075*4724848cSchristos
test_rand(void)2076*4724848cSchristos static int test_rand(void)
2077*4724848cSchristos {
2078*4724848cSchristos BIGNUM *bn = NULL;
2079*4724848cSchristos int st = 0;
2080*4724848cSchristos
2081*4724848cSchristos if (!TEST_ptr(bn = BN_new()))
2082*4724848cSchristos return 0;
2083*4724848cSchristos
2084*4724848cSchristos /* Test BN_rand for degenerate cases with |top| and |bottom| parameters. */
2085*4724848cSchristos if (!TEST_false(BN_rand(bn, 0, 0 /* top */ , 0 /* bottom */ ))
2086*4724848cSchristos || !TEST_false(BN_rand(bn, 0, 1 /* top */ , 1 /* bottom */ ))
2087*4724848cSchristos || !TEST_true(BN_rand(bn, 1, 0 /* top */ , 0 /* bottom */ ))
2088*4724848cSchristos || !TEST_BN_eq_one(bn)
2089*4724848cSchristos || !TEST_false(BN_rand(bn, 1, 1 /* top */ , 0 /* bottom */ ))
2090*4724848cSchristos || !TEST_true(BN_rand(bn, 1, -1 /* top */ , 1 /* bottom */ ))
2091*4724848cSchristos || !TEST_BN_eq_one(bn)
2092*4724848cSchristos || !TEST_true(BN_rand(bn, 2, 1 /* top */ , 0 /* bottom */ ))
2093*4724848cSchristos || !TEST_BN_eq_word(bn, 3))
2094*4724848cSchristos goto err;
2095*4724848cSchristos
2096*4724848cSchristos st = 1;
2097*4724848cSchristos err:
2098*4724848cSchristos BN_free(bn);
2099*4724848cSchristos return st;
2100*4724848cSchristos }
2101*4724848cSchristos
test_negzero(void)2102*4724848cSchristos static int test_negzero(void)
2103*4724848cSchristos {
2104*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *c = NULL, *d = NULL;
2105*4724848cSchristos BIGNUM *numerator = NULL, *denominator = NULL;
2106*4724848cSchristos int consttime, st = 0;
2107*4724848cSchristos
2108*4724848cSchristos if (!TEST_ptr(a = BN_new())
2109*4724848cSchristos || !TEST_ptr(b = BN_new())
2110*4724848cSchristos || !TEST_ptr(c = BN_new())
2111*4724848cSchristos || !TEST_ptr(d = BN_new()))
2112*4724848cSchristos goto err;
2113*4724848cSchristos
2114*4724848cSchristos /* Test that BN_mul never gives negative zero. */
2115*4724848cSchristos if (!TEST_true(BN_set_word(a, 1)))
2116*4724848cSchristos goto err;
2117*4724848cSchristos BN_set_negative(a, 1);
2118*4724848cSchristos BN_zero(b);
2119*4724848cSchristos if (!TEST_true(BN_mul(c, a, b, ctx)))
2120*4724848cSchristos goto err;
2121*4724848cSchristos if (!TEST_BN_eq_zero(c)
2122*4724848cSchristos || !TEST_BN_ge_zero(c))
2123*4724848cSchristos goto err;
2124*4724848cSchristos
2125*4724848cSchristos for (consttime = 0; consttime < 2; consttime++) {
2126*4724848cSchristos if (!TEST_ptr(numerator = BN_new())
2127*4724848cSchristos || !TEST_ptr(denominator = BN_new()))
2128*4724848cSchristos goto err;
2129*4724848cSchristos if (consttime) {
2130*4724848cSchristos BN_set_flags(numerator, BN_FLG_CONSTTIME);
2131*4724848cSchristos BN_set_flags(denominator, BN_FLG_CONSTTIME);
2132*4724848cSchristos }
2133*4724848cSchristos /* Test that BN_div never gives negative zero in the quotient. */
2134*4724848cSchristos if (!TEST_true(BN_set_word(numerator, 1))
2135*4724848cSchristos || !TEST_true(BN_set_word(denominator, 2)))
2136*4724848cSchristos goto err;
2137*4724848cSchristos BN_set_negative(numerator, 1);
2138*4724848cSchristos if (!TEST_true(BN_div(a, b, numerator, denominator, ctx))
2139*4724848cSchristos || !TEST_BN_eq_zero(a)
2140*4724848cSchristos || !TEST_BN_ge_zero(a))
2141*4724848cSchristos goto err;
2142*4724848cSchristos
2143*4724848cSchristos /* Test that BN_div never gives negative zero in the remainder. */
2144*4724848cSchristos if (!TEST_true(BN_set_word(denominator, 1))
2145*4724848cSchristos || !TEST_true(BN_div(a, b, numerator, denominator, ctx))
2146*4724848cSchristos || !TEST_BN_eq_zero(b)
2147*4724848cSchristos || !TEST_BN_ge_zero(b))
2148*4724848cSchristos goto err;
2149*4724848cSchristos BN_free(numerator);
2150*4724848cSchristos BN_free(denominator);
2151*4724848cSchristos numerator = denominator = NULL;
2152*4724848cSchristos }
2153*4724848cSchristos
2154*4724848cSchristos /* Test that BN_set_negative will not produce a negative zero. */
2155*4724848cSchristos BN_zero(a);
2156*4724848cSchristos BN_set_negative(a, 1);
2157*4724848cSchristos if (BN_is_negative(a))
2158*4724848cSchristos goto err;
2159*4724848cSchristos st = 1;
2160*4724848cSchristos
2161*4724848cSchristos err:
2162*4724848cSchristos BN_free(a);
2163*4724848cSchristos BN_free(b);
2164*4724848cSchristos BN_free(c);
2165*4724848cSchristos BN_free(d);
2166*4724848cSchristos BN_free(numerator);
2167*4724848cSchristos BN_free(denominator);
2168*4724848cSchristos return st;
2169*4724848cSchristos }
2170*4724848cSchristos
test_badmod(void)2171*4724848cSchristos static int test_badmod(void)
2172*4724848cSchristos {
2173*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *zero = NULL;
2174*4724848cSchristos BN_MONT_CTX *mont = NULL;
2175*4724848cSchristos int st = 0;
2176*4724848cSchristos
2177*4724848cSchristos if (!TEST_ptr(a = BN_new())
2178*4724848cSchristos || !TEST_ptr(b = BN_new())
2179*4724848cSchristos || !TEST_ptr(zero = BN_new())
2180*4724848cSchristos || !TEST_ptr(mont = BN_MONT_CTX_new()))
2181*4724848cSchristos goto err;
2182*4724848cSchristos BN_zero(zero);
2183*4724848cSchristos
2184*4724848cSchristos if (!TEST_false(BN_div(a, b, BN_value_one(), zero, ctx)))
2185*4724848cSchristos goto err;
2186*4724848cSchristos ERR_clear_error();
2187*4724848cSchristos
2188*4724848cSchristos if (!TEST_false(BN_mod_mul(a, BN_value_one(), BN_value_one(), zero, ctx)))
2189*4724848cSchristos goto err;
2190*4724848cSchristos ERR_clear_error();
2191*4724848cSchristos
2192*4724848cSchristos if (!TEST_false(BN_mod_exp(a, BN_value_one(), BN_value_one(), zero, ctx)))
2193*4724848cSchristos goto err;
2194*4724848cSchristos ERR_clear_error();
2195*4724848cSchristos
2196*4724848cSchristos if (!TEST_false(BN_mod_exp_mont(a, BN_value_one(), BN_value_one(),
2197*4724848cSchristos zero, ctx, NULL)))
2198*4724848cSchristos goto err;
2199*4724848cSchristos ERR_clear_error();
2200*4724848cSchristos
2201*4724848cSchristos if (!TEST_false(BN_mod_exp_mont_consttime(a, BN_value_one(), BN_value_one(),
2202*4724848cSchristos zero, ctx, NULL)))
2203*4724848cSchristos goto err;
2204*4724848cSchristos ERR_clear_error();
2205*4724848cSchristos
2206*4724848cSchristos if (!TEST_false(BN_MONT_CTX_set(mont, zero, ctx)))
2207*4724848cSchristos goto err;
2208*4724848cSchristos ERR_clear_error();
2209*4724848cSchristos
2210*4724848cSchristos /* Some operations also may not be used with an even modulus. */
2211*4724848cSchristos if (!TEST_true(BN_set_word(b, 16)))
2212*4724848cSchristos goto err;
2213*4724848cSchristos
2214*4724848cSchristos if (!TEST_false(BN_MONT_CTX_set(mont, b, ctx)))
2215*4724848cSchristos goto err;
2216*4724848cSchristos ERR_clear_error();
2217*4724848cSchristos
2218*4724848cSchristos if (!TEST_false(BN_mod_exp_mont(a, BN_value_one(), BN_value_one(),
2219*4724848cSchristos b, ctx, NULL)))
2220*4724848cSchristos goto err;
2221*4724848cSchristos ERR_clear_error();
2222*4724848cSchristos
2223*4724848cSchristos if (!TEST_false(BN_mod_exp_mont_consttime(a, BN_value_one(), BN_value_one(),
2224*4724848cSchristos b, ctx, NULL)))
2225*4724848cSchristos goto err;
2226*4724848cSchristos ERR_clear_error();
2227*4724848cSchristos
2228*4724848cSchristos st = 1;
2229*4724848cSchristos err:
2230*4724848cSchristos BN_free(a);
2231*4724848cSchristos BN_free(b);
2232*4724848cSchristos BN_free(zero);
2233*4724848cSchristos BN_MONT_CTX_free(mont);
2234*4724848cSchristos return st;
2235*4724848cSchristos }
2236*4724848cSchristos
test_expmodzero(void)2237*4724848cSchristos static int test_expmodzero(void)
2238*4724848cSchristos {
2239*4724848cSchristos BIGNUM *a = NULL, *r = NULL, *zero = NULL;
2240*4724848cSchristos int st = 0;
2241*4724848cSchristos
2242*4724848cSchristos if (!TEST_ptr(zero = BN_new())
2243*4724848cSchristos || !TEST_ptr(a = BN_new())
2244*4724848cSchristos || !TEST_ptr(r = BN_new()))
2245*4724848cSchristos goto err;
2246*4724848cSchristos BN_zero(zero);
2247*4724848cSchristos
2248*4724848cSchristos if (!TEST_true(BN_mod_exp(r, a, zero, BN_value_one(), NULL))
2249*4724848cSchristos || !TEST_BN_eq_zero(r)
2250*4724848cSchristos || !TEST_true(BN_mod_exp_mont(r, a, zero, BN_value_one(),
2251*4724848cSchristos NULL, NULL))
2252*4724848cSchristos || !TEST_BN_eq_zero(r)
2253*4724848cSchristos || !TEST_true(BN_mod_exp_mont_consttime(r, a, zero,
2254*4724848cSchristos BN_value_one(),
2255*4724848cSchristos NULL, NULL))
2256*4724848cSchristos || !TEST_BN_eq_zero(r)
2257*4724848cSchristos || !TEST_true(BN_mod_exp_mont_word(r, 42, zero,
2258*4724848cSchristos BN_value_one(), NULL, NULL))
2259*4724848cSchristos || !TEST_BN_eq_zero(r))
2260*4724848cSchristos goto err;
2261*4724848cSchristos
2262*4724848cSchristos st = 1;
2263*4724848cSchristos err:
2264*4724848cSchristos BN_free(zero);
2265*4724848cSchristos BN_free(a);
2266*4724848cSchristos BN_free(r);
2267*4724848cSchristos return st;
2268*4724848cSchristos }
2269*4724848cSchristos
test_expmodone(void)2270*4724848cSchristos static int test_expmodone(void)
2271*4724848cSchristos {
2272*4724848cSchristos int ret = 0, i;
2273*4724848cSchristos BIGNUM *r = BN_new();
2274*4724848cSchristos BIGNUM *a = BN_new();
2275*4724848cSchristos BIGNUM *p = BN_new();
2276*4724848cSchristos BIGNUM *m = BN_new();
2277*4724848cSchristos
2278*4724848cSchristos if (!TEST_ptr(r)
2279*4724848cSchristos || !TEST_ptr(a)
2280*4724848cSchristos || !TEST_ptr(p)
2281*4724848cSchristos || !TEST_ptr(p)
2282*4724848cSchristos || !TEST_ptr(m)
2283*4724848cSchristos || !TEST_true(BN_set_word(a, 1))
2284*4724848cSchristos || !TEST_true(BN_set_word(p, 0))
2285*4724848cSchristos || !TEST_true(BN_set_word(m, 1)))
2286*4724848cSchristos goto err;
2287*4724848cSchristos
2288*4724848cSchristos /* Calculate r = 1 ^ 0 mod 1, and check the result is always 0 */
2289*4724848cSchristos for (i = 0; i < 2; i++) {
2290*4724848cSchristos if (!TEST_true(BN_mod_exp(r, a, p, m, NULL))
2291*4724848cSchristos || !TEST_BN_eq_zero(r)
2292*4724848cSchristos || !TEST_true(BN_mod_exp_mont(r, a, p, m, NULL, NULL))
2293*4724848cSchristos || !TEST_BN_eq_zero(r)
2294*4724848cSchristos || !TEST_true(BN_mod_exp_mont_consttime(r, a, p, m, NULL, NULL))
2295*4724848cSchristos || !TEST_BN_eq_zero(r)
2296*4724848cSchristos || !TEST_true(BN_mod_exp_mont_word(r, 1, p, m, NULL, NULL))
2297*4724848cSchristos || !TEST_BN_eq_zero(r)
2298*4724848cSchristos || !TEST_true(BN_mod_exp_simple(r, a, p, m, NULL))
2299*4724848cSchristos || !TEST_BN_eq_zero(r)
2300*4724848cSchristos || !TEST_true(BN_mod_exp_recp(r, a, p, m, NULL))
2301*4724848cSchristos || !TEST_BN_eq_zero(r))
2302*4724848cSchristos goto err;
2303*4724848cSchristos /* Repeat for r = 1 ^ 0 mod -1 */
2304*4724848cSchristos if (i == 0)
2305*4724848cSchristos BN_set_negative(m, 1);
2306*4724848cSchristos }
2307*4724848cSchristos
2308*4724848cSchristos ret = 1;
2309*4724848cSchristos err:
2310*4724848cSchristos BN_free(r);
2311*4724848cSchristos BN_free(a);
2312*4724848cSchristos BN_free(p);
2313*4724848cSchristos BN_free(m);
2314*4724848cSchristos return ret;
2315*4724848cSchristos }
2316*4724848cSchristos
test_smallprime(int kBits)2317*4724848cSchristos static int test_smallprime(int kBits)
2318*4724848cSchristos {
2319*4724848cSchristos BIGNUM *r;
2320*4724848cSchristos int st = 0;
2321*4724848cSchristos
2322*4724848cSchristos if (!TEST_ptr(r = BN_new()))
2323*4724848cSchristos goto err;
2324*4724848cSchristos
2325*4724848cSchristos if (kBits <= 1) {
2326*4724848cSchristos if (!TEST_false(BN_generate_prime_ex(r, kBits, 0,
2327*4724848cSchristos NULL, NULL, NULL)))
2328*4724848cSchristos goto err;
2329*4724848cSchristos } else {
2330*4724848cSchristos if (!TEST_true(BN_generate_prime_ex(r, kBits, 0,
2331*4724848cSchristos NULL, NULL, NULL))
2332*4724848cSchristos || !TEST_int_eq(BN_num_bits(r), kBits))
2333*4724848cSchristos goto err;
2334*4724848cSchristos }
2335*4724848cSchristos
2336*4724848cSchristos st = 1;
2337*4724848cSchristos err:
2338*4724848cSchristos BN_free(r);
2339*4724848cSchristos return st;
2340*4724848cSchristos }
2341*4724848cSchristos
test_smallsafeprime(int kBits)2342*4724848cSchristos static int test_smallsafeprime(int kBits)
2343*4724848cSchristos {
2344*4724848cSchristos BIGNUM *r;
2345*4724848cSchristos int st = 0;
2346*4724848cSchristos
2347*4724848cSchristos if (!TEST_ptr(r = BN_new()))
2348*4724848cSchristos goto err;
2349*4724848cSchristos
2350*4724848cSchristos if (kBits <= 5 && kBits != 3) {
2351*4724848cSchristos if (!TEST_false(BN_generate_prime_ex(r, kBits, 1,
2352*4724848cSchristos NULL, NULL, NULL)))
2353*4724848cSchristos goto err;
2354*4724848cSchristos } else {
2355*4724848cSchristos if (!TEST_true(BN_generate_prime_ex(r, kBits, 1,
2356*4724848cSchristos NULL, NULL, NULL))
2357*4724848cSchristos || !TEST_int_eq(BN_num_bits(r), kBits))
2358*4724848cSchristos goto err;
2359*4724848cSchristos }
2360*4724848cSchristos
2361*4724848cSchristos st = 1;
2362*4724848cSchristos err:
2363*4724848cSchristos BN_free(r);
2364*4724848cSchristos return st;
2365*4724848cSchristos }
2366*4724848cSchristos
2367*4724848cSchristos static int primes[] = { 2, 3, 5, 7, 17863 };
2368*4724848cSchristos
test_is_prime(int i)2369*4724848cSchristos static int test_is_prime(int i)
2370*4724848cSchristos {
2371*4724848cSchristos int ret = 0;
2372*4724848cSchristos BIGNUM *r = NULL;
2373*4724848cSchristos int trial;
2374*4724848cSchristos
2375*4724848cSchristos if (!TEST_ptr(r = BN_new()))
2376*4724848cSchristos goto err;
2377*4724848cSchristos
2378*4724848cSchristos for (trial = 0; trial <= 1; ++trial) {
2379*4724848cSchristos if (!TEST_true(BN_set_word(r, primes[i]))
2380*4724848cSchristos || !TEST_int_eq(BN_is_prime_fasttest_ex(r, 1, ctx, trial, NULL),
2381*4724848cSchristos 1))
2382*4724848cSchristos goto err;
2383*4724848cSchristos }
2384*4724848cSchristos
2385*4724848cSchristos ret = 1;
2386*4724848cSchristos err:
2387*4724848cSchristos BN_free(r);
2388*4724848cSchristos return ret;
2389*4724848cSchristos }
2390*4724848cSchristos
2391*4724848cSchristos static int not_primes[] = { -1, 0, 1, 4 };
2392*4724848cSchristos
test_not_prime(int i)2393*4724848cSchristos static int test_not_prime(int i)
2394*4724848cSchristos {
2395*4724848cSchristos int ret = 0;
2396*4724848cSchristos BIGNUM *r = NULL;
2397*4724848cSchristos int trial;
2398*4724848cSchristos
2399*4724848cSchristos if (!TEST_ptr(r = BN_new()))
2400*4724848cSchristos goto err;
2401*4724848cSchristos
2402*4724848cSchristos for (trial = 0; trial <= 1; ++trial) {
2403*4724848cSchristos if (!TEST_true(BN_set_word(r, not_primes[i]))
2404*4724848cSchristos || !TEST_false(BN_is_prime_fasttest_ex(r, 1, ctx, trial, NULL)))
2405*4724848cSchristos goto err;
2406*4724848cSchristos }
2407*4724848cSchristos
2408*4724848cSchristos ret = 1;
2409*4724848cSchristos err:
2410*4724848cSchristos BN_free(r);
2411*4724848cSchristos return ret;
2412*4724848cSchristos }
2413*4724848cSchristos
test_ctx_set_ct_flag(BN_CTX * c)2414*4724848cSchristos static int test_ctx_set_ct_flag(BN_CTX *c)
2415*4724848cSchristos {
2416*4724848cSchristos int st = 0;
2417*4724848cSchristos size_t i;
2418*4724848cSchristos BIGNUM *b[15];
2419*4724848cSchristos
2420*4724848cSchristos BN_CTX_start(c);
2421*4724848cSchristos for (i = 0; i < OSSL_NELEM(b); i++) {
2422*4724848cSchristos if (!TEST_ptr(b[i] = BN_CTX_get(c)))
2423*4724848cSchristos goto err;
2424*4724848cSchristos if (i % 2 == 1)
2425*4724848cSchristos BN_set_flags(b[i], BN_FLG_CONSTTIME);
2426*4724848cSchristos }
2427*4724848cSchristos
2428*4724848cSchristos st = 1;
2429*4724848cSchristos err:
2430*4724848cSchristos BN_CTX_end(c);
2431*4724848cSchristos return st;
2432*4724848cSchristos }
2433*4724848cSchristos
test_ctx_check_ct_flag(BN_CTX * c)2434*4724848cSchristos static int test_ctx_check_ct_flag(BN_CTX *c)
2435*4724848cSchristos {
2436*4724848cSchristos int st = 0;
2437*4724848cSchristos size_t i;
2438*4724848cSchristos BIGNUM *b[30];
2439*4724848cSchristos
2440*4724848cSchristos BN_CTX_start(c);
2441*4724848cSchristos for (i = 0; i < OSSL_NELEM(b); i++) {
2442*4724848cSchristos if (!TEST_ptr(b[i] = BN_CTX_get(c)))
2443*4724848cSchristos goto err;
2444*4724848cSchristos if (!TEST_false(BN_get_flags(b[i], BN_FLG_CONSTTIME)))
2445*4724848cSchristos goto err;
2446*4724848cSchristos }
2447*4724848cSchristos
2448*4724848cSchristos st = 1;
2449*4724848cSchristos err:
2450*4724848cSchristos BN_CTX_end(c);
2451*4724848cSchristos return st;
2452*4724848cSchristos }
2453*4724848cSchristos
test_ctx_consttime_flag(void)2454*4724848cSchristos static int test_ctx_consttime_flag(void)
2455*4724848cSchristos {
2456*4724848cSchristos /*-
2457*4724848cSchristos * The constant-time flag should not "leak" among BN_CTX frames:
2458*4724848cSchristos *
2459*4724848cSchristos * - test_ctx_set_ct_flag() starts a frame in the given BN_CTX and
2460*4724848cSchristos * sets the BN_FLG_CONSTTIME flag on some of the BIGNUMs obtained
2461*4724848cSchristos * from the frame before ending it.
2462*4724848cSchristos * - test_ctx_check_ct_flag() then starts a new frame and gets a
2463*4724848cSchristos * number of BIGNUMs from it. In absence of leaks, none of the
2464*4724848cSchristos * BIGNUMs in the new frame should have BN_FLG_CONSTTIME set.
2465*4724848cSchristos *
2466*4724848cSchristos * In actual BN_CTX usage inside libcrypto the leak could happen at
2467*4724848cSchristos * any depth level in the BN_CTX stack, with varying results
2468*4724848cSchristos * depending on the patterns of sibling trees of nested function
2469*4724848cSchristos * calls sharing the same BN_CTX object, and the effect of
2470*4724848cSchristos * unintended BN_FLG_CONSTTIME on the called BN_* functions.
2471*4724848cSchristos *
2472*4724848cSchristos * This simple unit test abstracts away this complexity and verifies
2473*4724848cSchristos * that the leak does not happen between two sibling functions
2474*4724848cSchristos * sharing the same BN_CTX object at the same level of nesting.
2475*4724848cSchristos *
2476*4724848cSchristos */
2477*4724848cSchristos BN_CTX *nctx = NULL;
2478*4724848cSchristos BN_CTX *sctx = NULL;
2479*4724848cSchristos size_t i = 0;
2480*4724848cSchristos int st = 0;
2481*4724848cSchristos
2482*4724848cSchristos if (!TEST_ptr(nctx = BN_CTX_new())
2483*4724848cSchristos || !TEST_ptr(sctx = BN_CTX_secure_new()))
2484*4724848cSchristos goto err;
2485*4724848cSchristos
2486*4724848cSchristos for (i = 0; i < 2; i++) {
2487*4724848cSchristos BN_CTX *c = i == 0 ? nctx : sctx;
2488*4724848cSchristos if (!TEST_true(test_ctx_set_ct_flag(c))
2489*4724848cSchristos || !TEST_true(test_ctx_check_ct_flag(c)))
2490*4724848cSchristos goto err;
2491*4724848cSchristos }
2492*4724848cSchristos
2493*4724848cSchristos st = 1;
2494*4724848cSchristos err:
2495*4724848cSchristos BN_CTX_free(nctx);
2496*4724848cSchristos BN_CTX_free(sctx);
2497*4724848cSchristos return st;
2498*4724848cSchristos }
2499*4724848cSchristos
test_gcd_prime(void)2500*4724848cSchristos static int test_gcd_prime(void)
2501*4724848cSchristos {
2502*4724848cSchristos BIGNUM *a = NULL, *b = NULL, *gcd = NULL;
2503*4724848cSchristos int i, st = 0;
2504*4724848cSchristos
2505*4724848cSchristos if (!TEST_ptr(a = BN_new())
2506*4724848cSchristos || !TEST_ptr(b = BN_new())
2507*4724848cSchristos || !TEST_ptr(gcd = BN_new()))
2508*4724848cSchristos goto err;
2509*4724848cSchristos
2510*4724848cSchristos if (!TEST_true(BN_generate_prime_ex(a, 1024, 0, NULL, NULL, NULL)))
2511*4724848cSchristos goto err;
2512*4724848cSchristos for (i = 0; i < NUM0; i++) {
2513*4724848cSchristos if (!TEST_true(BN_generate_prime_ex(b, 1024, 0,
2514*4724848cSchristos NULL, NULL, NULL))
2515*4724848cSchristos || !TEST_true(BN_gcd(gcd, a, b, ctx))
2516*4724848cSchristos || !TEST_true(BN_is_one(gcd)))
2517*4724848cSchristos goto err;
2518*4724848cSchristos }
2519*4724848cSchristos
2520*4724848cSchristos st = 1;
2521*4724848cSchristos err:
2522*4724848cSchristos BN_free(a);
2523*4724848cSchristos BN_free(b);
2524*4724848cSchristos BN_free(gcd);
2525*4724848cSchristos return st;
2526*4724848cSchristos }
2527*4724848cSchristos
2528*4724848cSchristos typedef struct mod_exp_test_st
2529*4724848cSchristos {
2530*4724848cSchristos const char *base;
2531*4724848cSchristos const char *exp;
2532*4724848cSchristos const char *mod;
2533*4724848cSchristos const char *res;
2534*4724848cSchristos } MOD_EXP_TEST;
2535*4724848cSchristos
2536*4724848cSchristos static const MOD_EXP_TEST ModExpTests[] = {
2537*4724848cSchristos /* original test vectors for rsaz_512_sqr bug, by OSS-Fuzz */
2538*4724848cSchristos {
2539*4724848cSchristos "1166180238001879113042182292626169621106255558914000595999312084"
2540*4724848cSchristos "4627946820899490684928760491249738643524880720584249698100907201"
2541*4724848cSchristos "002086675047927600340800371",
2542*4724848cSchristos "8000000000000000000000000000000000000000000000000000000000000000"
2543*4724848cSchristos "0000000000000000000000000000000000000000000000000000000000000000"
2544*4724848cSchristos "00000000",
2545*4724848cSchristos "1340780792684523720980737645613191762604395855615117867483316354"
2546*4724848cSchristos "3294276330515137663421134775482798690129946803802212663956180562"
2547*4724848cSchristos "088664022929883876655300863",
2548*4724848cSchristos "8243904058268085430037326628480645845409758077568738532059032482"
2549*4724848cSchristos "8294114415890603594730158120426756266457928475330450251339773498"
2550*4724848cSchristos "26758407619521544102068438"
2551*4724848cSchristos },
2552*4724848cSchristos {
2553*4724848cSchristos "4974270041410803822078866696159586946995877618987010219312844726"
2554*4724848cSchristos "0284386121835740784990869050050504348861513337232530490826340663"
2555*4724848cSchristos "197278031692737429054",
2556*4724848cSchristos "4974270041410803822078866696159586946995877428188754995041148539"
2557*4724848cSchristos "1663243362592271353668158565195557417149981094324650322556843202"
2558*4724848cSchristos "946445882670777892608",
2559*4724848cSchristos "1340780716511420227215592830971452482815377482627251725537099028"
2560*4724848cSchristos "4429769497230131760206012644403029349547320953206103351725462999"
2561*4724848cSchristos "947509743623340557059752191",
2562*4724848cSchristos "5296244594780707015616522701706118082963369547253192207884519362"
2563*4724848cSchristos "1767869984947542695665420219028522815539559194793619684334900442"
2564*4724848cSchristos "49304558011362360473525933"
2565*4724848cSchristos },
2566*4724848cSchristos /* test vectors for rsaz_512_srq bug, with rcx/rbx=1 */
2567*4724848cSchristos { /* between first and second iteration */
2568*4724848cSchristos "5148719036160389201525610950887605325980251964889646556085286545"
2569*4724848cSchristos "3931548809178823413169359635978762036512397113080988070677858033"
2570*4724848cSchristos "36463909753993540214027190",
2571*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2572*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2573*4724848cSchristos "05973284973216824503042158",
2574*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2575*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2576*4724848cSchristos "05973284973216824503042159",
2577*4724848cSchristos "1"
2578*4724848cSchristos },
2579*4724848cSchristos { /* between second and third iteration */
2580*4724848cSchristos "8908340854353752577419678771330460827942371434853054158622636544"
2581*4724848cSchristos "8151360109722890949471912566649465436296659601091730745087014189"
2582*4724848cSchristos "2672764191218875181826063",
2583*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2584*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2585*4724848cSchristos "05973284973216824503042158",
2586*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2587*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2588*4724848cSchristos "05973284973216824503042159",
2589*4724848cSchristos "1"
2590*4724848cSchristos },
2591*4724848cSchristos { /* between third and fourth iteration */
2592*4724848cSchristos "3427446396505596330634350984901719674479522569002785244080234738"
2593*4724848cSchristos "4288743635435746136297299366444548736533053717416735379073185344"
2594*4724848cSchristos "26985272974404612945608761",
2595*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2596*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2597*4724848cSchristos "05973284973216824503042158",
2598*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2599*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2600*4724848cSchristos "05973284973216824503042159",
2601*4724848cSchristos "1"
2602*4724848cSchristos },
2603*4724848cSchristos { /* between fourth and fifth iteration */
2604*4724848cSchristos "3472743044917564564078857826111874560045331237315597383869652985"
2605*4724848cSchristos "6919870028890895988478351133601517365908445058405433832718206902"
2606*4724848cSchristos "4088133164805266956353542",
2607*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2608*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2609*4724848cSchristos "05973284973216824503042158",
2610*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2611*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2612*4724848cSchristos "05973284973216824503042159",
2613*4724848cSchristos "1"
2614*4724848cSchristos },
2615*4724848cSchristos { /* between fifth and sixth iteration */
2616*4724848cSchristos "3608632990153469264412378349742339216742409743898601587274768025"
2617*4724848cSchristos "0110772032985643555192767717344946174122842255204082586753499651"
2618*4724848cSchristos "14483434992887431333675068",
2619*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2620*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2621*4724848cSchristos "05973284973216824503042158",
2622*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2623*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2624*4724848cSchristos "05973284973216824503042159",
2625*4724848cSchristos "1"
2626*4724848cSchristos },
2627*4724848cSchristos { /* between sixth and seventh iteration */
2628*4724848cSchristos "8455374370234070242910508226941981520235709767260723212165264877"
2629*4724848cSchristos "8689064388017521524568434328264431772644802567028663962962025746"
2630*4724848cSchristos "9283458217850119569539086",
2631*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2632*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2633*4724848cSchristos "05973284973216824503042158",
2634*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2635*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2636*4724848cSchristos "05973284973216824503042159",
2637*4724848cSchristos "1"
2638*4724848cSchristos },
2639*4724848cSchristos { /* between seventh and eighth iteration */
2640*4724848cSchristos "5155371529688532178421209781159131443543419764974688878527112131"
2641*4724848cSchristos "7446518205609427412336183157918981038066636807317733319323257603"
2642*4724848cSchristos "04416292040754017461076359",
2643*4724848cSchristos "1005585594745694782468051874865438459560952436544429503329267108"
2644*4724848cSchristos "2791323022555160232601405723625177570767523893639864538140315412"
2645*4724848cSchristos "108959927459825236754563832",
2646*4724848cSchristos "1005585594745694782468051874865438459560952436544429503329267108"
2647*4724848cSchristos "2791323022555160232601405723625177570767523893639864538140315412"
2648*4724848cSchristos "108959927459825236754563833",
2649*4724848cSchristos "1"
2650*4724848cSchristos },
2651*4724848cSchristos /* test vectors for rsaz_512_srq bug, with rcx/rbx=2 */
2652*4724848cSchristos { /* between first and second iteration */
2653*4724848cSchristos "3155666506033786929967309937640790361084670559125912405342594979"
2654*4724848cSchristos "4345142818528956285490897841406338022378565972533508820577760065"
2655*4724848cSchristos "58494345853302083699912572",
2656*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2657*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2658*4724848cSchristos "05973284973216824503042158",
2659*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2660*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2661*4724848cSchristos "05973284973216824503042159",
2662*4724848cSchristos "1"
2663*4724848cSchristos },
2664*4724848cSchristos { /* between second and third iteration */
2665*4724848cSchristos "3789819583801342198190405714582958759005991915505282362397087750"
2666*4724848cSchristos "4213544724644823098843135685133927198668818185338794377239590049"
2667*4724848cSchristos "41019388529192775771488319",
2668*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2669*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2670*4724848cSchristos "05973284973216824503042158",
2671*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2672*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2673*4724848cSchristos "05973284973216824503042159",
2674*4724848cSchristos "1"
2675*4724848cSchristos },
2676*4724848cSchristos { /* between third and forth iteration */
2677*4724848cSchristos "4695752552040706867080542538786056470322165281761525158189220280"
2678*4724848cSchristos "4025547447667484759200742764246905647644662050122968912279199065"
2679*4724848cSchristos "48065034299166336940507214",
2680*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2681*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2682*4724848cSchristos "05973284973216824503042158",
2683*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2684*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2685*4724848cSchristos "05973284973216824503042159",
2686*4724848cSchristos "1"
2687*4724848cSchristos },
2688*4724848cSchristos { /* between forth and fifth iteration */
2689*4724848cSchristos "2159140240970485794188159431017382878636879856244045329971239574"
2690*4724848cSchristos "8919691133560661162828034323196457386059819832804593989740268964"
2691*4724848cSchristos "74502911811812651475927076",
2692*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2693*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2694*4724848cSchristos "05973284973216824503042158",
2695*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2696*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2697*4724848cSchristos "05973284973216824503042159",
2698*4724848cSchristos "1"
2699*4724848cSchristos },
2700*4724848cSchristos { /* between fifth and sixth iteration */
2701*4724848cSchristos "5239312332984325668414624633307915097111691815000872662334695514"
2702*4724848cSchristos "5436533521392362443557163429336808208137221322444780490437871903"
2703*4724848cSchristos "99972784701334569424519255",
2704*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2705*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2706*4724848cSchristos "05973284973216824503042158",
2707*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2708*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2709*4724848cSchristos "05973284973216824503042159",
2710*4724848cSchristos "1"
2711*4724848cSchristos },
2712*4724848cSchristos { /* between sixth and seventh iteration */
2713*4724848cSchristos "1977953647322612860406858017869125467496941904523063466791308891"
2714*4724848cSchristos "1172796739058531929470539758361774569875505293428856181093904091"
2715*4724848cSchristos "33788264851714311303725089",
2716*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2717*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2718*4724848cSchristos "05973284973216824503042158",
2719*4724848cSchristos "6703903964971298549787012499102923063739682910296196688861780721"
2720*4724848cSchristos "8608820150367734884009371490834517138450159290932430254268769414"
2721*4724848cSchristos "05973284973216824503042159",
2722*4724848cSchristos "1"
2723*4724848cSchristos },
2724*4724848cSchristos { /* between seventh and eighth iteration */
2725*4724848cSchristos "6456987954117763835533395796948878140715006860263624787492985786"
2726*4724848cSchristos "8514630216966738305923915688821526449499763719943997120302368211"
2727*4724848cSchristos "04813318117996225041943964",
2728*4724848cSchristos "1340780792994259709957402499820584612747936582059239337772356144"
2729*4724848cSchristos "3721764030073546976801874298166903427690031858186486050853753882"
2730*4724848cSchristos "811946551499689575296532556",
2731*4724848cSchristos "1340780792994259709957402499820584612747936582059239337772356144"
2732*4724848cSchristos "3721764030073546976801874298166903427690031858186486050853753882"
2733*4724848cSchristos "811946551499689575296532557",
2734*4724848cSchristos "1"
2735*4724848cSchristos }
2736*4724848cSchristos };
2737*4724848cSchristos
test_mod_exp(int i)2738*4724848cSchristos static int test_mod_exp(int i)
2739*4724848cSchristos {
2740*4724848cSchristos const MOD_EXP_TEST *test = &ModExpTests[i];
2741*4724848cSchristos int res = 0;
2742*4724848cSchristos BIGNUM* result = NULL;
2743*4724848cSchristos BIGNUM *base = NULL, *exponent = NULL, *modulo = NULL;
2744*4724848cSchristos char *s = NULL;
2745*4724848cSchristos
2746*4724848cSchristos if (!TEST_ptr(result = BN_new())
2747*4724848cSchristos || !TEST_true(BN_dec2bn(&base, test->base))
2748*4724848cSchristos || !TEST_true(BN_dec2bn(&exponent, test->exp))
2749*4724848cSchristos || !TEST_true(BN_dec2bn(&modulo, test->mod)))
2750*4724848cSchristos goto err;
2751*4724848cSchristos
2752*4724848cSchristos if (!TEST_int_eq(BN_mod_exp(result, base, exponent, modulo, ctx), 1))
2753*4724848cSchristos goto err;
2754*4724848cSchristos
2755*4724848cSchristos if (!TEST_ptr(s = BN_bn2dec(result)))
2756*4724848cSchristos goto err;
2757*4724848cSchristos
2758*4724848cSchristos if (!TEST_mem_eq(s, strlen(s), test->res, strlen(test->res)))
2759*4724848cSchristos goto err;
2760*4724848cSchristos
2761*4724848cSchristos res = 1;
2762*4724848cSchristos
2763*4724848cSchristos err:
2764*4724848cSchristos OPENSSL_free(s);
2765*4724848cSchristos BN_free(result);
2766*4724848cSchristos BN_free(base);
2767*4724848cSchristos BN_free(exponent);
2768*4724848cSchristos BN_free(modulo);
2769*4724848cSchristos return res;
2770*4724848cSchristos }
2771*4724848cSchristos
test_mod_exp_consttime(int i)2772*4724848cSchristos static int test_mod_exp_consttime(int i)
2773*4724848cSchristos {
2774*4724848cSchristos const MOD_EXP_TEST *test = &ModExpTests[i];
2775*4724848cSchristos int res = 0;
2776*4724848cSchristos BIGNUM* result = NULL;
2777*4724848cSchristos BIGNUM *base = NULL, *exponent = NULL, *modulo = NULL;
2778*4724848cSchristos char *s = NULL;
2779*4724848cSchristos
2780*4724848cSchristos if (!TEST_ptr(result = BN_new())
2781*4724848cSchristos || !TEST_true(BN_dec2bn(&base, test->base))
2782*4724848cSchristos || !TEST_true(BN_dec2bn(&exponent, test->exp))
2783*4724848cSchristos || !TEST_true(BN_dec2bn(&modulo, test->mod)))
2784*4724848cSchristos goto err;
2785*4724848cSchristos
2786*4724848cSchristos BN_set_flags(base, BN_FLG_CONSTTIME);
2787*4724848cSchristos BN_set_flags(exponent, BN_FLG_CONSTTIME);
2788*4724848cSchristos BN_set_flags(modulo, BN_FLG_CONSTTIME);
2789*4724848cSchristos
2790*4724848cSchristos if (!TEST_int_eq(BN_mod_exp(result, base, exponent, modulo, ctx), 1))
2791*4724848cSchristos goto err;
2792*4724848cSchristos
2793*4724848cSchristos if (!TEST_ptr(s = BN_bn2dec(result)))
2794*4724848cSchristos goto err;
2795*4724848cSchristos
2796*4724848cSchristos if (!TEST_mem_eq(s, strlen(s), test->res, strlen(test->res)))
2797*4724848cSchristos goto err;
2798*4724848cSchristos
2799*4724848cSchristos res = 1;
2800*4724848cSchristos
2801*4724848cSchristos err:
2802*4724848cSchristos OPENSSL_free(s);
2803*4724848cSchristos BN_free(result);
2804*4724848cSchristos BN_free(base);
2805*4724848cSchristos BN_free(exponent);
2806*4724848cSchristos BN_free(modulo);
2807*4724848cSchristos return res;
2808*4724848cSchristos }
2809*4724848cSchristos
2810*4724848cSchristos /*
2811*4724848cSchristos * Regression test to ensure BN_mod_exp2_mont fails safely if argument m is
2812*4724848cSchristos * zero.
2813*4724848cSchristos */
test_mod_exp2_mont(void)2814*4724848cSchristos static int test_mod_exp2_mont(void)
2815*4724848cSchristos {
2816*4724848cSchristos int res = 0;
2817*4724848cSchristos BIGNUM *exp_result = NULL;
2818*4724848cSchristos BIGNUM *exp_a1 = NULL, *exp_p1 = NULL, *exp_a2 = NULL, *exp_p2 = NULL,
2819*4724848cSchristos *exp_m = NULL;
2820*4724848cSchristos
2821*4724848cSchristos if (!TEST_ptr(exp_result = BN_new())
2822*4724848cSchristos || !TEST_ptr(exp_a1 = BN_new())
2823*4724848cSchristos || !TEST_ptr(exp_p1 = BN_new())
2824*4724848cSchristos || !TEST_ptr(exp_a2 = BN_new())
2825*4724848cSchristos || !TEST_ptr(exp_p2 = BN_new())
2826*4724848cSchristos || !TEST_ptr(exp_m = BN_new()))
2827*4724848cSchristos goto err;
2828*4724848cSchristos
2829*4724848cSchristos if (!TEST_true(BN_one(exp_a1))
2830*4724848cSchristos || !TEST_true(BN_one(exp_p1))
2831*4724848cSchristos || !TEST_true(BN_one(exp_a2))
2832*4724848cSchristos || !TEST_true(BN_one(exp_p2)))
2833*4724848cSchristos goto err;
2834*4724848cSchristos
2835*4724848cSchristos BN_zero(exp_m);
2836*4724848cSchristos
2837*4724848cSchristos /* input of 0 is even, so must fail */
2838*4724848cSchristos if (!TEST_int_eq(BN_mod_exp2_mont(exp_result, exp_a1, exp_p1, exp_a2,
2839*4724848cSchristos exp_p2, exp_m, ctx, NULL), 0))
2840*4724848cSchristos goto err;
2841*4724848cSchristos
2842*4724848cSchristos res = 1;
2843*4724848cSchristos
2844*4724848cSchristos err:
2845*4724848cSchristos BN_free(exp_result);
2846*4724848cSchristos BN_free(exp_a1);
2847*4724848cSchristos BN_free(exp_p1);
2848*4724848cSchristos BN_free(exp_a2);
2849*4724848cSchristos BN_free(exp_p2);
2850*4724848cSchristos BN_free(exp_m);
2851*4724848cSchristos return res;
2852*4724848cSchristos }
2853*4724848cSchristos
file_test_run(STANZA * s)2854*4724848cSchristos static int file_test_run(STANZA *s)
2855*4724848cSchristos {
2856*4724848cSchristos static const FILETEST filetests[] = {
2857*4724848cSchristos {"Sum", file_sum},
2858*4724848cSchristos {"LShift1", file_lshift1},
2859*4724848cSchristos {"LShift", file_lshift},
2860*4724848cSchristos {"RShift", file_rshift},
2861*4724848cSchristos {"Square", file_square},
2862*4724848cSchristos {"Product", file_product},
2863*4724848cSchristos {"Quotient", file_quotient},
2864*4724848cSchristos {"ModMul", file_modmul},
2865*4724848cSchristos {"ModExp", file_modexp},
2866*4724848cSchristos {"Exp", file_exp},
2867*4724848cSchristos {"ModSqrt", file_modsqrt},
2868*4724848cSchristos {"GCD", file_gcd},
2869*4724848cSchristos };
2870*4724848cSchristos int numtests = OSSL_NELEM(filetests);
2871*4724848cSchristos const FILETEST *tp = filetests;
2872*4724848cSchristos
2873*4724848cSchristos for ( ; --numtests >= 0; tp++) {
2874*4724848cSchristos if (findattr(s, tp->name) != NULL) {
2875*4724848cSchristos if (!tp->func(s)) {
2876*4724848cSchristos TEST_info("%s:%d: Failed %s test",
2877*4724848cSchristos s->test_file, s->start, tp->name);
2878*4724848cSchristos return 0;
2879*4724848cSchristos }
2880*4724848cSchristos return 1;
2881*4724848cSchristos }
2882*4724848cSchristos }
2883*4724848cSchristos TEST_info("%s:%d: Unknown test", s->test_file, s->start);
2884*4724848cSchristos return 0;
2885*4724848cSchristos }
2886*4724848cSchristos
run_file_tests(int i)2887*4724848cSchristos static int run_file_tests(int i)
2888*4724848cSchristos {
2889*4724848cSchristos STANZA *s = NULL;
2890*4724848cSchristos char *testfile = test_get_argument(i);
2891*4724848cSchristos int c;
2892*4724848cSchristos
2893*4724848cSchristos if (!TEST_ptr(s = OPENSSL_zalloc(sizeof(*s))))
2894*4724848cSchristos return 0;
2895*4724848cSchristos if (!test_start_file(s, testfile)) {
2896*4724848cSchristos OPENSSL_free(s);
2897*4724848cSchristos return 0;
2898*4724848cSchristos }
2899*4724848cSchristos
2900*4724848cSchristos /* Read test file. */
2901*4724848cSchristos while (!BIO_eof(s->fp) && test_readstanza(s)) {
2902*4724848cSchristos if (s->numpairs == 0)
2903*4724848cSchristos continue;
2904*4724848cSchristos if (!file_test_run(s))
2905*4724848cSchristos s->errors++;
2906*4724848cSchristos s->numtests++;
2907*4724848cSchristos test_clearstanza(s);
2908*4724848cSchristos }
2909*4724848cSchristos test_end_file(s);
2910*4724848cSchristos c = s->errors;
2911*4724848cSchristos OPENSSL_free(s);
2912*4724848cSchristos
2913*4724848cSchristos return c == 0;
2914*4724848cSchristos }
2915*4724848cSchristos
2916*4724848cSchristos
setup_tests(void)2917*4724848cSchristos int setup_tests(void)
2918*4724848cSchristos {
2919*4724848cSchristos int n = test_get_argument_count();
2920*4724848cSchristos
2921*4724848cSchristos if (!TEST_ptr(ctx = BN_CTX_new()))
2922*4724848cSchristos return 0;
2923*4724848cSchristos
2924*4724848cSchristos if (n == 0) {
2925*4724848cSchristos ADD_TEST(test_sub);
2926*4724848cSchristos ADD_TEST(test_div_recip);
2927*4724848cSchristos ADD_ALL_TESTS(test_signed_mod_replace_ab, OSSL_NELEM(signed_mod_tests));
2928*4724848cSchristos ADD_ALL_TESTS(test_signed_mod_replace_ba, OSSL_NELEM(signed_mod_tests));
2929*4724848cSchristos ADD_TEST(test_mod);
2930*4724848cSchristos ADD_TEST(test_modexp_mont5);
2931*4724848cSchristos ADD_TEST(test_kronecker);
2932*4724848cSchristos ADD_TEST(test_rand);
2933*4724848cSchristos ADD_TEST(test_bn2padded);
2934*4724848cSchristos ADD_TEST(test_dec2bn);
2935*4724848cSchristos ADD_TEST(test_hex2bn);
2936*4724848cSchristos ADD_TEST(test_asc2bn);
2937*4724848cSchristos ADD_ALL_TESTS(test_mpi, (int)OSSL_NELEM(kMPITests));
2938*4724848cSchristos ADD_TEST(test_negzero);
2939*4724848cSchristos ADD_TEST(test_badmod);
2940*4724848cSchristos ADD_TEST(test_expmodzero);
2941*4724848cSchristos ADD_TEST(test_expmodone);
2942*4724848cSchristos ADD_ALL_TESTS(test_smallprime, 16);
2943*4724848cSchristos ADD_ALL_TESTS(test_smallsafeprime, 16);
2944*4724848cSchristos ADD_TEST(test_swap);
2945*4724848cSchristos ADD_TEST(test_ctx_consttime_flag);
2946*4724848cSchristos #ifndef OPENSSL_NO_EC2M
2947*4724848cSchristos ADD_TEST(test_gf2m_add);
2948*4724848cSchristos ADD_TEST(test_gf2m_mod);
2949*4724848cSchristos ADD_TEST(test_gf2m_mul);
2950*4724848cSchristos ADD_TEST(test_gf2m_sqr);
2951*4724848cSchristos ADD_TEST(test_gf2m_modinv);
2952*4724848cSchristos ADD_TEST(test_gf2m_moddiv);
2953*4724848cSchristos ADD_TEST(test_gf2m_modexp);
2954*4724848cSchristos ADD_TEST(test_gf2m_modsqrt);
2955*4724848cSchristos ADD_TEST(test_gf2m_modsolvequad);
2956*4724848cSchristos #endif
2957*4724848cSchristos ADD_ALL_TESTS(test_is_prime, (int)OSSL_NELEM(primes));
2958*4724848cSchristos ADD_ALL_TESTS(test_not_prime, (int)OSSL_NELEM(not_primes));
2959*4724848cSchristos ADD_TEST(test_gcd_prime);
2960*4724848cSchristos ADD_ALL_TESTS(test_mod_exp, (int)OSSL_NELEM(ModExpTests));
2961*4724848cSchristos ADD_ALL_TESTS(test_mod_exp_consttime, (int)OSSL_NELEM(ModExpTests));
2962*4724848cSchristos ADD_TEST(test_mod_exp2_mont);
2963*4724848cSchristos } else {
2964*4724848cSchristos ADD_ALL_TESTS(run_file_tests, n);
2965*4724848cSchristos }
2966*4724848cSchristos return 1;
2967*4724848cSchristos }
2968*4724848cSchristos
cleanup_tests(void)2969*4724848cSchristos void cleanup_tests(void)
2970*4724848cSchristos {
2971*4724848cSchristos BN_CTX_free(ctx);
2972*4724848cSchristos }
2973