X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fec%2Fec_lib.c;h=f469b679d86affa93a19cc292e8122a8adde3bb5;hp=a5153cd4bf5982e2b698d51d8a4a83ec4af60f00;hb=7711de24f914e4d283766acec0973daad30b5936;hpb=17d6bb815813bab443a29cfd821d876afc9ecfef diff --git a/crypto/ec/ec_lib.c b/crypto/ec/ec_lib.c index a5153cd4bf..f469b679d8 100644 --- a/crypto/ec/ec_lib.c +++ b/crypto/ec/ec_lib.c @@ -94,6 +94,10 @@ EC_GROUP *EC_GROUP_new(const EC_METHOD *meth) ret->extra_data_free_func = 0; ret->extra_data_clear_free_func = 0; + ret->generator = NULL; + BN_init(&ret->order); + BN_init(&ret->cofactor); + ret->nid = 0; if (!meth->group_init(ret)) @@ -108,17 +112,26 @@ EC_GROUP *EC_GROUP_new(const EC_METHOD *meth) void EC_GROUP_free(EC_GROUP *group) { + if (!group) return; + if (group->meth->group_finish != 0) group->meth->group_finish(group); EC_GROUP_free_extra_data(group); + if (group->generator != NULL) + EC_POINT_free(group->generator); + BN_free(&group->order); + BN_free(&group->cofactor); + OPENSSL_free(group); } void EC_GROUP_clear_free(EC_GROUP *group) { + if (!group) return; + if (group->meth->group_clear_finish != 0) group->meth->group_clear_finish(group); else if (group->meth != NULL && group->meth->group_finish != 0) @@ -126,6 +139,11 @@ void EC_GROUP_clear_free(EC_GROUP *group) EC_GROUP_clear_free_extra_data(group); + if (group->generator != NULL) + EC_POINT_clear_free(group->generator); + BN_clear_free(&group->order); + BN_clear_free(&group->cofactor); + memset(group, 0, sizeof *group); OPENSSL_free(group); } @@ -161,6 +179,30 @@ int EC_GROUP_copy(EC_GROUP *dest, const EC_GROUP *src) dest->extra_data_clear_free_func = src->extra_data_clear_free_func; } + if (src->generator != NULL) + { + if (dest->generator == NULL) + { + dest->generator = EC_POINT_new(dest); + if (dest->generator == NULL) return 0; + } + if (!EC_POINT_copy(dest->generator, src->generator)) return 0; + } + else + { + /* src->generator == NULL */ + if (dest->generator != NULL) + { + EC_POINT_clear_free(dest->generator); + dest->generator = NULL; + } + } + + if (!BN_copy(&dest->order, &src->order)) return 0; + if (!BN_copy(&dest->cofactor, &src->cofactor)) return 0; + + dest->nid = src->nid; + return dest->meth->group_copy(dest, src); } @@ -171,69 +213,90 @@ const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group) } -int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) +int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor) { - if (group->meth->group_set_curve_GFp == 0) + if (generator == NULL) { - ECerr(EC_F_EC_GROUP_SET_CURVE_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; + ECerr(EC_F_EC_GROUP_SET_GENERATOR, ERR_R_PASSED_NULL_PARAMETER); + return 0 ; } - return group->meth->group_set_curve_GFp(group, p, a, b, ctx); + + if (group->generator == NULL) + { + group->generator = EC_POINT_new(group); + if (group->generator == NULL) return 0; + } + if (!EC_POINT_copy(group->generator, generator)) return 0; + + if (order != NULL) + { if (!BN_copy(&group->order, order)) return 0; } + else + { if (!BN_zero(&group->order)) return 0; } + + if (cofactor != NULL) + { if (!BN_copy(&group->cofactor, cofactor)) return 0; } + else + { if (!BN_zero(&group->cofactor)) return 0; } + + return 1; } -int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx) +EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group) { - if (group->meth->group_get_curve_GFp == 0) - { - ECerr(EC_F_EC_GROUP_GET_CURVE_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; - } - return group->meth->group_get_curve_GFp(group, p, a, b, ctx); + return group->generator; } -int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor) +int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx) { - if (group->meth->group_set_generator == 0) - { - ECerr(EC_F_EC_GROUP_SET_GENERATOR, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + if (!BN_copy(order, &group->order)) return 0; - } - return group->meth->group_set_generator(group, generator, order, cofactor); + + return !BN_is_zero(order); } -EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group) +int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx) { - if (group->meth->group_get0_generator == 0) - { - ECerr(EC_F_EC_GROUP_GET0_GENERATOR, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + if (!BN_copy(cofactor, &group->cofactor)) return 0; - } - return group->meth->group_get0_generator(group); + + return !BN_is_zero(&group->cofactor); } -int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx) +void EC_GROUP_set_nid(EC_GROUP *group, int nid) { - if (group->meth->group_get_order == 0) + group->nid = nid; + } + + +int EC_GROUP_get_nid(const EC_GROUP *group) + { + return group->nid; + } + + +int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) + { + if (group->meth->group_set_curve_GFp == 0) { - ECerr(EC_F_EC_GROUP_GET_ORDER, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + ECerr(EC_F_EC_GROUP_SET_CURVE_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } - return group->meth->group_get_order(group, order, ctx); + return group->meth->group_set_curve_GFp(group, p, a, b, ctx); } -int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx) +int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx) { - if (group->meth->group_get_cofactor == 0) + if (group->meth->group_get_curve_GFp == 0) { - ECerr(EC_F_EC_GROUP_GET_COFACTOR, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + ECerr(EC_F_EC_GROUP_GET_CURVE_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } - return group->meth->group_get_cofactor(group, cofactor, ctx); + return group->meth->group_get_curve_GFp(group, p, a, b, ctx); } @@ -248,18 +311,6 @@ int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx) } -void EC_GROUP_set_nid(EC_GROUP *group, int nid) - { - group->nid = nid; - } - - -int EC_GROUP_get_nid(const EC_GROUP *group) - { - return group->nid; - } - - /* this has 'package' visibility */ int EC_GROUP_set_extra_data(EC_GROUP *group, void *extra_data, void *(*extra_data_dup_func)(void *), void (*extra_data_free_func)(void *), void (*extra_data_clear_free_func)(void *)) @@ -361,6 +412,8 @@ EC_POINT *EC_POINT_new(const EC_GROUP *group) void EC_POINT_free(EC_POINT *point) { + if (!point) return; + if (point->meth->point_finish != 0) point->meth->point_finish(point); OPENSSL_free(point); @@ -369,6 +422,8 @@ void EC_POINT_free(EC_POINT *point) void EC_POINT_clear_free(EC_POINT *point) { + if (!point) return; + if (point->meth->point_clear_finish != 0) point->meth->point_clear_finish(point); else if (point->meth != NULL && point->meth->point_finish != 0)