diff options
Diffstat (limited to 'crypto/ec/ec2_mult.c')
| -rw-r--r-- | crypto/ec/ec2_mult.c | 37 | 
1 files changed, 21 insertions, 16 deletions
diff --git a/crypto/ec/ec2_mult.c b/crypto/ec/ec2_mult.c index 7dca5e4bcd436..26f4a783fcc1e 100644 --- a/crypto/ec/ec2_mult.c +++ b/crypto/ec/ec2_mult.c @@ -71,12 +71,14 @@  #include "ec_lcl.h" +#ifndef OPENSSL_NO_EC2M +  /* Compute the x-coordinate x/z for the point 2*(x/z) in Montgomery projective    * 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 +109,8 @@ static int gf2m_Mdouble(const EC_GROUP *group, BIGNUM *x, BIGNUM *z, BN_CTX *ctx  /* 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 +142,8 @@ static int gf2m_Madd(const EC_GROUP *group, const BIGNUM *x, BIGNUM *x1, BIGNUM  /* 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 +211,15 @@ static int gf2m_Mxy(const EC_GROUP *group, const BIGNUM *x, const BIGNUM *y, BIG  /* 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 +253,24 @@ static int ec_GF2m_montgomery_point_multiply(const EC_GROUP *group, EC_POINT *r,  	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 +282,6 @@ static int ec_GF2m_montgomery_point_multiply(const EC_GROUP *group, EC_POINT *r,  				}  			mask >>= 1;  			} -		j = BN_BITS2 - 1;  		mask = BN_TBIT;  		} @@ -383,3 +386,5 @@ int ec_GF2m_have_precompute_mult(const EC_GROUP *group)  	{  	return ec_wNAF_have_precompute_mult(group);   	} + +#endif  | 
