Pull apart slot memory allocation from key validation.

Signed-off-by: Steven Cooreman <steven.cooreman@silabs.com>
diff --git a/library/psa_crypto.c b/library/psa_crypto.c
index 5498073..e2e99d7 100644
--- a/library/psa_crypto.c
+++ b/library/psa_crypto.c
@@ -441,9 +441,8 @@
 }
 #endif /* defined(MBEDTLS_ECP_C) */
 
-static psa_status_t prepare_raw_data_slot( psa_key_type_t type,
-                                           size_t bits,
-                                           struct key_data *key )
+static psa_status_t validate_unstructured_key_bit_size( psa_key_type_t type,
+                                                        size_t bits )
 {
     /* Check that the bit size is acceptable for the key type */
     switch( type )
@@ -490,14 +489,6 @@
     if( bits % 8 != 0 )
         return( PSA_ERROR_INVALID_ARGUMENT );
 
-    /* Allocate memory for the key */
-    key->bytes = PSA_BITS_TO_BYTES( bits );
-    key->data = mbedtls_calloc( 1, key->bytes );
-    if( key->data == NULL )
-    {
-        key->bytes = 0;
-        return( PSA_ERROR_INSUFFICIENT_MEMORY );
-    }
     return( PSA_SUCCESS );
 }
 
@@ -740,22 +731,42 @@
 {
     psa_status_t status = PSA_SUCCESS;
 
+    /* zero-length keys are never supported. */
+    if( data_length == 0 )
+        return( PSA_ERROR_NOT_SUPPORTED );
+
+    /* Ensure that the bytes-to-bit conversion never overflows. */
+    if( data_length > SIZE_MAX / 8 )
+        return( PSA_ERROR_NOT_SUPPORTED );
+
     if( key_type_is_raw_bytes( slot->attr.type ) )
     {
         size_t bit_size = PSA_BYTES_TO_BITS( data_length );
-        /* Ensure that the bytes-to-bit conversion didn't overflow. */
-        if( data_length > SIZE_MAX / 8 )
-            return( PSA_ERROR_NOT_SUPPORTED );
+
         /* Enforce a size limit, and in particular ensure that the bit
          * size fits in its representation type. */
         if( bit_size > PSA_MAX_KEY_BITS )
             return( PSA_ERROR_NOT_SUPPORTED );
-        status = prepare_raw_data_slot( slot->attr.type, bit_size,
-                                        &slot->data.key );
+
+        status = validate_unstructured_key_bit_size( slot->attr.type, bit_size );
         if( status != PSA_SUCCESS )
-            return( status );
-        if( data_length != 0 )
-            memcpy( slot->data.key.data, data, data_length );
+            return status;
+
+        /* Allocate memory for the key */
+        slot->data.key.data = mbedtls_calloc( 1, data_length );
+        if( slot->data.key.data == NULL )
+        {
+            return( PSA_ERROR_INSUFFICIENT_MEMORY );
+        }
+        slot->data.key.bytes = data_length;
+
+        /* copy key into allocated buffer */
+        memcpy(slot->data.key.data, data, data_length);
+
+        /* Write the actual key size to the slot.
+         * psa_start_key_creation() wrote the size declared by the
+         * caller, which may be 0 (meaning unspecified) or wrong. */
+        slot->attr.bits = (psa_key_bits_t) bit_size;
     }
     else
 #if defined(MBEDTLS_ECP_C)
@@ -5525,13 +5536,26 @@
     if( key_type_is_raw_bytes( type ) )
     {
         psa_status_t status;
-        status = prepare_raw_data_slot( type, bits, &slot->data.key );
+
+        status = validate_unstructured_key_bit_size( slot->attr.type, bits );
         if( status != PSA_SUCCESS )
             return( status );
+
+        /* Allocate memory for the key */
+        slot->data.key.bytes = PSA_BITS_TO_BYTES( bits );
+        slot->data.key.data = mbedtls_calloc( 1, slot->data.key.bytes );
+        if( slot->data.key.data == NULL )
+        {
+            slot->data.key.bytes = 0;
+            return( PSA_ERROR_INSUFFICIENT_MEMORY );
+        }
+
         status = psa_generate_random( slot->data.key.data,
                                       slot->data.key.bytes );
         if( status != PSA_SUCCESS )
             return( status );
+
+        slot->attr.bits = (psa_key_bits_t) bits;
 #if defined(MBEDTLS_DES_C)
         if( type == PSA_KEY_TYPE_DES )
             psa_des_set_key_parity( slot->data.key.data,