| Index: openssl/crypto/ec/ec2_mult.c
|
| ===================================================================
|
| --- openssl/crypto/ec/ec2_mult.c (revision 105093)
|
| +++ openssl/crypto/ec/ec2_mult.c (working copy)
|
| @@ -76,7 +76,7 @@
|
| * coordinates.
|
| * Uses algorithm Mdouble in appendix of
|
| * Lopez, J. and Dahab, R. "Fast multiplication on elliptic curves over
|
| - * GF(2^m) without precomputation".
|
| + * GF(2^m) without precomputation" (CHES '99, LNCS 1717).
|
| * modified to not require precomputation of c=b^{2^{m-1}}.
|
| */
|
| static int gf2m_Mdouble(const EC_GROUP *group, BIGNUM *x, BIGNUM *z, BN_CTX *ctx)
|
| @@ -107,8 +107,8 @@
|
| /* Compute the x-coordinate x1/z1 for the point (x1/z1)+(x2/x2) in Montgomery
|
| * projective coordinates.
|
| * Uses algorithm Madd in appendix of
|
| - * Lopex, J. and Dahab, R. "Fast multiplication on elliptic curves over
|
| - * GF(2^m) without precomputation".
|
| + * Lopez, J. and Dahab, R. "Fast multiplication on elliptic curves over
|
| + * GF(2^m) without precomputation" (CHES '99, LNCS 1717).
|
| */
|
| static int gf2m_Madd(const EC_GROUP *group, const BIGNUM *x, BIGNUM *x1, BIGNUM *z1,
|
| const BIGNUM *x2, const BIGNUM *z2, BN_CTX *ctx)
|
| @@ -140,8 +140,8 @@
|
|
|
| /* Compute the x, y affine coordinates from the point (x1, z1) (x2, z2)
|
| * using Montgomery point multiplication algorithm Mxy() in appendix of
|
| - * Lopex, J. and Dahab, R. "Fast multiplication on elliptic curves over
|
| - * GF(2^m) without precomputation".
|
| + * Lopez, J. and Dahab, R. "Fast multiplication on elliptic curves over
|
| + * GF(2^m) without precomputation" (CHES '99, LNCS 1717).
|
| * Returns:
|
| * 0 on error
|
| * 1 if return value should be the point at infinity
|
| @@ -209,15 +209,15 @@
|
| /* Computes scalar*point and stores the result in r.
|
| * point can not equal r.
|
| * Uses algorithm 2P of
|
| - * Lopex, J. and Dahab, R. "Fast multiplication on elliptic curves over
|
| - * GF(2^m) without precomputation".
|
| + * Lopez, J. and Dahab, R. "Fast multiplication on elliptic curves over
|
| + * GF(2^m) without precomputation" (CHES '99, LNCS 1717).
|
| */
|
| static int ec_GF2m_montgomery_point_multiply(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
|
| const EC_POINT *point, BN_CTX *ctx)
|
| {
|
| BIGNUM *x1, *x2, *z1, *z2;
|
| - int ret = 0, i, j;
|
| - BN_ULONG mask;
|
| + int ret = 0, i;
|
| + BN_ULONG mask,word;
|
|
|
| if (r == point)
|
| {
|
| @@ -251,22 +251,24 @@
|
| if (!BN_GF2m_add(x2, x2, &group->b)) goto err; /* x2 = x^4 + b */
|
|
|
| /* find top most bit and go one past it */
|
| - i = scalar->top - 1; j = BN_BITS2 - 1;
|
| + i = scalar->top - 1;
|
| mask = BN_TBIT;
|
| - while (!(scalar->d[i] & mask)) { mask >>= 1; j--; }
|
| - mask >>= 1; j--;
|
| + word = scalar->d[i];
|
| + while (!(word & mask)) mask >>= 1;
|
| + mask >>= 1;
|
| /* if top most bit was at word break, go to next word */
|
| if (!mask)
|
| {
|
| - i--; j = BN_BITS2 - 1;
|
| + i--;
|
| mask = BN_TBIT;
|
| }
|
|
|
| for (; i >= 0; i--)
|
| {
|
| - for (; j >= 0; j--)
|
| + word = scalar->d[i];
|
| + while (mask)
|
| {
|
| - if (scalar->d[i] & mask)
|
| + if (word & mask)
|
| {
|
| if (!gf2m_Madd(group, &point->X, x1, z1, x2, z2, ctx)) goto err;
|
| if (!gf2m_Mdouble(group, x2, z2, ctx)) goto err;
|
| @@ -278,7 +280,6 @@
|
| }
|
| mask >>= 1;
|
| }
|
| - j = BN_BITS2 - 1;
|
| mask = BN_TBIT;
|
| }
|
|
|
| @@ -318,6 +319,7 @@
|
| int ret = 0;
|
| size_t i;
|
| EC_POINT *p=NULL;
|
| + EC_POINT *acc = NULL;
|
|
|
| if (ctx == NULL)
|
| {
|
| @@ -337,15 +339,16 @@
|
| }
|
|
|
| if ((p = EC_POINT_new(group)) == NULL) goto err;
|
| + if ((acc = EC_POINT_new(group)) == NULL) goto err;
|
|
|
| - if (!EC_POINT_set_to_infinity(group, r)) goto err;
|
| + if (!EC_POINT_set_to_infinity(group, acc)) goto err;
|
|
|
| if (scalar)
|
| {
|
| if (!ec_GF2m_montgomery_point_multiply(group, p, scalar, group->generator, ctx)) goto err;
|
| - if (BN_is_negative(scalar))
|
| + if (BN_is_negative(scalar))
|
| if (!group->meth->invert(group, p, ctx)) goto err;
|
| - if (!group->meth->add(group, r, r, p, ctx)) goto err;
|
| + if (!group->meth->add(group, acc, acc, p, ctx)) goto err;
|
| }
|
|
|
| for (i = 0; i < num; i++)
|
| @@ -353,13 +356,16 @@
|
| if (!ec_GF2m_montgomery_point_multiply(group, p, scalars[i], points[i], ctx)) goto err;
|
| if (BN_is_negative(scalars[i]))
|
| if (!group->meth->invert(group, p, ctx)) goto err;
|
| - if (!group->meth->add(group, r, r, p, ctx)) goto err;
|
| + if (!group->meth->add(group, acc, acc, p, ctx)) goto err;
|
| }
|
|
|
| + if (!EC_POINT_copy(r, acc)) goto err;
|
| +
|
| ret = 1;
|
|
|
| err:
|
| if (p) EC_POINT_free(p);
|
| + if (acc) EC_POINT_free(acc);
|
| if (new_ctx != NULL)
|
| BN_CTX_free(new_ctx);
|
| return ret;
|
|
|