Skip to content

Commit ff5f0e7

Browse files
Implement atomic-creation psa_{generate,generator_import}_key
Implement the new, attribute-based psa_generate_key and psa_generator_import_key.
1 parent db4b3ab commit ff5f0e7

File tree

2 files changed

+159
-72
lines changed

2 files changed

+159
-72
lines changed

library/psa_crypto.c

Lines changed: 102 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4120,6 +4120,59 @@ static void psa_des_set_key_parity( uint8_t *data, size_t data_size )
41204120
}
41214121
#endif /* MBEDTLS_DES_C */
41224122

4123+
static psa_status_t psa_generator_import_key_internal(
4124+
psa_key_slot_t *slot,
4125+
size_t bits,
4126+
psa_crypto_generator_t *generator )
4127+
{
4128+
uint8_t *data = NULL;
4129+
size_t bytes = PSA_BITS_TO_BYTES( bits );
4130+
psa_status_t status;
4131+
4132+
if( ! key_type_is_raw_bytes( slot->type ) )
4133+
return( PSA_ERROR_INVALID_ARGUMENT );
4134+
if( bits % 8 != 0 )
4135+
return( PSA_ERROR_INVALID_ARGUMENT );
4136+
data = mbedtls_calloc( 1, bytes );
4137+
if( data == NULL )
4138+
return( PSA_ERROR_INSUFFICIENT_MEMORY );
4139+
4140+
status = psa_generator_read( generator, data, bytes );
4141+
if( status != PSA_SUCCESS )
4142+
goto exit;
4143+
#if defined(MBEDTLS_DES_C)
4144+
if( slot->type == PSA_KEY_TYPE_DES )
4145+
psa_des_set_key_parity( data, bytes );
4146+
#endif /* MBEDTLS_DES_C */
4147+
status = psa_import_key_into_slot( slot, data, bytes );
4148+
4149+
exit:
4150+
mbedtls_free( data );
4151+
return( status );
4152+
}
4153+
4154+
psa_status_t psa_generator_import_key( const psa_key_attributes_t *attributes,
4155+
psa_key_handle_t *handle,
4156+
size_t bits,
4157+
psa_crypto_generator_t *generator )
4158+
{
4159+
psa_status_t status;
4160+
psa_key_slot_t *slot = NULL;
4161+
status = psa_start_key_creation( attributes, handle, &slot );
4162+
if( status == PSA_SUCCESS )
4163+
{
4164+
status = psa_generator_import_key_internal( slot, bits, generator );
4165+
}
4166+
if( status == PSA_SUCCESS )
4167+
status = psa_finish_key_creation( slot );
4168+
if( status != PSA_SUCCESS )
4169+
{
4170+
psa_fail_key_creation( slot );
4171+
*handle = 0;
4172+
}
4173+
return( status );
4174+
}
4175+
41234176
psa_status_t psa_generator_import_key_to_handle( psa_key_handle_t handle,
41244177
psa_key_type_t type,
41254178
size_t bits,
@@ -4873,24 +4926,19 @@ psa_status_t mbedtls_psa_inject_entropy( const unsigned char *seed,
48734926
}
48744927
#endif /* MBEDTLS_PSA_INJECT_ENTROPY */
48754928

4876-
psa_status_t psa_generate_key_to_handle( psa_key_handle_t handle,
4877-
psa_key_type_t type,
4878-
size_t bits,
4879-
const void *extra,
4880-
size_t extra_size )
4929+
static psa_status_t psa_generate_key_internal( psa_key_slot_t *slot,
4930+
size_t bits,
4931+
const void *extra,
4932+
size_t extra_size )
48814933
{
4882-
psa_key_slot_t *slot;
4883-
psa_status_t status;
4934+
psa_key_type_t type = slot->type;
48844935

48854936
if( extra == NULL && extra_size != 0 )
48864937
return( PSA_ERROR_INVALID_ARGUMENT );
48874938

4888-
status = psa_get_empty_key_slot( handle, &slot );
4889-
if( status != PSA_SUCCESS )
4890-
return( status );
4891-
48924939
if( key_type_is_raw_bytes( type ) )
48934940
{
4941+
psa_status_t status;
48944942
status = prepare_raw_data_slot( type, bits, &slot->data.raw );
48954943
if( status != PSA_SUCCESS )
48964944
return( status );
@@ -4989,7 +5037,26 @@ psa_status_t psa_generate_key_to_handle( psa_key_handle_t handle,
49895037

49905038
return( PSA_ERROR_NOT_SUPPORTED );
49915039

5040+
return( PSA_SUCCESS );
5041+
}
5042+
5043+
psa_status_t psa_generate_key_to_handle( psa_key_handle_t handle,
5044+
psa_key_type_t type,
5045+
size_t bits,
5046+
const void *extra,
5047+
size_t extra_size )
5048+
{
5049+
psa_key_slot_t *slot;
5050+
psa_status_t status;
5051+
5052+
status = psa_get_empty_key_slot( handle, &slot );
5053+
if( status != PSA_SUCCESS )
5054+
return( status );
5055+
49925056
slot->type = type;
5057+
status = psa_generate_key_internal( slot, bits, extra, extra_size );
5058+
if( status != PSA_SUCCESS )
5059+
slot->type = 0;
49935060

49945061
#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C)
49955062
if( slot->lifetime == PSA_KEY_LIFETIME_PERSISTENT )
@@ -5001,6 +5068,30 @@ psa_status_t psa_generate_key_to_handle( psa_key_handle_t handle,
50015068
return( status );
50025069
}
50035070

5071+
psa_status_t psa_generate_key( const psa_key_attributes_t *attributes,
5072+
psa_key_handle_t *handle,
5073+
size_t bits,
5074+
const void *extra,
5075+
size_t extra_size )
5076+
{
5077+
psa_status_t status;
5078+
psa_key_slot_t *slot = NULL;
5079+
status = psa_start_key_creation( attributes, handle, &slot );
5080+
if( status == PSA_SUCCESS )
5081+
{
5082+
status = psa_generate_key_internal( slot, bits, extra, extra_size );
5083+
}
5084+
if( status == PSA_SUCCESS )
5085+
status = psa_finish_key_creation( slot );
5086+
if( status != PSA_SUCCESS )
5087+
{
5088+
psa_fail_key_creation( slot );
5089+
*handle = 0;
5090+
}
5091+
return( status );
5092+
}
5093+
5094+
50045095

50055096
/****************************************************************/
50065097
/* Module setup */

0 commit comments

Comments
 (0)