xref: /netbsd-src/crypto/external/bsd/openssl.old/dist/test/bntest.c (revision 4724848cf0da353df257f730694b7882798e5daf)
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