crypto_se_driver: add an error injection mechanism to the mocks
diff --git a/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.data b/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.data
index 5f440fd..bb6586d 100644
--- a/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.data
+++ b/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.data
@@ -1,8 +1,23 @@
 SE key importing mock test
-mock_import:
+mock_import:PSA_SUCCESS:PSA_SUCCESS:PSA_SUCCESS
+
+SE key importing mock test: alloc failed
+mock_import:PSA_ERROR_HARDWARE_FAILURE:PSA_SUCCESS:PSA_ERROR_HARDWARE_FAILURE
+
+SE key importing mock test: import failed
+mock_import:PSA_SUCCESS:PSA_ERROR_HARDWARE_FAILURE:PSA_ERROR_HARDWARE_FAILURE
 
 SE key exporting mock test
-mock_export:
+mock_export:PSA_SUCCESS:PSA_SUCCESS
+
+SE key exporting mock test: export failed
+mock_export:PSA_ERROR_HARDWARE_FAILURE:PSA_ERROR_HARDWARE_FAILURE
 
 SE key generating mock test
-mock_generate:
+mock_generate:PSA_SUCCESS:PSA_SUCCESS:PSA_SUCCESS
+
+SE key generating mock test: alloc failed
+mock_generate:PSA_ERROR_HARDWARE_FAILURE:PSA_SUCCESS:PSA_ERROR_HARDWARE_FAILURE
+
+SE key generating mock test: generating failed
+mock_generate:PSA_SUCCESS:PSA_ERROR_HARDWARE_FAILURE:PSA_ERROR_HARDWARE_FAILURE
diff --git a/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.function b/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.function
index 1a132fd..78eaeda 100644
--- a/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.function
+++ b/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.function
@@ -10,6 +10,7 @@
     psa_key_slot_number_t key_slot;
     psa_key_attributes_t attributes;
     size_t pubkey_size;
+    psa_status_t return_value;
 } mock_generate_data;
 
 static struct
@@ -18,6 +19,7 @@
     psa_key_slot_number_t key_slot;
     psa_key_attributes_t attributes;
     size_t data_length;
+    psa_status_t return_value;
 } mock_import_data;
 
 static struct
@@ -25,17 +27,20 @@
     uint16_t called;
     psa_key_slot_number_t slot_number;
     size_t data_size;
+    psa_status_t return_value;
 } mock_export_data;
 
 static struct
 {
     uint16_t called;
+    psa_status_t return_value;
 } mock_allocate_data;
 
 static struct
 {
     uint16_t called;
     psa_key_slot_number_t slot_number;
+    psa_status_t return_value;
 } mock_destroy_data;
 
 static void mock_teardown( void )
@@ -63,7 +68,7 @@
     mock_generate_data.attributes = *attributes;
     mock_generate_data.pubkey_size = pubkey_size;
 
-    return( PSA_SUCCESS );
+    return( mock_generate_data.return_value );
 }
 
 static psa_status_t mock_import( psa_drv_se_context_t *drv_context,
@@ -82,7 +87,7 @@
     mock_import_data.attributes = *attributes;
     mock_import_data.data_length = data_length;
 
-    return( PSA_SUCCESS );
+    return( mock_import_data.return_value );
 }
 
 psa_status_t mock_export( psa_drv_se_context_t *context,
@@ -99,7 +104,7 @@
     mock_export_data.slot_number = slot_number;
     mock_export_data.data_size = data_size;
 
-    return( PSA_SUCCESS );
+    return( mock_export_data.return_value );
 }
 
 psa_status_t mock_allocate( psa_drv_se_context_t *drv_context,
@@ -117,7 +122,7 @@
     mock_allocate_data.called++;
     *key_slot = 0;
 
-    return( PSA_SUCCESS );
+    return( mock_allocate_data.return_value );
 }
 
 psa_status_t mock_destroy( psa_drv_se_context_t *context,
@@ -130,7 +135,7 @@
     mock_destroy_data.called++;
     mock_destroy_data.slot_number = slot_number;
 
-    return( PSA_SUCCESS );
+    return( mock_destroy_data.return_value );
 }
 
 /* END_HEADER */
@@ -141,7 +146,9 @@
  */
 
 /* BEGIN_CASE */
-void mock_import( )
+void mock_import( int mock_alloc_return_value,
+                  int mock_import_return_value,
+                  int expected_result )
 {
     psa_drv_se_t driver;
     psa_drv_se_key_management_t key_management;
@@ -151,6 +158,8 @@
     psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
     const uint8_t key_material[3] = {0xfa, 0xca, 0xde};
 
+    mock_allocate_data.return_value = mock_alloc_return_value;
+    mock_import_data.return_value = mock_import_return_value;
     memset( &driver, 0, sizeof( driver ) );
     memset( &key_management, 0, sizeof( key_management ) );
     driver.hal_version = PSA_DRV_SE_HAL_VERSION;
@@ -166,18 +175,27 @@
     psa_set_key_lifetime( &attributes, lifetime );
     psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT );
     psa_set_key_type( &attributes, PSA_KEY_TYPE_RAW_DATA );
-    PSA_ASSERT( psa_import_key( &attributes,
-                                key_material, sizeof( key_material ),
-                                &handle ) );
+    TEST_ASSERT( psa_import_key( &attributes,
+                                 key_material, sizeof( key_material ),
+                                 &handle ) == expected_result );
 
     TEST_ASSERT( mock_allocate_data.called == 1 );
-    TEST_ASSERT( mock_import_data.called == 1 );
-    TEST_ASSERT( mock_import_data.attributes.core.type == PSA_KEY_TYPE_RAW_DATA );
+    TEST_ASSERT( mock_import_data.called ==
+        ( mock_alloc_return_value == PSA_SUCCESS? 1 : 0 ) );
+    TEST_ASSERT( mock_import_data.attributes.core.id ==
+        ( mock_alloc_return_value == PSA_SUCCESS? id : 0 ) );
+    TEST_ASSERT( mock_import_data.attributes.core.lifetime ==
+        ( mock_alloc_return_value == PSA_SUCCESS? lifetime : 0 ) );
+    TEST_ASSERT( mock_import_data.attributes.core.policy.usage ==
+        ( mock_alloc_return_value == PSA_SUCCESS? PSA_KEY_USAGE_EXPORT : 0 ) );
+    TEST_ASSERT( mock_import_data.attributes.core.type ==
+        ( mock_alloc_return_value == PSA_SUCCESS? PSA_KEY_TYPE_RAW_DATA : 0 ) );
 
-    PSA_ASSERT( psa_destroy_key( handle ) );
-
-    TEST_ASSERT( mock_destroy_data.called == 1 );
-
+    if( expected_result == PSA_SUCCESS )
+    {
+        PSA_ASSERT( psa_destroy_key( handle ) );
+        TEST_ASSERT( mock_destroy_data.called == 1 );
+    }
 exit:
     PSA_DONE( );
     mock_teardown( );
@@ -185,7 +203,7 @@
 /* END_CASE */
 
 /* BEGIN_CASE */
-void mock_export( )
+void mock_export( int mock_export_return_value, int expected_result )
 {
     psa_drv_se_t driver;
     psa_drv_se_key_management_t key_management;
@@ -197,6 +215,7 @@
     uint8_t exported[sizeof( key_material )];
     size_t exported_length;
 
+    mock_export_data.return_value = mock_export_return_value;
     memset( &driver, 0, sizeof( driver ) );
     memset( &key_management, 0, sizeof( key_management ) );
     driver.hal_version = PSA_DRV_SE_HAL_VERSION;
@@ -217,9 +236,9 @@
                                 key_material, sizeof( key_material ),
                                 &handle ) );
 
-    PSA_ASSERT( psa_export_key( handle,
+    TEST_ASSERT( psa_export_key( handle,
                                 exported, sizeof( exported ),
-                                &exported_length ) );
+                                &exported_length ) == expected_result );
 
     TEST_ASSERT( mock_export_data.called == 1 );
 
@@ -234,7 +253,9 @@
 /* END_CASE */
 
 /* BEGIN_CASE */
-void mock_generate( )
+void mock_generate( int mock_alloc_return_value,
+                    int mock_generate_return_value,
+                    int expected_result )
 {
     psa_drv_se_t driver;
     psa_drv_se_key_management_t key_management;
@@ -243,6 +264,8 @@
     psa_key_handle_t handle = 0;
     psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
 
+    mock_allocate_data.return_value = mock_alloc_return_value;
+    mock_generate_data.return_value = mock_generate_return_value;
     memset( &driver, 0, sizeof( driver ) );
     memset( &key_management, 0, sizeof( key_management ) );
     driver.hal_version = PSA_DRV_SE_HAL_VERSION;
@@ -258,9 +281,18 @@
     psa_set_key_lifetime( &attributes, lifetime );
     psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT );
     psa_set_key_type( &attributes, PSA_KEY_TYPE_RAW_DATA );
-    PSA_ASSERT( psa_generate_key( &attributes, &handle ) );
+    TEST_ASSERT( psa_generate_key( &attributes, &handle ) == expected_result );
     TEST_ASSERT( mock_allocate_data.called == 1 );
-    TEST_ASSERT( mock_generate_data.called == 1 );
+    TEST_ASSERT( mock_generate_data.called ==
+        ( mock_alloc_return_value == PSA_SUCCESS? 1 : 0 ) );
+    TEST_ASSERT( mock_generate_data.attributes.core.id ==
+        ( mock_alloc_return_value == PSA_SUCCESS? id : 0 ) );
+    TEST_ASSERT( mock_generate_data.attributes.core.lifetime ==
+        ( mock_alloc_return_value == PSA_SUCCESS? lifetime : 0 ) );
+    TEST_ASSERT( mock_generate_data.attributes.core.policy.usage ==
+        ( mock_alloc_return_value == PSA_SUCCESS? PSA_KEY_USAGE_EXPORT : 0 ) );
+    TEST_ASSERT( mock_generate_data.attributes.core.type ==
+        ( mock_alloc_return_value == PSA_SUCCESS? PSA_KEY_TYPE_RAW_DATA : 0 ) );
 
     if( expected_result == PSA_SUCCESS )
     {