summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2018-07-18 15:22:07 +0200
committerAndy Polyakov <appro@openssl.org>2018-07-22 15:24:52 +0200
commiteff1c8a2d8c625b36e6ed33bd49ac09f37f1bf22 (patch)
tree64a809ee2d0e508ebf49a7a047335b953aff1043
parent5c2bac9289e97b47dc1fd1603efe09d3e10ce9cb (diff)
ec/ecp_nistz256.c: fix ecp_nistz256_set_from_affine.
ecp_nistz256_set_from_affine is called when application attempts to use custom generator, i.e. rarely. Even though it was wrong, it didn't affect point operations, they were just not as fast as expected. Reviewed-by: Rich Salz <rsalz@openssl.org> (Merged from https://github.com/openssl/openssl/pull/6738) (cherry picked from commit 8fc4aeb9521270ac74b29ce7f569939b0b39e685)
-rw-r--r--crypto/ec/ecp_nistz256.c28
1 files changed, 6 insertions, 22 deletions
diff --git a/crypto/ec/ecp_nistz256.c b/crypto/ec/ecp_nistz256.c
index 153f39012a..0dbcfc2f32 100644
--- a/crypto/ec/ecp_nistz256.c
+++ b/crypto/ec/ecp_nistz256.c
@@ -1110,28 +1110,12 @@ __owur static int ecp_nistz256_set_from_affine(EC_POINT *out, const EC_GROUP *gr
const P256_POINT_AFFINE *in,
BN_CTX *ctx)
{
- BIGNUM *x, *y;
- BN_ULONG d_x[P256_LIMBS], d_y[P256_LIMBS];
int ret = 0;
- x = BN_new();
- if (x == NULL)
- return 0;
- y = BN_new();
- if (y == NULL) {
- BN_free(x);
- return 0;
- }
- memcpy(d_x, in->X, sizeof(d_x));
- bn_set_static_words(x, d_x, P256_LIMBS);
-
- memcpy(d_y, in->Y, sizeof(d_y));
- bn_set_static_words(y, d_y, P256_LIMBS);
-
- ret = EC_POINT_set_affine_coordinates_GFp(group, out, x, y, ctx);
-
- BN_free(x);
- BN_free(y);
+ if ((ret = bn_set_words(out->X, in->X, P256_LIMBS))
+ && (ret = bn_set_words(out->Y, in->Y, P256_LIMBS))
+ && (ret = bn_set_words(out->Z, ONE, P256_LIMBS)))
+ out->Z_is_one = 1;
return ret;
}
@@ -1210,9 +1194,9 @@ __owur static int ecp_nistz256_points_mul(const EC_GROUP *group,
if (pre_comp_generator == NULL)
goto err;
+ ecp_nistz256_gather_w7(&p.a, pre_comp->precomp[0], 1);
if (!ecp_nistz256_set_from_affine(pre_comp_generator,
- group, pre_comp->precomp[0],
- ctx)) {
+ group, &p.a, ctx)) {
EC_POINT_free(pre_comp_generator);
goto err;
}