summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/bn/bn_local.h6
-rw-r--r--src/lib/libcrypto/bn/bn_mont.c74
2 files changed, 5 insertions, 75 deletions
diff --git a/src/lib/libcrypto/bn/bn_local.h b/src/lib/libcrypto/bn/bn_local.h
index d2c7a3983e..c763890695 100644
--- a/src/lib/libcrypto/bn/bn_local.h
+++ b/src/lib/libcrypto/bn/bn_local.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_local.h,v 1.13 2023/02/19 15:45:14 tb Exp $ */ 1/* $OpenBSD: bn_local.h,v 1.14 2023/02/21 05:58:08 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -132,9 +132,7 @@ struct bn_mont_ctx_st {
132 int ri; /* number of bits in R */ 132 int ri; /* number of bits in R */
133 BIGNUM RR; /* used to convert to montgomery form */ 133 BIGNUM RR; /* used to convert to montgomery form */
134 BIGNUM N; /* The modulus */ 134 BIGNUM N; /* The modulus */
135 BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1 135 BN_ULONG n0[2];/* least significant word(s) of Ni; R*(1/R mod N) - N*Ni = 1
136 * (Ni is only stored for bignum algorithm) */
137 BN_ULONG n0[2];/* least significant word(s) of Ni;
138 (type changed with 0.9.9, was "BN_ULONG n0;" before) */ 136 (type changed with 0.9.9, was "BN_ULONG n0;" before) */
139 int flags; 137 int flags;
140}; 138};
diff --git a/src/lib/libcrypto/bn/bn_mont.c b/src/lib/libcrypto/bn/bn_mont.c
index 89df675459..53ad5aac63 100644
--- a/src/lib/libcrypto/bn/bn_mont.c
+++ b/src/lib/libcrypto/bn/bn_mont.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_mont.c,v 1.42 2023/02/19 15:45:14 tb Exp $ */ 1/* $OpenBSD: bn_mont.c,v 1.43 2023/02/21 05:58:08 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -122,8 +122,6 @@
122 122
123#include "bn_local.h" 123#include "bn_local.h"
124 124
125#define MONT_WORD /* use the faster word-based algorithm */
126
127BN_MONT_CTX * 125BN_MONT_CTX *
128BN_MONT_CTX_new(void) 126BN_MONT_CTX_new(void)
129{ 127{
@@ -135,7 +133,6 @@ BN_MONT_CTX_new(void)
135 133
136 BN_init(&mctx->RR); 134 BN_init(&mctx->RR);
137 BN_init(&mctx->N); 135 BN_init(&mctx->N);
138 BN_init(&mctx->Ni);
139 136
140 return mctx; 137 return mctx;
141} 138}
@@ -147,7 +144,6 @@ BN_MONT_CTX_init(BN_MONT_CTX *mctx)
147 144
148 BN_init(&mctx->RR); 145 BN_init(&mctx->RR);
149 BN_init(&mctx->N); 146 BN_init(&mctx->N);
150 BN_init(&mctx->Ni);
151} 147}
152 148
153void 149void
@@ -158,7 +154,6 @@ BN_MONT_CTX_free(BN_MONT_CTX *mctx)
158 154
159 BN_free(&mctx->RR); 155 BN_free(&mctx->RR);
160 BN_free(&mctx->N); 156 BN_free(&mctx->N);
161 BN_free(&mctx->Ni);
162 157
163 if (mctx->flags & BN_FLG_MALLOCED) 158 if (mctx->flags & BN_FLG_MALLOCED)
164 free(mctx); 159 free(mctx);
@@ -174,8 +169,6 @@ BN_MONT_CTX_copy(BN_MONT_CTX *dst, BN_MONT_CTX *src)
174 return NULL; 169 return NULL;
175 if (!BN_copy(&dst->N, &src->N)) 170 if (!BN_copy(&dst->N, &src->N))
176 return NULL; 171 return NULL;
177 if (!BN_copy(&dst->Ni, &src->Ni))
178 return NULL;
179 172
180 dst->ri = src->ri; 173 dst->ri = src->ri;
181 dst->n0[0] = src->n0[0]; 174 dst->n0[0] = src->n0[0];
@@ -201,7 +194,6 @@ BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx)
201 goto err; /* Set N */ 194 goto err; /* Set N */
202 mont->N.neg = 0; 195 mont->N.neg = 0;
203 196
204#ifdef MONT_WORD
205 { 197 {
206 BIGNUM tmod; 198 BIGNUM tmod;
207 BN_ULONG buf[2]; 199 BN_ULONG buf[2];
@@ -284,24 +276,6 @@ BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx)
284 mont->n0[1] = 0; 276 mont->n0[1] = 0;
285#endif 277#endif
286 } 278 }
287#else /* !MONT_WORD */
288 { /* bignum version */
289 mont->ri = BN_num_bits(&mont->N);
290 BN_zero(R);
291 if (!BN_set_bit(R, mont->ri))
292 goto err; /* R = 2^ri */
293 /* Ri = R^-1 mod N*/
294 if ((BN_mod_inverse_ct(Ri, R, &mont->N, ctx)) == NULL)
295 goto err;
296 if (!BN_lshift(Ri, Ri, mont->ri))
297 goto err; /* R*Ri */
298 if (!BN_sub_word(Ri, 1))
299 goto err;
300 /* Ni = (R*Ri-1) / N */
301 if (!BN_div_ct(&(mont->Ni), NULL, Ri, &mont->N, ctx))
302 goto err;
303 }
304#endif
305 279
306 /* setup RR for conversions */ 280 /* setup RR for conversions */
307 BN_zero(&(mont->RR)); 281 BN_zero(&(mont->RR));
@@ -406,9 +380,7 @@ bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,
406#endif /* !OPENSSL_BN_ASM_MONT */ 380#endif /* !OPENSSL_BN_ASM_MONT */
407#endif /* OPENSSL_NO_ASM */ 381#endif /* OPENSSL_NO_ASM */
408 382
409#ifdef MONT_WORD
410static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont); 383static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont);
411#endif
412 384
413int 385int
414BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, 386BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
@@ -416,7 +388,8 @@ BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
416{ 388{
417 BIGNUM *tmp; 389 BIGNUM *tmp;
418 int ret = 0; 390 int ret = 0;
419#if defined(OPENSSL_BN_ASM_MONT) && defined(MONT_WORD) 391
392#if defined(OPENSSL_BN_ASM_MONT)
420 int num = mont->N.top; 393 int num = mont->N.top;
421 394
422 if (num > 1 && a->top == num && b->top == num) { 395 if (num > 1 && a->top == num && b->top == num) {
@@ -443,13 +416,8 @@ BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
443 goto err; 416 goto err;
444 } 417 }
445 /* reduce from aRR to aR */ 418 /* reduce from aRR to aR */
446#ifdef MONT_WORD
447 if (!BN_from_montgomery_word(r, tmp, mont)) 419 if (!BN_from_montgomery_word(r, tmp, mont))
448 goto err; 420 goto err;
449#else
450 if (!BN_from_montgomery(r, tmp, mont, ctx))
451 goto err;
452#endif
453 ret = 1; 421 ret = 1;
454err: 422err:
455 BN_CTX_end(ctx); 423 BN_CTX_end(ctx);
@@ -462,7 +430,6 @@ BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, BN_CTX *ctx)
462 return BN_mod_mul_montgomery(r, a, &mont->RR, mont, ctx); 430 return BN_mod_mul_montgomery(r, a, &mont->RR, mont, ctx);
463} 431}
464 432
465#ifdef MONT_WORD
466static int 433static int
467BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont) 434BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
468{ 435{
@@ -553,51 +520,16 @@ BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
553 520
554 return (1); 521 return (1);
555} 522}
556#endif /* MONT_WORD */
557 523
558int 524int
559BN_from_montgomery(BIGNUM *ret, const BIGNUM *a, BN_MONT_CTX *mont, BN_CTX *ctx) 525BN_from_montgomery(BIGNUM *ret, const BIGNUM *a, BN_MONT_CTX *mont, BN_CTX *ctx)
560{ 526{
561 int retn = 0; 527 int retn = 0;
562#ifdef MONT_WORD
563 BIGNUM *t; 528 BIGNUM *t;
564 529
565 BN_CTX_start(ctx); 530 BN_CTX_start(ctx);
566 if ((t = BN_CTX_get(ctx)) && BN_copy(t, a)) 531 if ((t = BN_CTX_get(ctx)) && BN_copy(t, a))
567 retn = BN_from_montgomery_word(ret, t, mont); 532 retn = BN_from_montgomery_word(ret, t, mont);
568 BN_CTX_end(ctx); 533 BN_CTX_end(ctx);
569#else /* !MONT_WORD */
570 BIGNUM *t1, *t2;
571
572 BN_CTX_start(ctx);
573 if ((t1 = BN_CTX_get(ctx)) == NULL)
574 goto err;
575 if ((t2 = BN_CTX_get(ctx)) == NULL)
576 goto err;
577
578 if (!BN_copy(t1, a))
579 goto err;
580 BN_mask_bits(t1, mont->ri);
581
582 if (!BN_mul(t2, t1, &mont->Ni, ctx))
583 goto err;
584 BN_mask_bits(t2, mont->ri);
585
586 if (!BN_mul(t1, t2, &mont->N, ctx))
587 goto err;
588 if (!BN_add(t2, a, t1))
589 goto err;
590 if (!BN_rshift(ret, t2, mont->ri))
591 goto err;
592
593 if (BN_ucmp(ret, &(mont->N)) >= 0) {
594 if (!BN_usub(ret, ret, &(mont->N)))
595 goto err;
596 }
597 retn = 1;
598
599err:
600 BN_CTX_end(ctx);
601#endif /* MONT_WORD */
602 return (retn); 534 return (retn);
603} 535}