Simplify ec_group_st on the assumption it is used for GF(p) only.
Change-Id: I90e8f9ce7b996471daed129794eb1b0fa80a27cc Reviewed-on: https://boringssl-review.googlesource.com/4272 Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
parent
054e682675
commit
0acef5ec27
@ -121,61 +121,61 @@ int ec_GFp_mont_group_init(EC_GROUP *group) {
|
||||
int ok;
|
||||
|
||||
ok = ec_GFp_simple_group_init(group);
|
||||
group->field_data1 = NULL;
|
||||
group->field_data2 = NULL;
|
||||
group->mont = NULL;
|
||||
group->one = NULL;
|
||||
return ok;
|
||||
}
|
||||
|
||||
void ec_GFp_mont_group_finish(EC_GROUP *group) {
|
||||
if (group->field_data1 != NULL) {
|
||||
BN_MONT_CTX_free(group->field_data1);
|
||||
group->field_data1 = NULL;
|
||||
if (group->mont != NULL) {
|
||||
BN_MONT_CTX_free(group->mont);
|
||||
group->mont = NULL;
|
||||
}
|
||||
if (group->field_data2 != NULL) {
|
||||
BN_free(group->field_data2);
|
||||
group->field_data2 = NULL;
|
||||
if (group->one != NULL) {
|
||||
BN_free(group->one);
|
||||
group->one = NULL;
|
||||
}
|
||||
ec_GFp_simple_group_finish(group);
|
||||
}
|
||||
|
||||
void ec_GFp_mont_group_clear_finish(EC_GROUP *group) {
|
||||
if (group->field_data1 != NULL) {
|
||||
BN_MONT_CTX_free(group->field_data1);
|
||||
group->field_data1 = NULL;
|
||||
if (group->mont != NULL) {
|
||||
BN_MONT_CTX_free(group->mont);
|
||||
group->mont = NULL;
|
||||
}
|
||||
if (group->field_data2 != NULL) {
|
||||
BN_clear_free(group->field_data2);
|
||||
group->field_data2 = NULL;
|
||||
if (group->one != NULL) {
|
||||
BN_clear_free(group->one);
|
||||
group->one = NULL;
|
||||
}
|
||||
ec_GFp_simple_group_clear_finish(group);
|
||||
}
|
||||
|
||||
int ec_GFp_mont_group_copy(EC_GROUP *dest, const EC_GROUP *src) {
|
||||
if (dest->field_data1 != NULL) {
|
||||
BN_MONT_CTX_free(dest->field_data1);
|
||||
dest->field_data1 = NULL;
|
||||
if (dest->mont != NULL) {
|
||||
BN_MONT_CTX_free(dest->mont);
|
||||
dest->mont = NULL;
|
||||
}
|
||||
if (dest->field_data2 != NULL) {
|
||||
BN_clear_free(dest->field_data2);
|
||||
dest->field_data2 = NULL;
|
||||
if (dest->one != NULL) {
|
||||
BN_clear_free(dest->one);
|
||||
dest->one = NULL;
|
||||
}
|
||||
|
||||
if (!ec_GFp_simple_group_copy(dest, src)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (src->field_data1 != NULL) {
|
||||
dest->field_data1 = BN_MONT_CTX_new();
|
||||
if (dest->field_data1 == NULL) {
|
||||
if (src->mont != NULL) {
|
||||
dest->mont = BN_MONT_CTX_new();
|
||||
if (dest->mont == NULL) {
|
||||
return 0;
|
||||
}
|
||||
if (!BN_MONT_CTX_copy(dest->field_data1, src->field_data1)) {
|
||||
if (!BN_MONT_CTX_copy(dest->mont, src->mont)) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
if (src->field_data2 != NULL) {
|
||||
dest->field_data2 = BN_dup(src->field_data2);
|
||||
if (dest->field_data2 == NULL) {
|
||||
if (src->one != NULL) {
|
||||
dest->one = BN_dup(src->one);
|
||||
if (dest->one == NULL) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
@ -183,9 +183,9 @@ int ec_GFp_mont_group_copy(EC_GROUP *dest, const EC_GROUP *src) {
|
||||
return 1;
|
||||
|
||||
err:
|
||||
if (dest->field_data1 != NULL) {
|
||||
BN_MONT_CTX_free(dest->field_data1);
|
||||
dest->field_data1 = NULL;
|
||||
if (dest->mont != NULL) {
|
||||
BN_MONT_CTX_free(dest->mont);
|
||||
dest->mont = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -197,13 +197,13 @@ int ec_GFp_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p,
|
||||
BIGNUM *one = NULL;
|
||||
int ret = 0;
|
||||
|
||||
if (group->field_data1 != NULL) {
|
||||
BN_MONT_CTX_free(group->field_data1);
|
||||
group->field_data1 = NULL;
|
||||
if (group->mont != NULL) {
|
||||
BN_MONT_CTX_free(group->mont);
|
||||
group->mont = NULL;
|
||||
}
|
||||
if (group->field_data2 != NULL) {
|
||||
BN_free(group->field_data2);
|
||||
group->field_data2 = NULL;
|
||||
if (group->one != NULL) {
|
||||
BN_free(group->one);
|
||||
group->one = NULL;
|
||||
}
|
||||
|
||||
if (ctx == NULL) {
|
||||
@ -226,18 +226,18 @@ int ec_GFp_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p,
|
||||
goto err;
|
||||
}
|
||||
|
||||
group->field_data1 = mont;
|
||||
group->mont = mont;
|
||||
mont = NULL;
|
||||
group->field_data2 = one;
|
||||
group->one = one;
|
||||
one = NULL;
|
||||
|
||||
ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
|
||||
|
||||
if (!ret) {
|
||||
BN_MONT_CTX_free(group->field_data1);
|
||||
group->field_data1 = NULL;
|
||||
BN_free(group->field_data2);
|
||||
group->field_data2 = NULL;
|
||||
BN_MONT_CTX_free(group->mont);
|
||||
group->mont = NULL;
|
||||
BN_free(group->one);
|
||||
group->one = NULL;
|
||||
}
|
||||
|
||||
err:
|
||||
@ -255,52 +255,52 @@ err:
|
||||
|
||||
int ec_GFp_mont_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
|
||||
const BIGNUM *b, BN_CTX *ctx) {
|
||||
if (group->field_data1 == NULL) {
|
||||
if (group->mont == NULL) {
|
||||
OPENSSL_PUT_ERROR(EC, ec_GFp_mont_field_mul, EC_R_NOT_INITIALIZED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return BN_mod_mul_montgomery(r, a, b, group->field_data1, ctx);
|
||||
return BN_mod_mul_montgomery(r, a, b, group->mont, ctx);
|
||||
}
|
||||
|
||||
int ec_GFp_mont_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
|
||||
BN_CTX *ctx) {
|
||||
if (group->field_data1 == NULL) {
|
||||
if (group->mont == NULL) {
|
||||
OPENSSL_PUT_ERROR(EC, ec_GFp_mont_field_sqr, EC_R_NOT_INITIALIZED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return BN_mod_mul_montgomery(r, a, a, group->field_data1, ctx);
|
||||
return BN_mod_mul_montgomery(r, a, a, group->mont, ctx);
|
||||
}
|
||||
|
||||
int ec_GFp_mont_field_encode(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
|
||||
BN_CTX *ctx) {
|
||||
if (group->field_data1 == NULL) {
|
||||
if (group->mont == NULL) {
|
||||
OPENSSL_PUT_ERROR(EC, ec_GFp_mont_field_encode, EC_R_NOT_INITIALIZED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return BN_to_montgomery(r, a, (BN_MONT_CTX *)group->field_data1, ctx);
|
||||
return BN_to_montgomery(r, a, group->mont, ctx);
|
||||
}
|
||||
|
||||
int ec_GFp_mont_field_decode(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
|
||||
BN_CTX *ctx) {
|
||||
if (group->field_data1 == NULL) {
|
||||
if (group->mont == NULL) {
|
||||
OPENSSL_PUT_ERROR(EC, ec_GFp_mont_field_decode, EC_R_NOT_INITIALIZED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return BN_from_montgomery(r, a, group->field_data1, ctx);
|
||||
return BN_from_montgomery(r, a, group->mont, ctx);
|
||||
}
|
||||
|
||||
int ec_GFp_mont_field_set_to_one(const EC_GROUP *group, BIGNUM *r,
|
||||
BN_CTX *ctx) {
|
||||
if (group->field_data2 == NULL) {
|
||||
if (group->one == NULL) {
|
||||
OPENSSL_PUT_ERROR(EC, ec_GFp_mont_field_set_to_one, EC_R_NOT_INITIALIZED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!BN_copy(r, group->field_data2)) {
|
||||
if (!BN_copy(r, group->one)) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
|
@ -205,35 +205,14 @@ struct ec_group_st {
|
||||
/* The following members are handled by the method functions,
|
||||
* even if they appear generic */
|
||||
|
||||
BIGNUM field; /* Field specification.
|
||||
* For curves over GF(p), this is the modulus;
|
||||
* for curves over GF(2^m), this is the
|
||||
* irreducible polynomial defining the field. */
|
||||
BIGNUM field; /* For curves over GF(p), this is the modulus. */
|
||||
|
||||
int poly[6]; /* Field specification for curves over GF(2^m).
|
||||
* The irreducible f(t) is then of the form:
|
||||
* t^poly[0] + t^poly[1] + ... + t^poly[k]
|
||||
* where m = poly[0] > poly[1] > ... > poly[k] = 0.
|
||||
* The array is terminated with poly[k+1]=-1.
|
||||
* All elliptic curve irreducibles have at most 5
|
||||
* non-zero terms. */
|
||||
|
||||
BIGNUM a, b; /* Curve coefficients.
|
||||
* (Here the assumption is that BIGNUMs can be used
|
||||
* or abused for all kinds of fields, not just GF(p).)
|
||||
* For characteristic > 3, the curve is defined
|
||||
* by a Weierstrass equation of the form
|
||||
* y^2 = x^3 + a*x + b.
|
||||
* For characteristic 2, the curve is defined by
|
||||
* an equation of the form
|
||||
* y^2 + x*y = x^3 + a*x^2 + b. */
|
||||
BIGNUM a, b; /* Curve coefficients. */
|
||||
|
||||
int a_is_minus3; /* enable optimized point arithmetics for special case */
|
||||
|
||||
void *field_data1; /* method-specific (e.g., Montgomery structure) */
|
||||
void *field_data2; /* method-specific */
|
||||
int (*field_mod_func)(BIGNUM *, const BIGNUM *, const BIGNUM *,
|
||||
BN_CTX *); /* method-specific */
|
||||
BN_MONT_CTX *mont; /* Montgomery structure. */
|
||||
BIGNUM *one; /* The value one */
|
||||
} /* EC_GROUP */;
|
||||
|
||||
struct ec_point_st {
|
||||
|
Loading…
Reference in New Issue
Block a user