free NULL cleanup 7
[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 = 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 = 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     bn_check_top(b);
388     return b;
389 }
390
391 BIGNUM *BN_dup(const BIGNUM *a)
392 {
393     BIGNUM *t;
394
395     if (a == NULL)
396         return NULL;
397     bn_check_top(a);
398
399     t = BN_new();
400     if (t == NULL)
401         return NULL;
402     if (!BN_copy(t, a)) {
403         BN_free(t);
404         return NULL;
405     }
406     bn_check_top(t);
407     return t;
408 }
409
410 BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
411 {
412     int i;
413     BN_ULONG *A;
414     const BN_ULONG *B;
415
416     bn_check_top(b);
417
418     if (a == b)
419         return (a);
420     if (bn_wexpand(a, b->top) == NULL)
421         return (NULL);
422
423 #if 1
424     A = a->d;
425     B = b->d;
426     for (i = b->top >> 2; i > 0; i--, A += 4, B += 4) {
427         BN_ULONG a0, a1, a2, a3;
428         a0 = B[0];
429         a1 = B[1];
430         a2 = B[2];
431         a3 = B[3];
432         A[0] = a0;
433         A[1] = a1;
434         A[2] = a2;
435         A[3] = a3;
436     }
437     /* ultrix cc workaround, see comments in bn_expand_internal */
438     switch (b->top & 3) {
439     case 3:
440         A[2] = B[2];
441     case 2:
442         A[1] = B[1];
443     case 1:
444         A[0] = B[0];
445     case 0:;
446     }
447 #else
448     memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);
449 #endif
450
451     a->top = b->top;
452     a->neg = b->neg;
453     bn_check_top(a);
454     return (a);
455 }
456
457 void BN_swap(BIGNUM *a, BIGNUM *b)
458 {
459     int flags_old_a, flags_old_b;
460     BN_ULONG *tmp_d;
461     int tmp_top, tmp_dmax, tmp_neg;
462
463     bn_check_top(a);
464     bn_check_top(b);
465
466     flags_old_a = a->flags;
467     flags_old_b = b->flags;
468
469     tmp_d = a->d;
470     tmp_top = a->top;
471     tmp_dmax = a->dmax;
472     tmp_neg = a->neg;
473
474     a->d = b->d;
475     a->top = b->top;
476     a->dmax = b->dmax;
477     a->neg = b->neg;
478
479     b->d = tmp_d;
480     b->top = tmp_top;
481     b->dmax = tmp_dmax;
482     b->neg = tmp_neg;
483
484     a->flags =
485         (flags_old_a & BN_FLG_MALLOCED) | (flags_old_b & BN_FLG_STATIC_DATA);
486     b->flags =
487         (flags_old_b & BN_FLG_MALLOCED) | (flags_old_a & BN_FLG_STATIC_DATA);
488     bn_check_top(a);
489     bn_check_top(b);
490 }
491
492 void BN_clear(BIGNUM *a)
493 {
494     bn_check_top(a);
495     if (a->d != NULL)
496         memset(a->d, 0, a->dmax * sizeof(a->d[0]));
497     a->top = 0;
498     a->neg = 0;
499 }
500
501 BN_ULONG BN_get_word(const BIGNUM *a)
502 {
503     if (a->top > 1)
504         return BN_MASK2;
505     else if (a->top == 1)
506         return a->d[0];
507     /* a->top == 0 */
508     return 0;
509 }
510
511 int BN_set_word(BIGNUM *a, BN_ULONG w)
512 {
513     bn_check_top(a);
514     if (bn_expand(a, (int)sizeof(BN_ULONG) * 8) == NULL)
515         return (0);
516     a->neg = 0;
517     a->d[0] = w;
518     a->top = (w ? 1 : 0);
519     bn_check_top(a);
520     return (1);
521 }
522
523 BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret)
524 {
525     unsigned int i, m;
526     unsigned int n;
527     BN_ULONG l;
528     BIGNUM *bn = NULL;
529
530     if (ret == NULL)
531         ret = bn = BN_new();
532     if (ret == NULL)
533         return (NULL);
534     bn_check_top(ret);
535     l = 0;
536     n = len;
537     if (n == 0) {
538         ret->top = 0;
539         return (ret);
540     }
541     i = ((n - 1) / BN_BYTES) + 1;
542     m = ((n - 1) % (BN_BYTES));
543     if (bn_wexpand(ret, (int)i) == NULL) {
544         BN_free(bn);
545         return NULL;
546     }
547     ret->top = i;
548     ret->neg = 0;
549     while (n--) {
550         l = (l << 8L) | *(s++);
551         if (m-- == 0) {
552             ret->d[--i] = l;
553             l = 0;
554             m = BN_BYTES - 1;
555         }
556     }
557     /*
558      * need to call this due to clear byte at top if avoiding having the top
559      * bit set (-ve number)
560      */
561     bn_correct_top(ret);
562     return (ret);
563 }
564
565 /* ignore negative */
566 int BN_bn2bin(const BIGNUM *a, unsigned char *to)
567 {
568     int n, i;
569     BN_ULONG l;
570
571     bn_check_top(a);
572     n = i = BN_num_bytes(a);
573     while (i--) {
574         l = a->d[i / BN_BYTES];
575         *(to++) = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff;
576     }
577     return (n);
578 }
579
580 int BN_ucmp(const BIGNUM *a, const BIGNUM *b)
581 {
582     int i;
583     BN_ULONG t1, t2, *ap, *bp;
584
585     bn_check_top(a);
586     bn_check_top(b);
587
588     i = a->top - b->top;
589     if (i != 0)
590         return (i);
591     ap = a->d;
592     bp = b->d;
593     for (i = a->top - 1; i >= 0; i--) {
594         t1 = ap[i];
595         t2 = bp[i];
596         if (t1 != t2)
597             return ((t1 > t2) ? 1 : -1);
598     }
599     return (0);
600 }
601
602 int BN_cmp(const BIGNUM *a, const BIGNUM *b)
603 {
604     int i;
605     int gt, lt;
606     BN_ULONG t1, t2;
607
608     if ((a == NULL) || (b == NULL)) {
609         if (a != NULL)
610             return (-1);
611         else if (b != NULL)
612             return (1);
613         else
614             return (0);
615     }
616
617     bn_check_top(a);
618     bn_check_top(b);
619
620     if (a->neg != b->neg) {
621         if (a->neg)
622             return (-1);
623         else
624             return (1);
625     }
626     if (a->neg == 0) {
627         gt = 1;
628         lt = -1;
629     } else {
630         gt = -1;
631         lt = 1;
632     }
633
634     if (a->top > b->top)
635         return (gt);
636     if (a->top < b->top)
637         return (lt);
638     for (i = a->top - 1; i >= 0; i--) {
639         t1 = a->d[i];
640         t2 = b->d[i];
641         if (t1 > t2)
642             return (gt);
643         if (t1 < t2)
644             return (lt);
645     }
646     return (0);
647 }
648
649 int BN_set_bit(BIGNUM *a, int n)
650 {
651     int i, j, k;
652
653     if (n < 0)
654         return 0;
655
656     i = n / BN_BITS2;
657     j = n % BN_BITS2;
658     if (a->top <= i) {
659         if (bn_wexpand(a, i + 1) == NULL)
660             return (0);
661         for (k = a->top; k < i + 1; k++)
662             a->d[k] = 0;
663         a->top = i + 1;
664     }
665
666     a->d[i] |= (((BN_ULONG)1) << j);
667     bn_check_top(a);
668     return (1);
669 }
670
671 int BN_clear_bit(BIGNUM *a, int n)
672 {
673     int i, j;
674
675     bn_check_top(a);
676     if (n < 0)
677         return 0;
678
679     i = n / BN_BITS2;
680     j = n % BN_BITS2;
681     if (a->top <= i)
682         return (0);
683
684     a->d[i] &= (~(((BN_ULONG)1) << j));
685     bn_correct_top(a);
686     return (1);
687 }
688
689 int BN_is_bit_set(const BIGNUM *a, int n)
690 {
691     int i, j;
692
693     bn_check_top(a);
694     if (n < 0)
695         return 0;
696     i = n / BN_BITS2;
697     j = n % BN_BITS2;
698     if (a->top <= i)
699         return 0;
700     return (int)(((a->d[i]) >> j) & ((BN_ULONG)1));
701 }
702
703 int BN_mask_bits(BIGNUM *a, int n)
704 {
705     int b, w;
706
707     bn_check_top(a);
708     if (n < 0)
709         return 0;
710
711     w = n / BN_BITS2;
712     b = n % BN_BITS2;
713     if (w >= a->top)
714         return 0;
715     if (b == 0)
716         a->top = w;
717     else {
718         a->top = w + 1;
719         a->d[w] &= ~(BN_MASK2 << b);
720     }
721     bn_correct_top(a);
722     return (1);
723 }
724
725 void BN_set_negative(BIGNUM *a, int b)
726 {
727     if (b && !BN_is_zero(a))
728         a->neg = 1;
729     else
730         a->neg = 0;
731 }
732
733 int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n)
734 {
735     int i;
736     BN_ULONG aa, bb;
737
738     aa = a[n - 1];
739     bb = b[n - 1];
740     if (aa != bb)
741         return ((aa > bb) ? 1 : -1);
742     for (i = n - 2; i >= 0; i--) {
743         aa = a[i];
744         bb = b[i];
745         if (aa != bb)
746             return ((aa > bb) ? 1 : -1);
747     }
748     return (0);
749 }
750
751 /*
752  * Here follows a specialised variants of bn_cmp_words().  It has the
753  * property of performing the operation on arrays of different sizes. The
754  * sizes of those arrays is expressed through cl, which is the common length
755  * ( basicall, min(len(a),len(b)) ), and dl, which is the delta between the
756  * two lengths, calculated as len(a)-len(b). All lengths are the number of
757  * BN_ULONGs...
758  */
759
760 int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, int cl, int dl)
761 {
762     int n, i;
763     n = cl - 1;
764
765     if (dl < 0) {
766         for (i = dl; i < 0; i++) {
767             if (b[n - i] != 0)
768                 return -1;      /* a < b */
769         }
770     }
771     if (dl > 0) {
772         for (i = dl; i > 0; i--) {
773             if (a[n + i] != 0)
774                 return 1;       /* a > b */
775         }
776     }
777     return bn_cmp_words(a, b, cl);
778 }
779
780 /*
781  * Constant-time conditional swap of a and b.
782  * a and b are swapped if condition is not 0.  The code assumes that at most one bit of condition is set.
783  * nwords is the number of words to swap.  The code assumes that at least nwords are allocated in both a and b,
784  * and that no more than nwords are used by either a or b.
785  * a and b cannot be the same number
786  */
787 void BN_consttime_swap(BN_ULONG condition, BIGNUM *a, BIGNUM *b, int nwords)
788 {
789     BN_ULONG t;
790     int i;
791
792     bn_wcheck_size(a, nwords);
793     bn_wcheck_size(b, nwords);
794
795     assert(a != b);
796     assert((condition & (condition - 1)) == 0);
797     assert(sizeof(BN_ULONG) >= sizeof(int));
798
799     condition = ((condition - 1) >> (BN_BITS2 - 1)) - 1;
800
801     t = (a->top ^ b->top) & condition;
802     a->top ^= t;
803     b->top ^= t;
804
805 #define BN_CONSTTIME_SWAP(ind) \
806         do { \
807                 t = (a->d[ind] ^ b->d[ind]) & condition; \
808                 a->d[ind] ^= t; \
809                 b->d[ind] ^= t; \
810         } while (0)
811
812     switch (nwords) {
813     default:
814         for (i = 10; i < nwords; i++)
815             BN_CONSTTIME_SWAP(i);
816         /* Fallthrough */
817     case 10:
818         BN_CONSTTIME_SWAP(9);   /* Fallthrough */
819     case 9:
820         BN_CONSTTIME_SWAP(8);   /* Fallthrough */
821     case 8:
822         BN_CONSTTIME_SWAP(7);   /* Fallthrough */
823     case 7:
824         BN_CONSTTIME_SWAP(6);   /* Fallthrough */
825     case 6:
826         BN_CONSTTIME_SWAP(5);   /* Fallthrough */
827     case 5:
828         BN_CONSTTIME_SWAP(4);   /* Fallthrough */
829     case 4:
830         BN_CONSTTIME_SWAP(3);   /* Fallthrough */
831     case 3:
832         BN_CONSTTIME_SWAP(2);   /* Fallthrough */
833     case 2:
834         BN_CONSTTIME_SWAP(1);   /* Fallthrough */
835     case 1:
836         BN_CONSTTIME_SWAP(0);
837     }
838 #undef BN_CONSTTIME_SWAP
839 }
840
841 /* Bits of security, see SP800-57 */
842
843 int BN_security_bits(int L, int N)
844 {
845     int secbits, bits;
846     if (L >= 15360)
847         secbits = 256;
848     else if (L >= 7690)
849         secbits = 192;
850     else if (L >= 3072)
851         secbits = 128;
852     else if (L >= 2048)
853         secbits = 112;
854     else if (L >= 1024)
855         secbits = 80;
856     else
857         return 0;
858     if (N == -1)
859         return secbits;
860     bits = N / 2;
861     if (bits < 80)
862         return 0;
863     return bits >= secbits ? secbits : bits;
864 }
865
866 void BN_zero_ex(BIGNUM *a)
867 {
868     a->top = 0;
869     a->neg = 0;
870 }
871
872 int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)
873 {
874     return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));
875 }
876
877 int BN_is_zero(const BIGNUM *a)
878 {
879     return a->top == 0;
880 }
881
882 int BN_is_one(const BIGNUM *a)
883 {
884     return BN_abs_is_word(a, 1) && !a->neg;
885 }
886
887 int BN_is_word(const BIGNUM *a, const BN_ULONG w)
888 {
889     return BN_abs_is_word(a, w) && (!w || !a->neg);
890 }
891
892 int BN_is_odd(const BIGNUM *a)
893 {
894     return (a->top > 0) && (a->d[0] & 1);
895 }
896
897 int BN_is_negative(const BIGNUM *a)
898 {
899     return (a->neg != 0);
900 }
901
902 int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont,
903                      BN_CTX *ctx)
904 {
905     return BN_mod_mul_montgomery(r, a, &(mont->RR), mont, ctx);
906 }
907
908 void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int n)
909 {
910     dest->d = b->d;
911     dest->top = b->top;
912     dest->dmax = b->dmax;
913     dest->neg = b->neg;
914     dest->flags = ((dest->flags & BN_FLG_MALLOCED)
915                    | (b->flags & ~BN_FLG_MALLOCED)
916                    | BN_FLG_STATIC_DATA | n);
917 }
918
919 BN_GENCB *BN_GENCB_new(void)
920 {
921     BN_GENCB *ret;
922
923     if ((ret = OPENSSL_malloc(sizeof(BN_GENCB))) == NULL) {
924         BNerr(BN_F_BN_GENCB_NEW, ERR_R_MALLOC_FAILURE);
925         return (NULL);
926     }
927
928     return ret;
929 }
930
931 void BN_GENCB_free(BN_GENCB *cb)
932 {
933     if (cb == NULL)
934         return;
935     OPENSSL_free(cb);
936 }
937
938 void BN_set_flags(BIGNUM *b, int n)
939 {
940     b->flags |= n;
941 }
942
943 int BN_get_flags(const BIGNUM *b, int n)
944 {
945     return b->flags & n;
946 }
947
948 /* Populate a BN_GENCB structure with an "old"-style callback */
949 void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback) (int, int, void *),
950                       void *cb_arg)
951 {
952     BN_GENCB *tmp_gencb = gencb;
953     tmp_gencb->ver = 1;
954     tmp_gencb->arg = cb_arg;
955     tmp_gencb->cb.cb_1 = callback;
956 }
957
958 /* Populate a BN_GENCB structure with a "new"-style callback */
959 void BN_GENCB_set(BN_GENCB *gencb, int (*callback) (int, int, BN_GENCB *),
960                   void *cb_arg)
961 {
962     BN_GENCB *tmp_gencb = gencb;
963     tmp_gencb->ver = 2;
964     tmp_gencb->arg = cb_arg;
965     tmp_gencb->cb.cb_2 = callback;
966 }
967
968 void *BN_GENCB_get_arg(BN_GENCB *cb)
969 {
970     return cb->arg;
971 }
972
973 BIGNUM *bn_wexpand(BIGNUM *a, int words)
974 {
975     return (words <= a->dmax) ? a : bn_expand2(a, words);
976 }
977
978 void bn_correct_top(BIGNUM *a)
979 {
980     BN_ULONG *ftl;
981     int tmp_top = a->top;
982
983     if (tmp_top > 0) {
984         for (ftl = &(a->d[tmp_top - 1]); tmp_top > 0; tmp_top--)
985             if (*(ftl--))
986                 break;
987         a->top = tmp_top;
988     }
989     bn_pollute(a);
990 }