remove malloc casts
[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         if (bn)
545             BN_free(bn);
546         return NULL;
547     }
548     ret->top = i;
549     ret->neg = 0;
550     while (n--) {
551         l = (l << 8L) | *(s++);
552         if (m-- == 0) {
553             ret->d[--i] = l;
554             l = 0;
555             m = BN_BYTES - 1;
556         }
557     }
558     /*
559      * need to call this due to clear byte at top if avoiding having the top
560      * bit set (-ve number)
561      */
562     bn_correct_top(ret);
563     return (ret);
564 }
565
566 /* ignore negative */
567 int BN_bn2bin(const BIGNUM *a, unsigned char *to)
568 {
569     int n, i;
570     BN_ULONG l;
571
572     bn_check_top(a);
573     n = i = BN_num_bytes(a);
574     while (i--) {
575         l = a->d[i / BN_BYTES];
576         *(to++) = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff;
577     }
578     return (n);
579 }
580
581 int BN_ucmp(const BIGNUM *a, const BIGNUM *b)
582 {
583     int i;
584     BN_ULONG t1, t2, *ap, *bp;
585
586     bn_check_top(a);
587     bn_check_top(b);
588
589     i = a->top - b->top;
590     if (i != 0)
591         return (i);
592     ap = a->d;
593     bp = b->d;
594     for (i = a->top - 1; i >= 0; i--) {
595         t1 = ap[i];
596         t2 = bp[i];
597         if (t1 != t2)
598             return ((t1 > t2) ? 1 : -1);
599     }
600     return (0);
601 }
602
603 int BN_cmp(const BIGNUM *a, const BIGNUM *b)
604 {
605     int i;
606     int gt, lt;
607     BN_ULONG t1, t2;
608
609     if ((a == NULL) || (b == NULL)) {
610         if (a != NULL)
611             return (-1);
612         else if (b != NULL)
613             return (1);
614         else
615             return (0);
616     }
617
618     bn_check_top(a);
619     bn_check_top(b);
620
621     if (a->neg != b->neg) {
622         if (a->neg)
623             return (-1);
624         else
625             return (1);
626     }
627     if (a->neg == 0) {
628         gt = 1;
629         lt = -1;
630     } else {
631         gt = -1;
632         lt = 1;
633     }
634
635     if (a->top > b->top)
636         return (gt);
637     if (a->top < b->top)
638         return (lt);
639     for (i = a->top - 1; i >= 0; i--) {
640         t1 = a->d[i];
641         t2 = b->d[i];
642         if (t1 > t2)
643             return (gt);
644         if (t1 < t2)
645             return (lt);
646     }
647     return (0);
648 }
649
650 int BN_set_bit(BIGNUM *a, int n)
651 {
652     int i, j, k;
653
654     if (n < 0)
655         return 0;
656
657     i = n / BN_BITS2;
658     j = n % BN_BITS2;
659     if (a->top <= i) {
660         if (bn_wexpand(a, i + 1) == NULL)
661             return (0);
662         for (k = a->top; k < i + 1; k++)
663             a->d[k] = 0;
664         a->top = i + 1;
665     }
666
667     a->d[i] |= (((BN_ULONG)1) << j);
668     bn_check_top(a);
669     return (1);
670 }
671
672 int BN_clear_bit(BIGNUM *a, int n)
673 {
674     int i, j;
675
676     bn_check_top(a);
677     if (n < 0)
678         return 0;
679
680     i = n / BN_BITS2;
681     j = n % BN_BITS2;
682     if (a->top <= i)
683         return (0);
684
685     a->d[i] &= (~(((BN_ULONG)1) << j));
686     bn_correct_top(a);
687     return (1);
688 }
689
690 int BN_is_bit_set(const BIGNUM *a, int n)
691 {
692     int i, j;
693
694     bn_check_top(a);
695     if (n < 0)
696         return 0;
697     i = n / BN_BITS2;
698     j = n % BN_BITS2;
699     if (a->top <= i)
700         return 0;
701     return (int)(((a->d[i]) >> j) & ((BN_ULONG)1));
702 }
703
704 int BN_mask_bits(BIGNUM *a, int n)
705 {
706     int b, w;
707
708     bn_check_top(a);
709     if (n < 0)
710         return 0;
711
712     w = n / BN_BITS2;
713     b = n % BN_BITS2;
714     if (w >= a->top)
715         return 0;
716     if (b == 0)
717         a->top = w;
718     else {
719         a->top = w + 1;
720         a->d[w] &= ~(BN_MASK2 << b);
721     }
722     bn_correct_top(a);
723     return (1);
724 }
725
726 void BN_set_negative(BIGNUM *a, int b)
727 {
728     if (b && !BN_is_zero(a))
729         a->neg = 1;
730     else
731         a->neg = 0;
732 }
733
734 int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n)
735 {
736     int i;
737     BN_ULONG aa, bb;
738
739     aa = a[n - 1];
740     bb = b[n - 1];
741     if (aa != bb)
742         return ((aa > bb) ? 1 : -1);
743     for (i = n - 2; i >= 0; i--) {
744         aa = a[i];
745         bb = b[i];
746         if (aa != bb)
747             return ((aa > bb) ? 1 : -1);
748     }
749     return (0);
750 }
751
752 /*
753  * Here follows a specialised variants of bn_cmp_words().  It has the
754  * property of performing the operation on arrays of different sizes. The
755  * sizes of those arrays is expressed through cl, which is the common length
756  * ( basicall, min(len(a),len(b)) ), and dl, which is the delta between the
757  * two lengths, calculated as len(a)-len(b). All lengths are the number of
758  * BN_ULONGs...
759  */
760
761 int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, int cl, int dl)
762 {
763     int n, i;
764     n = cl - 1;
765
766     if (dl < 0) {
767         for (i = dl; i < 0; i++) {
768             if (b[n - i] != 0)
769                 return -1;      /* a < b */
770         }
771     }
772     if (dl > 0) {
773         for (i = dl; i > 0; i--) {
774             if (a[n + i] != 0)
775                 return 1;       /* a > b */
776         }
777     }
778     return bn_cmp_words(a, b, cl);
779 }
780
781 /*
782  * Constant-time conditional swap of a and b.
783  * a and b are swapped if condition is not 0.  The code assumes that at most one bit of condition is set.
784  * nwords is the number of words to swap.  The code assumes that at least nwords are allocated in both a and b,
785  * and that no more than nwords are used by either a or b.
786  * a and b cannot be the same number
787  */
788 void BN_consttime_swap(BN_ULONG condition, BIGNUM *a, BIGNUM *b, int nwords)
789 {
790     BN_ULONG t;
791     int i;
792
793     bn_wcheck_size(a, nwords);
794     bn_wcheck_size(b, nwords);
795
796     assert(a != b);
797     assert((condition & (condition - 1)) == 0);
798     assert(sizeof(BN_ULONG) >= sizeof(int));
799
800     condition = ((condition - 1) >> (BN_BITS2 - 1)) - 1;
801
802     t = (a->top ^ b->top) & condition;
803     a->top ^= t;
804     b->top ^= t;
805
806 #define BN_CONSTTIME_SWAP(ind) \
807         do { \
808                 t = (a->d[ind] ^ b->d[ind]) & condition; \
809                 a->d[ind] ^= t; \
810                 b->d[ind] ^= t; \
811         } while (0)
812
813     switch (nwords) {
814     default:
815         for (i = 10; i < nwords; i++)
816             BN_CONSTTIME_SWAP(i);
817         /* Fallthrough */
818     case 10:
819         BN_CONSTTIME_SWAP(9);   /* Fallthrough */
820     case 9:
821         BN_CONSTTIME_SWAP(8);   /* Fallthrough */
822     case 8:
823         BN_CONSTTIME_SWAP(7);   /* Fallthrough */
824     case 7:
825         BN_CONSTTIME_SWAP(6);   /* Fallthrough */
826     case 6:
827         BN_CONSTTIME_SWAP(5);   /* Fallthrough */
828     case 5:
829         BN_CONSTTIME_SWAP(4);   /* Fallthrough */
830     case 4:
831         BN_CONSTTIME_SWAP(3);   /* Fallthrough */
832     case 3:
833         BN_CONSTTIME_SWAP(2);   /* Fallthrough */
834     case 2:
835         BN_CONSTTIME_SWAP(1);   /* Fallthrough */
836     case 1:
837         BN_CONSTTIME_SWAP(0);
838     }
839 #undef BN_CONSTTIME_SWAP
840 }
841
842 /* Bits of security, see SP800-57 */
843
844 int BN_security_bits(int L, int N)
845 {
846     int secbits, bits;
847     if (L >= 15360)
848         secbits = 256;
849     else if (L >= 7690)
850         secbits = 192;
851     else if (L >= 3072)
852         secbits = 128;
853     else if (L >= 2048)
854         secbits = 112;
855     else if (L >= 1024)
856         secbits = 80;
857     else
858         return 0;
859     if (N == -1)
860         return secbits;
861     bits = N / 2;
862     if (bits < 80)
863         return 0;
864     return bits >= secbits ? secbits : bits;
865 }
866
867 void BN_zero_ex(BIGNUM *a)
868 {
869     a->top = 0;
870     a->neg = 0;
871 }
872
873 int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)
874 {
875     return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));
876 }
877
878 int BN_is_zero(const BIGNUM *a)
879 {
880     return a->top == 0;
881 }
882
883 int BN_is_one(const BIGNUM *a)
884 {
885     return BN_abs_is_word(a, 1) && !a->neg;
886 }
887
888 int BN_is_word(const BIGNUM *a, const BN_ULONG w)
889 {
890     return BN_abs_is_word(a, w) && (!w || !a->neg);
891 }
892
893 int BN_is_odd(const BIGNUM *a)
894 {
895     return (a->top > 0) && (a->d[0] & 1);
896 }
897
898 int BN_is_negative(const BIGNUM *a)
899 {
900     return (a->neg != 0);
901 }
902
903 int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont,
904                      BN_CTX *ctx)
905 {
906     return BN_mod_mul_montgomery(r, a, &(mont->RR), mont, ctx);
907 }
908
909 void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int n)
910 {
911     dest->d = b->d;
912     dest->top = b->top;
913     dest->dmax = b->dmax;
914     dest->neg = b->neg;
915     dest->flags = ((dest->flags & BN_FLG_MALLOCED)
916                    | (b->flags & ~BN_FLG_MALLOCED)
917                    | BN_FLG_STATIC_DATA | n);
918 }
919
920 BN_GENCB *BN_GENCB_new(void)
921 {
922     BN_GENCB *ret;
923
924     if ((ret = OPENSSL_malloc(sizeof(BN_GENCB))) == NULL) {
925         BNerr(BN_F_BN_GENCB_NEW, ERR_R_MALLOC_FAILURE);
926         return (NULL);
927     }
928
929     return ret;
930 }
931
932 void BN_GENCB_free(BN_GENCB *cb)
933 {
934     if (cb == NULL)
935         return;
936     OPENSSL_free(cb);
937 }
938
939 void BN_set_flags(BIGNUM *b, int n)
940 {
941     b->flags |= n;
942 }
943
944 int BN_get_flags(const BIGNUM *b, int n)
945 {
946     return b->flags & n;
947 }
948
949 /* Populate a BN_GENCB structure with an "old"-style callback */
950 void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback) (int, int, void *),
951                       void *cb_arg)
952 {
953     BN_GENCB *tmp_gencb = gencb;
954     tmp_gencb->ver = 1;
955     tmp_gencb->arg = cb_arg;
956     tmp_gencb->cb.cb_1 = callback;
957 }
958
959 /* Populate a BN_GENCB structure with a "new"-style callback */
960 void BN_GENCB_set(BN_GENCB *gencb, int (*callback) (int, int, BN_GENCB *),
961                   void *cb_arg)
962 {
963     BN_GENCB *tmp_gencb = gencb;
964     tmp_gencb->ver = 2;
965     tmp_gencb->arg = cb_arg;
966     tmp_gencb->cb.cb_2 = callback;
967 }
968
969 void *BN_GENCB_get_arg(BN_GENCB *cb)
970 {
971     return cb->arg;
972 }
973
974 BIGNUM *bn_wexpand(BIGNUM *a, int words)
975 {
976     return (words <= a->dmax) ? a : bn_expand2(a, words);
977 }
978
979 void bn_correct_top(BIGNUM *a)
980 {
981     BN_ULONG *ftl;
982     int tmp_top = a->top;
983
984     if (tmp_top > 0) {
985         for (ftl = &(a->d[tmp_top - 1]); tmp_top > 0; tmp_top--)
986             if (*(ftl--))
987                 break;
988         a->top = tmp_top;
989     }
990     bn_pollute(a);
991 }