change API for looking at the internal curve list

Submitted by: Nils Larsch
diff --git a/apps/ecparam.c b/apps/ecparam.c
index e0a5606..71ae9e7 100644
--- a/apps/ecparam.c
+++ b/apps/ecparam.c
@@ -352,19 +352,33 @@
 
 	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 @@
 				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 faca04a..094e05e 100644
--- a/crypto/ec/ec.h
+++ b/crypto/ec/ec.h
@@ -184,12 +184,16 @@
 
 /* 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 93f775d..0905203 100644
--- a/crypto/ec/ec_curve.c
+++ b/crypto/ec/ec_curve.c
@@ -1207,19 +1207,20 @@
 	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 7f86dbc..4b96ca8 100755
--- a/util/libeay.num
+++ b/util/libeay.num
@@ -3003,9 +3003,10 @@
 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