xref: /freebsd/crypto/openssl/test/exptest.c (revision e0c4386e7e71d93b0edc0c8fa156263fc4a8b0b6)
1*e0c4386eSCy Schubert /*
2*e0c4386eSCy Schubert  * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
3*e0c4386eSCy Schubert  *
4*e0c4386eSCy Schubert  * Licensed under the Apache License 2.0 (the "License").  You may not use
5*e0c4386eSCy Schubert  * this file except in compliance with the License.  You can obtain a copy
6*e0c4386eSCy Schubert  * in the file LICENSE in the source distribution or at
7*e0c4386eSCy Schubert  * https://www.openssl.org/source/license.html
8*e0c4386eSCy Schubert  */
9*e0c4386eSCy Schubert 
10*e0c4386eSCy Schubert #include <stdio.h>
11*e0c4386eSCy Schubert #include <stdlib.h>
12*e0c4386eSCy Schubert #include <string.h>
13*e0c4386eSCy Schubert 
14*e0c4386eSCy Schubert #include "internal/nelem.h"
15*e0c4386eSCy Schubert 
16*e0c4386eSCy Schubert #include <openssl/bio.h>
17*e0c4386eSCy Schubert #include <openssl/bn.h>
18*e0c4386eSCy Schubert #include <openssl/rand.h>
19*e0c4386eSCy Schubert #include <openssl/err.h>
20*e0c4386eSCy Schubert 
21*e0c4386eSCy Schubert #include "testutil.h"
22*e0c4386eSCy Schubert 
23*e0c4386eSCy Schubert #define NUM_BITS        (BN_BITS2 * 4)
24*e0c4386eSCy Schubert 
25*e0c4386eSCy Schubert #define BN_print_var(v) test_output_bignum(#v, v)
26*e0c4386eSCy Schubert 
27*e0c4386eSCy Schubert /*
28*e0c4386eSCy Schubert  * Test that r == 0 in test_exp_mod_zero(). Returns one on success,
29*e0c4386eSCy Schubert  * returns zero and prints debug output otherwise.
30*e0c4386eSCy Schubert  */
a_is_zero_mod_one(const char * method,const BIGNUM * r,const BIGNUM * a)31*e0c4386eSCy Schubert static int a_is_zero_mod_one(const char *method, const BIGNUM *r,
32*e0c4386eSCy Schubert                              const BIGNUM *a)
33*e0c4386eSCy Schubert {
34*e0c4386eSCy Schubert     if (!BN_is_zero(r)) {
35*e0c4386eSCy Schubert         TEST_error("%s failed: a ** 0 mod 1 = r (should be 0)", method);
36*e0c4386eSCy Schubert         BN_print_var(a);
37*e0c4386eSCy Schubert         BN_print_var(r);
38*e0c4386eSCy Schubert         return 0;
39*e0c4386eSCy Schubert     }
40*e0c4386eSCy Schubert     return 1;
41*e0c4386eSCy Schubert }
42*e0c4386eSCy Schubert 
43*e0c4386eSCy Schubert /*
44*e0c4386eSCy Schubert  * test_mod_exp_zero tests that x**0 mod 1 == 0. It returns zero on success.
45*e0c4386eSCy Schubert  */
test_mod_exp_zero(void)46*e0c4386eSCy Schubert static int test_mod_exp_zero(void)
47*e0c4386eSCy Schubert {
48*e0c4386eSCy Schubert     BIGNUM *a = NULL, *p = NULL, *m = NULL;
49*e0c4386eSCy Schubert     BIGNUM *r = NULL;
50*e0c4386eSCy Schubert     BN_ULONG one_word = 1;
51*e0c4386eSCy Schubert     BN_CTX *ctx = BN_CTX_new();
52*e0c4386eSCy Schubert     int ret = 0, failed = 0;
53*e0c4386eSCy Schubert     BN_MONT_CTX *mont = NULL;
54*e0c4386eSCy Schubert 
55*e0c4386eSCy Schubert     if (!TEST_ptr(m = BN_new())
56*e0c4386eSCy Schubert         || !TEST_ptr(a = BN_new())
57*e0c4386eSCy Schubert         || !TEST_ptr(p = BN_new())
58*e0c4386eSCy Schubert         || !TEST_ptr(r = BN_new()))
59*e0c4386eSCy Schubert         goto err;
60*e0c4386eSCy Schubert 
61*e0c4386eSCy Schubert     BN_one(m);
62*e0c4386eSCy Schubert     BN_one(a);
63*e0c4386eSCy Schubert     BN_zero(p);
64*e0c4386eSCy Schubert 
65*e0c4386eSCy Schubert     if (!TEST_true(BN_rand(a, 1024, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY)))
66*e0c4386eSCy Schubert         goto err;
67*e0c4386eSCy Schubert 
68*e0c4386eSCy Schubert     if (!TEST_true(BN_mod_exp(r, a, p, m, ctx)))
69*e0c4386eSCy Schubert         goto err;
70*e0c4386eSCy Schubert 
71*e0c4386eSCy Schubert     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp", r, a)))
72*e0c4386eSCy Schubert         failed = 1;
73*e0c4386eSCy Schubert 
74*e0c4386eSCy Schubert     if (!TEST_true(BN_mod_exp_recp(r, a, p, m, ctx)))
75*e0c4386eSCy Schubert         goto err;
76*e0c4386eSCy Schubert 
77*e0c4386eSCy Schubert     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_recp", r, a)))
78*e0c4386eSCy Schubert         failed = 1;
79*e0c4386eSCy Schubert 
80*e0c4386eSCy Schubert     if (!TEST_true(BN_mod_exp_simple(r, a, p, m, ctx)))
81*e0c4386eSCy Schubert         goto err;
82*e0c4386eSCy Schubert 
83*e0c4386eSCy Schubert     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_simple", r, a)))
84*e0c4386eSCy Schubert         failed = 1;
85*e0c4386eSCy Schubert 
86*e0c4386eSCy Schubert     if (!TEST_true(BN_mod_exp_mont(r, a, p, m, ctx, NULL)))
87*e0c4386eSCy Schubert         goto err;
88*e0c4386eSCy Schubert 
89*e0c4386eSCy Schubert     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_mont", r, a)))
90*e0c4386eSCy Schubert         failed = 1;
91*e0c4386eSCy Schubert 
92*e0c4386eSCy Schubert     if (!TEST_true(BN_mod_exp_mont_consttime(r, a, p, m, ctx, NULL)))
93*e0c4386eSCy Schubert         goto err;
94*e0c4386eSCy Schubert 
95*e0c4386eSCy Schubert     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_mont_consttime", r, a)))
96*e0c4386eSCy Schubert         failed = 1;
97*e0c4386eSCy Schubert 
98*e0c4386eSCy Schubert     if (!TEST_ptr(mont = BN_MONT_CTX_new()))
99*e0c4386eSCy Schubert         goto err;
100*e0c4386eSCy Schubert 
101*e0c4386eSCy Schubert     ERR_set_mark();
102*e0c4386eSCy Schubert     /* mont is not set but passed in */
103*e0c4386eSCy Schubert     if (!TEST_false(BN_mod_exp_mont_consttime(r, p, a, m, ctx, mont)))
104*e0c4386eSCy Schubert         goto err;
105*e0c4386eSCy Schubert     if (!TEST_false(BN_mod_exp_mont(r, p, a, m, ctx, mont)))
106*e0c4386eSCy Schubert         goto err;
107*e0c4386eSCy Schubert     ERR_pop_to_mark();
108*e0c4386eSCy Schubert 
109*e0c4386eSCy Schubert     if (!TEST_true(BN_MONT_CTX_set(mont, m, ctx)))
110*e0c4386eSCy Schubert         goto err;
111*e0c4386eSCy Schubert 
112*e0c4386eSCy Schubert     /* we compute 0 ** a mod 1 here, to execute code that uses mont */
113*e0c4386eSCy Schubert     if (!TEST_true(BN_mod_exp_mont_consttime(r, p, a, m, ctx, mont)))
114*e0c4386eSCy Schubert         goto err;
115*e0c4386eSCy Schubert 
116*e0c4386eSCy Schubert     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_mont_consttime", r, a)))
117*e0c4386eSCy Schubert         failed = 1;
118*e0c4386eSCy Schubert 
119*e0c4386eSCy Schubert     if (!TEST_true(BN_mod_exp_mont(r, p, a, m, ctx, mont)))
120*e0c4386eSCy Schubert         goto err;
121*e0c4386eSCy Schubert 
122*e0c4386eSCy Schubert     if (!TEST_true(a_is_zero_mod_one("BN_mod_exp_mont", r, a)))
123*e0c4386eSCy Schubert         failed = 1;
124*e0c4386eSCy Schubert 
125*e0c4386eSCy Schubert     /*
126*e0c4386eSCy Schubert      * A different codepath exists for single word multiplication
127*e0c4386eSCy Schubert      * in non-constant-time only.
128*e0c4386eSCy Schubert      */
129*e0c4386eSCy Schubert     if (!TEST_true(BN_mod_exp_mont_word(r, one_word, p, m, ctx, NULL)))
130*e0c4386eSCy Schubert         goto err;
131*e0c4386eSCy Schubert 
132*e0c4386eSCy Schubert     if (!TEST_BN_eq_zero(r)) {
133*e0c4386eSCy Schubert         TEST_error("BN_mod_exp_mont_word failed: "
134*e0c4386eSCy Schubert                    "1 ** 0 mod 1 = r (should be 0)");
135*e0c4386eSCy Schubert         BN_print_var(r);
136*e0c4386eSCy Schubert         goto err;
137*e0c4386eSCy Schubert     }
138*e0c4386eSCy Schubert 
139*e0c4386eSCy Schubert     ret = !failed;
140*e0c4386eSCy Schubert  err:
141*e0c4386eSCy Schubert     BN_free(r);
142*e0c4386eSCy Schubert     BN_free(a);
143*e0c4386eSCy Schubert     BN_free(p);
144*e0c4386eSCy Schubert     BN_free(m);
145*e0c4386eSCy Schubert     BN_MONT_CTX_free(mont);
146*e0c4386eSCy Schubert     BN_CTX_free(ctx);
147*e0c4386eSCy Schubert 
148*e0c4386eSCy Schubert     return ret;
149*e0c4386eSCy Schubert }
150*e0c4386eSCy Schubert 
test_mod_exp(int round)151*e0c4386eSCy Schubert static int test_mod_exp(int round)
152*e0c4386eSCy Schubert {
153*e0c4386eSCy Schubert     BN_CTX *ctx;
154*e0c4386eSCy Schubert     unsigned char c;
155*e0c4386eSCy Schubert     int ret = 0;
156*e0c4386eSCy Schubert     BIGNUM *r_mont = NULL;
157*e0c4386eSCy Schubert     BIGNUM *r_mont_const = NULL;
158*e0c4386eSCy Schubert     BIGNUM *r_recp = NULL;
159*e0c4386eSCy Schubert     BIGNUM *r_simple = NULL;
160*e0c4386eSCy Schubert     BIGNUM *a = NULL;
161*e0c4386eSCy Schubert     BIGNUM *b = NULL;
162*e0c4386eSCy Schubert     BIGNUM *m = NULL;
163*e0c4386eSCy Schubert 
164*e0c4386eSCy Schubert     if (!TEST_ptr(ctx = BN_CTX_new()))
165*e0c4386eSCy Schubert         goto err;
166*e0c4386eSCy Schubert 
167*e0c4386eSCy Schubert     if (!TEST_ptr(r_mont = BN_new())
168*e0c4386eSCy Schubert         || !TEST_ptr(r_mont_const = BN_new())
169*e0c4386eSCy Schubert         || !TEST_ptr(r_recp = BN_new())
170*e0c4386eSCy Schubert         || !TEST_ptr(r_simple = BN_new())
171*e0c4386eSCy Schubert         || !TEST_ptr(a = BN_new())
172*e0c4386eSCy Schubert         || !TEST_ptr(b = BN_new())
173*e0c4386eSCy Schubert         || !TEST_ptr(m = BN_new()))
174*e0c4386eSCy Schubert         goto err;
175*e0c4386eSCy Schubert 
176*e0c4386eSCy Schubert     if (!TEST_int_gt(RAND_bytes(&c, 1), 0))
177*e0c4386eSCy Schubert         goto err;
178*e0c4386eSCy Schubert     c = (c % BN_BITS) - BN_BITS2;
179*e0c4386eSCy Schubert     if (!TEST_true(BN_rand(a, NUM_BITS + c, BN_RAND_TOP_ONE,
180*e0c4386eSCy Schubert                            BN_RAND_BOTTOM_ANY)))
181*e0c4386eSCy Schubert         goto err;
182*e0c4386eSCy Schubert 
183*e0c4386eSCy Schubert     if (!TEST_int_gt(RAND_bytes(&c, 1), 0))
184*e0c4386eSCy Schubert         goto err;
185*e0c4386eSCy Schubert     c = (c % BN_BITS) - BN_BITS2;
186*e0c4386eSCy Schubert     if (!TEST_true(BN_rand(b, NUM_BITS + c, BN_RAND_TOP_ONE,
187*e0c4386eSCy Schubert                            BN_RAND_BOTTOM_ANY)))
188*e0c4386eSCy Schubert         goto err;
189*e0c4386eSCy Schubert 
190*e0c4386eSCy Schubert     if (!TEST_int_gt(RAND_bytes(&c, 1), 0))
191*e0c4386eSCy Schubert         goto err;
192*e0c4386eSCy Schubert     c = (c % BN_BITS) - BN_BITS2;
193*e0c4386eSCy Schubert     if (!TEST_true(BN_rand(m, NUM_BITS + c, BN_RAND_TOP_ONE,
194*e0c4386eSCy Schubert                            BN_RAND_BOTTOM_ODD)))
195*e0c4386eSCy Schubert         goto err;
196*e0c4386eSCy Schubert 
197*e0c4386eSCy Schubert     if (!TEST_true(BN_mod(a, a, m, ctx))
198*e0c4386eSCy Schubert         || !TEST_true(BN_mod(b, b, m, ctx))
199*e0c4386eSCy Schubert         || !TEST_true(BN_mod_exp_mont(r_mont, a, b, m, ctx, NULL))
200*e0c4386eSCy Schubert         || !TEST_true(BN_mod_exp_recp(r_recp, a, b, m, ctx))
201*e0c4386eSCy Schubert         || !TEST_true(BN_mod_exp_simple(r_simple, a, b, m, ctx))
202*e0c4386eSCy Schubert         || !TEST_true(BN_mod_exp_mont_consttime(r_mont_const, a, b, m, ctx, NULL)))
203*e0c4386eSCy Schubert         goto err;
204*e0c4386eSCy Schubert 
205*e0c4386eSCy Schubert     if (!TEST_BN_eq(r_simple, r_mont)
206*e0c4386eSCy Schubert         || !TEST_BN_eq(r_simple, r_recp)
207*e0c4386eSCy Schubert         || !TEST_BN_eq(r_simple, r_mont_const)) {
208*e0c4386eSCy Schubert         if (BN_cmp(r_simple, r_mont) != 0)
209*e0c4386eSCy Schubert             TEST_info("simple and mont results differ");
210*e0c4386eSCy Schubert         if (BN_cmp(r_simple, r_mont_const) != 0)
211*e0c4386eSCy Schubert             TEST_info("simple and mont const time results differ");
212*e0c4386eSCy Schubert         if (BN_cmp(r_simple, r_recp) != 0)
213*e0c4386eSCy Schubert             TEST_info("simple and recp results differ");
214*e0c4386eSCy Schubert 
215*e0c4386eSCy Schubert         BN_print_var(a);
216*e0c4386eSCy Schubert         BN_print_var(b);
217*e0c4386eSCy Schubert         BN_print_var(m);
218*e0c4386eSCy Schubert         BN_print_var(r_simple);
219*e0c4386eSCy Schubert         BN_print_var(r_recp);
220*e0c4386eSCy Schubert         BN_print_var(r_mont);
221*e0c4386eSCy Schubert         BN_print_var(r_mont_const);
222*e0c4386eSCy Schubert         goto err;
223*e0c4386eSCy Schubert     }
224*e0c4386eSCy Schubert 
225*e0c4386eSCy Schubert     ret = 1;
226*e0c4386eSCy Schubert  err:
227*e0c4386eSCy Schubert     BN_free(r_mont);
228*e0c4386eSCy Schubert     BN_free(r_mont_const);
229*e0c4386eSCy Schubert     BN_free(r_recp);
230*e0c4386eSCy Schubert     BN_free(r_simple);
231*e0c4386eSCy Schubert     BN_free(a);
232*e0c4386eSCy Schubert     BN_free(b);
233*e0c4386eSCy Schubert     BN_free(m);
234*e0c4386eSCy Schubert     BN_CTX_free(ctx);
235*e0c4386eSCy Schubert 
236*e0c4386eSCy Schubert     return ret;
237*e0c4386eSCy Schubert }
238*e0c4386eSCy Schubert 
test_mod_exp_x2(int idx)239*e0c4386eSCy Schubert static int test_mod_exp_x2(int idx)
240*e0c4386eSCy Schubert {
241*e0c4386eSCy Schubert     BN_CTX *ctx;
242*e0c4386eSCy Schubert     int ret = 0;
243*e0c4386eSCy Schubert     BIGNUM *r_mont_const_x2_1 = NULL;
244*e0c4386eSCy Schubert     BIGNUM *r_mont_const_x2_2 = NULL;
245*e0c4386eSCy Schubert     BIGNUM *r_simple1 = NULL;
246*e0c4386eSCy Schubert     BIGNUM *r_simple2 = NULL;
247*e0c4386eSCy Schubert     BIGNUM *a1 = NULL;
248*e0c4386eSCy Schubert     BIGNUM *b1 = NULL;
249*e0c4386eSCy Schubert     BIGNUM *m1 = NULL;
250*e0c4386eSCy Schubert     BIGNUM *a2 = NULL;
251*e0c4386eSCy Schubert     BIGNUM *b2 = NULL;
252*e0c4386eSCy Schubert     BIGNUM *m2 = NULL;
253*e0c4386eSCy Schubert     int factor_size = 0;
254*e0c4386eSCy Schubert 
255*e0c4386eSCy Schubert     /*
256*e0c4386eSCy Schubert      * Currently only 1024-bit factor size is supported.
257*e0c4386eSCy Schubert      */
258*e0c4386eSCy Schubert     if (idx <= 100)
259*e0c4386eSCy Schubert         factor_size = 1024;
260*e0c4386eSCy Schubert 
261*e0c4386eSCy Schubert     if (!TEST_ptr(ctx = BN_CTX_new()))
262*e0c4386eSCy Schubert         goto err;
263*e0c4386eSCy Schubert 
264*e0c4386eSCy Schubert     if (!TEST_ptr(r_mont_const_x2_1 = BN_new())
265*e0c4386eSCy Schubert         || !TEST_ptr(r_mont_const_x2_2 = BN_new())
266*e0c4386eSCy Schubert         || !TEST_ptr(r_simple1 = BN_new())
267*e0c4386eSCy Schubert         || !TEST_ptr(r_simple2 = BN_new())
268*e0c4386eSCy Schubert         || !TEST_ptr(a1 = BN_new())
269*e0c4386eSCy Schubert         || !TEST_ptr(b1 = BN_new())
270*e0c4386eSCy Schubert         || !TEST_ptr(m1 = BN_new())
271*e0c4386eSCy Schubert         || !TEST_ptr(a2 = BN_new())
272*e0c4386eSCy Schubert         || !TEST_ptr(b2 = BN_new())
273*e0c4386eSCy Schubert         || !TEST_ptr(m2 = BN_new()))
274*e0c4386eSCy Schubert         goto err;
275*e0c4386eSCy Schubert 
276*e0c4386eSCy Schubert     BN_rand(a1, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY);
277*e0c4386eSCy Schubert     BN_rand(b1, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY);
278*e0c4386eSCy Schubert     BN_rand(m1, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD);
279*e0c4386eSCy Schubert     BN_rand(a2, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY);
280*e0c4386eSCy Schubert     BN_rand(b2, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY);
281*e0c4386eSCy Schubert     BN_rand(m2, factor_size, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD);
282*e0c4386eSCy Schubert 
283*e0c4386eSCy Schubert     if (!TEST_true(BN_mod(a1, a1, m1, ctx))
284*e0c4386eSCy Schubert         || !TEST_true(BN_mod(b1, b1, m1, ctx))
285*e0c4386eSCy Schubert         || !TEST_true(BN_mod(a2, a2, m2, ctx))
286*e0c4386eSCy Schubert         || !TEST_true(BN_mod(b2, b2, m2, ctx))
287*e0c4386eSCy Schubert         || !TEST_true(BN_mod_exp_simple(r_simple1, a1, b1, m1, ctx))
288*e0c4386eSCy Schubert         || !TEST_true(BN_mod_exp_simple(r_simple2, a2, b2, m2, ctx))
289*e0c4386eSCy Schubert         || !TEST_true(BN_mod_exp_mont_consttime_x2(r_mont_const_x2_1, a1, b1, m1, NULL,
290*e0c4386eSCy Schubert                                                    r_mont_const_x2_2, a2, b2, m2, NULL,
291*e0c4386eSCy Schubert                                                    ctx)))
292*e0c4386eSCy Schubert         goto err;
293*e0c4386eSCy Schubert 
294*e0c4386eSCy Schubert     if (!TEST_BN_eq(r_simple1, r_mont_const_x2_1)
295*e0c4386eSCy Schubert         || !TEST_BN_eq(r_simple2, r_mont_const_x2_2)) {
296*e0c4386eSCy Schubert         if (BN_cmp(r_simple1, r_mont_const_x2_1) != 0)
297*e0c4386eSCy Schubert             TEST_info("simple and mont const time x2 (#1) results differ");
298*e0c4386eSCy Schubert         if (BN_cmp(r_simple2, r_mont_const_x2_2) != 0)
299*e0c4386eSCy Schubert             TEST_info("simple and mont const time x2 (#2) results differ");
300*e0c4386eSCy Schubert 
301*e0c4386eSCy Schubert         BN_print_var(a1);
302*e0c4386eSCy Schubert         BN_print_var(b1);
303*e0c4386eSCy Schubert         BN_print_var(m1);
304*e0c4386eSCy Schubert         BN_print_var(a2);
305*e0c4386eSCy Schubert         BN_print_var(b2);
306*e0c4386eSCy Schubert         BN_print_var(m2);
307*e0c4386eSCy Schubert         BN_print_var(r_simple1);
308*e0c4386eSCy Schubert         BN_print_var(r_simple2);
309*e0c4386eSCy Schubert         BN_print_var(r_mont_const_x2_1);
310*e0c4386eSCy Schubert         BN_print_var(r_mont_const_x2_2);
311*e0c4386eSCy Schubert         goto err;
312*e0c4386eSCy Schubert     }
313*e0c4386eSCy Schubert 
314*e0c4386eSCy Schubert     ret = 1;
315*e0c4386eSCy Schubert  err:
316*e0c4386eSCy Schubert     BN_free(r_mont_const_x2_1);
317*e0c4386eSCy Schubert     BN_free(r_mont_const_x2_2);
318*e0c4386eSCy Schubert     BN_free(r_simple1);
319*e0c4386eSCy Schubert     BN_free(r_simple2);
320*e0c4386eSCy Schubert     BN_free(a1);
321*e0c4386eSCy Schubert     BN_free(b1);
322*e0c4386eSCy Schubert     BN_free(m1);
323*e0c4386eSCy Schubert     BN_free(a2);
324*e0c4386eSCy Schubert     BN_free(b2);
325*e0c4386eSCy Schubert     BN_free(m2);
326*e0c4386eSCy Schubert     BN_CTX_free(ctx);
327*e0c4386eSCy Schubert 
328*e0c4386eSCy Schubert     return ret;
329*e0c4386eSCy Schubert }
330*e0c4386eSCy Schubert 
setup_tests(void)331*e0c4386eSCy Schubert int setup_tests(void)
332*e0c4386eSCy Schubert {
333*e0c4386eSCy Schubert     ADD_TEST(test_mod_exp_zero);
334*e0c4386eSCy Schubert     ADD_ALL_TESTS(test_mod_exp, 200);
335*e0c4386eSCy Schubert     ADD_ALL_TESTS(test_mod_exp_x2, 100);
336*e0c4386eSCy Schubert     return 1;
337*e0c4386eSCy Schubert }
338