diff options
| author | mrezai | 2016-04-15 19:03:35 +0430 |
|---|---|---|
| committer | mrezai | 2016-04-15 19:03:35 +0430 |
| commit | e97922f22038e9049ed4c2db5b3736dfaa0edde3 (patch) | |
| tree | 37e036a343e7482a387b7acd0a88509af78a69eb /drivers/builtin_openssl2/crypto/ecdsa/ecs_ossl.c | |
| parent | 880f4abda44a42532abb6f15999a90bc85f6264a (diff) | |
| download | godot-e97922f22038e9049ed4c2db5b3736dfaa0edde3.tar.gz godot-e97922f22038e9049ed4c2db5b3736dfaa0edde3.tar.zst godot-e97922f22038e9049ed4c2db5b3736dfaa0edde3.zip | |
Diffstat (limited to 'drivers/builtin_openssl2/crypto/ecdsa/ecs_ossl.c')
| -rw-r--r-- | drivers/builtin_openssl2/crypto/ecdsa/ecs_ossl.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/drivers/builtin_openssl2/crypto/ecdsa/ecs_ossl.c b/drivers/builtin_openssl2/crypto/ecdsa/ecs_ossl.c index 4c5fa6b92..dd769609b 100644 --- a/drivers/builtin_openssl2/crypto/ecdsa/ecs_ossl.c +++ b/drivers/builtin_openssl2/crypto/ecdsa/ecs_ossl.c @@ -179,10 +179,32 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp, while (BN_is_zero(r)); /* compute the inverse of k */ - if (!BN_mod_inverse(k, k, order, ctx)) { - ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB); - goto err; + if (EC_GROUP_get_mont_data(group) != NULL) { + /* + * We want inverse in constant time, therefore we utilize the fact + * order must be prime and use Fermats Little Theorem instead. + */ + if (!BN_set_word(X, 2)) { + ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB); + goto err; + } + if (!BN_mod_sub(X, order, X, order, ctx)) { + ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB); + goto err; + } + BN_set_flags(X, BN_FLG_CONSTTIME); + if (!BN_mod_exp_mont_consttime + (k, k, X, order, ctx, EC_GROUP_get_mont_data(group))) { + ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB); + goto err; + } + } else { + if (!BN_mod_inverse(k, k, order, ctx)) { + ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB); + goto err; + } } + /* clear old values if necessary */ if (*rp != NULL) BN_clear_free(*rp); |
