~cyphermox/shim/0.9git

« back to all changes in this revision

Viewing changes to Cryptlib/OpenSSL/crypto/bn/bn_exp.c

  • Committer: Mathieu Trudel-Lapierre
  • Date: 2016-07-26 16:03:25 UTC
  • mfrom: (0.1.7)
  • Revision ID: mathieu.trudel-lapierre@canonical.com-20160726160325-y702pvbyiy4t2buq
New upstream release.

Show diffs side-by-side

added added

removed removed

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