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