New function mbedtls_rsa_get_bitlen
Add a new function mbedtls_rsa_get_bitlen which returns the RSA key
size, i.e. the bit size of the modulus. In the pk module, call
mbedtls_rsa_get_bitlen instead of mbedtls_rsa_get_len, which gave the
wrong result for key sizes that are not a multiple of 8.
This commit adds one non-regression test in the pk suite. More tests
are needed for RSA key sizes that are a multiple of 8.
This commit does not address RSA alternative implementations, which
only provide an interface that return the modulus size in bytes.
diff --git a/tests/suites/test_suite_pk.function b/tests/suites/test_suite_pk.function
index 9005ddb..a1d9b0b 100644
--- a/tests/suites/test_suite_pk.function
+++ b/tests/suites/test_suite_pk.function
@@ -13,13 +13,18 @@
#define RSA_KEY_SIZE 512
#define RSA_KEY_LEN 64
-static int pk_genkey( mbedtls_pk_context *pk )
+static int pk_genkey( mbedtls_pk_context *pk, int size )
{
((void) pk);
#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)
if( mbedtls_pk_get_type( pk ) == MBEDTLS_PK_RSA )
- return mbedtls_rsa_gen_key( mbedtls_pk_rsa( *pk ), rnd_std_rand, NULL, RSA_KEY_SIZE, 3 );
+ {
+ if( size == 0 )
+ size = RSA_KEY_SIZE;
+ return( mbedtls_rsa_gen_key( mbedtls_pk_rsa( *pk ),
+ rnd_std_rand, NULL, size, 3 ) );
+ }
#endif
#if defined(MBEDTLS_ECP_C)
if( mbedtls_pk_get_type( pk ) == MBEDTLS_PK_ECKEY ||
@@ -27,8 +32,30 @@
mbedtls_pk_get_type( pk ) == MBEDTLS_PK_ECDSA )
{
int ret;
+ mbedtls_ecp_group_id curve;
+ switch( size )
+ {
+ case 0:
+ case 192:
+ curve = MBEDTLS_ECP_DP_SECP192R1;
+ break;
+ case 224:
+ curve = MBEDTLS_ECP_DP_SECP224R1;
+ break;
+ case 256:
+ curve = MBEDTLS_ECP_DP_SECP256R1;
+ break;
+ case 384:
+ curve = MBEDTLS_ECP_DP_SECP384R1;
+ break;
+ case 521:
+ curve = MBEDTLS_ECP_DP_SECP521R1;
+ break;
+ default:
+ return( -1 );
+ }
if( ( ret = mbedtls_ecp_group_load( &mbedtls_pk_ec( *pk )->grp,
- MBEDTLS_ECP_DP_SECP192R1 ) ) != 0 )
+ curve ) ) != 0 )
return( ret );
return mbedtls_ecp_gen_keypair( &mbedtls_pk_ec( *pk )->grp, &mbedtls_pk_ec( *pk )->d,
@@ -77,7 +104,7 @@
mbedtls_pk_init( &pk );
TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( type ) ) == 0 );
- TEST_ASSERT( pk_genkey( &pk ) == 0 );
+ TEST_ASSERT( pk_genkey( &pk, size ) == 0 );
TEST_ASSERT( (int) mbedtls_pk_get_type( &pk ) == type );
TEST_ASSERT( mbedtls_pk_can_do( &pk, type ) );
@@ -252,7 +279,7 @@
memset( sig, 0, sizeof sig );
TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( type ) ) == 0 );
- TEST_ASSERT( pk_genkey( &pk ) == 0 );
+ TEST_ASSERT( pk_genkey( &pk, 0 ) == 0 );
TEST_ASSERT( mbedtls_pk_sign( &pk, MBEDTLS_MD_SHA256, hash, sizeof hash,
sig, &sig_len, rnd_std_rand, NULL ) == sign_ret );
@@ -447,7 +474,7 @@
/* Initiliaze PK RSA context with random key */
TEST_ASSERT( mbedtls_pk_setup( &rsa,
mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == 0 );
- TEST_ASSERT( pk_genkey( &rsa ) == 0 );
+ TEST_ASSERT( pk_genkey( &rsa, RSA_KEY_SIZE ) == 0 );
/* Extract key to the raw rsa context */
TEST_ASSERT( mbedtls_rsa_copy( &raw, mbedtls_pk_rsa( rsa ) ) == 0 );