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