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