diff options
author | Rich Salz <rsalz@akamai.com> | 2016-01-05 13:06:03 -0500 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2016-01-13 14:32:59 -0500 |
commit | 3aef36ffef89849348049296892327e6fdf9d705 (patch) | |
tree | a8a89aedef46029fcd855e4d9ad1d19c279b8483 /crypto/ec/ecp_nistz256.c | |
parent | 8ffcca65861520fb95e4603b2cb80b3028e56baa (diff) |
Add CRYPTO_EX_DATA; remove EC_EXTRA_DATA
Add CRYPTO_EX_DATA add EndC_KEY_[gs]et_method, From Roumen Petrov.
Had to add various exdata calls to init/copy/free the exdata.
Had to remove const from some EC functions because exdata isn't
const-correct. :(
Also remove EC_EXTRA_DATA and use a union to hold the possible
pre-computed values and an enum to tell which value is in the
union. (Rich Salz)
Reviewed-by: Dr. Stephen Henson <steve@openssl.org>
Diffstat (limited to 'crypto/ec/ecp_nistz256.c')
-rw-r--r-- | crypto/ec/ecp_nistz256.c | 89 |
1 files changed, 22 insertions, 67 deletions
diff --git a/crypto/ec/ecp_nistz256.c b/crypto/ec/ecp_nistz256.c index 3d83303349..16e79299c9 100644 --- a/crypto/ec/ecp_nistz256.c +++ b/crypto/ec/ecp_nistz256.c @@ -65,7 +65,7 @@ typedef struct { typedef P256_POINT_AFFINE PRECOMP256_ROW[64]; /* structure for precomputed multiples of the generator */ -typedef struct ec_pre_comp_st { +struct nistz256_pre_comp_st { const EC_GROUP *group; /* Parent EC_GROUP object */ size_t w; /* Window size */ /* @@ -76,7 +76,7 @@ typedef struct ec_pre_comp_st { PRECOMP256_ROW *precomp; void *precomp_storage; int references; -} EC_PRE_COMP; +}; /* Functions implemented in assembly */ /* Modular mul by 2: res = 2*a mod P */ @@ -127,10 +127,7 @@ static const BN_ULONG ONE[P256_LIMBS] = { TOBN(0xffffffff, 0xffffffff), TOBN(0x00000000, 0xfffffffe) }; -static void *ecp_nistz256_pre_comp_dup(void *); -static void ecp_nistz256_pre_comp_free(void *); -static void ecp_nistz256_pre_comp_clear_free(void *); -static EC_PRE_COMP *ecp_nistz256_pre_comp_new(const EC_GROUP *group); +static NISTZ256_PRE_COMP *ecp_nistz256_pre_comp_new(const EC_GROUP *group); /* Precomputed tables for the default generator */ extern const PRECOMP256_ROW ecp_nistz256_precomputed[37]; @@ -763,7 +760,7 @@ __owur static int ecp_nistz256_mult_precompute(EC_GROUP *group, BN_CTX *ctx) BIGNUM *order; EC_POINT *P = NULL, *T = NULL; const EC_POINT *generator; - EC_PRE_COMP *pre_comp; + NISTZ256_PRE_COMP *pre_comp; BN_CTX *new_ctx = NULL; int i, j, k, ret = 0; size_t w; @@ -771,11 +768,8 @@ __owur static int ecp_nistz256_mult_precompute(EC_GROUP *group, BN_CTX *ctx) PRECOMP256_ROW *preComputedTable = NULL; unsigned char *precomp_storage = NULL; - /* if there is an old EC_PRE_COMP object, throw it away */ - EC_EX_DATA_free_data(&group->extra_data, ecp_nistz256_pre_comp_dup, - ecp_nistz256_pre_comp_free, - ecp_nistz256_pre_comp_clear_free); - + /* if there is an old NISTZ256_PRE_COMP object, throw it away */ + EC_nistz256_pre_comp_free(group->pre_comp.nistz256); generator = EC_GROUP_get0_generator(group); if (generator == NULL) { ECerr(EC_F_ECP_NISTZ256_MULT_PRECOMPUTE, EC_R_UNDEFINED_GENERATOR); @@ -866,18 +860,9 @@ __owur static int ecp_nistz256_mult_precompute(EC_GROUP *group, BN_CTX *ctx) pre_comp->w = w; pre_comp->precomp = preComputedTable; pre_comp->precomp_storage = precomp_storage; - precomp_storage = NULL; - - if (!EC_EX_DATA_set_data(&group->extra_data, pre_comp, - ecp_nistz256_pre_comp_dup, - ecp_nistz256_pre_comp_free, - ecp_nistz256_pre_comp_clear_free)) { - goto err; - } - + SETPRECOMP(group, nistz256, pre_comp); pre_comp = NULL; - ret = 1; err: @@ -885,7 +870,7 @@ __owur static int ecp_nistz256_mult_precompute(EC_GROUP *group, BN_CTX *ctx) BN_CTX_end(ctx); BN_CTX_free(new_ctx); - ecp_nistz256_pre_comp_free(pre_comp); + EC_nistz256_pre_comp_free(pre_comp); OPENSSL_free(precomp_storage); EC_POINT_free(P); EC_POINT_free(T); @@ -1135,7 +1120,7 @@ __owur static int ecp_nistz256_points_mul(const EC_GROUP *group, size_t j; unsigned char p_str[33] = { 0 }; const PRECOMP256_ROW *preComputedTable = NULL; - const EC_PRE_COMP *pre_comp = NULL; + const NISTZ256_PRE_COMP *pre_comp = NULL; const EC_POINT *generator = NULL; BN_CTX *new_ctx = NULL; const BIGNUM **new_scalars = NULL; @@ -1186,10 +1171,7 @@ __owur static int ecp_nistz256_points_mul(const EC_GROUP *group, } /* look if we can use precomputed multiples of generator */ - pre_comp = - EC_EX_DATA_get_data(group->extra_data, ecp_nistz256_pre_comp_dup, - ecp_nistz256_pre_comp_free, - ecp_nistz256_pre_comp_clear_free); + pre_comp = group->pre_comp.nistz256; if (pre_comp) { /* @@ -1401,14 +1383,14 @@ __owur static int ecp_nistz256_get_affine(const EC_GROUP *group, return 1; } -static EC_PRE_COMP *ecp_nistz256_pre_comp_new(const EC_GROUP *group) +static NISTZ256_PRE_COMP *ecp_nistz256_pre_comp_new(const EC_GROUP *group) { - EC_PRE_COMP *ret = NULL; + NISTZ256_PRE_COMP *ret = NULL; if (!group) return NULL; - ret = OPENSSL_malloc(sizeof(*ret)); + ret = OPENSSL_zalloc(sizeof(*ret)); if (ret == NULL) { ECerr(EC_F_ECP_NISTZ256_PRE_COMP_NEW, ERR_R_MALLOC_FAILURE); @@ -1423,61 +1405,34 @@ static EC_PRE_COMP *ecp_nistz256_pre_comp_new(const EC_GROUP *group) return ret; } -static void *ecp_nistz256_pre_comp_dup(void *src_) +NISTZ256_PRE_COMP *EC_nistz256_pre_comp_dup(NISTZ256_PRE_COMP *p) { - EC_PRE_COMP *src = src_; - - /* no need to actually copy, these objects never change! */ - CRYPTO_add(&src->references, 1, CRYPTO_LOCK_EC_PRE_COMP); - - return src_; + if (p != NULL) + CRYPTO_add(&p->references, 1, CRYPTO_LOCK_EC_PRE_COMP); + return p; } -static void ecp_nistz256_pre_comp_free(void *pre_) +void EC_nistz256_pre_comp_free(NISTZ256_PRE_COMP *pre) { - int i; - EC_PRE_COMP *pre = pre_; - - if (!pre) + if (pre == NULL + || CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP) > 0) return; - - i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP); - if (i > 0) - return; - OPENSSL_free(pre->precomp_storage); OPENSSL_free(pre); } -static void ecp_nistz256_pre_comp_clear_free(void *pre_) -{ - int i; - EC_PRE_COMP *pre = pre_; - - if (!pre) - return; - - i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP); - if (i > 0) - return; - - OPENSSL_clear_free(pre->precomp, - 32 * sizeof(unsigned char) * (1 << pre->w) * 2 * 37); - OPENSSL_clear_free(pre, sizeof(*pre)); -} static int ecp_nistz256_window_have_precompute_mult(const EC_GROUP *group) { /* There is a hard-coded table for the default generator. */ const EC_POINT *generator = EC_GROUP_get0_generator(group); + if (generator != NULL && ecp_nistz256_is_affine_G(generator)) { /* There is a hard-coded table for the default generator. */ return 1; } - return EC_EX_DATA_get_data(group->extra_data, ecp_nistz256_pre_comp_dup, - ecp_nistz256_pre_comp_free, - ecp_nistz256_pre_comp_clear_free) != NULL; + return HAVEPRECOMP(group, nistz256); } const EC_METHOD *EC_GFp_nistz256_method(void) |