c742db6f1f7c277f6a4cc2625b06301d9c051db4
[openssl.git] / crypto / bn / bn_lib.c
1 /* crypto/bn/bn_lib.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 #ifndef BN_DEBUG
60 # undef NDEBUG                  /* avoid conflicting definitions */
61 # define NDEBUG
62 #endif
63
64 #include <assert.h>
65 #include <limits.h>
66 #include "cryptlib.h"
67 #include "bn_lcl.h"
68
69 const char BN_version[] = "Big Number" OPENSSL_VERSION_PTEXT;
70
71 /* This stuff appears to be completely unused, so is deprecated */
72 #ifndef OPENSSL_NO_DEPRECATED
73 /*-
74  * For a 32 bit machine
75  * 2 -   4 ==  128
76  * 3 -   8 ==  256
77  * 4 -  16 ==  512
78  * 5 -  32 == 1024
79  * 6 -  64 == 2048
80  * 7 - 128 == 4096
81  * 8 - 256 == 8192
82  */
83 static int bn_limit_bits = 0;
84 static int bn_limit_num = 8;    /* (1<<bn_limit_bits) */
85 static int bn_limit_bits_low = 0;
86 static int bn_limit_num_low = 8; /* (1<<bn_limit_bits_low) */
87 static int bn_limit_bits_high = 0;
88 static int bn_limit_num_high = 8; /* (1<<bn_limit_bits_high) */
89 static int bn_limit_bits_mont = 0;
90 static int bn_limit_num_mont = 8; /* (1<<bn_limit_bits_mont) */
91
92 void BN_set_params(int mult, int high, int low, int mont)
93 {
94     if (mult >= 0) {
95         if (mult > (int)(sizeof(int) * 8) - 1)
96             mult = sizeof(int) * 8 - 1;
97         bn_limit_bits = mult;
98         bn_limit_num = 1 << mult;
99     }
100     if (high >= 0) {
101         if (high > (int)(sizeof(int) * 8) - 1)
102             high = sizeof(int) * 8 - 1;
103         bn_limit_bits_high = high;
104         bn_limit_num_high = 1 << high;
105     }
106     if (low >= 0) {
107         if (low > (int)(sizeof(int) * 8) - 1)
108             low = sizeof(int) * 8 - 1;
109         bn_limit_bits_low = low;
110         bn_limit_num_low = 1 << low;
111     }
112     if (mont >= 0) {
113         if (mont > (int)(sizeof(int) * 8) - 1)
114             mont = sizeof(int) * 8 - 1;
115         bn_limit_bits_mont = mont;
116         bn_limit_num_mont = 1 << mont;
117     }
118 }
119
120 int BN_get_params(int which)
121 {
122     if (which == 0)
123         return (bn_limit_bits);
124     else if (which == 1)
125         return (bn_limit_bits_high);
126     else if (which == 2)
127         return (bn_limit_bits_low);
128     else if (which == 3)
129         return (bn_limit_bits_mont);
130     else
131         return (0);
132 }
133 #endif
134
135 const BIGNUM *BN_value_one(void)
136 {
137     static const BN_ULONG data_one = 1L;
138     static const BIGNUM const_one =
139         { (BN_ULONG *)&data_one, 1, 1, 0, BN_FLG_STATIC_DATA };
140
141     return (&const_one);
142 }
143
144 int BN_num_bits_word(BN_ULONG l)
145 {
146     static const unsigned char bits[256] = {
147         0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
148         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
149         6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
150         6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
151         7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
152         7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
153         7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
154         7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
155         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
156         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
157         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
158         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
159         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
160         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
161         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
162         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
163     };
164
165 #if defined(SIXTY_FOUR_BIT_LONG)
166     if (l & 0xffffffff00000000L) {
167         if (l & 0xffff000000000000L) {
168             if (l & 0xff00000000000000L) {
169                 return (bits[(int)(l >> 56)] + 56);
170             } else
171                 return (bits[(int)(l >> 48)] + 48);
172         } else {
173             if (l & 0x0000ff0000000000L) {
174                 return (bits[(int)(l >> 40)] + 40);
175             } else
176                 return (bits[(int)(l >> 32)] + 32);
177         }
178     } else
179 #else
180 # ifdef SIXTY_FOUR_BIT
181     if (l & 0xffffffff00000000LL) {
182         if (l & 0xffff000000000000LL) {
183             if (l & 0xff00000000000000LL) {
184                 return (bits[(int)(l >> 56)] + 56);
185             } else
186                 return (bits[(int)(l >> 48)] + 48);
187         } else {
188             if (l & 0x0000ff0000000000LL) {
189                 return (bits[(int)(l >> 40)] + 40);
190             } else
191                 return (bits[(int)(l >> 32)] + 32);
192         }
193     } else
194 # endif
195 #endif
196     {
197 #if defined(THIRTY_TWO_BIT) || defined(SIXTY_FOUR_BIT) || defined(SIXTY_FOUR_BIT_LONG)
198         if (l & 0xffff0000L) {
199             if (l & 0xff000000L)
200                 return (bits[(int)(l >> 24L)] + 24);
201             else
202                 return (bits[(int)(l >> 16L)] + 16);
203         } else
204 #endif
205         {
206 #if defined(THIRTY_TWO_BIT) || defined(SIXTY_FOUR_BIT) || defined(SIXTY_FOUR_BIT_LONG)
207             if (l & 0xff00L)
208                 return (bits[(int)(l >> 8)] + 8);
209             else
210 #endif
211                 return (bits[(int)(l)]);
212         }
213     }
214 }
215
216 int BN_num_bits(const BIGNUM *a)
217 {
218     int i = a->top - 1;
219     bn_check_top(a);
220
221     if (BN_is_zero(a))
222         return 0;
223     return ((i * BN_BITS2) + BN_num_bits_word(a->d[i]));
224 }
225
226 void BN_clear_free(BIGNUM *a)
227 {
228     int i;
229
230     if (a == NULL)
231         return;
232     bn_check_top(a);
233     if (a->d != NULL) {
234         OPENSSL_cleanse(a->d, a->dmax * sizeof(a->d[0]));
235         if (!(BN_get_flags(a, BN_FLG_STATIC_DATA)))
236             OPENSSL_free(a->d);
237     }
238     i = BN_get_flags(a, BN_FLG_MALLOCED);
239     OPENSSL_cleanse(a, sizeof(BIGNUM));
240     if (i)
241         OPENSSL_free(a);
242 }
243
244 void BN_free(BIGNUM *a)
245 {
246     if (a == NULL)
247         return;
248     bn_check_top(a);
249     if ((a->d != NULL) && !(BN_get_flags(a, BN_FLG_STATIC_DATA)))
250         OPENSSL_free(a->d);
251     if (a->flags & BN_FLG_MALLOCED)
252         OPENSSL_free(a);
253     else {
254 #ifndef OPENSSL_NO_DEPRECATED
255         a->flags |= BN_FLG_FREE;
256 #endif
257         a->d = NULL;
258     }
259 }
260
261 void BN_init(BIGNUM *a)
262 {
263     memset(a, 0, sizeof(BIGNUM));
264     bn_check_top(a);
265 }
266
267 BIGNUM *BN_new(void)
268 {
269     BIGNUM *ret;
270
271     if ((ret = (BIGNUM *)OPENSSL_malloc(sizeof(BIGNUM))) == NULL) {
272         BNerr(BN_F_BN_NEW, ERR_R_MALLOC_FAILURE);
273         return (NULL);
274     }
275     ret->flags = BN_FLG_MALLOCED;
276     ret->top = 0;
277     ret->neg = 0;
278     ret->dmax = 0;
279     ret->d = NULL;
280     bn_check_top(ret);
281     return (ret);
282 }
283
284 /* This is used both by bn_expand2() and bn_dup_expand() */
285 /* The caller MUST check that words > b->dmax before calling this */
286 static BN_ULONG *bn_expand_internal(const BIGNUM *b, int words)
287 {
288     BN_ULONG *A, *a = NULL;
289     const BN_ULONG *B;
290     int i;
291
292     bn_check_top(b);
293
294     if (words > (INT_MAX / (4 * BN_BITS2))) {
295         BNerr(BN_F_BN_EXPAND_INTERNAL, BN_R_BIGNUM_TOO_LONG);
296         return NULL;
297     }
298     if (BN_get_flags(b, BN_FLG_STATIC_DATA)) {
299         BNerr(BN_F_BN_EXPAND_INTERNAL, BN_R_EXPAND_ON_STATIC_BIGNUM_DATA);
300         return (NULL);
301     }
302     a = A = (BN_ULONG *)OPENSSL_malloc(sizeof(BN_ULONG) * words);
303     if (A == NULL) {
304         BNerr(BN_F_BN_EXPAND_INTERNAL, ERR_R_MALLOC_FAILURE);
305         return (NULL);
306     }
307 #ifdef PURIFY
308     /*
309      * Valgrind complains in BN_consttime_swap because we process the whole
310      * array even if it's not initialised yet. This doesn't matter in that
311      * function - what's important is constant time operation (we're not
312      * actually going to use the data)
313      */
314     memset(a, 0, sizeof(BN_ULONG) * words);
315 #endif
316
317 #if 1
318     B = b->d;
319     /* Check if the previous number needs to be copied */
320     if (B != NULL) {
321         for (i = b->top >> 2; i > 0; i--, A += 4, B += 4) {
322             /*
323              * The fact that the loop is unrolled
324              * 4-wise is a tribute to Intel. It's
325              * the one that doesn't have enough
326              * registers to accomodate more data.
327              * I'd unroll it 8-wise otherwise:-)
328              *
329              *              <appro@fy.chalmers.se>
330              */
331             BN_ULONG a0, a1, a2, a3;
332             a0 = B[0];
333             a1 = B[1];
334             a2 = B[2];
335             a3 = B[3];
336             A[0] = a0;
337             A[1] = a1;
338             A[2] = a2;
339             A[3] = a3;
340         }
341         /*
342          * workaround for ultrix cc: without 'case 0', the optimizer does
343          * the switch table by doing a=top&3; a--; goto jump_table[a];
344          * which fails for top== 0
345          */
346         switch (b->top & 3) {
347         case 3:
348             A[2] = B[2];
349         case 2:
350             A[1] = B[1];
351         case 1:
352             A[0] = B[0];
353         case 0:
354             ;
355         }
356     }
357 #else
358     memset(A, 0, sizeof(BN_ULONG) * words);
359     memcpy(A, b->d, sizeof(b->d[0]) * b->top);
360 #endif
361
362     return (a);
363 }
364
365 /*
366  * This is an internal function that should not be used in applications. It
367  * ensures that 'b' has enough room for a 'words' word number and initialises
368  * any unused part of b->d with leading zeros. It is mostly used by the
369  * various BIGNUM routines. If there is an error, NULL is returned. If not,
370  * 'b' is returned.
371  */
372
373 BIGNUM *bn_expand2(BIGNUM *b, int words)
374 {
375     bn_check_top(b);
376
377     if (words > b->dmax) {
378         BN_ULONG *a = bn_expand_internal(b, words);
379         if (!a)
380             return NULL;
381         if (b->d)
382             OPENSSL_free(b->d);
383         b->d = a;
384         b->dmax = words;
385     }
386
387 /* None of this should be necessary because of what b->top means! */
388 #if 0
389     /*
390      * NB: bn_wexpand() calls this only if the BIGNUM really has to grow
391      */
392     if (b->top < b->dmax) {
393         int i;
394         BN_ULONG *A = &(b->d[b->top]);
395         for (i = (b->dmax - b->top) >> 3; i > 0; i--, A += 8) {
396             A[0] = 0;
397             A[1] = 0;
398             A[2] = 0;
399             A[3] = 0;
400             A[4] = 0;
401             A[5] = 0;
402             A[6] = 0;
403             A[7] = 0;
404         }
405         for (i = (b->dmax - b->top) & 7; i > 0; i--, A++)
406             A[0] = 0;
407         assert(A == &(b->d[b->dmax]));
408     }
409 #endif
410     bn_check_top(b);
411     return b;
412 }
413
414 BIGNUM *BN_dup(const BIGNUM *a)
415 {
416     BIGNUM *t;
417
418     if (a == NULL)
419         return NULL;
420     bn_check_top(a);
421
422     t = BN_new();
423     if (t == NULL)
424         return NULL;
425     if (!BN_copy(t, a)) {
426         BN_free(t);
427         return NULL;
428     }
429     bn_check_top(t);
430     return t;
431 }
432
433 BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
434 {
435     int i;
436     BN_ULONG *A;
437     const BN_ULONG *B;
438
439     bn_check_top(b);
440
441     if (a == b)
442         return (a);
443     if (bn_wexpand(a, b->top) == NULL)
444         return (NULL);
445
446 #if 1
447     A = a->d;
448     B = b->d;
449     for (i = b->top >> 2; i > 0; i--, A += 4, B += 4) {
450         BN_ULONG a0, a1, a2, a3;
451         a0 = B[0];
452         a1 = B[1];
453         a2 = B[2];
454         a3 = B[3];
455         A[0] = a0;
456         A[1] = a1;
457         A[2] = a2;
458         A[3] = a3;
459     }
460     /* ultrix cc workaround, see comments in bn_expand_internal */
461     switch (b->top & 3) {
462     case 3:
463         A[2] = B[2];
464     case 2:
465         A[1] = B[1];
466     case 1:
467         A[0] = B[0];
468     case 0:;
469     }
470 #else
471     memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);
472 #endif
473
474     a->top = b->top;
475     a->neg = b->neg;
476     bn_check_top(a);
477     return (a);
478 }
479
480 void BN_swap(BIGNUM *a, BIGNUM *b)
481 {
482     int flags_old_a, flags_old_b;
483     BN_ULONG *tmp_d;
484     int tmp_top, tmp_dmax, tmp_neg;
485
486     bn_check_top(a);
487     bn_check_top(b);
488
489     flags_old_a = a->flags;
490     flags_old_b = b->flags;
491
492     tmp_d = a->d;
493     tmp_top = a->top;
494     tmp_dmax = a->dmax;
495     tmp_neg = a->neg;
496
497     a->d = b->d;
498     a->top = b->top;
499     a->dmax = b->dmax;
500     a->neg = b->neg;
501
502     b->d = tmp_d;
503     b->top = tmp_top;
504     b->dmax = tmp_dmax;
505     b->neg = tmp_neg;
506
507     a->flags =
508         (flags_old_a & BN_FLG_MALLOCED) | (flags_old_b & BN_FLG_STATIC_DATA);
509     b->flags =
510         (flags_old_b & BN_FLG_MALLOCED) | (flags_old_a & BN_FLG_STATIC_DATA);
511     bn_check_top(a);
512     bn_check_top(b);
513 }
514
515 void BN_clear(BIGNUM *a)
516 {
517     bn_check_top(a);
518     if (a->d != NULL)
519         memset(a->d, 0, a->dmax * sizeof(a->d[0]));
520     a->top = 0;
521     a->neg = 0;
522 }
523
524 BN_ULONG BN_get_word(const BIGNUM *a)
525 {
526     if (a->top > 1)
527         return BN_MASK2;
528     else if (a->top == 1)
529         return a->d[0];
530     /* a->top == 0 */
531     return 0;
532 }
533
534 int BN_set_word(BIGNUM *a, BN_ULONG w)
535 {
536     bn_check_top(a);
537     if (bn_expand(a, (int)sizeof(BN_ULONG) * 8) == NULL)
538         return (0);
539     a->neg = 0;
540     a->d[0] = w;
541     a->top = (w ? 1 : 0);
542     bn_check_top(a);
543     return (1);
544 }
545
546 BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret)
547 {
548     unsigned int i, m;
549     unsigned int n;
550     BN_ULONG l;
551     BIGNUM *bn = NULL;
552
553     if (ret == NULL)
554         ret = bn = BN_new();
555     if (ret == NULL)
556         return (NULL);
557     bn_check_top(ret);
558     l = 0;
559     n = len;
560     if (n == 0) {
561         ret->top = 0;
562         return (ret);
563     }
564     i = ((n - 1) / BN_BYTES) + 1;
565     m = ((n - 1) % (BN_BYTES));
566     if (bn_wexpand(ret, (int)i) == NULL) {
567         if (bn)
568             BN_free(bn);
569         return NULL;
570     }
571     ret->top = i;
572     ret->neg = 0;
573     while (n--) {
574         l = (l << 8L) | *(s++);
575         if (m-- == 0) {
576             ret->d[--i] = l;
577             l = 0;
578             m = BN_BYTES - 1;
579         }
580     }
581     /*
582      * need to call this due to clear byte at top if avoiding having the top
583      * bit set (-ve number)
584      */
585     bn_correct_top(ret);
586     return (ret);
587 }
588
589 /* ignore negative */
590 int BN_bn2bin(const BIGNUM *a, unsigned char *to)
591 {
592     int n, i;
593     BN_ULONG l;
594
595     bn_check_top(a);
596     n = i = BN_num_bytes(a);
597     while (i--) {
598         l = a->d[i / BN_BYTES];
599         *(to++) = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff;
600     }
601     return (n);
602 }
603
604 int BN_ucmp(const BIGNUM *a, const BIGNUM *b)
605 {
606     int i;
607     BN_ULONG t1, t2, *ap, *bp;
608
609     bn_check_top(a);
610     bn_check_top(b);
611
612     i = a->top - b->top;
613     if (i != 0)
614         return (i);
615     ap = a->d;
616     bp = b->d;
617     for (i = a->top - 1; i >= 0; i--) {
618         t1 = ap[i];
619         t2 = bp[i];
620         if (t1 != t2)
621             return ((t1 > t2) ? 1 : -1);
622     }
623     return (0);
624 }
625
626 int BN_cmp(const BIGNUM *a, const BIGNUM *b)
627 {
628     int i;
629     int gt, lt;
630     BN_ULONG t1, t2;
631
632     if ((a == NULL) || (b == NULL)) {
633         if (a != NULL)
634             return (-1);
635         else if (b != NULL)
636             return (1);
637         else
638             return (0);
639     }
640
641     bn_check_top(a);
642     bn_check_top(b);
643
644     if (a->neg != b->neg) {
645         if (a->neg)
646             return (-1);
647         else
648             return (1);
649     }
650     if (a->neg == 0) {
651         gt = 1;
652         lt = -1;
653     } else {
654         gt = -1;
655         lt = 1;
656     }
657
658     if (a->top > b->top)
659         return (gt);
660     if (a->top < b->top)
661         return (lt);
662     for (i = a->top - 1; i >= 0; i--) {
663         t1 = a->d[i];
664         t2 = b->d[i];
665         if (t1 > t2)
666             return (gt);
667         if (t1 < t2)
668             return (lt);
669     }
670     return (0);
671 }
672
673 int BN_set_bit(BIGNUM *a, int n)
674 {
675     int i, j, k;
676
677     if (n < 0)
678         return 0;
679
680     i = n / BN_BITS2;
681     j = n % BN_BITS2;
682     if (a->top <= i) {
683         if (bn_wexpand(a, i + 1) == NULL)
684             return (0);
685         for (k = a->top; k < i + 1; k++)
686             a->d[k] = 0;
687         a->top = i + 1;
688     }
689
690     a->d[i] |= (((BN_ULONG)1) << j);
691     bn_check_top(a);
692     return (1);
693 }
694
695 int BN_clear_bit(BIGNUM *a, int n)
696 {
697     int i, j;
698
699     bn_check_top(a);
700     if (n < 0)
701         return 0;
702
703     i = n / BN_BITS2;
704     j = n % BN_BITS2;
705     if (a->top <= i)
706         return (0);
707
708     a->d[i] &= (~(((BN_ULONG)1) << j));
709     bn_correct_top(a);
710     return (1);
711 }
712
713 int BN_is_bit_set(const BIGNUM *a, int n)
714 {
715     int i, j;
716
717     bn_check_top(a);
718     if (n < 0)
719         return 0;
720     i = n / BN_BITS2;
721     j = n % BN_BITS2;
722     if (a->top <= i)
723         return 0;
724     return (int)(((a->d[i]) >> j) & ((BN_ULONG)1));
725 }
726
727 int BN_mask_bits(BIGNUM *a, int n)
728 {
729     int b, w;
730
731     bn_check_top(a);
732     if (n < 0)
733         return 0;
734
735     w = n / BN_BITS2;
736     b = n % BN_BITS2;
737     if (w >= a->top)
738         return 0;
739     if (b == 0)
740         a->top = w;
741     else {
742         a->top = w + 1;
743         a->d[w] &= ~(BN_MASK2 << b);
744     }
745     bn_correct_top(a);
746     return (1);
747 }
748
749 void BN_set_negative(BIGNUM *a, int b)
750 {
751     if (b && !BN_is_zero(a))
752         a->neg = 1;
753     else
754         a->neg = 0;
755 }
756
757 int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n)
758 {
759     int i;
760     BN_ULONG aa, bb;
761
762     aa = a[n - 1];
763     bb = b[n - 1];
764     if (aa != bb)
765         return ((aa > bb) ? 1 : -1);
766     for (i = n - 2; i >= 0; i--) {
767         aa = a[i];
768         bb = b[i];
769         if (aa != bb)
770             return ((aa > bb) ? 1 : -1);
771     }
772     return (0);
773 }
774
775 /*
776  * Here follows a specialised variants of bn_cmp_words().  It has the
777  * property of performing the operation on arrays of different sizes. The
778  * sizes of those arrays is expressed through cl, which is the common length
779  * ( basicall, min(len(a),len(b)) ), and dl, which is the delta between the
780  * two lengths, calculated as len(a)-len(b). All lengths are the number of
781  * BN_ULONGs...
782  */
783
784 int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, int cl, int dl)
785 {
786     int n, i;
787     n = cl - 1;
788
789     if (dl < 0) {
790         for (i = dl; i < 0; i++) {
791             if (b[n - i] != 0)
792                 return -1;      /* a < b */
793         }
794     }
795     if (dl > 0) {
796         for (i = dl; i > 0; i--) {
797             if (a[n + i] != 0)
798                 return 1;       /* a > b */
799         }
800     }
801     return bn_cmp_words(a, b, cl);
802 }
803
804 /*
805  * Constant-time conditional swap of a and b.
806  * a and b are swapped if condition is not 0.  The code assumes that at most one bit of condition is set.
807  * nwords is the number of words to swap.  The code assumes that at least nwords are allocated in both a and b,
808  * and that no more than nwords are used by either a or b.
809  * a and b cannot be the same number
810  */
811 void BN_consttime_swap(BN_ULONG condition, BIGNUM *a, BIGNUM *b, int nwords)
812 {
813     BN_ULONG t;
814     int i;
815
816     bn_wcheck_size(a, nwords);
817     bn_wcheck_size(b, nwords);
818
819     assert(a != b);
820     assert((condition & (condition - 1)) == 0);
821     assert(sizeof(BN_ULONG) >= sizeof(int));
822
823     condition = ((condition - 1) >> (BN_BITS2 - 1)) - 1;
824
825     t = (a->top ^ b->top) & condition;
826     a->top ^= t;
827     b->top ^= t;
828
829 #define BN_CONSTTIME_SWAP(ind) \
830         do { \
831                 t = (a->d[ind] ^ b->d[ind]) & condition; \
832                 a->d[ind] ^= t; \
833                 b->d[ind] ^= t; \
834         } while (0)
835
836     switch (nwords) {
837     default:
838         for (i = 10; i < nwords; i++)
839             BN_CONSTTIME_SWAP(i);
840         /* Fallthrough */
841     case 10:
842         BN_CONSTTIME_SWAP(9);   /* Fallthrough */
843     case 9:
844         BN_CONSTTIME_SWAP(8);   /* Fallthrough */
845     case 8:
846         BN_CONSTTIME_SWAP(7);   /* Fallthrough */
847     case 7:
848         BN_CONSTTIME_SWAP(6);   /* Fallthrough */
849     case 6:
850         BN_CONSTTIME_SWAP(5);   /* Fallthrough */
851     case 5:
852         BN_CONSTTIME_SWAP(4);   /* Fallthrough */
853     case 4:
854         BN_CONSTTIME_SWAP(3);   /* Fallthrough */
855     case 3:
856         BN_CONSTTIME_SWAP(2);   /* Fallthrough */
857     case 2:
858         BN_CONSTTIME_SWAP(1);   /* Fallthrough */
859     case 1:
860         BN_CONSTTIME_SWAP(0);
861     }
862 #undef BN_CONSTTIME_SWAP
863 }
864
865 /* Bits of security, see SP800-57 */
866
867 int BN_security_bits(int L, int N)
868 {
869     int secbits, bits;
870     if (L >= 15360)
871         secbits = 256;
872     else if (L >= 7690)
873         secbits = 192;
874     else if (L >= 3072)
875         secbits = 128;
876     else if (L >= 2048)
877         secbits = 112;
878     else if (L >= 1024)
879         secbits = 80;
880     else
881         return 0;
882     if (N == -1)
883         return secbits;
884     bits = N / 2;
885     if (bits < 80)
886         return 0;
887     return bits >= secbits ? secbits : bits;
888 }
889
890 void BN_zero_ex(BIGNUM *a)
891 {
892     a->top = 0;
893     a->neg = 0;
894 }
895
896 int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)
897 {
898     return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));
899 }
900
901 int BN_is_zero(const BIGNUM *a)
902 {
903     return a->top == 0;
904 }
905
906 int BN_is_one(const BIGNUM *a)
907 {
908     return BN_abs_is_word(a, 1) && !a->neg;
909 }
910
911 int BN_is_word(const BIGNUM *a, const BN_ULONG w)
912 {
913     return BN_abs_is_word(a, w) && (!w || !a->neg);
914 }
915
916 int BN_is_odd(const BIGNUM *a)
917 {
918     return (a->top > 0) && (a->d[0] & 1);
919 }
920
921 int BN_is_negative(const BIGNUM *a)
922 {
923     return (a->neg != 0);
924 }
925
926 int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont,
927                      BN_CTX *ctx)
928 {
929     return BN_mod_mul_montgomery(r, a, &(mont->RR), mont, ctx);
930 }
931
932 void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int n)
933 {
934     dest->d = b->d;
935     dest->top = b->top;
936     dest->dmax = b->dmax;
937     dest->neg = b->neg;
938     dest->flags = ((dest->flags & BN_FLG_MALLOCED)
939                    | (b->flags & ~BN_FLG_MALLOCED)
940                    | BN_FLG_STATIC_DATA | n);
941 }
942
943 BN_GENCB *BN_GENCB_new(void)
944 {
945     BN_GENCB *ret;
946
947     if ((ret = (BN_GENCB *)OPENSSL_malloc(sizeof(BN_GENCB))) == NULL) {
948         BNerr(BN_F_BN_GENCB_NEW, ERR_R_MALLOC_FAILURE);
949         return (NULL);
950     }
951
952     return ret;
953 }
954
955 void BN_GENCB_free(BN_GENCB *cb)
956 {
957     if (cb == NULL)
958         return;
959     OPENSSL_free(cb);
960 }
961
962 void BN_set_flags(BIGNUM *b, int n)
963 {
964     b->flags |= n;
965 }
966
967 int BN_get_flags(const BIGNUM *b, int n)
968 {
969     return b->flags & n;
970 }
971
972 /* Populate a BN_GENCB structure with an "old"-style callback */
973 void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback) (int, int, void *),
974                       void *cb_arg)
975 {
976     BN_GENCB *tmp_gencb = gencb;
977     tmp_gencb->ver = 1;
978     tmp_gencb->arg = cb_arg;
979     tmp_gencb->cb.cb_1 = callback;
980 }
981
982 /* Populate a BN_GENCB structure with a "new"-style callback */
983 void BN_GENCB_set(BN_GENCB *gencb, int (*callback) (int, int, BN_GENCB *),
984                   void *cb_arg)
985 {
986     BN_GENCB *tmp_gencb = gencb;
987     tmp_gencb->ver = 2;
988     tmp_gencb->arg = cb_arg;
989     tmp_gencb->cb.cb_2 = callback;
990 }
991
992 void *BN_GENCB_get_arg(BN_GENCB *cb)
993 {
994     return cb->arg;
995 }
996
997 BIGNUM *bn_wexpand(BIGNUM *a, int words)
998 {
999     return (words <= a->dmax) ? a : bn_expand2(a, words);
1000 }
1001
1002 void bn_correct_top(BIGNUM *a)
1003 {
1004     BN_ULONG *ftl;
1005     int tmp_top = a->top;
1006
1007     if (tmp_top > 0) {
1008         for (ftl = &(a->d[tmp_top - 1]); tmp_top > 0; tmp_top--)
1009             if (*(ftl--))
1010                 break;
1011         a->top = tmp_top;
1012     }
1013     bn_pollute(a);
1014 }