From: Nikos Mavrogiannopoulos Date: Tue, 24 Jan 2012 19:27:57 +0000 (+0100) Subject: Allow quering available elliptic curves by adding gnutls_ecc_curve_list(). X-Git-Tag: gnutls_3_0_13~201 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a6cc0534fec3023e94878a9bd89918bb84244cb;p=thirdparty%2Fgnutls.git Allow quering available elliptic curves by adding gnutls_ecc_curve_list(). --- diff --git a/NEWS b/NEWS index 6c78c4e3cb..6d82a68ef9 100644 --- a/NEWS +++ b/NEWS @@ -25,6 +25,7 @@ a fork. gnutls_x509_crt_get_authority_key_gn_serial: Added gnutls_x509_crl_get_authority_key_gn_serial: Added gnutls_pkcs11_reinit: Added +gnutls_ecc_list: Added * Version 3.0.12 (released 2012-01-20) diff --git a/doc/printlist.c b/doc/printlist.c index d52b5c81eb..87d0ca349b 100644 --- a/doc/printlist.c +++ b/doc/printlist.c @@ -144,6 +144,18 @@ static void main_texinfo (void) printf ("@end table\n"); } + { + const gnutls_ecc_curve_t *p = gnutls_ecc_curve_list (); + + printf ("\n@heading Elliptic curves\n@table @code\n"); + for (; *p; p++) + { + printf ("@item %s\n", gnutls_ecc_curve_get_name (*p)); + } + printf ("@end table\n"); + } + + { const gnutls_compression_method_t *p = gnutls_compression_list (); diff --git a/lib/algorithms/ecc.c b/lib/algorithms/ecc.c index ea0b830d35..0431450d02 100644 --- a/lib/algorithms/ecc.c +++ b/lib/algorithms/ecc.c @@ -121,6 +121,34 @@ _gnutls_tls_id_to_ecc_curve (int num) return ret; } +/** + * gnutls_ecc_curve_list: + * + * Get the list of supported elliptic curves. + * + * This function is not thread safe. + * + * Returns: Return a (0)-terminated list of #gnutls_ecc_curve_t + * integers indicating the available curves. + **/ +const gnutls_ecc_curve_t * +gnutls_ecc_curve_list (void) +{ +static gnutls_ecc_curve_t supported_curves[MAX_ALGOS] = { 0 }; + + if (supported_curves[0] == 0) + { + int i = 0; + + GNUTLS_ECC_CURVE_LOOP ( + supported_curves[i++]=p->id; + ); + supported_curves[i++]=0; + } + + return supported_curves; +} + /* Maps numbers to TLS NamedCurve IDs (RFC4492). * Returns a negative number on error. */ diff --git a/lib/includes/gnutls/gnutls.h.in b/lib/includes/gnutls/gnutls.h.in index 92acaaadbb..344168a2e0 100644 --- a/lib/includes/gnutls/gnutls.h.in +++ b/lib/includes/gnutls/gnutls.h.in @@ -797,6 +797,7 @@ gnutls_ecc_curve_t gnutls_ecc_curve_get(gnutls_session_t session); gnutls_sign_algorithm_t gnutls_sign_get_id (const char *name); /* list supported algorithms */ + const gnutls_ecc_curve_t * gnutls_ecc_curve_list (void); const gnutls_cipher_algorithm_t *gnutls_cipher_list (void); const gnutls_mac_algorithm_t *gnutls_mac_list (void); const gnutls_compression_method_t *gnutls_compression_list (void); diff --git a/lib/libgnutls.map b/lib/libgnutls.map index cf3792c3af..229a65c4e2 100644 --- a/lib/libgnutls.map +++ b/lib/libgnutls.map @@ -765,6 +765,7 @@ GNUTLS_3_0_0 { gnutls_pkcs11_reinit; gnutls_x509_crt_get_authority_key_gn_serial; gnutls_x509_crl_get_authority_key_gn_serial; + gnutls_ecc_curve_list; } GNUTLS_2_12; GNUTLS_PRIVATE { diff --git a/src/common.c b/src/common.c index bd03a54229..e01e9a07ca 100644 --- a/src/common.c +++ b/src/common.c @@ -702,6 +702,20 @@ print_list (const char* priorities, int verbose) } } + { + const gnutls_ecc_curve_t *p = gnutls_ecc_curve_list (); + + printf ("Elliptic curves: "); + for (; *p; p++) + { + printf ("CURVE-%s", gnutls_ecc_curve_get_name (*p)); + if (*(p + 1)) + printf (", "); + else + printf ("\n"); + } + } + { const gnutls_pk_algorithm_t *p = gnutls_pk_list ();