Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/boringssl.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Benjamin <davidben@google.com>2016-06-16 21:58:36 +0300
committerAdam Langley <agl@google.com>2016-06-20 20:11:42 +0300
commit8cf79af7d1497c07bd684764b96c9659e7b32ae1 (patch)
treedf58b9873173e76f9b29080a0744a4b694eb4d85 /crypto/ecdsa
parent40e3906234d84b6153567229ce7fee95f54a0f23 (diff)
Always use Fermat's Little Theorem in ecdsa_sign_setup.
The case where ec_group_get_mont_data is NULL is only for arbitrary groups which we now require to be prime order. BN_mod_exp_mont is fine with a NULL BN_MONT_CTX. It will just compute it. Saves a bit of special-casing. Also don't mark p-2 as BN_FLG_CONSTTIME as the exponent is public anyway. Change-Id: Ie868576d52fc9ae5f5c9f2a4039a729151bf84c7 Reviewed-on: https://boringssl-review.googlesource.com/8307 Reviewed-by: Adam Langley <agl@google.com>
Diffstat (limited to 'crypto/ecdsa')
-rw-r--r--crypto/ecdsa/ecdsa.c36
1 files changed, 14 insertions, 22 deletions
diff --git a/crypto/ecdsa/ecdsa.c b/crypto/ecdsa/ecdsa.c
index 70cb1189..69383259 100644
--- a/crypto/ecdsa/ecdsa.c
+++ b/crypto/ecdsa/ecdsa.c
@@ -225,7 +225,7 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
BIGNUM **rp, const uint8_t *digest,
size_t digest_len) {
BN_CTX *ctx = NULL;
- BIGNUM *k = NULL, *r = NULL, *X = NULL;
+ BIGNUM *k = NULL, *r = NULL, *tmp = NULL;
EC_POINT *tmp_point = NULL;
const EC_GROUP *group;
int ret = 0;
@@ -246,8 +246,8 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
k = BN_new(); /* this value is later returned in *kinvp */
r = BN_new(); /* this value is later returned in *rp */
- X = BN_new();
- if (k == NULL || r == NULL || X == NULL) {
+ tmp = BN_new();
+ if (k == NULL || r == NULL || tmp == NULL) {
OPENSSL_PUT_ERROR(ECDSA, ERR_R_MALLOC_FAILURE);
goto err;
}
@@ -296,33 +296,25 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
OPENSSL_PUT_ERROR(ECDSA, ERR_R_EC_LIB);
goto err;
}
- if (!EC_POINT_get_affine_coordinates_GFp(group, tmp_point, X, NULL, ctx)) {
+ if (!EC_POINT_get_affine_coordinates_GFp(group, tmp_point, tmp, NULL,
+ ctx)) {
OPENSSL_PUT_ERROR(ECDSA, ERR_R_EC_LIB);
goto err;
}
- if (!BN_nnmod(r, X, order, ctx)) {
+ if (!BN_nnmod(r, tmp, order, ctx)) {
OPENSSL_PUT_ERROR(ECDSA, ERR_R_BN_LIB);
goto err;
}
} while (BN_is_zero(r));
- /* compute the inverse of k */
- if (ec_group_get_mont_data(group) != NULL) {
- /* We want inverse in constant time, therefore we use that the order must
- * be prime and thus we can use Fermat's Little Theorem. */
- if (!BN_set_word(X, 2) ||
- !BN_sub(X, order, X)) {
- OPENSSL_PUT_ERROR(ECDSA, 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))) {
- OPENSSL_PUT_ERROR(ECDSA, ERR_R_BN_LIB);
- goto err;
- }
- } else if (!BN_mod_inverse(k, k, order, ctx)) {
+ /* Compute the inverse of k. The order is a prime, so use Fermat's Little
+ * Theorem. */
+ if (!BN_set_word(tmp, 2) ||
+ !BN_sub(tmp, order, tmp) ||
+ /* Note |ec_group_get_mont_data| may return NULL but |BN_mod_exp_mont|
+ * allows it to be. */
+ !BN_mod_exp_mont(k, k, tmp, order, ctx, ec_group_get_mont_data(group))) {
OPENSSL_PUT_ERROR(ECDSA, ERR_R_BN_LIB);
goto err;
}
@@ -344,7 +336,7 @@ err:
BN_CTX_free(ctx);
}
EC_POINT_free(tmp_point);
- BN_clear_free(X);
+ BN_clear_free(tmp);
return ret;
}