Add EC_GROUP_order_bits, EC_GROUP_get0_order and EC_GROUP_get0_cofactor
New functions to return internal pointer for order and cofactor. This avoids the need to allocate a new BIGNUM which to copy the value to. Simplify code to use new functions. Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
parent
81e03785f7
commit
be2e334fce
@ -356,23 +356,7 @@ static int int_ec_size(const EVP_PKEY *pkey)
|
|||||||
|
|
||||||
static int ec_bits(const EVP_PKEY *pkey)
|
static int ec_bits(const EVP_PKEY *pkey)
|
||||||
{
|
{
|
||||||
BIGNUM *order = BN_new();
|
return EC_GROUP_order_bits(EC_KEY_get0_group(pkey->pkey.ec));
|
||||||
const EC_GROUP *group;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (order == NULL) {
|
|
||||||
ERR_clear_error();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
group = EC_KEY_get0_group(pkey->pkey.ec);
|
|
||||||
if (!EC_GROUP_get_order(group, order, NULL)) {
|
|
||||||
ERR_clear_error();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = BN_num_bits(order);
|
|
||||||
BN_free(order);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ec_security_bits(const EVP_PKEY *pkey)
|
static int ec_security_bits(const EVP_PKEY *pkey)
|
||||||
@ -435,7 +419,7 @@ static int do_EC_KEY_print(BIO *bp, const EC_KEY *x, int off, int ktype)
|
|||||||
const char *ecstr;
|
const char *ecstr;
|
||||||
size_t buf_len = 0, i;
|
size_t buf_len = 0, i;
|
||||||
int ret = 0, reason = ERR_R_BIO_LIB;
|
int ret = 0, reason = ERR_R_BIO_LIB;
|
||||||
BIGNUM *pub_key = NULL, *order = NULL;
|
BIGNUM *pub_key = NULL;
|
||||||
BN_CTX *ctx = NULL;
|
BN_CTX *ctx = NULL;
|
||||||
const EC_GROUP *group;
|
const EC_GROUP *group;
|
||||||
const EC_POINT *public_key;
|
const EC_POINT *public_key;
|
||||||
@ -488,11 +472,8 @@ static int do_EC_KEY_print(BIO *bp, const EC_KEY *x, int off, int ktype)
|
|||||||
|
|
||||||
if (!BIO_indent(bp, off, 128))
|
if (!BIO_indent(bp, off, 128))
|
||||||
goto err;
|
goto err;
|
||||||
if ((order = BN_new()) == NULL)
|
if (BIO_printf(bp, "%s: (%d bit)\n", ecstr,
|
||||||
goto err;
|
EC_GROUP_order_bits(group)) <= 0)
|
||||||
if (!EC_GROUP_get_order(group, order, NULL))
|
|
||||||
goto err;
|
|
||||||
if (BIO_printf(bp, "%s: (%d bit)\n", ecstr, BN_num_bits(order)) <= 0)
|
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if ((priv_key != NULL) && !ASN1_bn_print(bp, "priv:", priv_key,
|
if ((priv_key != NULL) && !ASN1_bn_print(bp, "priv:", priv_key,
|
||||||
@ -508,7 +489,6 @@ static int do_EC_KEY_print(BIO *bp, const EC_KEY *x, int off, int ktype)
|
|||||||
if (!ret)
|
if (!ret)
|
||||||
ECerr(EC_F_DO_EC_KEY_PRINT, reason);
|
ECerr(EC_F_DO_EC_KEY_PRINT, reason);
|
||||||
BN_free(pub_key);
|
BN_free(pub_key);
|
||||||
BN_free(order);
|
|
||||||
BN_CTX_free(ctx);
|
BN_CTX_free(ctx);
|
||||||
OPENSSL_free(buffer);
|
OPENSSL_free(buffer);
|
||||||
return (ret);
|
return (ret);
|
||||||
|
@ -536,16 +536,11 @@ static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group,
|
|||||||
{
|
{
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
ECPARAMETERS *ret = NULL;
|
ECPARAMETERS *ret = NULL;
|
||||||
BIGNUM *tmp = NULL;
|
const BIGNUM *tmp;
|
||||||
unsigned char *buffer = NULL;
|
unsigned char *buffer = NULL;
|
||||||
const EC_POINT *point = NULL;
|
const EC_POINT *point = NULL;
|
||||||
point_conversion_form_t form;
|
point_conversion_form_t form;
|
||||||
|
|
||||||
if ((tmp = BN_new()) == NULL) {
|
|
||||||
ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (param == NULL) {
|
if (param == NULL) {
|
||||||
if ((ret = ECPARAMETERS_new()) == NULL) {
|
if ((ret = ECPARAMETERS_new()) == NULL) {
|
||||||
ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE);
|
||||||
@ -592,7 +587,8 @@ static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* set the order */
|
/* set the order */
|
||||||
if (!EC_GROUP_get_order(group, tmp, NULL)) {
|
tmp = EC_GROUP_get0_order(group);
|
||||||
|
if (tmp == NULL) {
|
||||||
ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB);
|
ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -603,7 +599,8 @@ static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* set the cofactor (optional) */
|
/* set the cofactor (optional) */
|
||||||
if (EC_GROUP_get_cofactor(group, tmp, NULL)) {
|
tmp = EC_GROUP_get0_cofactor(group);
|
||||||
|
if (tmp != NULL) {
|
||||||
ret->cofactor = BN_to_ASN1_INTEGER(tmp, ret->cofactor);
|
ret->cofactor = BN_to_ASN1_INTEGER(tmp, ret->cofactor);
|
||||||
if (ret->cofactor == NULL) {
|
if (ret->cofactor == NULL) {
|
||||||
ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB);
|
ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB);
|
||||||
@ -616,7 +613,6 @@ static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group,
|
|||||||
err:
|
err:
|
||||||
if (!param)
|
if (!param)
|
||||||
ECPARAMETERS_free(ret);
|
ECPARAMETERS_free(ret);
|
||||||
BN_free(tmp);
|
|
||||||
OPENSSL_free(buffer);
|
OPENSSL_free(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1315,7 +1311,6 @@ int ECDSA_size(const EC_KEY *r)
|
|||||||
{
|
{
|
||||||
int ret, i;
|
int ret, i;
|
||||||
ASN1_INTEGER bs;
|
ASN1_INTEGER bs;
|
||||||
BIGNUM *order = NULL;
|
|
||||||
unsigned char buf[4];
|
unsigned char buf[4];
|
||||||
const EC_GROUP *group;
|
const EC_GROUP *group;
|
||||||
|
|
||||||
@ -1325,13 +1320,9 @@ int ECDSA_size(const EC_KEY *r)
|
|||||||
if (group == NULL)
|
if (group == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((order = BN_new()) == NULL)
|
i = EC_GROUP_order_bits(group);
|
||||||
|
if (i == 0)
|
||||||
return 0;
|
return 0;
|
||||||
if (!EC_GROUP_get_order(group, order, NULL)) {
|
|
||||||
BN_clear_free(order);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
i = BN_num_bits(order);
|
|
||||||
bs.length = (i + 7) / 8;
|
bs.length = (i + 7) / 8;
|
||||||
bs.data = buf;
|
bs.data = buf;
|
||||||
bs.type = V_ASN1_INTEGER;
|
bs.type = V_ASN1_INTEGER;
|
||||||
@ -1341,6 +1332,5 @@ int ECDSA_size(const EC_KEY *r)
|
|||||||
i = i2d_ASN1_INTEGER(&bs, NULL);
|
i = i2d_ASN1_INTEGER(&bs, NULL);
|
||||||
i += i; /* r and s */
|
i += i; /* r and s */
|
||||||
ret = ASN1_object_size(1, i, V_ASN1_SEQUENCE);
|
ret = ASN1_object_size(1, i, V_ASN1_SEQUENCE);
|
||||||
BN_clear_free(order);
|
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@
|
|||||||
int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx)
|
int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
BIGNUM *order;
|
const BIGNUM *order;
|
||||||
BN_CTX *new_ctx = NULL;
|
BN_CTX *new_ctx = NULL;
|
||||||
EC_POINT *point = NULL;
|
EC_POINT *point = NULL;
|
||||||
|
|
||||||
@ -92,7 +92,8 @@ int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx)
|
|||||||
/* check the order of the generator */
|
/* check the order of the generator */
|
||||||
if ((point = EC_POINT_new(group)) == NULL)
|
if ((point = EC_POINT_new(group)) == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
if (!EC_GROUP_get_order(group, order, ctx))
|
order = EC_GROUP_get0_order(group);
|
||||||
|
if (order == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
if (BN_is_zero(order)) {
|
if (BN_is_zero(order)) {
|
||||||
ECerr(EC_F_EC_GROUP_CHECK, EC_R_UNDEFINED_ORDER);
|
ECerr(EC_F_EC_GROUP_CHECK, EC_R_UNDEFINED_ORDER);
|
||||||
|
@ -241,11 +241,10 @@ int ossl_ec_key_gen(EC_KEY *eckey)
|
|||||||
{
|
{
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
BN_CTX *ctx = NULL;
|
BN_CTX *ctx = NULL;
|
||||||
BIGNUM *priv_key = NULL, *order = NULL;
|
BIGNUM *priv_key = NULL;
|
||||||
|
const BIGNUM *order = NULL;
|
||||||
EC_POINT *pub_key = NULL;
|
EC_POINT *pub_key = NULL;
|
||||||
|
|
||||||
if ((order = BN_new()) == NULL)
|
|
||||||
goto err;
|
|
||||||
if ((ctx = BN_CTX_new()) == NULL)
|
if ((ctx = BN_CTX_new()) == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
@ -256,7 +255,8 @@ int ossl_ec_key_gen(EC_KEY *eckey)
|
|||||||
} else
|
} else
|
||||||
priv_key = eckey->priv_key;
|
priv_key = eckey->priv_key;
|
||||||
|
|
||||||
if (!EC_GROUP_get_order(eckey->group, order, ctx))
|
order = EC_GROUP_get0_order(eckey->group);
|
||||||
|
if (order == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
do
|
do
|
||||||
@ -280,7 +280,6 @@ int ossl_ec_key_gen(EC_KEY *eckey)
|
|||||||
ok = 1;
|
ok = 1;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
BN_free(order);
|
|
||||||
if (eckey->pub_key == NULL)
|
if (eckey->pub_key == NULL)
|
||||||
EC_POINT_free(pub_key);
|
EC_POINT_free(pub_key);
|
||||||
if (eckey->priv_key != priv_key)
|
if (eckey->priv_key != priv_key)
|
||||||
|
@ -349,21 +349,43 @@ BN_MONT_CTX *EC_GROUP_get_mont_data(const EC_GROUP *group)
|
|||||||
|
|
||||||
int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx)
|
int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx)
|
||||||
{
|
{
|
||||||
|
if (group->order == NULL)
|
||||||
|
return 0;
|
||||||
if (!BN_copy(order, group->order))
|
if (!BN_copy(order, group->order))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return !BN_is_zero(order);
|
return !BN_is_zero(order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group)
|
||||||
|
{
|
||||||
|
return group->order;
|
||||||
|
}
|
||||||
|
|
||||||
|
int EC_GROUP_order_bits(const EC_GROUP *group)
|
||||||
|
{
|
||||||
|
if (group->order)
|
||||||
|
return BN_num_bits(group->order);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor,
|
int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor,
|
||||||
BN_CTX *ctx)
|
BN_CTX *ctx)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (group->cofactor == NULL)
|
||||||
|
return 0;
|
||||||
if (!BN_copy(cofactor, group->cofactor))
|
if (!BN_copy(cofactor, group->cofactor))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return !BN_is_zero(group->cofactor);
|
return !BN_is_zero(group->cofactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const BIGNUM *EC_GROUP_get0_cofactor(const EC_GROUP *group)
|
||||||
|
{
|
||||||
|
return group->cofactor;
|
||||||
|
}
|
||||||
|
|
||||||
void EC_GROUP_set_curve_name(EC_GROUP *group, int nid)
|
void EC_GROUP_set_curve_name(EC_GROUP *group, int nid)
|
||||||
{
|
{
|
||||||
group->curve_name = nid;
|
group->curve_name = nid;
|
||||||
@ -536,16 +558,18 @@ int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx)
|
|||||||
r = 1;
|
r = 1;
|
||||||
|
|
||||||
if (!r) {
|
if (!r) {
|
||||||
|
const BIGNUM *ao, *bo, *ac, *bc;
|
||||||
/* compare the order and cofactor */
|
/* compare the order and cofactor */
|
||||||
if (!EC_GROUP_get_order(a, a1, ctx) ||
|
ao = EC_GROUP_get0_order(a);
|
||||||
!EC_GROUP_get_order(b, b1, ctx) ||
|
bo = EC_GROUP_get0_order(b);
|
||||||
!EC_GROUP_get_cofactor(a, a2, ctx) ||
|
ac = EC_GROUP_get0_cofactor(a);
|
||||||
!EC_GROUP_get_cofactor(b, b2, ctx)) {
|
bc = EC_GROUP_get0_cofactor(b);
|
||||||
|
if (ao == NULL || bo == NULL) {
|
||||||
BN_CTX_end(ctx);
|
BN_CTX_end(ctx);
|
||||||
BN_CTX_free(ctx_new);
|
BN_CTX_free(ctx_new);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (BN_cmp(a1, b1) || BN_cmp(a2, b2))
|
if (BN_cmp(ao, bo) || BN_cmp(ac, bc))
|
||||||
r = 1;
|
r = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -554,7 +554,7 @@ int ec_wNAF_precompute_mult(EC_GROUP *group, BN_CTX *ctx)
|
|||||||
const EC_POINT *generator;
|
const EC_POINT *generator;
|
||||||
EC_POINT *tmp_point = NULL, *base = NULL, **var;
|
EC_POINT *tmp_point = NULL, *base = NULL, **var;
|
||||||
BN_CTX *new_ctx = NULL;
|
BN_CTX *new_ctx = NULL;
|
||||||
BIGNUM *order;
|
const BIGNUM *order;
|
||||||
size_t i, bits, w, pre_points_per_block, blocksize, numblocks, num;
|
size_t i, bits, w, pre_points_per_block, blocksize, numblocks, num;
|
||||||
EC_POINT **points = NULL;
|
EC_POINT **points = NULL;
|
||||||
EC_PRE_COMP *pre_comp;
|
EC_PRE_COMP *pre_comp;
|
||||||
@ -578,11 +578,9 @@ int ec_wNAF_precompute_mult(EC_GROUP *group, BN_CTX *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
BN_CTX_start(ctx);
|
BN_CTX_start(ctx);
|
||||||
order = BN_CTX_get(ctx);
|
|
||||||
if (order == NULL)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
if (!EC_GROUP_get_order(group, order, ctx))
|
order = EC_GROUP_get0_order(group);
|
||||||
|
if (order == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
if (BN_is_zero(order)) {
|
if (BN_is_zero(order)) {
|
||||||
ECerr(EC_F_EC_WNAF_PRECOMPUTE_MULT, EC_R_UNKNOWN_ORDER);
|
ECerr(EC_F_EC_WNAF_PRECOMPUTE_MULT, EC_R_UNKNOWN_ORDER);
|
||||||
|
@ -84,7 +84,8 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
const unsigned char *dgst, int dlen)
|
const unsigned char *dgst, int dlen)
|
||||||
{
|
{
|
||||||
BN_CTX *ctx = NULL;
|
BN_CTX *ctx = NULL;
|
||||||
BIGNUM *k = NULL, *r = NULL, *order = NULL, *X = NULL;
|
BIGNUM *k = NULL, *r = NULL, *X = NULL;
|
||||||
|
const BIGNUM *order;
|
||||||
EC_POINT *tmp_point = NULL;
|
EC_POINT *tmp_point = NULL;
|
||||||
const EC_GROUP *group;
|
const EC_GROUP *group;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -104,9 +105,8 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
|
|
||||||
k = BN_new(); /* this value is later returned in *kinvp */
|
k = BN_new(); /* this value is later returned in *kinvp */
|
||||||
r = BN_new(); /* this value is later returned in *rp */
|
r = BN_new(); /* this value is later returned in *rp */
|
||||||
order = BN_new();
|
|
||||||
X = BN_new();
|
X = BN_new();
|
||||||
if (k == NULL || r == NULL || order == NULL || X == NULL) {
|
if (k == NULL || r == NULL || X == NULL) {
|
||||||
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_MALLOC_FAILURE);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -114,7 +114,8 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (!EC_GROUP_get_order(group, order, ctx)) {
|
order = EC_GROUP_get0_order(group);
|
||||||
|
if (order == NULL) {
|
||||||
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -222,7 +223,6 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
}
|
}
|
||||||
if (ctx != ctx_in)
|
if (ctx != ctx_in)
|
||||||
BN_CTX_free(ctx);
|
BN_CTX_free(ctx);
|
||||||
BN_free(order);
|
|
||||||
EC_POINT_free(tmp_point);
|
EC_POINT_free(tmp_point);
|
||||||
BN_clear_free(X);
|
BN_clear_free(X);
|
||||||
return (ret);
|
return (ret);
|
||||||
@ -239,8 +239,8 @@ ECDSA_SIG *ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
|
|||||||
EC_KEY *eckey)
|
EC_KEY *eckey)
|
||||||
{
|
{
|
||||||
int ok = 0, i;
|
int ok = 0, i;
|
||||||
BIGNUM *kinv = NULL, *s, *m = NULL, *tmp = NULL, *order = NULL;
|
BIGNUM *kinv = NULL, *s, *m = NULL, *tmp = NULL;
|
||||||
const BIGNUM *ckinv;
|
const BIGNUM *order, *ckinv;
|
||||||
BN_CTX *ctx = NULL;
|
BN_CTX *ctx = NULL;
|
||||||
const EC_GROUP *group;
|
const EC_GROUP *group;
|
||||||
ECDSA_SIG *ret;
|
ECDSA_SIG *ret;
|
||||||
@ -261,13 +261,14 @@ ECDSA_SIG *ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
|
|||||||
}
|
}
|
||||||
s = ret->s;
|
s = ret->s;
|
||||||
|
|
||||||
if ((ctx = BN_CTX_new()) == NULL || (order = BN_new()) == NULL ||
|
if ((ctx = BN_CTX_new()) == NULL ||
|
||||||
(tmp = BN_new()) == NULL || (m = BN_new()) == NULL) {
|
(tmp = BN_new()) == NULL || (m = BN_new()) == NULL) {
|
||||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_MALLOC_FAILURE);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!EC_GROUP_get_order(group, order, ctx)) {
|
order = EC_GROUP_get0_order(group);
|
||||||
|
if (order == NULL) {
|
||||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_EC_LIB);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -337,7 +338,6 @@ ECDSA_SIG *ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
|
|||||||
BN_CTX_free(ctx);
|
BN_CTX_free(ctx);
|
||||||
BN_clear_free(m);
|
BN_clear_free(m);
|
||||||
BN_clear_free(tmp);
|
BN_clear_free(tmp);
|
||||||
BN_free(order);
|
|
||||||
BN_clear_free(kinv);
|
BN_clear_free(kinv);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -378,7 +378,8 @@ int ossl_ecdsa_verify_sig(const unsigned char *dgst, int dgst_len,
|
|||||||
{
|
{
|
||||||
int ret = -1, i;
|
int ret = -1, i;
|
||||||
BN_CTX *ctx;
|
BN_CTX *ctx;
|
||||||
BIGNUM *order, *u1, *u2, *m, *X;
|
const BIGNUM *order;
|
||||||
|
BIGNUM *u1, *u2, *m, *X;
|
||||||
EC_POINT *point = NULL;
|
EC_POINT *point = NULL;
|
||||||
const EC_GROUP *group;
|
const EC_GROUP *group;
|
||||||
const EC_POINT *pub_key;
|
const EC_POINT *pub_key;
|
||||||
@ -396,7 +397,6 @@ int ossl_ecdsa_verify_sig(const unsigned char *dgst, int dgst_len,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
BN_CTX_start(ctx);
|
BN_CTX_start(ctx);
|
||||||
order = BN_CTX_get(ctx);
|
|
||||||
u1 = BN_CTX_get(ctx);
|
u1 = BN_CTX_get(ctx);
|
||||||
u2 = BN_CTX_get(ctx);
|
u2 = BN_CTX_get(ctx);
|
||||||
m = BN_CTX_get(ctx);
|
m = BN_CTX_get(ctx);
|
||||||
@ -406,7 +406,8 @@ int ossl_ecdsa_verify_sig(const unsigned char *dgst, int dgst_len,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!EC_GROUP_get_order(group, order, ctx)) {
|
order = EC_GROUP_get0_order(group);
|
||||||
|
if (order == NULL) {
|
||||||
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_EC_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -147,8 +147,8 @@ int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off)
|
|||||||
int ret = 0, reason = ERR_R_BIO_LIB;
|
int ret = 0, reason = ERR_R_BIO_LIB;
|
||||||
BN_CTX *ctx = NULL;
|
BN_CTX *ctx = NULL;
|
||||||
const EC_POINT *point = NULL;
|
const EC_POINT *point = NULL;
|
||||||
BIGNUM *p = NULL, *a = NULL, *b = NULL, *gen = NULL,
|
BIGNUM *p = NULL, *a = NULL, *b = NULL, *gen = NULL;
|
||||||
*order = NULL, *cofactor = NULL;
|
const BIGNUM *order = NULL, *cofactor = NULL;
|
||||||
const unsigned char *seed;
|
const unsigned char *seed;
|
||||||
size_t seed_len = 0;
|
size_t seed_len = 0;
|
||||||
|
|
||||||
@ -199,8 +199,7 @@ int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off)
|
|||||||
is_char_two = 1;
|
is_char_two = 1;
|
||||||
|
|
||||||
if ((p = BN_new()) == NULL || (a = BN_new()) == NULL ||
|
if ((p = BN_new()) == NULL || (a = BN_new()) == NULL ||
|
||||||
(b = BN_new()) == NULL || (order = BN_new()) == NULL ||
|
(b = BN_new()) == NULL) {
|
||||||
(cofactor = BN_new()) == NULL) {
|
|
||||||
reason = ERR_R_MALLOC_FAILURE;
|
reason = ERR_R_MALLOC_FAILURE;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -223,8 +222,9 @@ int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off)
|
|||||||
reason = ERR_R_EC_LIB;
|
reason = ERR_R_EC_LIB;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (!EC_GROUP_get_order(x, order, NULL) ||
|
order = EC_GROUP_get0_order(x);
|
||||||
!EC_GROUP_get_cofactor(x, cofactor, NULL)) {
|
cofactor = EC_GROUP_get0_cofactor(x);
|
||||||
|
if (order == NULL) {
|
||||||
reason = ERR_R_EC_LIB;
|
reason = ERR_R_EC_LIB;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -321,8 +321,6 @@ int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off)
|
|||||||
BN_free(a);
|
BN_free(a);
|
||||||
BN_free(b);
|
BN_free(b);
|
||||||
BN_free(gen);
|
BN_free(gen);
|
||||||
BN_free(order);
|
|
||||||
BN_free(cofactor);
|
|
||||||
BN_CTX_free(ctx);
|
BN_CTX_free(ctx);
|
||||||
OPENSSL_free(buffer);
|
OPENSSL_free(buffer);
|
||||||
return (ret);
|
return (ret);
|
||||||
|
@ -756,7 +756,7 @@ __owur static int ecp_nistz256_mult_precompute(EC_GROUP *group, BN_CTX *ctx)
|
|||||||
* implicit value of infinity at index zero. We use window of size 7, and
|
* implicit value of infinity at index zero. We use window of size 7, and
|
||||||
* therefore require ceil(256/7) = 37 tables.
|
* therefore require ceil(256/7) = 37 tables.
|
||||||
*/
|
*/
|
||||||
BIGNUM *order;
|
const BIGNUM *order;
|
||||||
EC_POINT *P = NULL, *T = NULL;
|
EC_POINT *P = NULL, *T = NULL;
|
||||||
const EC_POINT *generator;
|
const EC_POINT *generator;
|
||||||
NISTZ256_PRE_COMP *pre_comp;
|
NISTZ256_PRE_COMP *pre_comp;
|
||||||
@ -793,14 +793,11 @@ __owur static int ecp_nistz256_mult_precompute(EC_GROUP *group, BN_CTX *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
BN_CTX_start(ctx);
|
BN_CTX_start(ctx);
|
||||||
order = BN_CTX_get(ctx);
|
|
||||||
|
|
||||||
|
order = EC_GROUP_get0_order(group);
|
||||||
if (order == NULL)
|
if (order == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (!EC_GROUP_get_order(group, order, ctx))
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
if (BN_is_zero(order)) {
|
if (BN_is_zero(order)) {
|
||||||
ECerr(EC_F_ECP_NISTZ256_MULT_PRECOMPUTE, EC_R_UNKNOWN_ORDER);
|
ECerr(EC_F_ECP_NISTZ256_MULT_PRECOMPUTE, EC_R_UNKNOWN_ORDER);
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -18,7 +18,10 @@ EC_GROUP_copy, EC_GROUP_dup, EC_GROUP_method_of, EC_GROUP_set_generator, EC_GROU
|
|||||||
const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group);
|
const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group);
|
||||||
|
|
||||||
int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx);
|
int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx);
|
||||||
|
const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group);
|
||||||
|
const BIGNUM *EC_GROUP_order_bits(const EC_GROUP *group);
|
||||||
int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx);
|
int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx);
|
||||||
|
const BIGNUM *EC_GROUP_get0_cofactor(const EC_GROUP *group);
|
||||||
|
|
||||||
void EC_GROUP_set_curve_name(EC_GROUP *group, int nid);
|
void EC_GROUP_set_curve_name(EC_GROUP *group, int nid);
|
||||||
int EC_GROUP_get_curve_name(const EC_GROUP *group);
|
int EC_GROUP_get_curve_name(const EC_GROUP *group);
|
||||||
@ -162,6 +165,10 @@ EC_GROUP_get_order, EC_GROUP_get_cofactor, EC_GROUP_get_curve_name, EC_GROUP_get
|
|||||||
and EC_GROUP_get_degree return the order, cofactor, curve name (NID), ASN1 flag, point_conversion_form and degree for the
|
and EC_GROUP_get_degree return the order, cofactor, curve name (NID), ASN1 flag, point_conversion_form and degree for the
|
||||||
specified curve respectively. If there is no curve name associated with a curve then EC_GROUP_get_curve_name will return 0.
|
specified curve respectively. If there is no curve name associated with a curve then EC_GROUP_get_curve_name will return 0.
|
||||||
|
|
||||||
|
EC_GROUP_get0_order() returns an internal pointer to the group order.
|
||||||
|
EC_GROUP_get_order_bits() returns the number of bits in the group order.
|
||||||
|
EC_GROUP_get0_cofactor() returns an internal pointer to the group cofactor.
|
||||||
|
|
||||||
EC_GROUP_get0_seed returns a pointer to the seed that was used to generate the parameter b, or NULL if the seed is not
|
EC_GROUP_get0_seed returns a pointer to the seed that was used to generate the parameter b, or NULL if the seed is not
|
||||||
specified. EC_GROUP_get_seed_len returns the length of the seed or 0 if the seed is not specified.
|
specified. EC_GROUP_get_seed_len returns the length of the seed or 0 if the seed is not specified.
|
||||||
|
|
||||||
|
@ -257,6 +257,20 @@ BN_MONT_CTX *EC_GROUP_get_mont_data(const EC_GROUP *group);
|
|||||||
*/
|
*/
|
||||||
int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx);
|
int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx);
|
||||||
|
|
||||||
|
/** Gets the order of an EC_GROUP
|
||||||
|
* \param group EC_GROUP object
|
||||||
|
* \return the group order
|
||||||
|
*/
|
||||||
|
|
||||||
|
const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group);
|
||||||
|
|
||||||
|
/** Gets the number of bits of ther order of an EC_GROUP
|
||||||
|
* \param group EC_GROUP object
|
||||||
|
* \return number of bits of group order.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int EC_GROUP_order_bits(const EC_GROUP *group);
|
||||||
|
|
||||||
/** Gets the cofactor of a EC_GROUP
|
/** Gets the cofactor of a EC_GROUP
|
||||||
* \param group EC_GROUP object
|
* \param group EC_GROUP object
|
||||||
* \param cofactor BIGNUM to which the cofactor is copied
|
* \param cofactor BIGNUM to which the cofactor is copied
|
||||||
@ -266,6 +280,13 @@ int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx);
|
|||||||
int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor,
|
int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor,
|
||||||
BN_CTX *ctx);
|
BN_CTX *ctx);
|
||||||
|
|
||||||
|
/** Gets the cofactor of an EC_GROUP
|
||||||
|
* \param group EC_GROUP object
|
||||||
|
* \return the group cofactor
|
||||||
|
*/
|
||||||
|
|
||||||
|
const BIGNUM *EC_GROUP_get0_cofactor(const EC_GROUP *group);
|
||||||
|
|
||||||
/** Sets the name of a EC_GROUP object
|
/** Sets the name of a EC_GROUP object
|
||||||
* \param group EC_GROUP object
|
* \param group EC_GROUP object
|
||||||
* \param nid NID of the curve name OID
|
* \param nid NID of the curve name OID
|
||||||
|
@ -4766,3 +4766,6 @@ TS_STATUS_INFO_get0_failure_info 5160 1_1_0 EXIST::FUNCTION:
|
|||||||
TS_STATUS_INFO_get0_text 5161 1_1_0 EXIST::FUNCTION:
|
TS_STATUS_INFO_get0_text 5161 1_1_0 EXIST::FUNCTION:
|
||||||
CRYPTO_secure_zalloc 5162 1_1_0 EXIST::FUNCTION:
|
CRYPTO_secure_zalloc 5162 1_1_0 EXIST::FUNCTION:
|
||||||
X509_NAME_get0_der 5163 1_1_0 EXIST::FUNCTION:
|
X509_NAME_get0_der 5163 1_1_0 EXIST::FUNCTION:
|
||||||
|
EC_GROUP_order_bits 5164 1_1_0 EXIST::FUNCTION:EC
|
||||||
|
EC_GROUP_get0_order 5165 1_1_0 EXIST::FUNCTION:EC
|
||||||
|
EC_GROUP_get0_cofactor 5166 1_1_0 EXIST::FUNCTION:EC
|
||||||
|
Loading…
x
Reference in New Issue
Block a user