modular arithmetics
[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 <stdio.h>
66 #include "cryptlib.h"
67 #include "bn_lcl.h"
68
69 const char *BN_version="Big Number" OPENSSL_VERSION_PTEXT;
70
71 /* For a 32 bit machine
72  * 2 -   4 ==  128
73  * 3 -   8 ==  256
74  * 4 -  16 ==  512
75  * 5 -  32 == 1024
76  * 6 -  64 == 2048
77  * 7 - 128 == 4096
78  * 8 - 256 == 8192
79  */
80 static int bn_limit_bits=0;
81 static int bn_limit_num=8;        /* (1<<bn_limit_bits) */
82 static int bn_limit_bits_low=0;
83 static int bn_limit_num_low=8;    /* (1<<bn_limit_bits_low) */
84 static int bn_limit_bits_high=0;
85 static int bn_limit_num_high=8;   /* (1<<bn_limit_bits_high) */
86 static int bn_limit_bits_mont=0;
87 static int bn_limit_num_mont=8;   /* (1<<bn_limit_bits_mont) */
88
89 void BN_set_params(int mult, int high, int low, int mont)
90         {
91         if (mult >= 0)
92                 {
93                 if (mult > (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                 {
100                 if (high > (sizeof(int)*8)-1)
101                         high=sizeof(int)*8-1;
102                 bn_limit_bits_high=high;
103                 bn_limit_num_high=1<<high;
104                 }
105         if (low >= 0)
106                 {
107                 if (low > (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                 {
114                 if (mont > (sizeof(int)*8)-1)
115                         mont=sizeof(int)*8-1;
116                 bn_limit_bits_mont=mont;
117                 bn_limit_num_mont=1<<mont;
118                 }
119         }
120
121 int BN_get_params(int which)
122         {
123         if      (which == 0) return(bn_limit_bits);
124         else if (which == 1) return(bn_limit_bits_high);
125         else if (which == 2) return(bn_limit_bits_low);
126         else if (which == 3) return(bn_limit_bits_mont);
127         else return(0);
128         }
129
130 BIGNUM *BN_value_one(void)
131         {
132         static BN_ULONG data_one=1L;
133         static BIGNUM const_one={&data_one,1,1,0};
134
135         return(&const_one);
136         }
137
138 char *BN_options(void)
139         {
140         static int init=0;
141         static char data[16];
142
143         if (!init)
144                 {
145                 init++;
146 #ifdef BN_LLONG
147                 sprintf(data,"bn(%d,%d)",(int)sizeof(BN_ULLONG)*8,
148                         (int)sizeof(BN_ULONG)*8);
149 #else
150                 sprintf(data,"bn(%d,%d)",(int)sizeof(BN_ULONG)*8,
151                         (int)sizeof(BN_ULONG)*8);
152 #endif
153                 }
154         return(data);
155         }
156
157 int BN_num_bits_word(BN_ULONG l)
158         {
159         static const char bits[256]={
160                 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,
161                 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
162                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
163                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
164                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
165                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
166                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
167                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
168                 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
169                 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
170                 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
171                 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
172                 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
173                 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
174                 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
175                 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
176                 };
177
178 #if defined(SIXTY_FOUR_BIT_LONG)
179         if (l & 0xffffffff00000000L)
180                 {
181                 if (l & 0xffff000000000000L)
182                         {
183                         if (l & 0xff00000000000000L)
184                                 {
185                                 return(bits[(int)(l>>56)]+56);
186                                 }
187                         else    return(bits[(int)(l>>48)]+48);
188                         }
189                 else
190                         {
191                         if (l & 0x0000ff0000000000L)
192                                 {
193                                 return(bits[(int)(l>>40)]+40);
194                                 }
195                         else    return(bits[(int)(l>>32)]+32);
196                         }
197                 }
198         else
199 #else
200 #ifdef SIXTY_FOUR_BIT
201         if (l & 0xffffffff00000000LL)
202                 {
203                 if (l & 0xffff000000000000LL)
204                         {
205                         if (l & 0xff00000000000000LL)
206                                 {
207                                 return(bits[(int)(l>>56)]+56);
208                                 }
209                         else    return(bits[(int)(l>>48)]+48);
210                         }
211                 else
212                         {
213                         if (l & 0x0000ff0000000000LL)
214                                 {
215                                 return(bits[(int)(l>>40)]+40);
216                                 }
217                         else    return(bits[(int)(l>>32)]+32);
218                         }
219                 }
220         else
221 #endif
222 #endif
223                 {
224 #if defined(THIRTY_TWO_BIT) || defined(SIXTY_FOUR_BIT) || defined(SIXTY_FOUR_BIT_LONG)
225                 if (l & 0xffff0000L)
226                         {
227                         if (l & 0xff000000L)
228                                 return(bits[(int)(l>>24L)]+24);
229                         else    return(bits[(int)(l>>16L)]+16);
230                         }
231                 else
232 #endif
233                         {
234 #if defined(SIXTEEN_BIT) || defined(THIRTY_TWO_BIT) || defined(SIXTY_FOUR_BIT) || defined(SIXTY_FOUR_BIT_LONG)
235                         if (l & 0xff00L)
236                                 return(bits[(int)(l>>8)]+8);
237                         else    
238 #endif
239                                 return(bits[(int)(l   )]  );
240                         }
241                 }
242         }
243
244 int BN_num_bits(const BIGNUM *a)
245         {
246         BN_ULONG l;
247         int i;
248
249         bn_check_top(a);
250
251         if (a->top == 0) return(0);
252         l=a->d[a->top-1];
253         assert(l != 0);
254         i=(a->top-1)*BN_BITS2;
255         return(i+BN_num_bits_word(l));
256         }
257
258 void BN_clear_free(BIGNUM *a)
259         {
260         int i;
261
262         if (a == NULL) return;
263         if (a->d != NULL)
264                 {
265                 memset(a->d,0,a->dmax*sizeof(a->d[0]));
266                 if (!(BN_get_flags(a,BN_FLG_STATIC_DATA)))
267                         OPENSSL_free(a->d);
268                 }
269         i=BN_get_flags(a,BN_FLG_MALLOCED);
270         memset(a,0,sizeof(BIGNUM));
271         if (i)
272                 OPENSSL_free(a);
273         }
274
275 void BN_free(BIGNUM *a)
276         {
277         if (a == NULL) return;
278         if ((a->d != NULL) && !(BN_get_flags(a,BN_FLG_STATIC_DATA)))
279                 OPENSSL_free(a->d);
280         a->flags|=BN_FLG_FREE; /* REMOVE? */
281         if (a->flags & BN_FLG_MALLOCED)
282                 OPENSSL_free(a);
283         }
284
285 void BN_init(BIGNUM *a)
286         {
287         memset(a,0,sizeof(BIGNUM));
288         }
289
290 BIGNUM *BN_new(void)
291         {
292         BIGNUM *ret;
293
294         if ((ret=(BIGNUM *)OPENSSL_malloc(sizeof(BIGNUM))) == NULL)
295                 {
296                 BNerr(BN_F_BN_NEW,ERR_R_MALLOC_FAILURE);
297                 return(NULL);
298                 }
299         ret->flags=BN_FLG_MALLOCED;
300         ret->top=0;
301         ret->neg=0;
302         ret->dmax=0;
303         ret->d=NULL;
304         return(ret);
305         }
306
307 /* This is used both by bn_expand2() and bn_dup_expand() */
308 /* The caller MUST check that words > b->dmax before calling this */
309 static BN_ULONG *internal_bn_expand(const BIGNUM *b, int words)
310         {
311         BN_ULONG *A,*a = NULL;
312         const BN_ULONG *B;
313         int i;
314
315         bn_check_top(b);        
316         if (BN_get_flags(b,BN_FLG_STATIC_DATA))
317                 {
318                 BNerr(BN_F_BN_EXPAND2,BN_R_EXPAND_ON_STATIC_BIGNUM_DATA);
319                 return(NULL);
320                 }
321         a=A=(BN_ULONG *)OPENSSL_malloc(sizeof(BN_ULONG)*(words+1));
322         if (A == NULL)
323                 {
324                 BNerr(BN_F_BN_EXPAND2,ERR_R_MALLOC_FAILURE);
325                 return(NULL);
326                 }
327 #if 1
328         B=b->d;
329         /* Check if the previous number needs to be copied */
330         if (B != NULL)
331                 {
332 #if 0
333                 /* This lot is an unrolled loop to copy b->top 
334                  * BN_ULONGs from B to A
335                  */
336 /*
337  * I have nothing against unrolling but it's usually done for
338  * several reasons, namely:
339  * - minimize percentage of decision making code, i.e. branches;
340  * - avoid cache trashing;
341  * - make it possible to schedule loads earlier;
342  * Now let's examine the code below. The cornerstone of C is
343  * "programmer is always right" and that's what we love it for:-)
344  * For this very reason C compilers have to be paranoid when it
345  * comes to data aliasing and assume the worst. Yeah, but what
346  * does it mean in real life? This means that loop body below will
347  * be compiled to sequence of loads immediately followed by stores
348  * as compiler assumes the worst, something in A==B+1 style. As a
349  * result CPU pipeline is going to starve for incoming data. Secondly
350  * if A and B happen to share same cache line such code is going to
351  * cause severe cache trashing. Both factors have severe impact on
352  * performance of modern CPUs and this is the reason why this
353  * particular piece of code is #ifdefed away and replaced by more
354  * "friendly" version found in #else section below. This comment
355  * also applies to BN_copy function.
356  *
357  *                                      <appro@fy.chalmers.se>
358  */
359                 for (i=b->top&(~7); i>0; i-=8)
360                         {
361                         A[0]=B[0]; A[1]=B[1]; A[2]=B[2]; A[3]=B[3];
362                         A[4]=B[4]; A[5]=B[5]; A[6]=B[6]; A[7]=B[7];
363                         A+=8;
364                         B+=8;
365                         }
366                 switch (b->top&7)
367                         {
368                 case 7:
369                         A[6]=B[6];
370                 case 6:
371                         A[5]=B[5];
372                 case 5:
373                         A[4]=B[4];
374                 case 4:
375                         A[3]=B[3];
376                 case 3:
377                         A[2]=B[2];
378                 case 2:
379                         A[1]=B[1];
380                 case 1:
381                         A[0]=B[0];
382                 case 0:
383                         /* I need the 'case 0' entry for utrix cc.
384                          * If the optimizer is turned on, it does the
385                          * switch table by doing
386                          * a=top&7
387                          * a--;
388                          * goto jump_table[a];
389                          * If top is 0, this makes us jump to 0xffffffc 
390                          * which is rather bad :-(.
391                          * eric 23-Apr-1998
392                          */
393                         ;
394                         }
395 #else
396                 for (i=b->top>>2; i>0; i--,A+=4,B+=4)
397                         {
398                         /*
399                          * The fact that the loop is unrolled
400                          * 4-wise is a tribute to Intel. It's
401                          * the one that doesn't have enough
402                          * registers to accomodate more data.
403                          * I'd unroll it 8-wise otherwise:-)
404                          *
405                          *              <appro@fy.chalmers.se>
406                          */
407                         BN_ULONG a0,a1,a2,a3;
408                         a0=B[0]; a1=B[1]; a2=B[2]; a3=B[3];
409                         A[0]=a0; A[1]=a1; A[2]=a2; A[3]=a3;
410                         }
411                 switch (b->top&3)
412                         {
413                 case 3: A[2]=B[2];
414                 case 2: A[1]=B[1];
415                 case 1: A[0]=B[0];
416                 case 0: ; /* ultrix cc workaround, see above */
417                         }
418 #endif
419                 }
420
421         /* Now need to zero any data between b->top and b->max */
422
423         A= &(a[b->top]);
424         for (i=(words - b->top)>>3; i>0; i--,A+=8)
425                 {
426                 A[0]=0; A[1]=0; A[2]=0; A[3]=0;
427                 A[4]=0; A[5]=0; A[6]=0; A[7]=0;
428                 }
429         for (i=(words - b->top)&7; i>0; i--,A++)
430                 A[0]=0;
431 #else
432         memset(A,0,sizeof(BN_ULONG)*(words+1));
433         memcpy(A,b->d,sizeof(b->d[0])*b->top);
434 #endif
435                 
436         return(a);
437         }
438
439 /* This is an internal function that can be used instead of bn_expand2()
440  * when there is a need to copy BIGNUMs instead of only expanding the
441  * data part, while still expanding them.
442  * Especially useful when needing to expand BIGNUMs that are declared
443  * 'const' and should therefore not be changed.
444  * The reason to use this instead of a BN_dup() followed by a bn_expand2()
445  * is memory allocation overhead.  A BN_dup() followed by a bn_expand2()
446  * will allocate new memory for the BIGNUM data twice, and free it once,
447  * while bn_dup_expand() makes sure allocation is made only once.
448  */
449
450 BIGNUM *bn_dup_expand(const BIGNUM *b, int words)
451         {
452         BIGNUM *r = NULL;
453
454         if (words > b->dmax)
455                 {
456                 BN_ULONG *a = internal_bn_expand(b, words);
457
458                 if (a)
459                         {
460                         r = BN_new();
461                         if (r)
462                                 {
463                                 r->top = b->top;
464                                 r->dmax = words;
465                                 r->neg = b->neg;
466                                 r->d = a;
467                                 }
468                         else
469                                 {
470                                 /* r == NULL, BN_new failure */
471                                 OPENSSL_free(a);
472                                 }
473                         }
474                 /* If a == NULL, there was an error in allocation in
475                    internal_bn_expand(), and NULL should be returned */
476                 }
477         else
478                 {
479                 r = BN_dup(b);
480                 }
481
482         return r;
483         }
484
485 /* This is an internal function that should not be used in applications.
486  * It ensures that 'b' has enough room for a 'words' word number number.
487  * It is mostly used by the various BIGNUM routines. If there is an error,
488  * NULL is returned. If not, 'b' is returned. */
489
490 BIGNUM *bn_expand2(BIGNUM *b, int words)
491         {
492         if (words > b->dmax)
493                 {
494                 BN_ULONG *a = internal_bn_expand(b, words);
495
496                 if (a)
497                         {
498                         OPENSSL_free(b->d);
499                         b->d=a;
500                         b->dmax=words;
501                         }
502                 else
503                         b = NULL;
504                 }
505         return b;
506         }
507
508 BIGNUM *BN_dup(const BIGNUM *a)
509         {
510         BIGNUM *r, *t;
511
512         if (a == NULL) return NULL;
513
514         bn_check_top(a);
515
516         t = BN_new();
517         if (t == NULL) return(NULL);
518         r = BN_copy(t, a);
519         /* now  r == t || r == NULL */
520         if (r == NULL)
521                 BN_free(t);
522         return r;
523         }
524
525 BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
526         {
527         int i;
528         BN_ULONG *A;
529         const BN_ULONG *B;
530
531         bn_check_top(b);
532
533         if (a == b) return(a);
534         if (bn_wexpand(a,b->top) == NULL) return(NULL);
535
536 #if 1
537         A=a->d;
538         B=b->d;
539         for (i=b->top>>2; i>0; i--,A+=4,B+=4)
540                 {
541                 BN_ULONG a0,a1,a2,a3;
542                 a0=B[0]; a1=B[1]; a2=B[2]; a3=B[3];
543                 A[0]=a0; A[1]=a1; A[2]=a2; A[3]=a3;
544                 }
545         switch (b->top&3)
546                 {
547                 case 3: A[2]=B[2];
548                 case 2: A[1]=B[1];
549                 case 1: A[0]=B[0];
550                 case 0: ; /* ultrix cc workaround, see comments in bn_expand2 */
551                 }
552 #else
553         memcpy(a->d,b->d,sizeof(b->d[0])*b->top);
554 #endif
555
556 /*      memset(&(a->d[b->top]),0,sizeof(a->d[0])*(a->max-b->top));*/
557         a->top=b->top;
558         if ((a->top == 0) && (a->d != NULL))
559                 a->d[0]=0;
560         a->neg=b->neg;
561         return(a);
562         }
563
564 void BN_swap(BIGNUM *a, BIGNUM *b)
565         {
566         int flags_old_a, flags_old_b;
567         BN_ULONG *tmp_d;
568         int tmp_top, tmp_dmax, tmp_neg;
569         
570         flags_old_a = a->flags;
571         flags_old_b = b->flags;
572
573         tmp_d = a->d;
574         tmp_top = a->top;
575         tmp_dmax = a->dmax;
576         tmp_neg = a->neg;
577         
578         a->d = b->d;
579         a->top = b->top;
580         a->dmax = b->dmax;
581         a->neg = b->neg;
582         
583         b->d = tmp_d;
584         b->top = tmp_top;
585         b->dmax = tmp_dmax;
586         b->neg = tmp_neg;
587         
588         a->flags = (flags_old_a & BN_FLG_MALLOCED) | (flags_old_b & BN_FLG_STATIC_DATA);
589         b->flags = (flags_old_b & BN_FLG_MALLOCED) | (flags_old_a & BN_FLG_STATIC_DATA);
590         }
591
592
593 void BN_clear(BIGNUM *a)
594         {
595         if (a->d != NULL)
596                 memset(a->d,0,a->dmax*sizeof(a->d[0]));
597         a->top=0;
598         a->neg=0;
599         }
600
601 BN_ULONG BN_get_word(const BIGNUM *a)
602         {
603         int i,n;
604         BN_ULONG ret=0;
605
606         n=BN_num_bytes(a);
607         if (n > sizeof(BN_ULONG))
608                 return(BN_MASK2);
609         for (i=a->top-1; i>=0; i--)
610                 {
611 #ifndef SIXTY_FOUR_BIT /* the data item > unsigned long */
612                 ret<<=BN_BITS4; /* stops the compiler complaining */
613                 ret<<=BN_BITS4;
614 #else
615                 ret=0;
616 #endif
617                 ret|=a->d[i];
618                 }
619         return(ret);
620         }
621
622 int BN_set_word(BIGNUM *a, BN_ULONG w)
623         {
624         int i,n;
625         if (bn_expand(a,sizeof(BN_ULONG)*8) == NULL) return(0);
626
627         n=sizeof(BN_ULONG)/BN_BYTES;
628         a->neg=0;
629         a->top=0;
630         a->d[0]=(BN_ULONG)w&BN_MASK2;
631         if (a->d[0] != 0) a->top=1;
632         for (i=1; i<n; i++)
633                 {
634                 /* the following is done instead of
635                  * w>>=BN_BITS2 so compilers don't complain
636                  * on builds where sizeof(long) == BN_TYPES */
637 #ifndef SIXTY_FOUR_BIT /* the data item > unsigned long */
638                 w>>=BN_BITS4;
639                 w>>=BN_BITS4;
640 #else
641                 w=0;
642 #endif
643                 a->d[i]=(BN_ULONG)w&BN_MASK2;
644                 if (a->d[i] != 0) a->top=i+1;
645                 }
646         return(1);
647         }
648
649 /* ignore negative */
650 BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret)
651         {
652         unsigned int i,m;
653         unsigned int n;
654         BN_ULONG l;
655
656         if (ret == NULL) ret=BN_new();
657         if (ret == NULL) return(NULL);
658         l=0;
659         n=len;
660         if (n == 0)
661                 {
662                 ret->top=0;
663                 return(ret);
664                 }
665         if (bn_expand(ret,(int)(n+2)*8) == NULL)
666                 return(NULL);
667         i=((n-1)/BN_BYTES)+1;
668         m=((n-1)%(BN_BYTES));
669         ret->top=i;
670         while (n-- > 0)
671                 {
672                 l=(l<<8L)| *(s++);
673                 if (m-- == 0)
674                         {
675                         ret->d[--i]=l;
676                         l=0;
677                         m=BN_BYTES-1;
678                         }
679                 }
680         /* need to call this due to clear byte at top if avoiding
681          * having the top bit set (-ve number) */
682         bn_fix_top(ret);
683         return(ret);
684         }
685
686 /* ignore negative */
687 int BN_bn2bin(const BIGNUM *a, unsigned char *to)
688         {
689         int n,i;
690         BN_ULONG l;
691
692         n=i=BN_num_bytes(a);
693         while (i-- > 0)
694                 {
695                 l=a->d[i/BN_BYTES];
696                 *(to++)=(unsigned char)(l>>(8*(i%BN_BYTES)))&0xff;
697                 }
698         return(n);
699         }
700
701 int BN_ucmp(const BIGNUM *a, const BIGNUM *b)
702         {
703         int i;
704         BN_ULONG t1,t2,*ap,*bp;
705
706         bn_check_top(a);
707         bn_check_top(b);
708
709         i=a->top-b->top;
710         if (i != 0) return(i);
711         ap=a->d;
712         bp=b->d;
713         for (i=a->top-1; i>=0; i--)
714                 {
715                 t1= ap[i];
716                 t2= bp[i];
717                 if (t1 != t2)
718                         return(t1 > t2?1:-1);
719                 }
720         return(0);
721         }
722
723 int BN_cmp(const BIGNUM *a, const BIGNUM *b)
724         {
725         int i;
726         int gt,lt;
727         BN_ULONG t1,t2;
728
729         if ((a == NULL) || (b == NULL))
730                 {
731                 if (a != NULL)
732                         return(-1);
733                 else if (b != NULL)
734                         return(1);
735                 else
736                         return(0);
737                 }
738
739         bn_check_top(a);
740         bn_check_top(b);
741
742         if (a->neg != b->neg)
743                 {
744                 if (a->neg)
745                         return(-1);
746                 else    return(1);
747                 }
748         if (a->neg == 0)
749                 { gt=1; lt= -1; }
750         else    { gt= -1; lt=1; }
751
752         if (a->top > b->top) return(gt);
753         if (a->top < b->top) return(lt);
754         for (i=a->top-1; i>=0; i--)
755                 {
756                 t1=a->d[i];
757                 t2=b->d[i];
758                 if (t1 > t2) return(gt);
759                 if (t1 < t2) return(lt);
760                 }
761         return(0);
762         }
763
764 int BN_set_bit(BIGNUM *a, int n)
765         {
766         int i,j,k;
767
768         i=n/BN_BITS2;
769         j=n%BN_BITS2;
770         if (a->top <= i)
771                 {
772                 if (bn_wexpand(a,i+1) == NULL) return(0);
773                 for(k=a->top; k<i+1; k++)
774                         a->d[k]=0;
775                 a->top=i+1;
776                 }
777
778         a->d[i]|=(((BN_ULONG)1)<<j);
779         return(1);
780         }
781
782 int BN_clear_bit(BIGNUM *a, int n)
783         {
784         int i,j;
785
786         i=n/BN_BITS2;
787         j=n%BN_BITS2;
788         if (a->top <= i) return(0);
789
790         a->d[i]&=(~(((BN_ULONG)1)<<j));
791         bn_fix_top(a);
792         return(1);
793         }
794
795 int BN_is_bit_set(const BIGNUM *a, int n)
796         {
797         int i,j;
798
799         if (n < 0) return(0);
800         i=n/BN_BITS2;
801         j=n%BN_BITS2;
802         if (a->top <= i) return(0);
803         return((a->d[i]&(((BN_ULONG)1)<<j))?1:0);
804         }
805
806 int BN_mask_bits(BIGNUM *a, int n)
807         {
808         int b,w;
809
810         w=n/BN_BITS2;
811         b=n%BN_BITS2;
812         if (w >= a->top) return(0);
813         if (b == 0)
814                 a->top=w;
815         else
816                 {
817                 a->top=w+1;
818                 a->d[w]&= ~(BN_MASK2<<b);
819                 }
820         bn_fix_top(a);
821         return(1);
822         }
823
824 int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n)
825         {
826         int i;
827         BN_ULONG aa,bb;
828
829         aa=a[n-1];
830         bb=b[n-1];
831         if (aa != bb) return((aa > bb)?1:-1);
832         for (i=n-2; i>=0; i--)
833                 {
834                 aa=a[i];
835                 bb=b[i];
836                 if (aa != bb) return((aa > bb)?1:-1);
837                 }
838         return(0);
839         }
840