aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/ec/ec_lib.c
diff options
context:
space:
mode:
authorBodo Möller <bodo@openssl.org>2002-05-08 11:54:24 +0000
committerBodo Möller <bodo@openssl.org>2002-05-08 11:54:24 +0000
commitb6db386ffd66f9227989df64ebedd95bc61597de (patch)
tree2d70d51946df2a8c89e9cbf78bb27a25487a4910 /crypto/ec/ec_lib.c
parent2c975b501daf915758aafc699814af0f4a92599c (diff)
downloadopenssl-b6db386ffd66f9227989df64ebedd95bc61597de.tar.gz
Change internals of the EC library so that the functions
EC_GROUP_{set_generator,get_generator,get_order,get_cofactor} are implemented directly in crypto/ec/ec_lib.c and not dispatched to methods. Also fix EC_GROUP_copy to copy the NID.
Diffstat (limited to 'crypto/ec/ec_lib.c')
-rw-r--r--crypto/ec/ec_lib.c135
1 files changed, 91 insertions, 44 deletions
diff --git a/crypto/ec/ec_lib.c b/crypto/ec/ec_lib.c
index a5153cd4bf..0597087cb7 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))
@@ -113,6 +117,11 @@ void EC_GROUP_free(EC_GROUP *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);
}
@@ -126,6 +135,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 +175,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 +209,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)
+ {
+ 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_get_order == 0)
+ 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 +307,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 *))