Skip to content

Commit 47b726b

Browse files
Smoke test SE keys: import, export, destroy
1 parent 1f0a3e6 commit 47b726b

File tree

2 files changed

+122
-1
lines changed

2 files changed

+122
-1
lines changed

tests/suites/test_suite_psa_crypto_se_driver_hal.data

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,6 @@ register_twice:3
2626

2727
Register SE driver: maximum number of drivers
2828
register_max:
29+
30+
Key creation smoke test
31+
key_creation_import_export:

tests/suites/test_suite_psa_crypto_se_driver_hal.function

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,73 @@
44

55
#include "psa_crypto_se.h"
66

7-
/* The minimum valid lifetime value for a secure element driver. */
7+
/** The minimum valid lifetime value for a secure element driver. */
88
#define MIN_DRIVER_LIFETIME 2
99

10+
/** The driver detected a condition that shouldn't happen.
11+
* This is probably a bug in the library. */
12+
#define PSA_ERROR_DETECTED_BY_DRIVER ((psa_status_t)( -500 ))
13+
14+
#define RAM_MAX_KEY_SIZE 64
15+
typedef struct
16+
{
17+
psa_key_lifetime_t lifetime;
18+
psa_key_type_t type;
19+
size_t bits;
20+
uint8_t content[RAM_MAX_KEY_SIZE];
21+
} ram_slot_t;
22+
static ram_slot_t ram_slots[16];
23+
24+
static void ram_slots_reset( void )
25+
{
26+
memset( ram_slots, 0, sizeof( ram_slots ) );
27+
}
28+
29+
static psa_status_t ram_import( psa_key_slot_number_t slot_number,
30+
psa_key_lifetime_t lifetime,
31+
psa_key_type_t type,
32+
psa_algorithm_t algorithm,
33+
psa_key_usage_t usage,
34+
const uint8_t *p_data,
35+
size_t data_length )
36+
{
37+
if( slot_number > ARRAY_LENGTH( ram_slots ) )
38+
return( PSA_ERROR_DETECTED_BY_DRIVER );
39+
if( data_length > sizeof( ram_slots[slot_number].content ) )
40+
return( PSA_ERROR_INSUFFICIENT_STORAGE );
41+
ram_slots[slot_number].lifetime = lifetime;
42+
ram_slots[slot_number].type = type;
43+
ram_slots[slot_number].bits = PSA_BYTES_TO_BITS( data_length );
44+
(void) algorithm;
45+
(void) usage;
46+
memcpy( ram_slots[slot_number].content, p_data, data_length );
47+
return( PSA_SUCCESS );
48+
}
49+
50+
psa_status_t ram_export( psa_key_slot_number_t slot_number,
51+
uint8_t *p_data,
52+
size_t data_size,
53+
size_t *p_data_length )
54+
{
55+
size_t actual_size;
56+
if( slot_number > ARRAY_LENGTH( ram_slots ) )
57+
return( PSA_ERROR_DETECTED_BY_DRIVER );
58+
actual_size = PSA_BITS_TO_BYTES( ram_slots[slot_number].bits );
59+
if( actual_size > data_size )
60+
return( PSA_ERROR_BUFFER_TOO_SMALL );
61+
*p_data_length = actual_size;
62+
memcpy( p_data, ram_slots[slot_number].content, actual_size );
63+
return( PSA_SUCCESS );
64+
}
65+
66+
psa_status_t ram_destroy( psa_key_slot_number_t slot_number )
67+
{
68+
if( slot_number > ARRAY_LENGTH( ram_slots ) )
69+
return( PSA_ERROR_DETECTED_BY_DRIVER );
70+
memset( &ram_slots[slot_number], 0, sizeof( ram_slots[slot_number] ) );
71+
return( PSA_SUCCESS );
72+
}
73+
1074
/* END_HEADER */
1175

1276
/* BEGIN_DEPENDENCIES
@@ -78,3 +142,57 @@ exit:
78142
PSA_DONE( );
79143
}
80144
/* END_CASE */
145+
146+
/* BEGIN_CASE */
147+
void key_creation_import_export( )
148+
{
149+
psa_drv_se_t driver;
150+
psa_drv_se_key_management_t key_management;
151+
psa_key_lifetime_t lifetime = 2;
152+
psa_key_id_t id = 1;
153+
psa_key_handle_t handle = 0;
154+
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
155+
const uint8_t key_material[3] = {0xfa, 0xca, 0xde};
156+
uint8_t exported[sizeof( key_material )];
157+
size_t exported_length;
158+
psa_key_slot_number_t expected_slot = 0;
159+
160+
memset( &driver, 0, sizeof( driver ) );
161+
memset( &key_management, 0, sizeof( key_management ) );
162+
driver.hal_version = PSA_DRV_SE_HAL_VERSION;
163+
driver.key_management = &key_management;
164+
key_management.slot_count = ARRAY_LENGTH( ram_slots );
165+
key_management.p_import = ram_import;
166+
key_management.p_export = ram_export;
167+
key_management.p_destroy = ram_destroy;
168+
169+
PSA_ASSERT( psa_register_se_driver( lifetime, &driver ) );
170+
PSA_ASSERT( psa_crypto_init( ) );
171+
172+
psa_set_key_id( &attributes, id );
173+
psa_set_key_lifetime( &attributes, lifetime );
174+
psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT );
175+
psa_set_key_type( &attributes, PSA_KEY_TYPE_RAW_DATA );
176+
PSA_ASSERT( psa_import_key( &attributes,
177+
key_material, sizeof( key_material ),
178+
&handle ) );
179+
180+
/* Test that the key was created in the designated slot. */
181+
TEST_ASSERT( ram_slots[expected_slot].type == PSA_KEY_TYPE_RAW_DATA );
182+
183+
PSA_ASSERT( psa_export_key( handle,
184+
exported, sizeof( exported ),
185+
&exported_length ) );
186+
ASSERT_COMPARE( key_material, sizeof( key_material ),
187+
exported, exported_length );
188+
189+
PSA_ASSERT( psa_destroy_key( handle ) );
190+
191+
/* Test that the key has been erased from the designated slot. */
192+
TEST_ASSERT( ram_slots[expected_slot].type == 0 );
193+
194+
exit:
195+
PSA_DONE( );
196+
ram_slots_reset( );
197+
}
198+
/* END_CASE */

0 commit comments

Comments
 (0)