@@ -4120,6 +4120,59 @@ static void psa_des_set_key_parity( uint8_t *data, size_t data_size )
4120
4120
}
4121
4121
#endif /* MBEDTLS_DES_C */
4122
4122
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
+
4123
4176
psa_status_t psa_generator_import_key_to_handle ( psa_key_handle_t handle ,
4124
4177
psa_key_type_t type ,
4125
4178
size_t bits ,
@@ -4873,24 +4926,19 @@ psa_status_t mbedtls_psa_inject_entropy( const unsigned char *seed,
4873
4926
}
4874
4927
#endif /* MBEDTLS_PSA_INJECT_ENTROPY */
4875
4928
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 )
4881
4933
{
4882
- psa_key_slot_t * slot ;
4883
- psa_status_t status ;
4934
+ psa_key_type_t type = slot -> type ;
4884
4935
4885
4936
if ( extra == NULL && extra_size != 0 )
4886
4937
return ( PSA_ERROR_INVALID_ARGUMENT );
4887
4938
4888
- status = psa_get_empty_key_slot ( handle , & slot );
4889
- if ( status != PSA_SUCCESS )
4890
- return ( status );
4891
-
4892
4939
if ( key_type_is_raw_bytes ( type ) )
4893
4940
{
4941
+ psa_status_t status ;
4894
4942
status = prepare_raw_data_slot ( type , bits , & slot -> data .raw );
4895
4943
if ( status != PSA_SUCCESS )
4896
4944
return ( status );
@@ -4989,7 +5037,26 @@ psa_status_t psa_generate_key_to_handle( psa_key_handle_t handle,
4989
5037
4990
5038
return ( PSA_ERROR_NOT_SUPPORTED );
4991
5039
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
+
4992
5056
slot -> type = type ;
5057
+ status = psa_generate_key_internal ( slot , bits , extra , extra_size );
5058
+ if ( status != PSA_SUCCESS )
5059
+ slot -> type = 0 ;
4993
5060
4994
5061
#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C )
4995
5062
if ( slot -> lifetime == PSA_KEY_LIFETIME_PERSISTENT )
@@ -5001,6 +5068,30 @@ psa_status_t psa_generate_key_to_handle( psa_key_handle_t handle,
5001
5068
return ( status );
5002
5069
}
5003
5070
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
+
5004
5095
5005
5096
/****************************************************************/
5006
5097
/* Module setup */
0 commit comments