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))
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)
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);
}
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);
}
}
-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);
}
}
-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 *))
void EC_POINT_free(EC_POINT *point)
{
+ if (!point) return;
+
if (point->meth->point_finish != 0)
point->meth->point_finish(point);
OPENSSL_free(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)