6 int bn_mull(BIGNUM *r,BIGNUM *a,BIGNUM *b, BN_CTX *ctx);
16 printf("bn_mull %d * %d\n",a->top,b->top);
28 if ((al < 4) || (bl < 4))
30 if (bn_wexpand(r,top) == NULL) return(0);
32 bn_mul_normal(r->d,a->d,al,b->d,bl);
35 else if (al == bl) /* A good start, they are the same size */
40 if ((i == 1) && !BN_get_flags(b,BN_FLG_STATIC_DATA))
47 else if ((i == -1) && !BN_get_flags(a,BN_FLG_STATIC_DATA))
56 /* asymetric and >= 4 */
57 if (bn_wexpand(r,top) == NULL) return(0);
59 bn_mul_normal(r->d,a->d,al,b->d,bl);
63 /* symetric and > 4 */
67 if (bn_wexpand(r,al*2) == NULL) return(0);
69 bn_mul_comba4(r->d,a->d,b->d);
74 if (bn_wexpand(r,al*2) == NULL) return(0);
76 bn_mul_comba8(r->d,a->d,b->d);
79 if (al <= BN_MULL_NORMAL_SIZE)
81 if (bn_wexpand(r,al*2) == NULL) return(0);
83 bn_mul_normal(r->d,a->d,al,b->d,bl);
87 j=BN_num_bits_word((BN_ULONG)al);
90 t= &(ctx->bn[ctx->tos]);
91 if (al == j) /* exact multiple */
95 bn_mul_recursive(r->d,a->d,b->d,al,t->d);
103 for (i=a->top; i<k; i++)
105 for (i=b->top; i<k; i++)
107 bn_mul_part_recursive(r->d,a->d,b->d,al-j,j,t->d);
117 void bn_mul_normal(r,a,na,b,nb)
126 printf(" bn_mul_normal %d * %d\n",na,nb);
134 itmp=na; na=nb; nb=itmp;
139 rr[0]=bn_mul_words(r,a,na,b[0]);
143 if (--nb <= 0) return;
144 rr[1]=bn_mul_add_words(&(r[1]),a,na,b[1]);
145 if (--nb <= 0) return;
146 rr[2]=bn_mul_add_words(&(r[2]),a,na,b[2]);
147 if (--nb <= 0) return;
148 rr[3]=bn_mul_add_words(&(r[3]),a,na,b[3]);
149 if (--nb <= 0) return;
150 rr[4]=bn_mul_add_words(&(r[4]),a,na,b[4]);
158 void bn_mul_low_normal(r,a,b,n)
163 printf(" bn_mul_low_normal %d * %d\n",n,n);
165 bn_mul_words(r,a,n,b[0]);
169 if (--n <= 0) return;
170 bn_mul_add_words(&(r[1]),a,n,b[1]);
171 if (--n <= 0) return;
172 bn_mul_add_words(&(r[2]),a,n,b[2]);
173 if (--n <= 0) return;
174 bn_mul_add_words(&(r[3]),a,n,b[3]);
175 if (--n <= 0) return;
176 bn_mul_add_words(&(r[4]),a,n,b[4]);