diff options
Diffstat (limited to 'src/lib/libcrypto/bn/bn_mont.c')
-rw-r--r-- | src/lib/libcrypto/bn/bn_mont.c | 63 |
1 files changed, 33 insertions, 30 deletions
diff --git a/src/lib/libcrypto/bn/bn_mont.c b/src/lib/libcrypto/bn/bn_mont.c index 8cf1febacc..82942a4759 100644 --- a/src/lib/libcrypto/bn/bn_mont.c +++ b/src/lib/libcrypto/bn/bn_mont.c | |||
@@ -69,20 +69,17 @@ | |||
69 | 69 | ||
70 | #define MONT_WORD /* use the faster word-based algorithm */ | 70 | #define MONT_WORD /* use the faster word-based algorithm */ |
71 | 71 | ||
72 | int BN_mod_mul_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *b, | 72 | int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
73 | BN_MONT_CTX *mont, BN_CTX *ctx) | 73 | BN_MONT_CTX *mont, BN_CTX *ctx) |
74 | { | 74 | { |
75 | BIGNUM *tmp,*tmp2; | 75 | BIGNUM *tmp; |
76 | int ret=0; | 76 | int ret=0; |
77 | 77 | ||
78 | BN_CTX_start(ctx); | 78 | BN_CTX_start(ctx); |
79 | tmp = BN_CTX_get(ctx); | 79 | tmp = BN_CTX_get(ctx); |
80 | tmp2 = BN_CTX_get(ctx); | 80 | if (tmp == NULL) goto err; |
81 | if (tmp == NULL || tmp2 == NULL) goto err; | ||
82 | 81 | ||
83 | bn_check_top(tmp); | 82 | bn_check_top(tmp); |
84 | bn_check_top(tmp2); | ||
85 | |||
86 | if (a == b) | 83 | if (a == b) |
87 | { | 84 | { |
88 | if (!BN_sqr(tmp,a,ctx)) goto err; | 85 | if (!BN_sqr(tmp,a,ctx)) goto err; |
@@ -99,7 +96,7 @@ err: | |||
99 | return(ret); | 96 | return(ret); |
100 | } | 97 | } |
101 | 98 | ||
102 | int BN_from_montgomery(BIGNUM *ret, BIGNUM *a, BN_MONT_CTX *mont, | 99 | int BN_from_montgomery(BIGNUM *ret, const BIGNUM *a, BN_MONT_CTX *mont, |
103 | BN_CTX *ctx) | 100 | BN_CTX *ctx) |
104 | { | 101 | { |
105 | int retn=0; | 102 | int retn=0; |
@@ -144,7 +141,7 @@ int BN_from_montgomery(BIGNUM *ret, BIGNUM *a, BN_MONT_CTX *mont, | |||
144 | n0=mont->n0; | 141 | n0=mont->n0; |
145 | 142 | ||
146 | #ifdef BN_COUNT | 143 | #ifdef BN_COUNT |
147 | printf("word BN_from_montgomery %d * %d\n",nl,nl); | 144 | fprintf(stderr,"word BN_from_montgomery %d * %d\n",nl,nl); |
148 | #endif | 145 | #endif |
149 | for (i=0; i<nl; i++) | 146 | for (i=0; i<nl; i++) |
150 | { | 147 | { |
@@ -229,7 +226,7 @@ int BN_from_montgomery(BIGNUM *ret, BIGNUM *a, BN_MONT_CTX *mont, | |||
229 | 226 | ||
230 | if (BN_ucmp(ret, &(mont->N)) >= 0) | 227 | if (BN_ucmp(ret, &(mont->N)) >= 0) |
231 | { | 228 | { |
232 | BN_usub(ret,ret,&(mont->N)); | 229 | if (!BN_usub(ret,ret,&(mont->N))) goto err; |
233 | } | 230 | } |
234 | retn=1; | 231 | retn=1; |
235 | err: | 232 | err: |
@@ -277,6 +274,7 @@ int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx) | |||
277 | BN_init(&Ri); | 274 | BN_init(&Ri); |
278 | R= &(mont->RR); /* grab RR as a temp */ | 275 | R= &(mont->RR); /* grab RR as a temp */ |
279 | BN_copy(&(mont->N),mod); /* Set N */ | 276 | BN_copy(&(mont->N),mod); /* Set N */ |
277 | mont->N.neg = 0; | ||
280 | 278 | ||
281 | #ifdef MONT_WORD | 279 | #ifdef MONT_WORD |
282 | { | 280 | { |
@@ -292,40 +290,45 @@ int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx) | |||
292 | tmod.d=buf; | 290 | tmod.d=buf; |
293 | tmod.top=1; | 291 | tmod.top=1; |
294 | tmod.dmax=2; | 292 | tmod.dmax=2; |
295 | tmod.neg=mod->neg; | 293 | tmod.neg=0; |
296 | /* Ri = R^-1 mod N*/ | 294 | /* Ri = R^-1 mod N*/ |
297 | if ((BN_mod_inverse(&Ri,R,&tmod,ctx)) == NULL) | 295 | if ((BN_mod_inverse(&Ri,R,&tmod,ctx)) == NULL) |
298 | goto err; | 296 | goto err; |
299 | BN_lshift(&Ri,&Ri,BN_BITS2); /* R*Ri */ | 297 | if (!BN_lshift(&Ri,&Ri,BN_BITS2)) goto err; /* R*Ri */ |
300 | if (!BN_is_zero(&Ri)) | 298 | if (!BN_is_zero(&Ri)) |
301 | BN_sub_word(&Ri,1); | 299 | { |
300 | if (!BN_sub_word(&Ri,1)) goto err; | ||
301 | } | ||
302 | else /* if N mod word size == 1 */ | 302 | else /* if N mod word size == 1 */ |
303 | BN_set_word(&Ri,BN_MASK2); /* Ri-- (mod word size) */ | 303 | { |
304 | BN_div(&Ri,NULL,&Ri,&tmod,ctx); /* Ni = (R*Ri-1)/N, | 304 | if (!BN_set_word(&Ri,BN_MASK2)) goto err; /* Ri-- (mod word size) */ |
305 | * keep only least significant word: */ | 305 | } |
306 | mont->n0=Ri.d[0]; | 306 | if (!BN_div(&Ri,NULL,&Ri,&tmod,ctx)) goto err; |
307 | /* Ni = (R*Ri-1)/N, | ||
308 | * keep only least significant word: */ | ||
309 | mont->n0 = (Ri.top > 0) ? Ri.d[0] : 0; | ||
307 | BN_free(&Ri); | 310 | BN_free(&Ri); |
308 | } | 311 | } |
309 | #else /* !MONT_WORD */ | 312 | #else /* !MONT_WORD */ |
310 | { /* bignum version */ | 313 | { /* bignum version */ |
311 | mont->ri=BN_num_bits(mod); | 314 | mont->ri=BN_num_bits(&mont->N); |
312 | BN_zero(R); | 315 | if (!BN_zero(R)) goto err; |
313 | BN_set_bit(R,mont->ri); /* R = 2^ri */ | 316 | if (!BN_set_bit(R,mont->ri)) goto err; /* R = 2^ri */ |
314 | /* Ri = R^-1 mod N*/ | 317 | /* Ri = R^-1 mod N*/ |
315 | if ((BN_mod_inverse(&Ri,R,mod,ctx)) == NULL) | 318 | if ((BN_mod_inverse(&Ri,R,&mont->N,ctx)) == NULL) |
316 | goto err; | 319 | goto err; |
317 | BN_lshift(&Ri,&Ri,mont->ri); /* R*Ri */ | 320 | if (!BN_lshift(&Ri,&Ri,mont->ri)) goto err; /* R*Ri */ |
318 | BN_sub_word(&Ri,1); | 321 | if (!BN_sub_word(&Ri,1)) goto err; |
319 | /* Ni = (R*Ri-1) / N */ | 322 | /* Ni = (R*Ri-1) / N */ |
320 | BN_div(&(mont->Ni),NULL,&Ri,mod,ctx); | 323 | if (!BN_div(&(mont->Ni),NULL,&Ri,&mont->N,ctx)) goto err; |
321 | BN_free(&Ri); | 324 | BN_free(&Ri); |
322 | } | 325 | } |
323 | #endif | 326 | #endif |
324 | 327 | ||
325 | /* setup RR for conversions */ | 328 | /* setup RR for conversions */ |
326 | BN_zero(&(mont->RR)); | 329 | if (!BN_zero(&(mont->RR))) goto err; |
327 | BN_set_bit(&(mont->RR),mont->ri*2); | 330 | if (!BN_set_bit(&(mont->RR),mont->ri*2)) goto err; |
328 | BN_mod(&(mont->RR),&(mont->RR),&(mont->N),ctx); | 331 | if (!BN_mod(&(mont->RR),&(mont->RR),&(mont->N),ctx)) goto err; |
329 | 332 | ||
330 | return(1); | 333 | return(1); |
331 | err: | 334 | err: |
@@ -336,9 +339,9 @@ BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from) | |||
336 | { | 339 | { |
337 | if (to == from) return(to); | 340 | if (to == from) return(to); |
338 | 341 | ||
339 | BN_copy(&(to->RR),&(from->RR)); | 342 | if (!BN_copy(&(to->RR),&(from->RR))) return NULL; |
340 | BN_copy(&(to->N),&(from->N)); | 343 | if (!BN_copy(&(to->N),&(from->N))) return NULL; |
341 | BN_copy(&(to->Ni),&(from->Ni)); | 344 | if (!BN_copy(&(to->Ni),&(from->Ni))) return NULL; |
342 | to->ri=from->ri; | 345 | to->ri=from->ri; |
343 | to->n0=from->n0; | 346 | to->n0=from->n0; |
344 | return(to); | 347 | return(to); |