Remove /* foo.c */ comments
[openssl.git] / crypto / bn / bn_exp.c
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to.  The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  *    notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  *    notice, this list of conditions and the following disclaimer in the
29  *    documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  *    must display the following acknowledgement:
32  *    "This product includes cryptographic software written by
33  *     Eric Young (eay@cryptsoft.com)"
34  *    The word 'cryptographic' can be left out if the rouines from the library
35  *    being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  *    the apps directory (application code) you must include an acknowledgement:
38  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.]
56  */
57 /* ====================================================================
58  * Copyright (c) 1998-2005 The OpenSSL Project.  All rights reserved.
59  *
60  * Redistribution and use in source and binary forms, with or without
61  * modification, are permitted provided that the following conditions
62  * are met:
63  *
64  * 1. Redistributions of source code must retain the above copyright
65  *    notice, this list of conditions and the following disclaimer.
66  *
67  * 2. Redistributions in binary form must reproduce the above copyright
68  *    notice, this list of conditions and the following disclaimer in
69  *    the documentation and/or other materials provided with the
70  *    distribution.
71  *
72  * 3. All advertising materials mentioning features or use of this
73  *    software must display the following acknowledgment:
74  *    "This product includes software developed by the OpenSSL Project
75  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
76  *
77  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
78  *    endorse or promote products derived from this software without
79  *    prior written permission. For written permission, please contact
80  *    openssl-core@openssl.org.
81  *
82  * 5. Products derived from this software may not be called "OpenSSL"
83  *    nor may "OpenSSL" appear in their names without prior written
84  *    permission of the OpenSSL Project.
85  *
86  * 6. Redistributions of any form whatsoever must retain the following
87  *    acknowledgment:
88  *    "This product includes software developed by the OpenSSL Project
89  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
90  *
91  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
92  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
93  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
94  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
95  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
96  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
97  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
98  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
99  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
100  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
101  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
102  * OF THE POSSIBILITY OF SUCH DAMAGE.
103  * ====================================================================
104  *
105  * This product includes cryptographic software written by Eric Young
106  * (eay@cryptsoft.com).  This product includes software written by Tim
107  * Hudson (tjh@cryptsoft.com).
108  *
109  */
110
111 #include "internal/cryptlib.h"
112 #include "bn_lcl.h"
113
114 #include <stdlib.h>
115 #ifdef _WIN32
116 # include <malloc.h>
117 # ifndef alloca
118 #  define alloca _alloca
119 # endif
120 #elif defined(__GNUC__)
121 # ifndef alloca
122 #  define alloca(s) __builtin_alloca((s))
123 # endif
124 #elif defined(__sun)
125 # include <alloca.h>
126 #endif
127
128 #include "rsaz_exp.h"
129
130 #undef SPARC_T4_MONT
131 #if defined(OPENSSL_BN_ASM_MONT) && (defined(__sparc__) || defined(__sparc))
132 # include "sparc_arch.h"
133 extern unsigned int OPENSSL_sparcv9cap_P[];
134 # define SPARC_T4_MONT
135 #endif
136
137 /* maximum precomputation table size for *variable* sliding windows */
138 #define TABLE_SIZE      32
139
140 /* this one works - simple but works */
141 int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
142 {
143     int i, bits, ret = 0;
144     BIGNUM *v, *rr;
145
146     if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0) {
147         /* BN_FLG_CONSTTIME only supported by BN_mod_exp_mont() */
148         BNerr(BN_F_BN_EXP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
149         return -1;
150     }
151
152     BN_CTX_start(ctx);
153     if ((r == a) || (r == p))
154         rr = BN_CTX_get(ctx);
155     else
156         rr = r;
157     v = BN_CTX_get(ctx);
158     if (rr == NULL || v == NULL)
159         goto err;
160
161     if (BN_copy(v, a) == NULL)
162         goto err;
163     bits = BN_num_bits(p);
164
165     if (BN_is_odd(p)) {
166         if (BN_copy(rr, a) == NULL)
167             goto err;
168     } else {
169         if (!BN_one(rr))
170             goto err;
171     }
172
173     for (i = 1; i < bits; i++) {
174         if (!BN_sqr(v, v, ctx))
175             goto err;
176         if (BN_is_bit_set(p, i)) {
177             if (!BN_mul(rr, rr, v, ctx))
178                 goto err;
179         }
180     }
181     if (r != rr)
182         BN_copy(r, rr);
183     ret = 1;
184  err:
185     BN_CTX_end(ctx);
186     bn_check_top(r);
187     return (ret);
188 }
189
190 int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m,
191                BN_CTX *ctx)
192 {
193     int ret;
194
195     bn_check_top(a);
196     bn_check_top(p);
197     bn_check_top(m);
198
199     /*-
200      * For even modulus  m = 2^k*m_odd,  it might make sense to compute
201      * a^p mod m_odd  and  a^p mod 2^k  separately (with Montgomery
202      * exponentiation for the odd part), using appropriate exponent
203      * reductions, and combine the results using the CRT.
204      *
205      * For now, we use Montgomery only if the modulus is odd; otherwise,
206      * exponentiation using the reciprocal-based quick remaindering
207      * algorithm is used.
208      *
209      * (Timing obtained with expspeed.c [computations  a^p mod m
210      * where  a, p, m  are of the same length: 256, 512, 1024, 2048,
211      * 4096, 8192 bits], compared to the running time of the
212      * standard algorithm:
213      *
214      *   BN_mod_exp_mont   33 .. 40 %  [AMD K6-2, Linux, debug configuration]
215      *                     55 .. 77 %  [UltraSparc processor, but
216      *                                  debug-solaris-sparcv8-gcc conf.]
217      *
218      *   BN_mod_exp_recp   50 .. 70 %  [AMD K6-2, Linux, debug configuration]
219      *                     62 .. 118 % [UltraSparc, debug-solaris-sparcv8-gcc]
220      *
221      * On the Sparc, BN_mod_exp_recp was faster than BN_mod_exp_mont
222      * at 2048 and more bits, but at 512 and 1024 bits, it was
223      * slower even than the standard algorithm!
224      *
225      * "Real" timings [linux-elf, solaris-sparcv9-gcc configurations]
226      * should be obtained when the new Montgomery reduction code
227      * has been integrated into OpenSSL.)
228      */
229
230 #define MONT_MUL_MOD
231 #define MONT_EXP_WORD
232 #define RECP_MUL_MOD
233
234 #ifdef MONT_MUL_MOD
235     /*
236      * I have finally been able to take out this pre-condition of the top bit
237      * being set.  It was caused by an error in BN_div with negatives.  There
238      * was also another problem when for a^b%m a >= m.  eay 07-May-97
239      */
240     /* if ((m->d[m->top-1]&BN_TBIT) && BN_is_odd(m)) */
241
242     if (BN_is_odd(m)) {
243 # ifdef MONT_EXP_WORD
244         if (a->top == 1 && !a->neg
245             && (BN_get_flags(p, BN_FLG_CONSTTIME) == 0)) {
246             BN_ULONG A = a->d[0];
247             ret = BN_mod_exp_mont_word(r, A, p, m, ctx, NULL);
248         } else
249 # endif
250             ret = BN_mod_exp_mont(r, a, p, m, ctx, NULL);
251     } else
252 #endif
253 #ifdef RECP_MUL_MOD
254     {
255         ret = BN_mod_exp_recp(r, a, p, m, ctx);
256     }
257 #else
258     {
259         ret = BN_mod_exp_simple(r, a, p, m, ctx);
260     }
261 #endif
262
263     bn_check_top(r);
264     return (ret);
265 }
266
267 int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
268                     const BIGNUM *m, BN_CTX *ctx)
269 {
270     int i, j, bits, ret = 0, wstart, wend, window, wvalue;
271     int start = 1;
272     BIGNUM *aa;
273     /* Table of variables obtained from 'ctx' */
274     BIGNUM *val[TABLE_SIZE];
275     BN_RECP_CTX recp;
276
277     if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0) {
278         /* BN_FLG_CONSTTIME only supported by BN_mod_exp_mont() */
279         BNerr(BN_F_BN_MOD_EXP_RECP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
280         return -1;
281     }
282
283     bits = BN_num_bits(p);
284     if (bits == 0) {
285         /* x**0 mod 1 is still zero. */
286         if (BN_is_one(m)) {
287             ret = 1;
288             BN_zero(r);
289         } else {
290             ret = BN_one(r);
291         }
292         return ret;
293     }
294
295     BN_CTX_start(ctx);
296     aa = BN_CTX_get(ctx);
297     val[0] = BN_CTX_get(ctx);
298     if (!aa || !val[0])
299         goto err;
300
301     BN_RECP_CTX_init(&recp);
302     if (m->neg) {
303         /* ignore sign of 'm' */
304         if (!BN_copy(aa, m))
305             goto err;
306         aa->neg = 0;
307         if (BN_RECP_CTX_set(&recp, aa, ctx) <= 0)
308             goto err;
309     } else {
310         if (BN_RECP_CTX_set(&recp, m, ctx) <= 0)
311             goto err;
312     }
313
314     if (!BN_nnmod(val[0], a, m, ctx))
315         goto err;               /* 1 */
316     if (BN_is_zero(val[0])) {
317         BN_zero(r);
318         ret = 1;
319         goto err;
320     }
321
322     window = BN_window_bits_for_exponent_size(bits);
323     if (window > 1) {
324         if (!BN_mod_mul_reciprocal(aa, val[0], val[0], &recp, ctx))
325             goto err;           /* 2 */
326         j = 1 << (window - 1);
327         for (i = 1; i < j; i++) {
328             if (((val[i] = BN_CTX_get(ctx)) == NULL) ||
329                 !BN_mod_mul_reciprocal(val[i], val[i - 1], aa, &recp, ctx))
330                 goto err;
331         }
332     }
333
334     start = 1;                  /* This is used to avoid multiplication etc
335                                  * when there is only the value '1' in the
336                                  * buffer. */
337     wvalue = 0;                 /* The 'value' of the window */
338     wstart = bits - 1;          /* The top bit of the window */
339     wend = 0;                   /* The bottom bit of the window */
340
341     if (!BN_one(r))
342         goto err;
343
344     for (;;) {
345         if (BN_is_bit_set(p, wstart) == 0) {
346             if (!start)
347                 if (!BN_mod_mul_reciprocal(r, r, r, &recp, ctx))
348                     goto err;
349             if (wstart == 0)
350                 break;
351             wstart--;
352             continue;
353         }
354         /*
355          * We now have wstart on a 'set' bit, we now need to work out how bit
356          * a window to do.  To do this we need to scan forward until the last
357          * set bit before the end of the window
358          */
359         j = wstart;
360         wvalue = 1;
361         wend = 0;
362         for (i = 1; i < window; i++) {
363             if (wstart - i < 0)
364                 break;
365             if (BN_is_bit_set(p, wstart - i)) {
366                 wvalue <<= (i - wend);
367                 wvalue |= 1;
368                 wend = i;
369             }
370         }
371
372         /* wend is the size of the current window */
373         j = wend + 1;
374         /* add the 'bytes above' */
375         if (!start)
376             for (i = 0; i < j; i++) {
377                 if (!BN_mod_mul_reciprocal(r, r, r, &recp, ctx))
378                     goto err;
379             }
380
381         /* wvalue will be an odd number < 2^window */
382         if (!BN_mod_mul_reciprocal(r, r, val[wvalue >> 1], &recp, ctx))
383             goto err;
384
385         /* move the 'window' down further */
386         wstart -= wend + 1;
387         wvalue = 0;
388         start = 0;
389         if (wstart < 0)
390             break;
391     }
392     ret = 1;
393  err:
394     BN_CTX_end(ctx);
395     BN_RECP_CTX_free(&recp);
396     bn_check_top(r);
397     return (ret);
398 }
399
400 int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
401                     const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont)
402 {
403     int i, j, bits, ret = 0, wstart, wend, window, wvalue;
404     int start = 1;
405     BIGNUM *d, *r;
406     const BIGNUM *aa;
407     /* Table of variables obtained from 'ctx' */
408     BIGNUM *val[TABLE_SIZE];
409     BN_MONT_CTX *mont = NULL;
410
411     if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0) {
412         return BN_mod_exp_mont_consttime(rr, a, p, m, ctx, in_mont);
413     }
414
415     bn_check_top(a);
416     bn_check_top(p);
417     bn_check_top(m);
418
419     if (!BN_is_odd(m)) {
420         BNerr(BN_F_BN_MOD_EXP_MONT, BN_R_CALLED_WITH_EVEN_MODULUS);
421         return (0);
422     }
423     bits = BN_num_bits(p);
424     if (bits == 0) {
425         /* x**0 mod 1 is still zero. */
426         if (BN_is_one(m)) {
427             ret = 1;
428             BN_zero(rr);
429         } else {
430             ret = BN_one(rr);
431         }
432         return ret;
433     }
434
435     BN_CTX_start(ctx);
436     d = BN_CTX_get(ctx);
437     r = BN_CTX_get(ctx);
438     val[0] = BN_CTX_get(ctx);
439     if (!d || !r || !val[0])
440         goto err;
441
442     /*
443      * If this is not done, things will break in the montgomery part
444      */
445
446     if (in_mont != NULL)
447         mont = in_mont;
448     else {
449         if ((mont = BN_MONT_CTX_new()) == NULL)
450             goto err;
451         if (!BN_MONT_CTX_set(mont, m, ctx))
452             goto err;
453     }
454
455     if (a->neg || BN_ucmp(a, m) >= 0) {
456         if (!BN_nnmod(val[0], a, m, ctx))
457             goto err;
458         aa = val[0];
459     } else
460         aa = a;
461     if (BN_is_zero(aa)) {
462         BN_zero(rr);
463         ret = 1;
464         goto err;
465     }
466     if (!BN_to_montgomery(val[0], aa, mont, ctx))
467         goto err;               /* 1 */
468
469     window = BN_window_bits_for_exponent_size(bits);
470     if (window > 1) {
471         if (!BN_mod_mul_montgomery(d, val[0], val[0], mont, ctx))
472             goto err;           /* 2 */
473         j = 1 << (window - 1);
474         for (i = 1; i < j; i++) {
475             if (((val[i] = BN_CTX_get(ctx)) == NULL) ||
476                 !BN_mod_mul_montgomery(val[i], val[i - 1], d, mont, ctx))
477                 goto err;
478         }
479     }
480
481     start = 1;                  /* This is used to avoid multiplication etc
482                                  * when there is only the value '1' in the
483                                  * buffer. */
484     wvalue = 0;                 /* The 'value' of the window */
485     wstart = bits - 1;          /* The top bit of the window */
486     wend = 0;                   /* The bottom bit of the window */
487
488 #if 1                           /* by Shay Gueron's suggestion */
489     j = m->top;                 /* borrow j */
490     if (m->d[j - 1] & (((BN_ULONG)1) << (BN_BITS2 - 1))) {
491         if (bn_wexpand(r, j) == NULL)
492             goto err;
493         /* 2^(top*BN_BITS2) - m */
494         r->d[0] = (0 - m->d[0]) & BN_MASK2;
495         for (i = 1; i < j; i++)
496             r->d[i] = (~m->d[i]) & BN_MASK2;
497         r->top = j;
498         /*
499          * Upper words will be zero if the corresponding words of 'm' were
500          * 0xfff[...], so decrement r->top accordingly.
501          */
502         bn_correct_top(r);
503     } else
504 #endif
505     if (!BN_to_montgomery(r, BN_value_one(), mont, ctx))
506         goto err;
507     for (;;) {
508         if (BN_is_bit_set(p, wstart) == 0) {
509             if (!start) {
510                 if (!BN_mod_mul_montgomery(r, r, r, mont, ctx))
511                     goto err;
512             }
513             if (wstart == 0)
514                 break;
515             wstart--;
516             continue;
517         }
518         /*
519          * We now have wstart on a 'set' bit, we now need to work out how bit
520          * a window to do.  To do this we need to scan forward until the last
521          * set bit before the end of the window
522          */
523         j = wstart;
524         wvalue = 1;
525         wend = 0;
526         for (i = 1; i < window; i++) {
527             if (wstart - i < 0)
528                 break;
529             if (BN_is_bit_set(p, wstart - i)) {
530                 wvalue <<= (i - wend);
531                 wvalue |= 1;
532                 wend = i;
533             }
534         }
535
536         /* wend is the size of the current window */
537         j = wend + 1;
538         /* add the 'bytes above' */
539         if (!start)
540             for (i = 0; i < j; i++) {
541                 if (!BN_mod_mul_montgomery(r, r, r, mont, ctx))
542                     goto err;
543             }
544
545         /* wvalue will be an odd number < 2^window */
546         if (!BN_mod_mul_montgomery(r, r, val[wvalue >> 1], mont, ctx))
547             goto err;
548
549         /* move the 'window' down further */
550         wstart -= wend + 1;
551         wvalue = 0;
552         start = 0;
553         if (wstart < 0)
554             break;
555     }
556 #if defined(SPARC_T4_MONT)
557     if (OPENSSL_sparcv9cap_P[0] & (SPARCV9_VIS3 | SPARCV9_PREFER_FPU)) {
558         j = mont->N.top;        /* borrow j */
559         val[0]->d[0] = 1;       /* borrow val[0] */
560         for (i = 1; i < j; i++)
561             val[0]->d[i] = 0;
562         val[0]->top = j;
563         if (!BN_mod_mul_montgomery(rr, r, val[0], mont, ctx))
564             goto err;
565     } else
566 #endif
567     if (!BN_from_montgomery(rr, r, mont, ctx))
568         goto err;
569     ret = 1;
570  err:
571     if (in_mont == NULL)
572         BN_MONT_CTX_free(mont);
573     BN_CTX_end(ctx);
574     bn_check_top(rr);
575     return (ret);
576 }
577
578 #if defined(SPARC_T4_MONT)
579 static BN_ULONG bn_get_bits(const BIGNUM *a, int bitpos)
580 {
581     BN_ULONG ret = 0;
582     int wordpos;
583
584     wordpos = bitpos / BN_BITS2;
585     bitpos %= BN_BITS2;
586     if (wordpos >= 0 && wordpos < a->top) {
587         ret = a->d[wordpos] & BN_MASK2;
588         if (bitpos) {
589             ret >>= bitpos;
590             if (++wordpos < a->top)
591                 ret |= a->d[wordpos] << (BN_BITS2 - bitpos);
592         }
593     }
594
595     return ret & BN_MASK2;
596 }
597 #endif
598
599 /*
600  * BN_mod_exp_mont_consttime() stores the precomputed powers in a specific
601  * layout so that accessing any of these table values shows the same access
602  * pattern as far as cache lines are concerned.  The following functions are
603  * used to transfer a BIGNUM from/to that table.
604  */
605
606 static int MOD_EXP_CTIME_COPY_TO_PREBUF(const BIGNUM *b, int top,
607                                         unsigned char *buf, int idx,
608                                         int width)
609 {
610     size_t i, j;
611
612     if (top > b->top)
613         top = b->top;           /* this works because 'buf' is explicitly
614                                  * zeroed */
615     for (i = 0, j = idx; i < top * sizeof b->d[0]; i++, j += width) {
616         buf[j] = ((unsigned char *)b->d)[i];
617     }
618
619     return 1;
620 }
621
622 static int MOD_EXP_CTIME_COPY_FROM_PREBUF(BIGNUM *b, int top,
623                                           unsigned char *buf, int idx,
624                                           int width)
625 {
626     size_t i, j;
627
628     if (bn_wexpand(b, top) == NULL)
629         return 0;
630
631     for (i = 0, j = idx; i < top * sizeof b->d[0]; i++, j += width) {
632         ((unsigned char *)b->d)[i] = buf[j];
633     }
634
635     b->top = top;
636     bn_correct_top(b);
637     return 1;
638 }
639
640 /*
641  * Given a pointer value, compute the next address that is a cache line
642  * multiple.
643  */
644 #define MOD_EXP_CTIME_ALIGN(x_) \
645         ((unsigned char*)(x_) + (MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH - (((size_t)(x_)) & (MOD_EXP_CTIME_MIN_CACHE_LINE_MASK))))
646
647 /*
648  * This variant of BN_mod_exp_mont() uses fixed windows and the special
649  * precomputation memory layout to limit data-dependency to a minimum to
650  * protect secret exponents (cf. the hyper-threading timing attacks pointed
651  * out by Colin Percival,
652  * http://www.daemonology.net/hyperthreading-considered-harmful/)
653  */
654 int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
655                               const BIGNUM *m, BN_CTX *ctx,
656                               BN_MONT_CTX *in_mont)
657 {
658     int i, bits, ret = 0, window, wvalue;
659     int top;
660     BN_MONT_CTX *mont = NULL;
661
662     int numPowers;
663     unsigned char *powerbufFree = NULL;
664     int powerbufLen = 0;
665     unsigned char *powerbuf = NULL;
666     BIGNUM tmp, am;
667 #if defined(SPARC_T4_MONT)
668     unsigned int t4 = 0;
669 #endif
670
671     bn_check_top(a);
672     bn_check_top(p);
673     bn_check_top(m);
674
675     if (!BN_is_odd(m)) {
676         BNerr(BN_F_BN_MOD_EXP_MONT_CONSTTIME, BN_R_CALLED_WITH_EVEN_MODULUS);
677         return (0);
678     }
679
680     top = m->top;
681
682     bits = BN_num_bits(p);
683     if (bits == 0) {
684         /* x**0 mod 1 is still zero. */
685         if (BN_is_one(m)) {
686             ret = 1;
687             BN_zero(rr);
688         } else {
689             ret = BN_one(rr);
690         }
691         return ret;
692     }
693
694     BN_CTX_start(ctx);
695
696     /*
697      * Allocate a montgomery context if it was not supplied by the caller. If
698      * this is not done, things will break in the montgomery part.
699      */
700     if (in_mont != NULL)
701         mont = in_mont;
702     else {
703         if ((mont = BN_MONT_CTX_new()) == NULL)
704             goto err;
705         if (!BN_MONT_CTX_set(mont, m, ctx))
706             goto err;
707     }
708
709 #ifdef RSAZ_ENABLED
710     /*
711      * If the size of the operands allow it, perform the optimized
712      * RSAZ exponentiation. For further information see
713      * crypto/bn/rsaz_exp.c and accompanying assembly modules.
714      */
715     if ((16 == a->top) && (16 == p->top) && (BN_num_bits(m) == 1024)
716         && rsaz_avx2_eligible()) {
717         if (NULL == bn_wexpand(rr, 16))
718             goto err;
719         RSAZ_1024_mod_exp_avx2(rr->d, a->d, p->d, m->d, mont->RR.d,
720                                mont->n0[0]);
721         rr->top = 16;
722         rr->neg = 0;
723         bn_correct_top(rr);
724         ret = 1;
725         goto err;
726     } else if ((8 == a->top) && (8 == p->top) && (BN_num_bits(m) == 512)) {
727         if (NULL == bn_wexpand(rr, 8))
728             goto err;
729         RSAZ_512_mod_exp(rr->d, a->d, p->d, m->d, mont->n0[0], mont->RR.d);
730         rr->top = 8;
731         rr->neg = 0;
732         bn_correct_top(rr);
733         ret = 1;
734         goto err;
735     }
736 #endif
737
738     /* Get the window size to use with size of p. */
739     window = BN_window_bits_for_ctime_exponent_size(bits);
740 #if defined(SPARC_T4_MONT)
741     if (window >= 5 && (top & 15) == 0 && top <= 64 &&
742         (OPENSSL_sparcv9cap_P[1] & (CFR_MONTMUL | CFR_MONTSQR)) ==
743         (CFR_MONTMUL | CFR_MONTSQR) && (t4 = OPENSSL_sparcv9cap_P[0]))
744         window = 5;
745     else
746 #endif
747 #if defined(OPENSSL_BN_ASM_MONT5)
748     if (window >= 5) {
749         window = 5;             /* ~5% improvement for RSA2048 sign, and even
750                                  * for RSA4096 */
751         if ((top & 7) == 0)
752             powerbufLen += 2 * top * sizeof(m->d[0]);
753     }
754 #endif
755     (void)0;
756
757     /*
758      * Allocate a buffer large enough to hold all of the pre-computed powers
759      * of am, am itself and tmp.
760      */
761     numPowers = 1 << window;
762     powerbufLen += sizeof(m->d[0]) * (top * numPowers +
763                                       ((2 * top) >
764                                        numPowers ? (2 * top) : numPowers));
765 #ifdef alloca
766     if (powerbufLen < 3072)
767         powerbufFree =
768             alloca(powerbufLen + MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH);
769     else
770 #endif
771         if ((powerbufFree =
772              OPENSSL_malloc(powerbufLen + MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH))
773             == NULL)
774         goto err;
775
776     powerbuf = MOD_EXP_CTIME_ALIGN(powerbufFree);
777     memset(powerbuf, 0, powerbufLen);
778
779 #ifdef alloca
780     if (powerbufLen < 3072)
781         powerbufFree = NULL;
782 #endif
783
784     /* lay down tmp and am right after powers table */
785     tmp.d = (BN_ULONG *)(powerbuf + sizeof(m->d[0]) * top * numPowers);
786     am.d = tmp.d + top;
787     tmp.top = am.top = 0;
788     tmp.dmax = am.dmax = top;
789     tmp.neg = am.neg = 0;
790     tmp.flags = am.flags = BN_FLG_STATIC_DATA;
791
792     /* prepare a^0 in Montgomery domain */
793 #if 1                           /* by Shay Gueron's suggestion */
794     if (m->d[top - 1] & (((BN_ULONG)1) << (BN_BITS2 - 1))) {
795         /* 2^(top*BN_BITS2) - m */
796         tmp.d[0] = (0 - m->d[0]) & BN_MASK2;
797         for (i = 1; i < top; i++)
798             tmp.d[i] = (~m->d[i]) & BN_MASK2;
799         tmp.top = top;
800     } else
801 #endif
802     if (!BN_to_montgomery(&tmp, BN_value_one(), mont, ctx))
803         goto err;
804
805     /* prepare a^1 in Montgomery domain */
806     if (a->neg || BN_ucmp(a, m) >= 0) {
807         if (!BN_mod(&am, a, m, ctx))
808             goto err;
809         if (!BN_to_montgomery(&am, &am, mont, ctx))
810             goto err;
811     } else if (!BN_to_montgomery(&am, a, mont, ctx))
812         goto err;
813
814 #if defined(SPARC_T4_MONT)
815     if (t4) {
816         typedef int (*bn_pwr5_mont_f) (BN_ULONG *tp, const BN_ULONG *np,
817                                        const BN_ULONG *n0, const void *table,
818                                        int power, int bits);
819         int bn_pwr5_mont_t4_8(BN_ULONG *tp, const BN_ULONG *np,
820                               const BN_ULONG *n0, const void *table,
821                               int power, int bits);
822         int bn_pwr5_mont_t4_16(BN_ULONG *tp, const BN_ULONG *np,
823                                const BN_ULONG *n0, const void *table,
824                                int power, int bits);
825         int bn_pwr5_mont_t4_24(BN_ULONG *tp, const BN_ULONG *np,
826                                const BN_ULONG *n0, const void *table,
827                                int power, int bits);
828         int bn_pwr5_mont_t4_32(BN_ULONG *tp, const BN_ULONG *np,
829                                const BN_ULONG *n0, const void *table,
830                                int power, int bits);
831         static const bn_pwr5_mont_f pwr5_funcs[4] = {
832             bn_pwr5_mont_t4_8, bn_pwr5_mont_t4_16,
833             bn_pwr5_mont_t4_24, bn_pwr5_mont_t4_32
834         };
835         bn_pwr5_mont_f pwr5_worker = pwr5_funcs[top / 16 - 1];
836
837         typedef int (*bn_mul_mont_f) (BN_ULONG *rp, const BN_ULONG *ap,
838                                       const void *bp, const BN_ULONG *np,
839                                       const BN_ULONG *n0);
840         int bn_mul_mont_t4_8(BN_ULONG *rp, const BN_ULONG *ap, const void *bp,
841                              const BN_ULONG *np, const BN_ULONG *n0);
842         int bn_mul_mont_t4_16(BN_ULONG *rp, const BN_ULONG *ap,
843                               const void *bp, const BN_ULONG *np,
844                               const BN_ULONG *n0);
845         int bn_mul_mont_t4_24(BN_ULONG *rp, const BN_ULONG *ap,
846                               const void *bp, const BN_ULONG *np,
847                               const BN_ULONG *n0);
848         int bn_mul_mont_t4_32(BN_ULONG *rp, const BN_ULONG *ap,
849                               const void *bp, const BN_ULONG *np,
850                               const BN_ULONG *n0);
851         static const bn_mul_mont_f mul_funcs[4] = {
852             bn_mul_mont_t4_8, bn_mul_mont_t4_16,
853             bn_mul_mont_t4_24, bn_mul_mont_t4_32
854         };
855         bn_mul_mont_f mul_worker = mul_funcs[top / 16 - 1];
856
857         void bn_mul_mont_vis3(BN_ULONG *rp, const BN_ULONG *ap,
858                               const void *bp, const BN_ULONG *np,
859                               const BN_ULONG *n0, int num);
860         void bn_mul_mont_t4(BN_ULONG *rp, const BN_ULONG *ap,
861                             const void *bp, const BN_ULONG *np,
862                             const BN_ULONG *n0, int num);
863         void bn_mul_mont_gather5_t4(BN_ULONG *rp, const BN_ULONG *ap,
864                                     const void *table, const BN_ULONG *np,
865                                     const BN_ULONG *n0, int num, int power);
866         void bn_flip_n_scatter5_t4(const BN_ULONG *inp, size_t num,
867                                    void *table, size_t power);
868         void bn_gather5_t4(BN_ULONG *out, size_t num,
869                            void *table, size_t power);
870         void bn_flip_t4(BN_ULONG *dst, BN_ULONG *src, size_t num);
871
872         BN_ULONG *np = mont->N.d, *n0 = mont->n0;
873         int stride = 5 * (6 - (top / 16 - 1)); /* multiple of 5, but less
874                                                 * than 32 */
875
876         /*
877          * BN_to_montgomery can contaminate words above .top [in
878          * BN_DEBUG[_DEBUG] build]...
879          */
880         for (i = am.top; i < top; i++)
881             am.d[i] = 0;
882         for (i = tmp.top; i < top; i++)
883             tmp.d[i] = 0;
884
885         bn_flip_n_scatter5_t4(tmp.d, top, powerbuf, 0);
886         bn_flip_n_scatter5_t4(am.d, top, powerbuf, 1);
887         if (!(*mul_worker) (tmp.d, am.d, am.d, np, n0) &&
888             !(*mul_worker) (tmp.d, am.d, am.d, np, n0))
889             bn_mul_mont_vis3(tmp.d, am.d, am.d, np, n0, top);
890         bn_flip_n_scatter5_t4(tmp.d, top, powerbuf, 2);
891
892         for (i = 3; i < 32; i++) {
893             /* Calculate a^i = a^(i-1) * a */
894             if (!(*mul_worker) (tmp.d, tmp.d, am.d, np, n0) &&
895                 !(*mul_worker) (tmp.d, tmp.d, am.d, np, n0))
896                 bn_mul_mont_vis3(tmp.d, tmp.d, am.d, np, n0, top);
897             bn_flip_n_scatter5_t4(tmp.d, top, powerbuf, i);
898         }
899
900         /* switch to 64-bit domain */
901         np = alloca(top * sizeof(BN_ULONG));
902         top /= 2;
903         bn_flip_t4(np, mont->N.d, top);
904
905         bits--;
906         for (wvalue = 0, i = bits % 5; i >= 0; i--, bits--)
907             wvalue = (wvalue << 1) + BN_is_bit_set(p, bits);
908         bn_gather5_t4(tmp.d, top, powerbuf, wvalue);
909
910         /*
911          * Scan the exponent one window at a time starting from the most
912          * significant bits.
913          */
914         while (bits >= 0) {
915             if (bits < stride)
916                 stride = bits + 1;
917             bits -= stride;
918             wvalue = bn_get_bits(p, bits + 1);
919
920             if ((*pwr5_worker) (tmp.d, np, n0, powerbuf, wvalue, stride))
921                 continue;
922             /* retry once and fall back */
923             if ((*pwr5_worker) (tmp.d, np, n0, powerbuf, wvalue, stride))
924                 continue;
925
926             bits += stride - 5;
927             wvalue >>= stride - 5;
928             wvalue &= 31;
929             bn_mul_mont_t4(tmp.d, tmp.d, tmp.d, np, n0, top);
930             bn_mul_mont_t4(tmp.d, tmp.d, tmp.d, np, n0, top);
931             bn_mul_mont_t4(tmp.d, tmp.d, tmp.d, np, n0, top);
932             bn_mul_mont_t4(tmp.d, tmp.d, tmp.d, np, n0, top);
933             bn_mul_mont_t4(tmp.d, tmp.d, tmp.d, np, n0, top);
934             bn_mul_mont_gather5_t4(tmp.d, tmp.d, powerbuf, np, n0, top,
935                                    wvalue);
936         }
937
938         bn_flip_t4(tmp.d, tmp.d, top);
939         top *= 2;
940         /* back to 32-bit domain */
941         tmp.top = top;
942         bn_correct_top(&tmp);
943         OPENSSL_cleanse(np, top * sizeof(BN_ULONG));
944     } else
945 #endif
946 #if defined(OPENSSL_BN_ASM_MONT5)
947     if (window == 5 && top > 1) {
948         /*
949          * This optimization uses ideas from http://eprint.iacr.org/2011/239,
950          * specifically optimization of cache-timing attack countermeasures
951          * and pre-computation optimization.
952          */
953
954         /*
955          * Dedicated window==4 case improves 512-bit RSA sign by ~15%, but as
956          * 512-bit RSA is hardly relevant, we omit it to spare size...
957          */
958         void bn_mul_mont_gather5(BN_ULONG *rp, const BN_ULONG *ap,
959                                  const void *table, const BN_ULONG *np,
960                                  const BN_ULONG *n0, int num, int power);
961         void bn_scatter5(const BN_ULONG *inp, size_t num,
962                          void *table, size_t power);
963         void bn_gather5(BN_ULONG *out, size_t num, void *table, size_t power);
964         void bn_power5(BN_ULONG *rp, const BN_ULONG *ap,
965                        const void *table, const BN_ULONG *np,
966                        const BN_ULONG *n0, int num, int power);
967         int bn_get_bits5(const BN_ULONG *ap, int off);
968         int bn_from_montgomery(BN_ULONG *rp, const BN_ULONG *ap,
969                                const BN_ULONG *not_used, const BN_ULONG *np,
970                                const BN_ULONG *n0, int num);
971
972         BN_ULONG *np = mont->N.d, *n0 = mont->n0, *np2;
973
974         /*
975          * BN_to_montgomery can contaminate words above .top [in
976          * BN_DEBUG[_DEBUG] build]...
977          */
978         for (i = am.top; i < top; i++)
979             am.d[i] = 0;
980         for (i = tmp.top; i < top; i++)
981             tmp.d[i] = 0;
982
983         if (top & 7)
984             np2 = np;
985         else
986             for (np2 = am.d + top, i = 0; i < top; i++)
987                 np2[2 * i] = np[i];
988
989         bn_scatter5(tmp.d, top, powerbuf, 0);
990         bn_scatter5(am.d, am.top, powerbuf, 1);
991         bn_mul_mont(tmp.d, am.d, am.d, np, n0, top);
992         bn_scatter5(tmp.d, top, powerbuf, 2);
993
994 # if 0
995         for (i = 3; i < 32; i++) {
996             /* Calculate a^i = a^(i-1) * a */
997             bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np2, n0, top, i - 1);
998             bn_scatter5(tmp.d, top, powerbuf, i);
999         }
1000 # else
1001         /* same as above, but uses squaring for 1/2 of operations */
1002         for (i = 4; i < 32; i *= 2) {
1003             bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
1004             bn_scatter5(tmp.d, top, powerbuf, i);
1005         }
1006         for (i = 3; i < 8; i += 2) {
1007             int j;
1008             bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np2, n0, top, i - 1);
1009             bn_scatter5(tmp.d, top, powerbuf, i);
1010             for (j = 2 * i; j < 32; j *= 2) {
1011                 bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
1012                 bn_scatter5(tmp.d, top, powerbuf, j);
1013             }
1014         }
1015         for (; i < 16; i += 2) {
1016             bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np2, n0, top, i - 1);
1017             bn_scatter5(tmp.d, top, powerbuf, i);
1018             bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
1019             bn_scatter5(tmp.d, top, powerbuf, 2 * i);
1020         }
1021         for (; i < 32; i += 2) {
1022             bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np2, n0, top, i - 1);
1023             bn_scatter5(tmp.d, top, powerbuf, i);
1024         }
1025 # endif
1026         bits--;
1027         for (wvalue = 0, i = bits % 5; i >= 0; i--, bits--)
1028             wvalue = (wvalue << 1) + BN_is_bit_set(p, bits);
1029         bn_gather5(tmp.d, top, powerbuf, wvalue);
1030
1031         /*
1032          * Scan the exponent one window at a time starting from the most
1033          * significant bits.
1034          */
1035         if (top & 7)
1036             while (bits >= 0) {
1037                 for (wvalue = 0, i = 0; i < 5; i++, bits--)
1038                     wvalue = (wvalue << 1) + BN_is_bit_set(p, bits);
1039
1040                 bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
1041                 bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
1042                 bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
1043                 bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
1044                 bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
1045                 bn_mul_mont_gather5(tmp.d, tmp.d, powerbuf, np, n0, top,
1046                                     wvalue);
1047         } else {
1048             while (bits >= 0) {
1049                 wvalue = bn_get_bits5(p->d, bits - 4);
1050                 bits -= 5;
1051                 bn_power5(tmp.d, tmp.d, powerbuf, np2, n0, top, wvalue);
1052             }
1053         }
1054
1055         ret = bn_from_montgomery(tmp.d, tmp.d, NULL, np2, n0, top);
1056         tmp.top = top;
1057         bn_correct_top(&tmp);
1058         if (ret) {
1059             if (!BN_copy(rr, &tmp))
1060                 ret = 0;
1061             goto err;           /* non-zero ret means it's not error */
1062         }
1063     } else
1064 #endif
1065     {
1066         if (!MOD_EXP_CTIME_COPY_TO_PREBUF(&tmp, top, powerbuf, 0, numPowers))
1067             goto err;
1068         if (!MOD_EXP_CTIME_COPY_TO_PREBUF(&am, top, powerbuf, 1, numPowers))
1069             goto err;
1070
1071         /*
1072          * If the window size is greater than 1, then calculate
1073          * val[i=2..2^winsize-1]. Powers are computed as a*a^(i-1) (even
1074          * powers could instead be computed as (a^(i/2))^2 to use the slight
1075          * performance advantage of sqr over mul).
1076          */
1077         if (window > 1) {
1078             if (!BN_mod_mul_montgomery(&tmp, &am, &am, mont, ctx))
1079                 goto err;
1080             if (!MOD_EXP_CTIME_COPY_TO_PREBUF
1081                 (&tmp, top, powerbuf, 2, numPowers))
1082                 goto err;
1083             for (i = 3; i < numPowers; i++) {
1084                 /* Calculate a^i = a^(i-1) * a */
1085                 if (!BN_mod_mul_montgomery(&tmp, &am, &tmp, mont, ctx))
1086                     goto err;
1087                 if (!MOD_EXP_CTIME_COPY_TO_PREBUF
1088                     (&tmp, top, powerbuf, i, numPowers))
1089                     goto err;
1090             }
1091         }
1092
1093         bits--;
1094         for (wvalue = 0, i = bits % window; i >= 0; i--, bits--)
1095             wvalue = (wvalue << 1) + BN_is_bit_set(p, bits);
1096         if (!MOD_EXP_CTIME_COPY_FROM_PREBUF
1097             (&tmp, top, powerbuf, wvalue, numPowers))
1098             goto err;
1099
1100         /*
1101          * Scan the exponent one window at a time starting from the most
1102          * significant bits.
1103          */
1104         while (bits >= 0) {
1105             wvalue = 0;         /* The 'value' of the window */
1106
1107             /* Scan the window, squaring the result as we go */
1108             for (i = 0; i < window; i++, bits--) {
1109                 if (!BN_mod_mul_montgomery(&tmp, &tmp, &tmp, mont, ctx))
1110                     goto err;
1111                 wvalue = (wvalue << 1) + BN_is_bit_set(p, bits);
1112             }
1113
1114             /*
1115              * Fetch the appropriate pre-computed value from the pre-buf
1116              */
1117             if (!MOD_EXP_CTIME_COPY_FROM_PREBUF
1118                 (&am, top, powerbuf, wvalue, numPowers))
1119                 goto err;
1120
1121             /* Multiply the result into the intermediate result */
1122             if (!BN_mod_mul_montgomery(&tmp, &tmp, &am, mont, ctx))
1123                 goto err;
1124         }
1125     }
1126
1127     /* Convert the final result from montgomery to standard format */
1128 #if defined(SPARC_T4_MONT)
1129     if (OPENSSL_sparcv9cap_P[0] & (SPARCV9_VIS3 | SPARCV9_PREFER_FPU)) {
1130         am.d[0] = 1;            /* borrow am */
1131         for (i = 1; i < top; i++)
1132             am.d[i] = 0;
1133         if (!BN_mod_mul_montgomery(rr, &tmp, &am, mont, ctx))
1134             goto err;
1135     } else
1136 #endif
1137     if (!BN_from_montgomery(rr, &tmp, mont, ctx))
1138         goto err;
1139     ret = 1;
1140  err:
1141     if (in_mont == NULL)
1142         BN_MONT_CTX_free(mont);
1143     if (powerbuf != NULL) {
1144         OPENSSL_cleanse(powerbuf, powerbufLen);
1145         OPENSSL_free(powerbufFree);
1146     }
1147     BN_CTX_end(ctx);
1148     return (ret);
1149 }
1150
1151 int BN_mod_exp_mont_word(BIGNUM *rr, BN_ULONG a, const BIGNUM *p,
1152                          const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont)
1153 {
1154     BN_MONT_CTX *mont = NULL;
1155     int b, bits, ret = 0;
1156     int r_is_one;
1157     BN_ULONG w, next_w;
1158     BIGNUM *d, *r, *t;
1159     BIGNUM *swap_tmp;
1160 #define BN_MOD_MUL_WORD(r, w, m) \
1161                 (BN_mul_word(r, (w)) && \
1162                 (/* BN_ucmp(r, (m)) < 0 ? 1 :*/  \
1163                         (BN_mod(t, r, m, ctx) && (swap_tmp = r, r = t, t = swap_tmp, 1))))
1164     /*
1165      * BN_MOD_MUL_WORD is only used with 'w' large, so the BN_ucmp test is
1166      * probably more overhead than always using BN_mod (which uses BN_copy if
1167      * a similar test returns true).
1168      */
1169     /*
1170      * We can use BN_mod and do not need BN_nnmod because our accumulator is
1171      * never negative (the result of BN_mod does not depend on the sign of
1172      * the modulus).
1173      */
1174 #define BN_TO_MONTGOMERY_WORD(r, w, mont) \
1175                 (BN_set_word(r, (w)) && BN_to_montgomery(r, r, (mont), ctx))
1176
1177     if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0) {
1178         /* BN_FLG_CONSTTIME only supported by BN_mod_exp_mont() */
1179         BNerr(BN_F_BN_MOD_EXP_MONT_WORD, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1180         return -1;
1181     }
1182
1183     bn_check_top(p);
1184     bn_check_top(m);
1185
1186     if (!BN_is_odd(m)) {
1187         BNerr(BN_F_BN_MOD_EXP_MONT_WORD, BN_R_CALLED_WITH_EVEN_MODULUS);
1188         return (0);
1189     }
1190     if (m->top == 1)
1191         a %= m->d[0];           /* make sure that 'a' is reduced */
1192
1193     bits = BN_num_bits(p);
1194     if (bits == 0) {
1195         /* x**0 mod 1 is still zero. */
1196         if (BN_is_one(m)) {
1197             ret = 1;
1198             BN_zero(rr);
1199         } else {
1200             ret = BN_one(rr);
1201         }
1202         return ret;
1203     }
1204     if (a == 0) {
1205         BN_zero(rr);
1206         ret = 1;
1207         return ret;
1208     }
1209
1210     BN_CTX_start(ctx);
1211     d = BN_CTX_get(ctx);
1212     r = BN_CTX_get(ctx);
1213     t = BN_CTX_get(ctx);
1214     if (d == NULL || r == NULL || t == NULL)
1215         goto err;
1216
1217     if (in_mont != NULL)
1218         mont = in_mont;
1219     else {
1220         if ((mont = BN_MONT_CTX_new()) == NULL)
1221             goto err;
1222         if (!BN_MONT_CTX_set(mont, m, ctx))
1223             goto err;
1224     }
1225
1226     r_is_one = 1;               /* except for Montgomery factor */
1227
1228     /* bits-1 >= 0 */
1229
1230     /* The result is accumulated in the product r*w. */
1231     w = a;                      /* bit 'bits-1' of 'p' is always set */
1232     for (b = bits - 2; b >= 0; b--) {
1233         /* First, square r*w. */
1234         next_w = w * w;
1235         if ((next_w / w) != w) { /* overflow */
1236             if (r_is_one) {
1237                 if (!BN_TO_MONTGOMERY_WORD(r, w, mont))
1238                     goto err;
1239                 r_is_one = 0;
1240             } else {
1241                 if (!BN_MOD_MUL_WORD(r, w, m))
1242                     goto err;
1243             }
1244             next_w = 1;
1245         }
1246         w = next_w;
1247         if (!r_is_one) {
1248             if (!BN_mod_mul_montgomery(r, r, r, mont, ctx))
1249                 goto err;
1250         }
1251
1252         /* Second, multiply r*w by 'a' if exponent bit is set. */
1253         if (BN_is_bit_set(p, b)) {
1254             next_w = w * a;
1255             if ((next_w / a) != w) { /* overflow */
1256                 if (r_is_one) {
1257                     if (!BN_TO_MONTGOMERY_WORD(r, w, mont))
1258                         goto err;
1259                     r_is_one = 0;
1260                 } else {
1261                     if (!BN_MOD_MUL_WORD(r, w, m))
1262                         goto err;
1263                 }
1264                 next_w = a;
1265             }
1266             w = next_w;
1267         }
1268     }
1269
1270     /* Finally, set r:=r*w. */
1271     if (w != 1) {
1272         if (r_is_one) {
1273             if (!BN_TO_MONTGOMERY_WORD(r, w, mont))
1274                 goto err;
1275             r_is_one = 0;
1276         } else {
1277             if (!BN_MOD_MUL_WORD(r, w, m))
1278                 goto err;
1279         }
1280     }
1281
1282     if (r_is_one) {             /* can happen only if a == 1 */
1283         if (!BN_one(rr))
1284             goto err;
1285     } else {
1286         if (!BN_from_montgomery(rr, r, mont, ctx))
1287             goto err;
1288     }
1289     ret = 1;
1290  err:
1291     if (in_mont == NULL)
1292         BN_MONT_CTX_free(mont);
1293     BN_CTX_end(ctx);
1294     bn_check_top(rr);
1295     return (ret);
1296 }
1297
1298 /* The old fallback, simple version :-) */
1299 int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
1300                       const BIGNUM *m, BN_CTX *ctx)
1301 {
1302     int i, j, bits, ret = 0, wstart, wend, window, wvalue;
1303     int start = 1;
1304     BIGNUM *d;
1305     /* Table of variables obtained from 'ctx' */
1306     BIGNUM *val[TABLE_SIZE];
1307
1308     if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0) {
1309         /* BN_FLG_CONSTTIME only supported by BN_mod_exp_mont() */
1310         BNerr(BN_F_BN_MOD_EXP_SIMPLE, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1311         return -1;
1312     }
1313
1314     bits = BN_num_bits(p);
1315    if (bits == 0) {
1316         /* x**0 mod 1 is still zero. */
1317         if (BN_is_one(m)) {
1318             ret = 1;
1319             BN_zero(r);
1320         } else {
1321             ret = BN_one(r);
1322         }
1323         return ret;
1324     }
1325
1326     BN_CTX_start(ctx);
1327     d = BN_CTX_get(ctx);
1328     val[0] = BN_CTX_get(ctx);
1329     if (!d || !val[0])
1330         goto err;
1331
1332     if (!BN_nnmod(val[0], a, m, ctx))
1333         goto err;               /* 1 */
1334     if (BN_is_zero(val[0])) {
1335         BN_zero(r);
1336         ret = 1;
1337         goto err;
1338     }
1339
1340     window = BN_window_bits_for_exponent_size(bits);
1341     if (window > 1) {
1342         if (!BN_mod_mul(d, val[0], val[0], m, ctx))
1343             goto err;           /* 2 */
1344         j = 1 << (window - 1);
1345         for (i = 1; i < j; i++) {
1346             if (((val[i] = BN_CTX_get(ctx)) == NULL) ||
1347                 !BN_mod_mul(val[i], val[i - 1], d, m, ctx))
1348                 goto err;
1349         }
1350     }
1351
1352     start = 1;                  /* This is used to avoid multiplication etc
1353                                  * when there is only the value '1' in the
1354                                  * buffer. */
1355     wvalue = 0;                 /* The 'value' of the window */
1356     wstart = bits - 1;          /* The top bit of the window */
1357     wend = 0;                   /* The bottom bit of the window */
1358
1359     if (!BN_one(r))
1360         goto err;
1361
1362     for (;;) {
1363         if (BN_is_bit_set(p, wstart) == 0) {
1364             if (!start)
1365                 if (!BN_mod_mul(r, r, r, m, ctx))
1366                     goto err;
1367             if (wstart == 0)
1368                 break;
1369             wstart--;
1370             continue;
1371         }
1372         /*
1373          * We now have wstart on a 'set' bit, we now need to work out how bit
1374          * a window to do.  To do this we need to scan forward until the last
1375          * set bit before the end of the window
1376          */
1377         j = wstart;
1378         wvalue = 1;
1379         wend = 0;
1380         for (i = 1; i < window; i++) {
1381             if (wstart - i < 0)
1382                 break;
1383             if (BN_is_bit_set(p, wstart - i)) {
1384                 wvalue <<= (i - wend);
1385                 wvalue |= 1;
1386                 wend = i;
1387             }
1388         }
1389
1390         /* wend is the size of the current window */
1391         j = wend + 1;
1392         /* add the 'bytes above' */
1393         if (!start)
1394             for (i = 0; i < j; i++) {
1395                 if (!BN_mod_mul(r, r, r, m, ctx))
1396                     goto err;
1397             }
1398
1399         /* wvalue will be an odd number < 2^window */
1400         if (!BN_mod_mul(r, r, val[wvalue >> 1], m, ctx))
1401             goto err;
1402
1403         /* move the 'window' down further */
1404         wstart -= wend + 1;
1405         wvalue = 0;
1406         start = 0;
1407         if (wstart < 0)
1408             break;
1409     }
1410     ret = 1;
1411  err:
1412     BN_CTX_end(ctx);
1413     bn_check_top(r);
1414     return (ret);
1415 }