diff --git a/include/polarssl/ecp.h b/include/polarssl/ecp.h index 7342f4505..c0f50791d 100644 --- a/include/polarssl/ecp.h +++ b/include/polarssl/ecp.h @@ -204,6 +204,15 @@ const ecp_curve_info *ecp_curve_info_from_grp_id( ecp_group_id grp_id ); */ const ecp_curve_info *ecp_curve_info_from_tls_id( uint16_t tls_id ); +/** + * \brief Get curve information from a human-readable name + * + * \param name The name + * + * \return The associated curve information or NULL + */ +const ecp_curve_info *ecp_curve_info_from_name( const char *name ); + /** * \brief Initialize a point (as zero) */ diff --git a/library/ecp.c b/library/ecp.c index 80a10ba94..ef38d19d7 100644 --- a/library/ecp.c +++ b/library/ecp.c @@ -58,6 +58,11 @@ #include #include +#if defined(_MSC_VER) && !defined strcasecmp && !defined(EFIX64) && \ + !defined(EFI32) +#define strcasecmp _stricmp +#endif + #if defined(_MSC_VER) && !defined(inline) #define inline _inline #else @@ -84,13 +89,13 @@ unsigned long add_count, dbl_count, mul_count; const ecp_curve_info ecp_supported_curves[] = { #if defined(POLARSSL_ECP_DP_BP512R1_ENABLED) - { POLARSSL_ECP_DP_BP512R1, 28, 512, "brainpool512r1" }, + { POLARSSL_ECP_DP_BP512R1, 28, 512, "brainpoolP512r1" }, #endif #if defined(POLARSSL_ECP_DP_BP384R1_ENABLED) - { POLARSSL_ECP_DP_BP384R1, 27, 384, "brainpool384r1" }, + { POLARSSL_ECP_DP_BP384R1, 27, 384, "brainpoolP384r1" }, #endif #if defined(POLARSSL_ECP_DP_BP256R1_ENABLED) - { POLARSSL_ECP_DP_BP256R1, 26, 256, "brainpool256r1" }, + { POLARSSL_ECP_DP_BP256R1, 26, 256, "brainpoolP256r1" }, #endif #if defined(POLARSSL_ECP_DP_SECP521R1_ENABLED) { POLARSSL_ECP_DP_SECP521R1, 25, 521, "secp521r1" }, @@ -154,6 +159,24 @@ const ecp_curve_info *ecp_curve_info_from_tls_id( uint16_t tls_id ) return( NULL ); } +/* + * Get the curve info from the name + */ +const ecp_curve_info *ecp_curve_info_from_name( const char *name ) +{ + const ecp_curve_info *curve_info; + + for( curve_info = ecp_curve_list(); + curve_info->grp_id != POLARSSL_ECP_DP_NONE; + curve_info++ ) + { + if( strcasecmp( curve_info->name, name ) == 0 ) + return( curve_info ); + } + + return( NULL ); +} + /* * Initialize (the components of) a point */ diff --git a/tests/suites/test_suite_ecp.data b/tests/suites/test_suite_ecp.data index 92c490a15..17ad8aa10 100644 --- a/tests/suites/test_suite_ecp.data +++ b/tests/suites/test_suite_ecp.data @@ -1,3 +1,35 @@ +ECP curve info #1 +depends_on:POLARSSL_ECP_DP_BP512R1_ENABLED +ecp_curve_info:POLARSSL_ECP_DP_BP512R1:28:512:"brainpoolP512r1" + +ECP curve info #2 +depends_on:POLARSSL_ECP_DP_BP384R1_ENABLED +ecp_curve_info:POLARSSL_ECP_DP_BP384R1:27:384:"brainpoolP384r1" + +ECP curve info #3 +depends_on:POLARSSL_ECP_DP_BP256R1_ENABLED +ecp_curve_info:POLARSSL_ECP_DP_BP256R1:26:256:"brainpoolP256r1" + +ECP curve info #4 +depends_on:POLARSSL_ECP_DP_SECP521R1_ENABLED +ecp_curve_info:POLARSSL_ECP_DP_SECP521R1:25:521:"secp521r1" + +ECP curve info #5 +depends_on:POLARSSL_ECP_DP_SECP384R1_ENABLED +ecp_curve_info:POLARSSL_ECP_DP_SECP384R1:24:384:"secp384r1" + +ECP curve info #6 +depends_on:POLARSSL_ECP_DP_SECP256R1_ENABLED +ecp_curve_info:POLARSSL_ECP_DP_SECP256R1:23:256:"secp256r1" + +ECP curve info #7 +depends_on:POLARSSL_ECP_DP_SECP224R1_ENABLED +ecp_curve_info:POLARSSL_ECP_DP_SECP224R1:21:224:"secp224r1" + +ECP curve info #8 +depends_on:POLARSSL_ECP_DP_SECP192R1_ENABLED +ecp_curve_info:POLARSSL_ECP_DP_SECP192R1:19:192:"secp192r1" + ECP small addition #1 ecp_small_add:1:"":"":1:"":"":1:0:0 diff --git a/tests/suites/test_suite_ecp.function b/tests/suites/test_suite_ecp.function index 9473dd442..cb93e850a 100644 --- a/tests/suites/test_suite_ecp.function +++ b/tests/suites/test_suite_ecp.function @@ -9,6 +9,22 @@ * END_DEPENDENCIES */ +/* BEGIN_CASE */ +void ecp_curve_info( int id, int tls_id, int size, char *name ) +{ + const ecp_curve_info *by_id, *by_tls, *by_name; + + TEST_ASSERT( ( by_id = ecp_curve_info_from_grp_id( id ) ) != NULL ); + TEST_ASSERT( ( by_tls = ecp_curve_info_from_tls_id( tls_id ) ) != NULL ); + TEST_ASSERT( ( by_name = ecp_curve_info_from_name( name ) ) != NULL ); + + TEST_ASSERT( by_id == by_tls ); + TEST_ASSERT( by_id == by_name ); + + TEST_ASSERT( by_id->size == size ); +} +/* END_CASE */ + /* BEGIN_CASE */ void ecp_small_add( int a_zero, char *x_a, char *y_a, int b_zero, char *x_b, char *y_b, int c_zero, int x_c, int y_c )