summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/ecparam.c31
-rw-r--r--crypto/ec/ec.h16
-rw-r--r--crypto/ec/ec_curve.c25
-rwxr-xr-xutil/libeay.num5
4 files changed, 49 insertions, 28 deletions
diff --git a/apps/ecparam.c b/apps/ecparam.c
index e0a56062d3..71ae9e7d9b 100644
--- a/apps/ecparam.c
+++ b/apps/ecparam.c
@@ -352,19 +352,33 @@ bad:
if (list_curves)
{
- int counter=0;
+ EC_builtin_curve *curves = NULL;
+ size_t crv_len = 0;
+ size_t n = 0;
+ size_t len;
- for (;;)
+ crv_len = EC_get_builtin_curves(NULL, 0);
+
+ curves = OPENSSL_malloc(sizeof(EC_builtin_curve) * crv_len);
+
+ if (curves == NULL)
+ goto end;
+
+ if (!EC_get_builtin_curves(curves, crv_len))
+ {
+ OPENSSL_free(curves);
+ goto end;
+ }
+
+
+ for (n = 0; n < crv_len; n++)
{
const char *comment;
const char *sname;
- int len, nid = ec_group_index2nid(counter++);
- if (!nid)
- break;
- comment = EC_GROUP_get0_comment(nid);
- sname = OBJ_nid2sn(nid);
+ comment = curves[n].comment;
+ sname = OBJ_nid2sn(curves[n].nid);
if (comment == NULL)
- comment = "";
+ comment = "CURVE DESCRIPTION NOT AVAILABLE";
if (sname == NULL)
sname = "";
@@ -375,6 +389,7 @@ bad:
BIO_printf(out, "%s\n", comment);
}
+ OPENSSL_free(curves);
ret = 0;
goto end;
}
diff --git a/crypto/ec/ec.h b/crypto/ec/ec.h
index faca04aab9..094e05e168 100644
--- a/crypto/ec/ec.h
+++ b/crypto/ec/ec.h
@@ -184,12 +184,16 @@ EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM
/* EC_GROUP_new_by_nid() creates a EC_GROUP structure specified by a NID */
EC_GROUP *EC_GROUP_new_by_nid(int nid);
-/* EC_GROUP_get0_comment() returns a pointer to the 'comment' field of
- * ec_curve_data_st structure */
-const char *EC_GROUP_get0_comment(int nid);
-/* internal function : ec_group_index2nid() returns the NID of curve
- * with the given index i from the internal curve list */
-int ec_group_index2nid(int i);
+/* handling of internal curves */
+typedef struct {
+ int nid;
+ const char *comment;
+ } EC_builtin_curve;
+/* EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number
+ * of all available curves or zero if a error occurred.
+ * In case r ist not zero nitems EC_builtin_curve structures
+ * are filled with the data of the first nitems internal groups */
+size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems);
/* EC_POINT functions */
diff --git a/crypto/ec/ec_curve.c b/crypto/ec/ec_curve.c
index 93f775d556..090520372e 100644
--- a/crypto/ec/ec_curve.c
+++ b/crypto/ec/ec_curve.c
@@ -1207,19 +1207,20 @@ EC_GROUP *EC_GROUP_new_by_nid(int nid)
return ret;
}
-const char *EC_GROUP_get0_comment(int nid)
+size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems)
{
- size_t i;
+ size_t i, min;
- for (i=0; i<curve_list_length; i++)
- if (curve_list[i].nid == nid)
- return curve_list[i].data->comment;
- return NULL;
- }
+ if (r == NULL || nitems == 0)
+ return curve_list_length;
-int ec_group_index2nid(int i)
- {
- if (i >= curve_list_length || i < 0)
- return 0;
- return curve_list[i].nid;
+ min = nitems < curve_list_length ? nitems : curve_list_length;
+
+ for (i = 0; i < min; i++)
+ {
+ r[i].nid = curve_list[i].nid;
+ r[i].comment = curve_list[i].data->comment;
+ }
+
+ return curve_list_length;
}
diff --git a/util/libeay.num b/util/libeay.num
index 7f86dbc01b..4b96ca8bf0 100755
--- a/util/libeay.num
+++ b/util/libeay.num
@@ -3003,9 +3003,10 @@ ENGINE_register_all_ECDH 3436 EXIST::FUNCTION:
ECDH_DATA_new_method 3437 EXIST::FUNCTION:ECDH
ENGINE_set_default_ECDH 3438 EXIST::FUNCTION:
ENGINE_register_ECDH 3439 EXIST::FUNCTION:
-EC_GROUP_get0_comment 3440 EXIST::FUNCTION:EC
-ec_group_index2nid 3441 EXIST::FUNCTION:EC
+EC_GROUP_get0_comment 3440 NOEXIST::FUNCTION:
+ec_group_index2nid 3441 NOEXIST::FUNCTION:
EC_GROUP_get_basis_type 3442 EXIST::FUNCTION:EC
X509_REQ_print_ex 3443 EXIST::FUNCTION:BIO
EC_GROUP_get_pentanomial_basis 3444 EXIST::FUNCTION:EC
EC_GROUP_get_trinomial_basis 3445 EXIST::FUNCTION:EC
+EC_get_builtin_curves 3446 EXIST::FUNCTION:EC