09d3954dada8049efbfa04d0bb815498c5a7acf4
[openssl.git] / crypto / bn / bn_lib.c
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to.  The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  *    notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  *    notice, this list of conditions and the following disclaimer in the
29  *    documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  *    must display the following acknowledgement:
32  *    "This product includes cryptographic software written by
33  *     Eric Young (eay@cryptsoft.com)"
34  *    The word 'cryptographic' can be left out if the rouines from the library
35  *    being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  *    the apps directory (application code) you must include an acknowledgement:
38  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.]
56  */
57
58 #ifndef BN_DEBUG
59 # undef NDEBUG                  /* avoid conflicting definitions */
60 # define NDEBUG
61 #endif
62
63 #include <assert.h>
64 #include <limits.h>
65 #include "internal/cryptlib.h"
66 #include "bn_lcl.h"
67 #include <openssl/opensslconf.h>
68
69 /* This stuff appears to be completely unused, so is deprecated */
70 #if OPENSSL_API_COMPAT < 0x00908000L
71 /*-
72  * For a 32 bit machine
73  * 2 -   4 ==  128
74  * 3 -   8 ==  256
75  * 4 -  16 ==  512
76  * 5 -  32 == 1024
77  * 6 -  64 == 2048
78  * 7 - 128 == 4096
79  * 8 - 256 == 8192
80  */
81 static int bn_limit_bits = 0;
82 static int bn_limit_num = 8;    /* (1<<bn_limit_bits) */
83 static int bn_limit_bits_low = 0;
84 static int bn_limit_num_low = 8; /* (1<<bn_limit_bits_low) */
85 static int bn_limit_bits_high = 0;
86 static int bn_limit_num_high = 8; /* (1<<bn_limit_bits_high) */
87 static int bn_limit_bits_mont = 0;
88 static int bn_limit_num_mont = 8; /* (1<<bn_limit_bits_mont) */
89
90 void BN_set_params(int mult, int high, int low, int mont)
91 {
92     if (mult >= 0) {
93         if (mult > (int)(sizeof(int) * 8) - 1)
94             mult = sizeof(int) * 8 - 1;
95         bn_limit_bits = mult;
96         bn_limit_num = 1 << mult;
97     }
98     if (high >= 0) {
99         if (high > (int)(sizeof(int) * 8) - 1)
100             high = sizeof(int) * 8 - 1;
101         bn_limit_bits_high = high;
102         bn_limit_num_high = 1 << high;
103     }
104     if (low >= 0) {
105         if (low > (int)(sizeof(int) * 8) - 1)
106             low = sizeof(int) * 8 - 1;
107         bn_limit_bits_low = low;
108         bn_limit_num_low = 1 << low;
109     }
110     if (mont >= 0) {
111         if (mont > (int)(sizeof(int) * 8) - 1)
112             mont = sizeof(int) * 8 - 1;
113         bn_limit_bits_mont = mont;
114         bn_limit_num_mont = 1 << mont;
115     }
116 }
117
118 int BN_get_params(int which)
119 {
120     if (which == 0)
121         return (bn_limit_bits);
122     else if (which == 1)
123         return (bn_limit_bits_high);
124     else if (which == 2)
125         return (bn_limit_bits_low);
126     else if (which == 3)
127         return (bn_limit_bits_mont);
128     else
129         return (0);
130 }
131 #endif
132
133 const BIGNUM *BN_value_one(void)
134 {
135     static const BN_ULONG data_one = 1L;
136     static const BIGNUM const_one =
137         { (BN_ULONG *)&data_one, 1, 1, 0, BN_FLG_STATIC_DATA };
138
139     return (&const_one);
140 }
141
142 int BN_num_bits_word(BN_ULONG l)
143 {
144     static const unsigned char bits[256] = {
145         0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
146         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
147         6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
148         6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
149         7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
150         7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
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         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
154         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
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     };
162
163 #if defined(SIXTY_FOUR_BIT_LONG)
164     if (l & 0xffffffff00000000L) {
165         if (l & 0xffff000000000000L) {
166             if (l & 0xff00000000000000L) {
167                 return (bits[(int)(l >> 56)] + 56);
168             } else
169                 return (bits[(int)(l >> 48)] + 48);
170         } else {
171             if (l & 0x0000ff0000000000L) {
172                 return (bits[(int)(l >> 40)] + 40);
173             } else
174                 return (bits[(int)(l >> 32)] + 32);
175         }
176     } else
177 #else
178 # ifdef SIXTY_FOUR_BIT
179     if (l & 0xffffffff00000000LL) {
180         if (l & 0xffff000000000000LL) {
181             if (l & 0xff00000000000000LL) {
182                 return (bits[(int)(l >> 56)] + 56);
183             } else
184                 return (bits[(int)(l >> 48)] + 48);
185         } else {
186             if (l & 0x0000ff0000000000LL) {
187                 return (bits[(int)(l >> 40)] + 40);
188             } else
189                 return (bits[(int)(l >> 32)] + 32);
190         }
191     } else
192 # endif
193 #endif
194     {
195 #if defined(THIRTY_TWO_BIT) || defined(SIXTY_FOUR_BIT) || defined(SIXTY_FOUR_BIT_LONG)
196         if (l & 0xffff0000L) {
197             if (l & 0xff000000L)
198                 return (bits[(int)(l >> 24L)] + 24);
199             else
200                 return (bits[(int)(l >> 16L)] + 16);
201         } else
202 #endif
203         {
204 #if defined(THIRTY_TWO_BIT) || defined(SIXTY_FOUR_BIT) || defined(SIXTY_FOUR_BIT_LONG)
205             if (l & 0xff00L)
206                 return (bits[(int)(l >> 8)] + 8);
207             else
208 #endif
209                 return (bits[(int)(l)]);
210         }
211     }
212 }
213
214 int BN_num_bits(const BIGNUM *a)
215 {
216     int i = a->top - 1;
217     bn_check_top(a);
218
219     if (BN_is_zero(a))
220         return 0;
221     return ((i * BN_BITS2) + BN_num_bits_word(a->d[i]));
222 }
223
224 static void bn_free_d(BIGNUM *a)
225 {
226     if (BN_get_flags(a,BN_FLG_SECURE))
227         OPENSSL_secure_free(a->d);
228     else
229         OPENSSL_free(a->d);
230 }
231
232
233 void BN_clear_free(BIGNUM *a)
234 {
235     int i;
236
237     if (a == NULL)
238         return;
239     bn_check_top(a);
240     if (a->d != NULL) {
241         OPENSSL_cleanse(a->d, a->dmax * sizeof(a->d[0]));
242         if (!BN_get_flags(a, BN_FLG_STATIC_DATA))
243             bn_free_d(a);
244     }
245     i = BN_get_flags(a, BN_FLG_MALLOCED);
246     OPENSSL_cleanse(a, sizeof(*a));
247     if (i)
248         OPENSSL_free(a);
249 }
250
251 void BN_free(BIGNUM *a)
252 {
253     if (a == NULL)
254         return;
255     bn_check_top(a);
256     if (!BN_get_flags(a, BN_FLG_STATIC_DATA))
257         bn_free_d(a);
258     if (a->flags & BN_FLG_MALLOCED)
259         OPENSSL_free(a);
260     else {
261 #if OPENSSL_API_COMPAT < 0x00908000L
262         a->flags |= BN_FLG_FREE;
263 #endif
264         a->d = NULL;
265     }
266 }
267
268 void bn_init(BIGNUM *a)
269 {
270     static BIGNUM nilbn;
271
272     *a = nilbn;
273     bn_check_top(a);
274 }
275
276 BIGNUM *BN_new(void)
277 {
278     BIGNUM *ret;
279
280     if ((ret = OPENSSL_zalloc(sizeof(*ret))) == NULL) {
281         BNerr(BN_F_BN_NEW, ERR_R_MALLOC_FAILURE);
282         return (NULL);
283     }
284     ret->flags = BN_FLG_MALLOCED;
285     bn_check_top(ret);
286     return (ret);
287 }
288
289  BIGNUM *BN_secure_new(void)
290  {
291      BIGNUM *ret = BN_new();
292      if (ret != NULL)
293          ret->flags |= BN_FLG_SECURE;
294      return (ret);
295  }
296
297 /* This is used by bn_expand2() */
298 /* The caller MUST check that words > b->dmax before calling this */
299 static BN_ULONG *bn_expand_internal(const BIGNUM *b, int words)
300 {
301     BN_ULONG *A, *a = NULL;
302     const BN_ULONG *B;
303     int i;
304
305     bn_check_top(b);
306
307     if (words > (INT_MAX / (4 * BN_BITS2))) {
308         BNerr(BN_F_BN_EXPAND_INTERNAL, BN_R_BIGNUM_TOO_LONG);
309         return NULL;
310     }
311     if (BN_get_flags(b, BN_FLG_STATIC_DATA)) {
312         BNerr(BN_F_BN_EXPAND_INTERNAL, BN_R_EXPAND_ON_STATIC_BIGNUM_DATA);
313         return (NULL);
314     }
315     if (BN_get_flags(b,BN_FLG_SECURE))
316         a = A = OPENSSL_secure_zalloc(words * sizeof(*a));
317     else
318         a = A = OPENSSL_zalloc(words * sizeof(*a));
319     if (A == NULL) {
320         BNerr(BN_F_BN_EXPAND_INTERNAL, ERR_R_MALLOC_FAILURE);
321         return (NULL);
322     }
323
324 #if 1
325     B = b->d;
326     /* Check if the previous number needs to be copied */
327     if (B != NULL) {
328         for (i = b->top >> 2; i > 0; i--, A += 4, B += 4) {
329             /*
330              * The fact that the loop is unrolled
331              * 4-wise is a tribute to Intel. It's
332              * the one that doesn't have enough
333              * registers to accommodate more data.
334              * I'd unroll it 8-wise otherwise:-)
335              *
336              *              <appro@fy.chalmers.se>
337              */
338             BN_ULONG a0, a1, a2, a3;
339             a0 = B[0];
340             a1 = B[1];
341             a2 = B[2];
342             a3 = B[3];
343             A[0] = a0;
344             A[1] = a1;
345             A[2] = a2;
346             A[3] = a3;
347         }
348         /*
349          * workaround for ultrix cc: without 'case 0', the optimizer does
350          * the switch table by doing a=top&3; a--; goto jump_table[a];
351          * which fails for top== 0
352          */
353         switch (b->top & 3) {
354         case 3:
355             A[2] = B[2];
356         case 2:
357             A[1] = B[1];
358         case 1:
359             A[0] = B[0];
360         case 0:
361             ;
362         }
363     }
364 #else
365     memset(A, 0, sizeof(*A) * words);
366     memcpy(A, b->d, sizeof(b->d[0]) * b->top);
367 #endif
368
369     return (a);
370 }
371
372 /*
373  * This is an internal function that should not be used in applications. It
374  * ensures that 'b' has enough room for a 'words' word number and initialises
375  * any unused part of b->d with leading zeros. It is mostly used by the
376  * various BIGNUM routines. If there is an error, NULL is returned. If not,
377  * 'b' is returned.
378  */
379
380 BIGNUM *bn_expand2(BIGNUM *b, int words)
381 {
382     bn_check_top(b);
383
384     if (words > b->dmax) {
385         BN_ULONG *a = bn_expand_internal(b, words);
386         if (!a)
387             return NULL;
388         if (b->d) {
389             OPENSSL_cleanse(b->d, b->dmax * sizeof(b->d[0]));
390             bn_free_d(b);
391         }
392         b->d = a;
393         b->dmax = words;
394     }
395
396     bn_check_top(b);
397     return b;
398 }
399
400 BIGNUM *BN_dup(const BIGNUM *a)
401 {
402     BIGNUM *t;
403
404     if (a == NULL)
405         return NULL;
406     bn_check_top(a);
407
408     t = BN_get_flags(a, BN_FLG_SECURE) ? BN_secure_new() : BN_new();
409     if (t == NULL)
410         return NULL;
411     if (!BN_copy(t, a)) {
412         BN_free(t);
413         return NULL;
414     }
415     bn_check_top(t);
416     return t;
417 }
418
419 BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
420 {
421     int i;
422     BN_ULONG *A;
423     const BN_ULONG *B;
424
425     bn_check_top(b);
426
427     if (a == b)
428         return (a);
429     if (bn_wexpand(a, b->top) == NULL)
430         return (NULL);
431
432 #if 1
433     A = a->d;
434     B = b->d;
435     for (i = b->top >> 2; i > 0; i--, A += 4, B += 4) {
436         BN_ULONG a0, a1, a2, a3;
437         a0 = B[0];
438         a1 = B[1];
439         a2 = B[2];
440         a3 = B[3];
441         A[0] = a0;
442         A[1] = a1;
443         A[2] = a2;
444         A[3] = a3;
445     }
446     /* ultrix cc workaround, see comments in bn_expand_internal */
447     switch (b->top & 3) {
448     case 3:
449         A[2] = B[2];
450     case 2:
451         A[1] = B[1];
452     case 1:
453         A[0] = B[0];
454     case 0:;
455     }
456 #else
457     memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);
458 #endif
459
460     a->top = b->top;
461     a->neg = b->neg;
462     bn_check_top(a);
463     return (a);
464 }
465
466 void BN_swap(BIGNUM *a, BIGNUM *b)
467 {
468     int flags_old_a, flags_old_b;
469     BN_ULONG *tmp_d;
470     int tmp_top, tmp_dmax, tmp_neg;
471
472     bn_check_top(a);
473     bn_check_top(b);
474
475     flags_old_a = a->flags;
476     flags_old_b = b->flags;
477
478     tmp_d = a->d;
479     tmp_top = a->top;
480     tmp_dmax = a->dmax;
481     tmp_neg = a->neg;
482
483     a->d = b->d;
484     a->top = b->top;
485     a->dmax = b->dmax;
486     a->neg = b->neg;
487
488     b->d = tmp_d;
489     b->top = tmp_top;
490     b->dmax = tmp_dmax;
491     b->neg = tmp_neg;
492
493     a->flags =
494         (flags_old_a & BN_FLG_MALLOCED) | (flags_old_b & BN_FLG_STATIC_DATA);
495     b->flags =
496         (flags_old_b & BN_FLG_MALLOCED) | (flags_old_a & BN_FLG_STATIC_DATA);
497     bn_check_top(a);
498     bn_check_top(b);
499 }
500
501 void BN_clear(BIGNUM *a)
502 {
503     bn_check_top(a);
504     if (a->d != NULL)
505         memset(a->d, 0, sizeof(*a->d) * a->dmax);
506     a->top = 0;
507     a->neg = 0;
508 }
509
510 BN_ULONG BN_get_word(const BIGNUM *a)
511 {
512     if (a->top > 1)
513         return BN_MASK2;
514     else if (a->top == 1)
515         return a->d[0];
516     /* a->top == 0 */
517     return 0;
518 }
519
520 int BN_set_word(BIGNUM *a, BN_ULONG w)
521 {
522     bn_check_top(a);
523     if (bn_expand(a, (int)sizeof(BN_ULONG) * 8) == NULL)
524         return (0);
525     a->neg = 0;
526     a->d[0] = w;
527     a->top = (w ? 1 : 0);
528     bn_check_top(a);
529     return (1);
530 }
531
532 BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret)
533 {
534     unsigned int i, m;
535     unsigned int n;
536     BN_ULONG l;
537     BIGNUM *bn = NULL;
538
539     if (ret == NULL)
540         ret = bn = BN_new();
541     if (ret == NULL)
542         return (NULL);
543     bn_check_top(ret);
544     /* Skip leading zero's. */
545     for ( ; len > 0 && *s == 0; s++, len--)
546         continue;
547     n = len;
548     if (n == 0) {
549         ret->top = 0;
550         return (ret);
551     }
552     i = ((n - 1) / BN_BYTES) + 1;
553     m = ((n - 1) % (BN_BYTES));
554     if (bn_wexpand(ret, (int)i) == NULL) {
555         BN_free(bn);
556         return NULL;
557     }
558     ret->top = i;
559     ret->neg = 0;
560     l = 0;
561     while (n--) {
562         l = (l << 8L) | *(s++);
563         if (m-- == 0) {
564             ret->d[--i] = l;
565             l = 0;
566             m = BN_BYTES - 1;
567         }
568     }
569     /*
570      * need to call this due to clear byte at top if avoiding having the top
571      * bit set (-ve number)
572      */
573     bn_correct_top(ret);
574     return (ret);
575 }
576
577 /* ignore negative */
578 static int bn2binpad(const BIGNUM *a, unsigned char *to, int tolen)
579 {
580     int i;
581     BN_ULONG l;
582
583     bn_check_top(a);
584     i = BN_num_bytes(a);
585     if (tolen == -1)
586         tolen = i;
587     else if (tolen < i)
588         return -1;
589     /* Add leading zeroes if necessary */
590     if (tolen > i) {
591         memset(to, 0, tolen - i);
592         to += tolen - i;
593     }
594     while (i--) {
595         l = a->d[i / BN_BYTES];
596         *(to++) = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff;
597     }
598     return tolen;
599 }
600
601 int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen)
602 {
603     if (tolen < 0)
604         return -1;
605     return bn2binpad(a, to, tolen);
606 }
607
608 int BN_bn2bin(const BIGNUM *a, unsigned char *to)
609 {
610     return bn2binpad(a, to, -1);
611 }
612
613 BIGNUM *BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret)
614 {
615     unsigned int i, m;
616     unsigned int n;
617     BN_ULONG l;
618     BIGNUM *bn = NULL;
619
620     if (ret == NULL)
621         ret = bn = BN_new();
622     if (ret == NULL)
623         return (NULL);
624     bn_check_top(ret);
625     s += len - 1;
626     /* Skip trailing zeroes. */
627     for ( ; len > 0 && *s == 0; s--, len--)
628         continue;
629     n = len;
630     if (n == 0) {
631         ret->top = 0;
632         return ret;
633     }
634     i = ((n - 1) / BN_BYTES) + 1;
635     m = ((n - 1) % (BN_BYTES));
636     if (bn_wexpand(ret, (int)i) == NULL) {
637         BN_free(bn);
638         return NULL;
639     }
640     ret->top = i;
641     ret->neg = 0;
642     l = 0;
643     while (n--) {
644         l = (l << 8L) | *(s--);
645         if (m-- == 0) {
646             ret->d[--i] = l;
647             l = 0;
648             m = BN_BYTES - 1;
649         }
650     }
651     /*
652      * need to call this due to clear byte at top if avoiding having the top
653      * bit set (-ve number)
654      */
655     bn_correct_top(ret);
656     return ret;
657 }
658
659 int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen)
660 {
661     int i;
662     BN_ULONG l;
663     bn_check_top(a);
664     i = BN_num_bytes(a);
665     if (tolen < i)
666         return -1;
667     /* Add trailing zeroes if necessary */
668     if (tolen > i)
669         memset(to + i, 0, tolen - i);
670     to += i - 1;
671     while (i--) {
672         l = a->d[i / BN_BYTES];
673         *(to--) = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff;
674     }
675     return tolen;
676 }
677
678 int BN_ucmp(const BIGNUM *a, const BIGNUM *b)
679 {
680     int i;
681     BN_ULONG t1, t2, *ap, *bp;
682
683     bn_check_top(a);
684     bn_check_top(b);
685
686     i = a->top - b->top;
687     if (i != 0)
688         return (i);
689     ap = a->d;
690     bp = b->d;
691     for (i = a->top - 1; i >= 0; i--) {
692         t1 = ap[i];
693         t2 = bp[i];
694         if (t1 != t2)
695             return ((t1 > t2) ? 1 : -1);
696     }
697     return (0);
698 }
699
700 int BN_cmp(const BIGNUM *a, const BIGNUM *b)
701 {
702     int i;
703     int gt, lt;
704     BN_ULONG t1, t2;
705
706     if ((a == NULL) || (b == NULL)) {
707         if (a != NULL)
708             return (-1);
709         else if (b != NULL)
710             return (1);
711         else
712             return (0);
713     }
714
715     bn_check_top(a);
716     bn_check_top(b);
717
718     if (a->neg != b->neg) {
719         if (a->neg)
720             return (-1);
721         else
722             return (1);
723     }
724     if (a->neg == 0) {
725         gt = 1;
726         lt = -1;
727     } else {
728         gt = -1;
729         lt = 1;
730     }
731
732     if (a->top > b->top)
733         return (gt);
734     if (a->top < b->top)
735         return (lt);
736     for (i = a->top - 1; i >= 0; i--) {
737         t1 = a->d[i];
738         t2 = b->d[i];
739         if (t1 > t2)
740             return (gt);
741         if (t1 < t2)
742             return (lt);
743     }
744     return (0);
745 }
746
747 int BN_set_bit(BIGNUM *a, int n)
748 {
749     int i, j, k;
750
751     if (n < 0)
752         return 0;
753
754     i = n / BN_BITS2;
755     j = n % BN_BITS2;
756     if (a->top <= i) {
757         if (bn_wexpand(a, i + 1) == NULL)
758             return (0);
759         for (k = a->top; k < i + 1; k++)
760             a->d[k] = 0;
761         a->top = i + 1;
762     }
763
764     a->d[i] |= (((BN_ULONG)1) << j);
765     bn_check_top(a);
766     return (1);
767 }
768
769 int BN_clear_bit(BIGNUM *a, int n)
770 {
771     int i, j;
772
773     bn_check_top(a);
774     if (n < 0)
775         return 0;
776
777     i = n / BN_BITS2;
778     j = n % BN_BITS2;
779     if (a->top <= i)
780         return (0);
781
782     a->d[i] &= (~(((BN_ULONG)1) << j));
783     bn_correct_top(a);
784     return (1);
785 }
786
787 int BN_is_bit_set(const BIGNUM *a, int n)
788 {
789     int i, j;
790
791     bn_check_top(a);
792     if (n < 0)
793         return 0;
794     i = n / BN_BITS2;
795     j = n % BN_BITS2;
796     if (a->top <= i)
797         return 0;
798     return (int)(((a->d[i]) >> j) & ((BN_ULONG)1));
799 }
800
801 int BN_mask_bits(BIGNUM *a, int n)
802 {
803     int b, w;
804
805     bn_check_top(a);
806     if (n < 0)
807         return 0;
808
809     w = n / BN_BITS2;
810     b = n % BN_BITS2;
811     if (w >= a->top)
812         return 0;
813     if (b == 0)
814         a->top = w;
815     else {
816         a->top = w + 1;
817         a->d[w] &= ~(BN_MASK2 << b);
818     }
819     bn_correct_top(a);
820     return (1);
821 }
822
823 void BN_set_negative(BIGNUM *a, int b)
824 {
825     if (b && !BN_is_zero(a))
826         a->neg = 1;
827     else
828         a->neg = 0;
829 }
830
831 int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n)
832 {
833     int i;
834     BN_ULONG aa, bb;
835
836     aa = a[n - 1];
837     bb = b[n - 1];
838     if (aa != bb)
839         return ((aa > bb) ? 1 : -1);
840     for (i = n - 2; i >= 0; i--) {
841         aa = a[i];
842         bb = b[i];
843         if (aa != bb)
844             return ((aa > bb) ? 1 : -1);
845     }
846     return (0);
847 }
848
849 /*
850  * Here follows a specialised variants of bn_cmp_words().  It has the
851  * property of performing the operation on arrays of different sizes. The
852  * sizes of those arrays is expressed through cl, which is the common length
853  * ( basicall, min(len(a),len(b)) ), and dl, which is the delta between the
854  * two lengths, calculated as len(a)-len(b). All lengths are the number of
855  * BN_ULONGs...
856  */
857
858 int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, int cl, int dl)
859 {
860     int n, i;
861     n = cl - 1;
862
863     if (dl < 0) {
864         for (i = dl; i < 0; i++) {
865             if (b[n - i] != 0)
866                 return -1;      /* a < b */
867         }
868     }
869     if (dl > 0) {
870         for (i = dl; i > 0; i--) {
871             if (a[n + i] != 0)
872                 return 1;       /* a > b */
873         }
874     }
875     return bn_cmp_words(a, b, cl);
876 }
877
878 /*
879  * Constant-time conditional swap of a and b.
880  * a and b are swapped if condition is not 0.  The code assumes that at most one bit of condition is set.
881  * nwords is the number of words to swap.  The code assumes that at least nwords are allocated in both a and b,
882  * and that no more than nwords are used by either a or b.
883  * a and b cannot be the same number
884  */
885 void BN_consttime_swap(BN_ULONG condition, BIGNUM *a, BIGNUM *b, int nwords)
886 {
887     BN_ULONG t;
888     int i;
889
890     bn_wcheck_size(a, nwords);
891     bn_wcheck_size(b, nwords);
892
893     assert(a != b);
894     assert((condition & (condition - 1)) == 0);
895     assert(sizeof(BN_ULONG) >= sizeof(int));
896
897     condition = ((condition - 1) >> (BN_BITS2 - 1)) - 1;
898
899     t = (a->top ^ b->top) & condition;
900     a->top ^= t;
901     b->top ^= t;
902
903 #define BN_CONSTTIME_SWAP(ind) \
904         do { \
905                 t = (a->d[ind] ^ b->d[ind]) & condition; \
906                 a->d[ind] ^= t; \
907                 b->d[ind] ^= t; \
908         } while (0)
909
910     switch (nwords) {
911     default:
912         for (i = 10; i < nwords; i++)
913             BN_CONSTTIME_SWAP(i);
914         /* Fallthrough */
915     case 10:
916         BN_CONSTTIME_SWAP(9);   /* Fallthrough */
917     case 9:
918         BN_CONSTTIME_SWAP(8);   /* Fallthrough */
919     case 8:
920         BN_CONSTTIME_SWAP(7);   /* Fallthrough */
921     case 7:
922         BN_CONSTTIME_SWAP(6);   /* Fallthrough */
923     case 6:
924         BN_CONSTTIME_SWAP(5);   /* Fallthrough */
925     case 5:
926         BN_CONSTTIME_SWAP(4);   /* Fallthrough */
927     case 4:
928         BN_CONSTTIME_SWAP(3);   /* Fallthrough */
929     case 3:
930         BN_CONSTTIME_SWAP(2);   /* Fallthrough */
931     case 2:
932         BN_CONSTTIME_SWAP(1);   /* Fallthrough */
933     case 1:
934         BN_CONSTTIME_SWAP(0);
935     }
936 #undef BN_CONSTTIME_SWAP
937 }
938
939 /* Bits of security, see SP800-57 */
940
941 int BN_security_bits(int L, int N)
942 {
943     int secbits, bits;
944     if (L >= 15360)
945         secbits = 256;
946     else if (L >= 7690)
947         secbits = 192;
948     else if (L >= 3072)
949         secbits = 128;
950     else if (L >= 2048)
951         secbits = 112;
952     else if (L >= 1024)
953         secbits = 80;
954     else
955         return 0;
956     if (N == -1)
957         return secbits;
958     bits = N / 2;
959     if (bits < 80)
960         return 0;
961     return bits >= secbits ? secbits : bits;
962 }
963
964 void BN_zero_ex(BIGNUM *a)
965 {
966     a->top = 0;
967     a->neg = 0;
968 }
969
970 int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)
971 {
972     return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));
973 }
974
975 int BN_is_zero(const BIGNUM *a)
976 {
977     return a->top == 0;
978 }
979
980 int BN_is_one(const BIGNUM *a)
981 {
982     return BN_abs_is_word(a, 1) && !a->neg;
983 }
984
985 int BN_is_word(const BIGNUM *a, const BN_ULONG w)
986 {
987     return BN_abs_is_word(a, w) && (!w || !a->neg);
988 }
989
990 int BN_is_odd(const BIGNUM *a)
991 {
992     return (a->top > 0) && (a->d[0] & 1);
993 }
994
995 int BN_is_negative(const BIGNUM *a)
996 {
997     return (a->neg != 0);
998 }
999
1000 int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont,
1001                      BN_CTX *ctx)
1002 {
1003     return BN_mod_mul_montgomery(r, a, &(mont->RR), mont, ctx);
1004 }
1005
1006 void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int flags)
1007 {
1008     dest->d = b->d;
1009     dest->top = b->top;
1010     dest->dmax = b->dmax;
1011     dest->neg = b->neg;
1012     dest->flags = ((dest->flags & BN_FLG_MALLOCED)
1013                    | (b->flags & ~BN_FLG_MALLOCED)
1014                    | BN_FLG_STATIC_DATA | flags);
1015 }
1016
1017 BN_GENCB *BN_GENCB_new(void)
1018 {
1019     BN_GENCB *ret;
1020
1021     if ((ret = OPENSSL_malloc(sizeof(*ret))) == NULL) {
1022         BNerr(BN_F_BN_GENCB_NEW, ERR_R_MALLOC_FAILURE);
1023         return (NULL);
1024     }
1025
1026     return ret;
1027 }
1028
1029 void BN_GENCB_free(BN_GENCB *cb)
1030 {
1031     if (cb == NULL)
1032         return;
1033     OPENSSL_free(cb);
1034 }
1035
1036 void BN_set_flags(BIGNUM *b, int n)
1037 {
1038     b->flags |= n;
1039 }
1040
1041 int BN_get_flags(const BIGNUM *b, int n)
1042 {
1043     return b->flags & n;
1044 }
1045
1046 /* Populate a BN_GENCB structure with an "old"-style callback */
1047 void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback) (int, int, void *),
1048                       void *cb_arg)
1049 {
1050     BN_GENCB *tmp_gencb = gencb;
1051     tmp_gencb->ver = 1;
1052     tmp_gencb->arg = cb_arg;
1053     tmp_gencb->cb.cb_1 = callback;
1054 }
1055
1056 /* Populate a BN_GENCB structure with a "new"-style callback */
1057 void BN_GENCB_set(BN_GENCB *gencb, int (*callback) (int, int, BN_GENCB *),
1058                   void *cb_arg)
1059 {
1060     BN_GENCB *tmp_gencb = gencb;
1061     tmp_gencb->ver = 2;
1062     tmp_gencb->arg = cb_arg;
1063     tmp_gencb->cb.cb_2 = callback;
1064 }
1065
1066 void *BN_GENCB_get_arg(BN_GENCB *cb)
1067 {
1068     return cb->arg;
1069 }
1070
1071 BIGNUM *bn_wexpand(BIGNUM *a, int words)
1072 {
1073     return (words <= a->dmax) ? a : bn_expand2(a, words);
1074 }
1075
1076 void bn_correct_top(BIGNUM *a)
1077 {
1078     BN_ULONG *ftl;
1079     int tmp_top = a->top;
1080
1081     if (tmp_top > 0) {
1082         for (ftl = &(a->d[tmp_top - 1]); tmp_top > 0; tmp_top--)
1083             if (*(ftl--))
1084                 break;
1085         a->top = tmp_top;
1086     }
1087     bn_pollute(a);
1088 }