blob: 70d4578bdc94718ab2394d4d561dc1a035003d48 [file] [log] [blame]
Gilles Peskinebc1f2722018-11-16 22:24:38 +01001/* BEGIN_HEADER */
2#include "../library/psa_its_file.h"
3
4/* Internal definitions of the implementation, copied for the sake of
5 * some of the tests and of the cleanup code. */
6#define PSA_ITS_STORAGE_PREFIX ""
7#define PSA_ITS_STORAGE_FILENAME_PATTERN "%08lx.psa_its"
8#define PSA_ITS_STORAGE_FILENAME_LENGTH \
9 ( sizeof( PSA_ITS_STORAGE_PREFIX ) + 16 )
10#define PSA_ITS_STORAGE_TEMP PSA_ITS_STORAGE_PREFIX "tempfile.psa_its"
11
12static void psa_its_fill_filename( uint32_t uid, char *filename )
13{
14 snprintf( filename, PSA_ITS_STORAGE_FILENAME_LENGTH,
15 "%s" PSA_ITS_STORAGE_FILENAME_PATTERN,
16 PSA_ITS_STORAGE_PREFIX, (unsigned long) uid );
17}
18
19#define MAX( m, n ) ( ( m ) > ( n ) ? ( m ) : ( n ) )
20
21#define ITS_ASSERT( expr ) \
22 TEST_ASSERT( ( expr ) == PSA_ITS_SUCCESS )
23
24/* Maximum uid used by the test, recorded so that cleanup() can delete
25 * all files. 0xffffffff is excluded. */
26static uint32_t uid_max = 0;
27
28static void cleanup( void )
29{
30 char filename[PSA_ITS_STORAGE_FILENAME_LENGTH];
31 uint32_t uid;
32 for( uid = 0; uid < uid_max; uid++ )
33 {
34 psa_its_fill_filename( uid, filename );
35 remove( filename );
36 }
37 psa_its_fill_filename( 0xffffffff, filename );
38 remove( filename );
39 remove( PSA_ITS_STORAGE_TEMP );
40 uid_max = 0;
41}
42
43static psa_its_status_t psa_its_set_wrap( uint32_t uid,
44 uint32_t data_length,
45 const void *p_data,
46 psa_its_create_flags_t create_flags )
47{
48 if( uid_max != 0xffffffff && uid_max < uid )
49 uid_max = uid;
50 return psa_its_set( uid, data_length, p_data, create_flags );
51}
52
53/* END_HEADER */
54
55/* BEGIN_DEPENDENCIES
56 * depends_on:MBEDTLS_PSA_ITS_FILE_C
57 * END_DEPENDENCIES
58 */
59
60/* BEGIN_CASE */
61void set_get_remove( int uid_arg, int flags_arg, data_t *data )
62{
63 uint32_t uid = uid_arg;
64 uint32_t flags = flags_arg;
65 struct psa_its_info_t info;
66 unsigned char *buffer = NULL;
67
68 ASSERT_ALLOC( buffer, data->len );
69
70 ITS_ASSERT( psa_its_set_wrap( uid, data->len, data->x, flags ) );
71
72 ITS_ASSERT( psa_its_get_info( uid, &info ) );
73 TEST_ASSERT( info.size == data->len );
74 TEST_ASSERT( info.flags == flags );
75 ITS_ASSERT( psa_its_get( uid, 0, data->len, buffer ) );
76 ASSERT_COMPARE( data->x, data->len, buffer, data->len );
77
78 ITS_ASSERT( psa_its_remove( uid ) );
79
80exit:
81 mbedtls_free( buffer );
82 cleanup( );
83}
84/* END_CASE */
85
86/* BEGIN_CASE */
87void set_overwrite( int uid_arg,
88 int flags1_arg, data_t *data1,
89 int flags2_arg, data_t *data2 )
90{
91 uint32_t uid = uid_arg;
92 uint32_t flags1 = flags1_arg;
93 uint32_t flags2 = flags2_arg;
94 struct psa_its_info_t info;
95 unsigned char *buffer = NULL;
96
97 ASSERT_ALLOC( buffer, MAX( data1->len, data2->len ) );
98
99 ITS_ASSERT( psa_its_set_wrap( uid, data1->len, data1->x, flags1 ) );
100 ITS_ASSERT( psa_its_get_info( uid, &info ) );
101 TEST_ASSERT( info.size == data1->len );
102 TEST_ASSERT( info.flags == flags1 );
103 ITS_ASSERT( psa_its_get( uid, 0, data1->len, buffer ) );
104 ASSERT_COMPARE( data1->x, data1->len, buffer, data1->len );
105
106 ITS_ASSERT( psa_its_set_wrap( uid, data2->len, data2->x, flags2 ) );
107 ITS_ASSERT( psa_its_get_info( uid, &info ) );
108 TEST_ASSERT( info.size == data2->len );
109 TEST_ASSERT( info.flags == flags2 );
110 ITS_ASSERT( psa_its_get( uid, 0, data2->len, buffer ) );
111 ASSERT_COMPARE( data2->x, data2->len, buffer, data2->len );
112
113 ITS_ASSERT( psa_its_remove( uid ) );
114
115exit:
116 mbedtls_free( buffer );
117 cleanup( );
118}
119/* END_CASE */
120
121/* BEGIN_CASE */
122void set_multiple( int first_id, int count )
123{
124 uint32_t uid0 = first_id;
125 uint32_t uid;
126 char stored[40];
127 char retrieved[40];
128
129 memset( stored, '.', sizeof( stored ) );
130 for( uid = uid0; uid < uid0 + count; uid++ )
131 {
132 mbedtls_snprintf( stored, sizeof( stored ),
133 "Content of file 0x%08lx", (unsigned long) uid );
134 ITS_ASSERT( psa_its_set_wrap( uid, sizeof( stored ), stored, 0 ) );
135 }
136
137 for( uid = uid0; uid < uid0 + count; uid++ )
138 {
139 mbedtls_snprintf( stored, sizeof( stored ),
140 "Content of file 0x%08lx", (unsigned long) uid );
141 ITS_ASSERT( psa_its_get( uid, 0, sizeof( stored ), retrieved ) );
142 ASSERT_COMPARE( retrieved, sizeof( stored ),
143 stored, sizeof( stored ) );
144 ITS_ASSERT( psa_its_remove( uid ) );
145 TEST_ASSERT( psa_its_get( uid, 0, 0, NULL ) ==
146 PSA_ITS_ERROR_KEY_NOT_FOUND );
147 }
148
149exit:
150 cleanup( );
151}
152/* END_CASE */
153
154/* BEGIN_CASE */
155void nonexistent( int uid_arg, int create_and_remove )
156{
157 uint32_t uid = uid_arg;
158 struct psa_its_info_t info;
159
160 if( create_and_remove )
161 {
162 ITS_ASSERT( psa_its_set_wrap( uid, 0, NULL, 0 ) );
163 ITS_ASSERT( psa_its_remove( uid ) );
164 }
165
166 TEST_ASSERT( psa_its_remove( uid ) == PSA_ITS_ERROR_KEY_NOT_FOUND );
167 TEST_ASSERT( psa_its_get_info( uid, &info ) ==
168 PSA_ITS_ERROR_KEY_NOT_FOUND );
169 TEST_ASSERT( psa_its_get( uid, 0, 0, NULL ) ==
170 PSA_ITS_ERROR_KEY_NOT_FOUND );
171
172exit:
173 cleanup( );
174}
175/* END_CASE */
176
177/* BEGIN_CASE */
178void get_at( int uid_arg, data_t *data,
179 int offset, int length_arg,
180 int expected_status )
181{
182 uint32_t uid = uid_arg;
183 unsigned char *buffer = NULL;
184 psa_its_status_t ist;
185 size_t length = length_arg >= 0 ? length_arg : 0;
186 unsigned char *trailer;
187 size_t i;
188
189 ASSERT_ALLOC( buffer, length + 16 );
190 trailer = buffer + length;
191 memset( trailer, '-', 16 );
192
193 ITS_ASSERT( psa_its_set_wrap( uid, data->len, data->x, 0 ) );
194
195 ist = psa_its_get( uid, offset, length_arg, buffer );
196 TEST_ASSERT( ist == (psa_its_status_t) expected_status );
197 if( ist == PSA_ITS_SUCCESS )
198 ASSERT_COMPARE( data->x + offset, length,
199 buffer, length );
200 for( i = 0; i < 16; i++ )
201 TEST_ASSERT( trailer[i] == '-' );
202 ITS_ASSERT( psa_its_remove( uid ) );
203
204exit:
205 mbedtls_free( buffer );
206 cleanup( );
207}
208/* END_CASE */