tests: psa: Reset key attributes where needed

After a call to psa_get_key_attributes() to retrieve
the attributes of a key into a psa_key_attributes_t
structure, a call to psa_reset_key_attributes() is
mandated to free the resources that may be
referenced by the psa_key_attributes_t structure.
Not calling psa_reset_key_attributes() may result in
a memory leak.

When a test function calls psa_get_key_parameters()
the associated key attributes are systematically
reset in the clean-up part of the function with a
comment to emphasize the need for the reset and make
it more visible.

Signed-off-by: Ronald Cron <ronald.cron@arm.com>
This commit is contained in:
Ronald Cron 2020-11-19 17:55:23 +01:00
parent 1d12d87d18
commit 3a4f0e3cc4
5 changed files with 226 additions and 12 deletions

View file

@ -200,6 +200,12 @@ void pk_psa_utils( )
TEST_ASSERT( PSA_SUCCESS == psa_destroy_key( key ) ); TEST_ASSERT( PSA_SUCCESS == psa_destroy_key( key ) );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes );
mbedtls_pk_free( &pk ); /* redundant except upon error */ mbedtls_pk_free( &pk ); /* redundant except upon error */
mbedtls_pk_free( &pk2 ); mbedtls_pk_free( &pk2 );
PSA_DONE( ); PSA_DONE( );
@ -1289,6 +1295,12 @@ void pk_psa_sign( int grpid_arg,
hash, sizeof hash, sig, sig_len ) == 0 ); hash, sizeof hash, sig, sig_len ) == 0 );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes );
mbedtls_pk_free( &pk ); mbedtls_pk_free( &pk );
PSA_DONE( ); PSA_DONE( );
} }

View file

@ -292,7 +292,12 @@ int check_key_attributes_sanity( mbedtls_svc_key_id_t key )
ok = 1; ok = 1;
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
return( ok ); return( ok );
} }
@ -445,6 +450,7 @@ static int exercise_cipher_key( mbedtls_svc_key_id_t key,
iv_length = PSA_BLOCK_CIPHER_BLOCK_SIZE( iv_length = PSA_BLOCK_CIPHER_BLOCK_SIZE(
psa_get_key_type( &attributes ) ); psa_get_key_type( &attributes ) );
maybe_invalid_padding = ! PSA_ALG_IS_STREAM_CIPHER( alg ); maybe_invalid_padding = ! PSA_ALG_IS_STREAM_CIPHER( alg );
psa_reset_key_attributes( &attributes );
} }
PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) ); PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
PSA_ASSERT( psa_cipher_set_iv( &operation, PSA_ASSERT( psa_cipher_set_iv( &operation,
@ -717,8 +723,13 @@ static psa_status_t key_agreement_with_self(
operation, PSA_KEY_DERIVATION_INPUT_SECRET, key, operation, PSA_KEY_DERIVATION_INPUT_SECRET, key,
public_key, public_key_length ); public_key, public_key_length );
exit: exit:
mbedtls_free( public_key ); /*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
mbedtls_free( public_key );
return( status ); return( status );
} }
@ -754,8 +765,13 @@ static psa_status_t raw_key_agreement_with_self( psa_algorithm_t alg,
public_key, public_key_length, public_key, public_key_length,
output, sizeof( output ), &output_length ); output, sizeof( output ), &output_length );
exit: exit:
mbedtls_free( public_key ); /*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
mbedtls_free( public_key );
return( status ); return( status );
} }
@ -1033,8 +1049,13 @@ static int exercise_export_key( mbedtls_svc_key_id_t key,
exported, exported_length ); exported, exported_length );
exit: exit:
mbedtls_free( exported ); /*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
mbedtls_free( exported );
return( ok ); return( ok );
} }
@ -1069,8 +1090,13 @@ static int exercise_export_public_key( mbedtls_svc_key_id_t key )
exported, exported_length ); exported, exported_length );
exit: exit:
mbedtls_free( exported ); /*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
mbedtls_free( exported );
return( ok ); return( ok );
} }
@ -1205,7 +1231,12 @@ static int test_operations_on_invalid_key( mbedtls_svc_key_id_t key )
ok = 1; ok = 1;
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
return( ok ); return( ok );
} }
@ -1479,8 +1510,13 @@ void import_with_policy( int type_arg,
test_operations_on_invalid_key( key ); test_operations_on_invalid_key( key );
exit: exit:
psa_destroy_key( key ); /*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &got_attributes ); psa_reset_key_attributes( &got_attributes );
psa_destroy_key( key );
PSA_DONE( ); PSA_DONE( );
} }
/* END_CASE */ /* END_CASE */
@ -1518,8 +1554,13 @@ void import_with_data( data_t *data, int type_arg,
test_operations_on_invalid_key( key ); test_operations_on_invalid_key( key );
exit: exit:
psa_destroy_key( key ); /*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &got_attributes ); psa_reset_key_attributes( &got_attributes );
psa_destroy_key( key );
PSA_DONE( ); PSA_DONE( );
} }
/* END_CASE */ /* END_CASE */
@ -1567,6 +1608,12 @@ void import_large_key( int type_arg, int byte_size_arg,
} }
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes );
psa_destroy_key( key ); psa_destroy_key( key );
PSA_DONE( ); PSA_DONE( );
mbedtls_free( buffer ); mbedtls_free( buffer );
@ -1696,9 +1743,14 @@ destroy:
test_operations_on_invalid_key( key ); test_operations_on_invalid_key( key );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &got_attributes );
mbedtls_free( exported ); mbedtls_free( exported );
mbedtls_free( reexported ); mbedtls_free( reexported );
psa_reset_key_attributes( &got_attributes );
PSA_DONE( ); PSA_DONE( );
} }
/* END_CASE */ /* END_CASE */
@ -1749,9 +1801,14 @@ void import_export_public_key( data_t *data,
} }
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes );
mbedtls_free( exported ); mbedtls_free( exported );
psa_destroy_key( key ); psa_destroy_key( key );
psa_reset_key_attributes( &attributes );
PSA_DONE( ); PSA_DONE( );
} }
/* END_CASE */ /* END_CASE */
@ -1792,8 +1849,14 @@ void import_and_exercise_key( data_t *data,
test_operations_on_invalid_key( key ); test_operations_on_invalid_key( key );
exit: exit:
psa_destroy_key( key ); /*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &got_attributes ); psa_reset_key_attributes( &got_attributes );
psa_reset_key_attributes( &attributes );
psa_destroy_key( key );
PSA_DONE( ); PSA_DONE( );
} }
/* END_CASE */ /* END_CASE */
@ -1832,8 +1895,13 @@ void effective_key_attributes( int type_arg, int expected_type_arg,
TEST_EQUAL( psa_get_key_algorithm( &attributes ), expected_alg ); TEST_EQUAL( psa_get_key_algorithm( &attributes ), expected_alg );
exit: exit:
psa_destroy_key( key ); /*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
psa_destroy_key( key );
PSA_DONE( ); PSA_DONE( );
} }
/* END_CASE */ /* END_CASE */
@ -2087,8 +2155,13 @@ void asymmetric_encryption_key_policy( int policy_usage,
TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED ); TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
exit: exit:
psa_destroy_key( key ); /*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
psa_destroy_key( key );
PSA_DONE( ); PSA_DONE( );
mbedtls_free( buffer ); mbedtls_free( buffer );
} }
@ -2265,6 +2338,12 @@ void key_policy_alg2( int key_type_arg, data_t *key_data,
goto exit; goto exit;
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &got_attributes );
psa_destroy_key( key ); psa_destroy_key( key );
PSA_DONE( ); PSA_DONE( );
} }
@ -2385,8 +2464,13 @@ void copy_success( int source_usage_arg,
PSA_ASSERT( psa_destroy_key( target_key ) ); PSA_ASSERT( psa_destroy_key( target_key ) );
exit: exit:
/*
* Source and target key attributes may have been returned by
* psa_get_key_attributes() thus reset them as required.
*/
psa_reset_key_attributes( &source_attributes ); psa_reset_key_attributes( &source_attributes );
psa_reset_key_attributes( &target_attributes ); psa_reset_key_attributes( &target_attributes );
PSA_DONE( ); PSA_DONE( );
mbedtls_free( export_buffer ); mbedtls_free( export_buffer );
} }
@ -4138,7 +4222,12 @@ void sign_deterministic( int key_type_arg, data_t *key_data,
#endif /* MBEDTLS_TEST_DEPRECATED */ #endif /* MBEDTLS_TEST_DEPRECATED */
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
psa_destroy_key( key ); psa_destroy_key( key );
mbedtls_free( signature ); mbedtls_free( signature );
PSA_DONE( ); PSA_DONE( );
@ -4259,7 +4348,12 @@ void sign_verify( int key_type_arg, data_t *key_data,
} }
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
psa_destroy_key( key ); psa_destroy_key( key );
mbedtls_free( signature ); mbedtls_free( signature );
PSA_DONE( ); PSA_DONE( );
@ -4409,7 +4503,12 @@ void asymmetric_encrypt( int key_type_arg,
} }
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
psa_destroy_key( key ); psa_destroy_key( key );
mbedtls_free( output ); mbedtls_free( output );
PSA_DONE( ); PSA_DONE( );
@ -4473,7 +4572,12 @@ void asymmetric_encrypt_decrypt( int key_type_arg,
output2, output2_length ); output2, output2_length );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
psa_destroy_key( key ); psa_destroy_key( key );
mbedtls_free( output ); mbedtls_free( output );
mbedtls_free( output2 ); mbedtls_free( output2 );
@ -5080,8 +5184,13 @@ void derive_key_exercise( int alg_arg,
goto exit; goto exit;
exit: exit:
psa_key_derivation_abort( &operation ); /*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &got_attributes ); psa_reset_key_attributes( &got_attributes );
psa_key_derivation_abort( &operation );
psa_destroy_key( base_key ); psa_destroy_key( base_key );
psa_destroy_key( derived_key ); psa_destroy_key( derived_key );
PSA_DONE( ); PSA_DONE( );
@ -5511,7 +5620,12 @@ void generate_key( int type_arg,
goto exit; goto exit;
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &got_attributes ); psa_reset_key_attributes( &got_attributes );
psa_destroy_key( key ); psa_destroy_key( key );
PSA_DONE( ); PSA_DONE( );
} }
@ -5612,7 +5726,12 @@ void generate_key_rsa( int bits_arg,
} }
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes() or
* set by psa_set_key_domain_parameters() thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
psa_destroy_key( key ); psa_destroy_key( key );
PSA_DONE( ); PSA_DONE( );
mbedtls_free( e_read_buffer ); mbedtls_free( e_read_buffer );
@ -5741,7 +5860,12 @@ void persistent_key_load_key_from_storage( data_t *data,
goto exit; goto exit;
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
mbedtls_free( first_export ); mbedtls_free( first_export );
mbedtls_free( second_export ); mbedtls_free( second_export );
psa_key_derivation_abort( &operation ); psa_key_derivation_abort( &operation );

View file

@ -240,7 +240,12 @@ void persistent_key_import( int owner_id_arg, int key_id_arg, int type_arg,
PSA_ASSERT( psa_destroy_key( key_id ) ); PSA_ASSERT( psa_destroy_key( key_id ) );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
psa_destroy_persistent_key( key_id ); psa_destroy_persistent_key( key_id );
PSA_DONE(); PSA_DONE();
} }
@ -308,7 +313,12 @@ void import_export_persistent_key( data_t *data, int type_arg,
TEST_EQUAL( psa_is_key_present_in_storage( key_id ), 0 ); TEST_EQUAL( psa_is_key_present_in_storage( key_id ), 0 );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
mbedtls_free( exported ); mbedtls_free( exported );
PSA_DONE( ); PSA_DONE( );
psa_destroy_persistent_key( key_id ); psa_destroy_persistent_key( key_id );

View file

@ -578,6 +578,12 @@ static int check_key_attributes(
ok = 1; ok = 1;
exit: exit:
/*
* Actual key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &actual_attributes );
return( ok ); return( ok );
} }
@ -753,7 +759,12 @@ static int smoke_test_key( mbedtls_svc_key_id_t key )
ok = 1; ok = 1;
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes ); psa_reset_key_attributes( &attributes );
return( ok ); return( ok );
} }
@ -1080,6 +1091,12 @@ void key_creation_in_chosen_slot( int slot_arg,
TEST_EQUAL( psa_open_key( id, &handle ), PSA_ERROR_DOES_NOT_EXIST ); TEST_EQUAL( psa_open_key( id, &handle ), PSA_ERROR_DOES_NOT_EXIST );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes );
PSA_DONE( ); PSA_DONE( );
ram_slots_reset( ); ram_slots_reset( );
psa_purge_storage( ); psa_purge_storage( );
@ -1431,6 +1448,12 @@ void sign_verify( int flow,
PSA_ERROR_INVALID_SIGNATURE ); PSA_ERROR_INVALID_SIGNATURE );
exit: exit:
/*
* Driver key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &drv_attributes );
psa_destroy_key( id ); psa_destroy_key( id );
psa_destroy_key( sw_key ); psa_destroy_key( sw_key );
PSA_DONE( ); PSA_DONE( );

View file

@ -226,6 +226,12 @@ void transient_slot_lifecycle( int owner_id_arg,
TEST_EQUAL( psa_close_key( key ), PSA_ERROR_DOES_NOT_EXIST ); TEST_EQUAL( psa_close_key( key ), PSA_ERROR_DOES_NOT_EXIST );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes );
PSA_DONE( ); PSA_DONE( );
} }
/* END_CASE */ /* END_CASE */
@ -369,6 +375,13 @@ void persistent_slot_lifecycle( int lifetime_arg, int owner_id_arg, int id_arg,
} }
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes );
psa_reset_key_attributes( &read_attributes );
PSA_DONE( ); PSA_DONE( );
psa_purge_key_storage( ); psa_purge_key_storage( );
mbedtls_free( reexported ); mbedtls_free( reexported );
@ -437,6 +450,12 @@ void create_existent( int lifetime_arg, int owner_id_arg, int id_arg,
PSA_ASSERT( psa_close_key( id ) ); PSA_ASSERT( psa_close_key( id ) );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes );
PSA_DONE( ); PSA_DONE( );
psa_purge_key_storage( ); psa_purge_key_storage( );
} }
@ -626,6 +645,13 @@ void copy_across_lifetimes( int source_lifetime_arg, int source_owner_id_arg,
PSA_ASSERT( psa_destroy_key( returned_target_id ) ); PSA_ASSERT( psa_destroy_key( returned_target_id ) );
exit: exit:
/*
* Source and target key attributes may have been returned by
* psa_get_key_attributes() thus reset them as required.
*/
psa_reset_key_attributes( &source_attributes );
psa_reset_key_attributes( &target_attributes );
PSA_DONE( ); PSA_DONE( );
mbedtls_free( export_buffer ); mbedtls_free( export_buffer );
#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) #if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C)
@ -737,6 +763,13 @@ void copy_to_occupied( int source_lifetime_arg, int source_id_arg,
PSA_ASSERT( psa_destroy_key( returned_target_id ) ); PSA_ASSERT( psa_destroy_key( returned_target_id ) );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes1 );
psa_reset_key_attributes( &attributes2 );
PSA_DONE( ); PSA_DONE( );
mbedtls_free( export_buffer ); mbedtls_free( export_buffer );
#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) #if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C)
@ -824,6 +857,12 @@ void invalid_handle( int handle_construction,
PSA_ASSERT( psa_close_key( valid_handle ) ); PSA_ASSERT( psa_close_key( valid_handle ) );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes );
PSA_DONE( ); PSA_DONE( );
} }
/* END_CASE */ /* END_CASE */
@ -1059,6 +1098,12 @@ void non_reusable_key_slots_integrity_in_case_of_key_slot_starvation( )
ASSERT_COMPARE( exported, exported_length, ASSERT_COMPARE( exported, exported_length,
(uint8_t *) &persistent_key, sizeof( persistent_key ) ); (uint8_t *) &persistent_key, sizeof( persistent_key ) );
exit: exit:
/*
* Key attributes may have been returned by psa_get_key_attributes()
* thus reset them as required.
*/
psa_reset_key_attributes( &attributes );
psa_destroy_key( persistent_key ); psa_destroy_key( persistent_key );
PSA_DONE( ); PSA_DONE( );
mbedtls_free( keys ); mbedtls_free( keys );