diff options
Diffstat (limited to 'src/crypto/bn/exponentiation.c')
-rw-r--r-- | src/crypto/bn/exponentiation.c | 94 |
1 files changed, 40 insertions, 54 deletions
diff --git a/src/crypto/bn/exponentiation.c b/src/crypto/bn/exponentiation.c index 9cefa62..c580248 100644 --- a/src/crypto/bn/exponentiation.c +++ b/src/crypto/bn/exponentiation.c @@ -613,17 +613,17 @@ int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, } int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont) { + const BIGNUM *m, BN_CTX *ctx, const BN_MONT_CTX *mont) { int i, j, bits, ret = 0, wstart, window; int start = 1; BIGNUM *d, *r; const BIGNUM *aa; /* Table of variables obtained from 'ctx' */ BIGNUM *val[TABLE_SIZE]; - BN_MONT_CTX *mont = NULL; + BN_MONT_CTX *new_mont = NULL; if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0) { - return BN_mod_exp_mont_consttime(rr, a, p, m, ctx, in_mont); + return BN_mod_exp_mont_consttime(rr, a, p, m, ctx, mont); } if (!BN_is_odd(m)) { @@ -644,18 +644,13 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, goto err; } - /* If this is not done, things will break in the montgomery part */ - - if (in_mont != NULL) { - mont = in_mont; - } else { - mont = BN_MONT_CTX_new(); - if (mont == NULL) { - goto err; - } - if (!BN_MONT_CTX_set(mont, m, ctx)) { + /* Allocate a montgomery context if it was not supplied by the caller. */ + if (mont == NULL) { + new_mont = BN_MONT_CTX_new(); + if (new_mont == NULL || !BN_MONT_CTX_set(new_mont, m, ctx)) { goto err; } + mont = new_mont; } if (a->neg || BN_ucmp(a, m) >= 0) { @@ -774,9 +769,7 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, ret = 1; err: - if (in_mont == NULL) { - BN_MONT_CTX_free(mont); - } + BN_MONT_CTX_free(new_mont); BN_CTX_end(ctx); return ret; } @@ -862,10 +855,10 @@ static int copy_from_prebuf(BIGNUM *b, int top, unsigned char *buf, int idx, */ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, - BN_MONT_CTX *in_mont) { + const BN_MONT_CTX *mont) { int i, bits, ret = 0, window, wvalue; int top; - BN_MONT_CTX *mont = NULL; + BN_MONT_CTX *new_mont = NULL; int numPowers; unsigned char *powerbufFree = NULL; @@ -888,15 +881,13 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, BN_CTX_start(ctx); - /* Allocate a montgomery context if it was not supplied by the caller. - * If this is not done, things will break in the montgomery part. */ - if (in_mont != NULL) { - mont = in_mont; - } else { - mont = BN_MONT_CTX_new(); - if (mont == NULL || !BN_MONT_CTX_set(mont, m, ctx)) { + /* Allocate a montgomery context if it was not supplied by the caller. */ + if (mont == NULL) { + new_mont = BN_MONT_CTX_new(); + if (new_mont == NULL || !BN_MONT_CTX_set(new_mont, m, ctx)) { goto err; } + mont = new_mont; } #ifdef RSAZ_ENABLED @@ -1005,7 +996,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, /* Dedicated window==4 case improves 512-bit RSA sign by ~15%, but as * 512-bit RSA is hardly relevant, we omit it to spare size... */ if (window == 5 && top > 1) { - BN_ULONG *np = mont->N.d, *n0 = mont->n0, *np2; + const BN_ULONG *np = mont->N.d, *n0 = mont->n0, *np2; /* BN_to_montgomery can contaminate words above .top * [in BN_DEBUG[_DEBUG] build]... */ @@ -1019,9 +1010,11 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, if (top & 7) { np2 = np; } else { - for (np2 = am.d + top, i = 0; i < top; i++) { - np2[2 * i] = np[i]; + BN_ULONG *np_double = am.d + top; + for (i = 0; i < top; i++) { + np_double[2 * i] = np[i]; } + np2 = np_double; } bn_scatter5(tmp.d, top, powerbuf, 0); @@ -1186,10 +1179,9 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, goto err; } ret = 1; + err: - if (in_mont == NULL) { - BN_MONT_CTX_free(mont); - } + BN_MONT_CTX_free(new_mont); if (powerbuf != NULL) { OPENSSL_cleanse(powerbuf, powerbufLen); OPENSSL_free(powerbufFree); @@ -1199,8 +1191,9 @@ err: } int BN_mod_exp_mont_word(BIGNUM *rr, BN_ULONG a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont) { - BN_MONT_CTX *mont = NULL; + const BIGNUM *m, BN_CTX *ctx, + const BN_MONT_CTX *mont) { + BN_MONT_CTX *new_mont = NULL; int b, bits, ret = 0; int r_is_one; BN_ULONG w, next_w; @@ -1258,13 +1251,13 @@ int BN_mod_exp_mont_word(BIGNUM *rr, BN_ULONG a, const BIGNUM *p, goto err; } - if (in_mont != NULL) { - mont = in_mont; - } else { - mont = BN_MONT_CTX_new(); - if (mont == NULL || !BN_MONT_CTX_set(mont, m, ctx)) { + /* Allocate a montgomery context if it was not supplied by the caller. */ + if (mont == NULL) { + new_mont = BN_MONT_CTX_new(); + if (new_mont == NULL || !BN_MONT_CTX_set(new_mont, m, ctx)) { goto err; } + mont = new_mont; } r_is_one = 1; /* except for Montgomery factor */ @@ -1346,9 +1339,7 @@ int BN_mod_exp_mont_word(BIGNUM *rr, BN_ULONG a, const BIGNUM *p, ret = 1; err: - if (in_mont == NULL) { - BN_MONT_CTX_free(mont); - } + BN_MONT_CTX_free(new_mont); BN_CTX_end(ctx); return ret; } @@ -1357,7 +1348,7 @@ err: int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1, const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m, - BN_CTX *ctx, BN_MONT_CTX *in_mont) { + BN_CTX *ctx, const BN_MONT_CTX *mont) { int i, j, bits, b, bits1, bits2, ret = 0, wpos1, wpos2, window1, window2, wvalue1, wvalue2; int r_is_one = 1; @@ -1365,7 +1356,7 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1, const BIGNUM *a_mod_m; /* Tables of variables obtained from 'ctx' */ BIGNUM *val1[TABLE_SIZE], *val2[TABLE_SIZE]; - BN_MONT_CTX *mont = NULL; + BN_MONT_CTX *new_mont = NULL; if (!(m->d[0] & 1)) { OPENSSL_PUT_ERROR(BN, BN_R_CALLED_WITH_EVEN_MODULUS); @@ -1389,16 +1380,13 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1, goto err; } - if (in_mont != NULL) { - mont = in_mont; - } else { - mont = BN_MONT_CTX_new(); - if (mont == NULL) { - goto err; - } - if (!BN_MONT_CTX_set(mont, m, ctx)) { + /* Allocate a montgomery context if it was not supplied by the caller. */ + if (mont == NULL) { + new_mont = BN_MONT_CTX_new(); + if (new_mont == NULL || !BN_MONT_CTX_set(new_mont, m, ctx)) { goto err; } + mont = new_mont; } window1 = BN_window_bits_for_exponent_size(bits1); @@ -1550,9 +1538,7 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1, ret = 1; err: - if (in_mont == NULL) { - BN_MONT_CTX_free(mont); - } + BN_MONT_CTX_free(new_mont); BN_CTX_end(ctx); return ret; } |