blob: cb9301ab670ba58eb4efbc9a05852ba9962fb138 [file] [log] [blame]
Gilles Peskinee59236f2018-01-27 23:32:46 +01001/* BEGIN_HEADER */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002#include <stdint.h>
Gilles Peskinee59236f2018-01-27 23:32:46 +01003#include "psa/crypto.h"
Gilles Peskine8c9def32018-02-08 10:02:12 +01004#include "mbedtls/md.h"
itayzafrir3e02b3b2018-06-12 17:06:52 +03005
6#if(UINT32_MAX > SIZE_MAX)
7#define PSA_CRYPTO_TEST_SIZE_T_RANGE(x) ((x) <= SIZE_MAX)
8#else
9#define PSA_CRYPTO_TEST_SIZE_T_RANGE(x) 1
10#endif
Gilles Peskinee59236f2018-01-27 23:32:46 +010011/* END_HEADER */
12
13/* BEGIN_DEPENDENCIES
14 * depends_on:MBEDTLS_PSA_CRYPTO_C
15 * END_DEPENDENCIES
16 */
17
18/* BEGIN_CASE */
19void init_deinit()
20{
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010021 psa_status_t status;
Gilles Peskinee59236f2018-01-27 23:32:46 +010022 int i;
23 for( i = 0; i <= 1; i++ )
24 {
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010025 status = psa_crypto_init( );
26 TEST_ASSERT( status == PSA_SUCCESS );
27 status = psa_crypto_init( );
28 TEST_ASSERT( status == PSA_SUCCESS );
Gilles Peskinee59236f2018-01-27 23:32:46 +010029 mbedtls_psa_crypto_free( );
30 }
31}
32/* END_CASE */
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010033
34/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +030035void import( data_t *data, int type, int expected_status )
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010036{
37 int slot = 1;
38 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010039
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010040 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +030041 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010042 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
43
itayzafrir3e02b3b2018-06-12 17:06:52 +030044 status = psa_import_key( slot, type, data->x, (size_t) data->len );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010045 TEST_ASSERT( status == (psa_status_t) expected_status );
46 if( status == PSA_SUCCESS )
47 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
48
49exit:
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010050 mbedtls_psa_crypto_free( );
51}
52/* END_CASE */
53
54/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +030055void import_export( data_t *data,
Moran Pekera964a8f2018-06-04 18:42:36 +030056 int type_arg,
57 int alg_arg,
58 int usage_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010059 int expected_bits,
60 int export_size_delta,
61 int expected_export_status,
62 int canonical_input )
63{
64 int slot = 1;
65 int slot2 = slot + 1;
66 psa_key_type_t type = type_arg;
67 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010068 unsigned char *exported = NULL;
69 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010070 size_t export_size;
71 size_t exported_length;
72 size_t reexported_length;
73 psa_key_type_t got_type;
74 size_t got_bits;
mohammad1603a97cb8c2018-03-28 03:46:26 -070075 psa_key_policy_t policy = {0};
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010076
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010077 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +030078 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
79 export_size = (ssize_t) data->len + export_size_delta;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010080 exported = mbedtls_calloc( 1, export_size );
81 TEST_ASSERT( exported != NULL );
82 if( ! canonical_input )
83 {
84 reexported = mbedtls_calloc( 1, export_size );
85 TEST_ASSERT( reexported != NULL );
86 }
87 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
88
mohammad1603a97cb8c2018-03-28 03:46:26 -070089 psa_key_policy_init( &policy );
90
Moran Pekera964a8f2018-06-04 18:42:36 +030091 psa_key_policy_set_usage( &policy, usage_arg, alg_arg );
mohammad1603a97cb8c2018-03-28 03:46:26 -070092
93 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
94
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010095 /* Import the key */
96 TEST_ASSERT( psa_import_key( slot, type,
itayzafrir3e02b3b2018-06-12 17:06:52 +030097 data->x, (size_t) data->len ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010098
99 /* Test the key information */
100 TEST_ASSERT( psa_get_key_information( slot,
101 &got_type, &got_bits ) ==
102 PSA_SUCCESS );
103 TEST_ASSERT( got_type == type );
104 TEST_ASSERT( got_bits == (size_t) expected_bits );
105
106 /* Export the key */
107 status = psa_export_key( slot,
108 exported, export_size,
109 &exported_length );
110 TEST_ASSERT( status == (psa_status_t) expected_export_status );
111 if( status != PSA_SUCCESS )
112 goto destroy;
113
114 if( canonical_input )
115 {
itayzafrir3e02b3b2018-06-12 17:06:52 +0300116 TEST_ASSERT( exported_length == (size_t) data->len );
117 TEST_ASSERT( memcmp( exported, data->x, (size_t) data->len ) == 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100118 }
119 else
120 {
mohammad1603a97cb8c2018-03-28 03:46:26 -0700121 TEST_ASSERT( psa_set_key_policy( slot2, &policy ) == PSA_SUCCESS );
122
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100123 TEST_ASSERT( psa_import_key( slot2, type,
124 exported, export_size ) ==
125 PSA_SUCCESS );
126 TEST_ASSERT( psa_export_key( slot2,
127 reexported, export_size,
128 &reexported_length ) ==
129 PSA_SUCCESS );
130 TEST_ASSERT( reexported_length == exported_length );
131 TEST_ASSERT( memcmp( reexported, exported,
132 exported_length ) == 0 );
133 }
134
135destroy:
136 /* Destroy the key */
137 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
138 TEST_ASSERT( psa_get_key_information(
139 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
140
141exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300142 mbedtls_free( exported );
143 mbedtls_free( reexported );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100144 mbedtls_psa_crypto_free( );
145}
146/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100147
Moran Pekerf709f4a2018-06-06 17:26:04 +0300148
149/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300150void import_export_public_key( data_t *data,
Moran Pekerf709f4a2018-06-06 17:26:04 +0300151 int type_arg,
152 int alg_arg,
153 int expected_bits,
154 int public_key_expected_length,
155 int expected_export_status )
156{
157 int slot = 1;
158 psa_key_type_t type = type_arg;
159 psa_status_t status;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300160 unsigned char *exported = NULL;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300161 size_t export_size;
162 size_t exported_length;
163 psa_key_type_t got_type;
164 size_t got_bits;
165 psa_key_policy_t policy = {0};
166
Moran Pekerf709f4a2018-06-06 17:26:04 +0300167 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300168 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
169 export_size = (ssize_t) data->len;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300170 exported = mbedtls_calloc( 1, export_size );
171 TEST_ASSERT( exported != NULL );
172
173 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
174
175 psa_key_policy_init( &policy );
176
177 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT,
178 alg_arg );
179
180 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
181
182 /* Import the key */
183 TEST_ASSERT( psa_import_key( slot, type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300184 data->x, (size_t) data->len ) ==
185 PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300186
187 /* Test the key information */
188 TEST_ASSERT( psa_get_key_information( slot,
189 &got_type, &got_bits ) == PSA_SUCCESS );
190 TEST_ASSERT( got_type == type );
191 TEST_ASSERT( got_bits == (size_t) expected_bits );
192
193 /* Export the key */
194 status = psa_export_public_key( slot,
195 exported, export_size,
196 &exported_length );
197 TEST_ASSERT( status == (psa_status_t) expected_export_status );
198 if( status != PSA_SUCCESS )
199 goto destroy;
200
201 TEST_ASSERT( exported_length == (size_t) public_key_expected_length );
202
203destroy:
204 /* Destroy the key */
205 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
206 TEST_ASSERT( psa_get_key_information(
207 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
208
209exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300210 mbedtls_free( exported );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300211 mbedtls_psa_crypto_free( );
212}
213/* END_CASE */
214
Gilles Peskine20035e32018-02-03 22:44:14 +0100215/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300216void hash_finish( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100217{
218 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100219 unsigned char actual_hash[MBEDTLS_MD_MAX_SIZE];
220 size_t actual_hash_length;
221 psa_hash_operation_t operation;
222
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100223 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300224 TEST_ASSERT( expected_hash != NULL );
225 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
226 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100227
228 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
229
230 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
231 TEST_ASSERT( psa_hash_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300232 input->x, (size_t) input->len ) ==
233 PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100234 TEST_ASSERT( psa_hash_finish( &operation,
235 actual_hash, sizeof( actual_hash ),
236 &actual_hash_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300237 TEST_ASSERT( actual_hash_length == (size_t) expected_hash->len );
238 TEST_ASSERT( memcmp( expected_hash->x, actual_hash,
239 (size_t) expected_hash->len ) == 0 );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100240
241exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100242 mbedtls_psa_crypto_free( );
243}
244/* END_CASE */
245
246/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300247void hash_verify( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100248{
249 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100250 psa_hash_operation_t operation;
251
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100252 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300253 TEST_ASSERT( expected_hash != NULL );
254 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
255 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100256
257 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
258
259 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
260 TEST_ASSERT( psa_hash_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300261 input->x, (size_t) input->len ) ==
262 PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100263 TEST_ASSERT( psa_hash_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300264 expected_hash->x,
265 (size_t) expected_hash->len ) ==
266 PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100267
268exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100269 mbedtls_psa_crypto_free( );
270}
271/* END_CASE */
272
273/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300274void mac_verify( int key_type_arg, data_t *key,
275 int alg_arg, data_t *iv,
276 data_t *input, data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +0100277{
278 int key_slot = 1;
279 psa_key_type_t key_type = key_type_arg;
280 psa_algorithm_t alg = alg_arg;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100281 psa_mac_operation_t operation;
mohammad16036df908f2018-04-02 08:34:15 -0700282 psa_key_policy_t policy;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100283
Gilles Peskine8c9def32018-02-08 10:02:12 +0100284 TEST_ASSERT( key != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300285 TEST_ASSERT( iv != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100286 TEST_ASSERT( input != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100287 TEST_ASSERT( expected_mac != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300288 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
289 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( iv->len ) );
290 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
291 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100292
293 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
294
mohammad16036df908f2018-04-02 08:34:15 -0700295 psa_key_policy_init( &policy );
296
297 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg_arg );
298
299 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
300
Gilles Peskine8c9def32018-02-08 10:02:12 +0100301 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300302 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100303 // TODO: support IV
304 TEST_ASSERT( psa_mac_start( &operation, key_slot, alg ) == PSA_SUCCESS );
305 TEST_ASSERT( psa_destroy_key( key_slot ) == PSA_SUCCESS );
306 TEST_ASSERT( psa_mac_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300307 input->x, (size_t) input->len ) ==
308 PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100309 TEST_ASSERT( psa_mac_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300310 expected_mac->x,
311 (size_t) expected_mac->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100312
313exit:
Gilles Peskine8c9def32018-02-08 10:02:12 +0100314 psa_destroy_key( key_slot );
315 mbedtls_psa_crypto_free( );
316}
317/* END_CASE */
318
Moran Peker7f878502018-06-06 17:09:40 +0300319
Gilles Peskine8c9def32018-02-08 10:02:12 +0100320/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +0200321void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300322 data_t *key,
323 data_t *input, data_t *expected_output,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200324 int expected_status )
325{
326 int key_slot = 1;
327 psa_status_t status;
328 psa_key_type_t key_type = key_type_arg;
329 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200330 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300331 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200332 size_t output_buffer_size = 0;
333 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200334 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200335 psa_cipher_operation_t operation;
336
Gilles Peskine50e586b2018-06-08 14:28:46 +0200337 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200338 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200339 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300340 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
341 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
342 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200343
344 memset( iv, 0x2a, sizeof( iv ) );
345
346 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
347
348 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300349 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200350
351 TEST_ASSERT( psa_encrypt_setup( &operation, key_slot, alg ) == PSA_SUCCESS );
352
353 TEST_ASSERT( psa_encrypt_set_iv( &operation,
354 iv, sizeof( iv ) ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300355 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200356 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300357 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200358
itayzafrir3e02b3b2018-06-12 17:06:52 +0300359 TEST_ASSERT( psa_cipher_update( &operation, input->x, (size_t) input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200360 output, output_buffer_size,
361 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200362 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200363 status = psa_cipher_finish( &operation,
364 output + function_output_length,
365 output_buffer_size,
366 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200367 total_output_length += function_output_length;
368
Gilles Peskine50e586b2018-06-08 14:28:46 +0200369 TEST_ASSERT( status == (psa_status_t) expected_status );
370 if( expected_status == PSA_SUCCESS )
371 {
372 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300373 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
374 TEST_ASSERT( memcmp( expected_output->x, output,
375 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200376 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200377
Gilles Peskine50e586b2018-06-08 14:28:46 +0200378exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300379 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200380 psa_destroy_key( key_slot );
381 mbedtls_psa_crypto_free( );
382}
383/* END_CASE */
384
385/* BEGIN_CASE */
386void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300387 data_t *key,
388 data_t *input,
389 int first_part_size,
390 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +0200391{
392 int key_slot = 1;
393 psa_key_type_t key_type = key_type_arg;
394 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200395 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300396 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200397 size_t output_buffer_size = 0;
398 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200399 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200400 psa_cipher_operation_t operation;
401
Gilles Peskine50e586b2018-06-08 14:28:46 +0200402 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200403 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200404 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300405 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
406 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
407 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200408
409 memset( iv, 0x2a, sizeof( iv ) );
410
411 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
412
413 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300414 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200415
416 TEST_ASSERT( psa_encrypt_setup( &operation, key_slot, alg ) == PSA_SUCCESS );
417
418 TEST_ASSERT( psa_encrypt_set_iv( &operation,
419 iv, sizeof( iv ) ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300420 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200421 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300422 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200423
itayzafrir3e02b3b2018-06-12 17:06:52 +0300424 TEST_ASSERT( (unsigned int) first_part_size < (size_t) input->len );
425 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200426 output, output_buffer_size,
427 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200428 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200429 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300430 input->x + first_part_size,
431 (size_t) input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200432 output, output_buffer_size,
433 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200434 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200435 TEST_ASSERT( psa_cipher_finish( &operation,
436 output + function_output_length,
437 output_buffer_size,
438 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200439 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200440 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
441
itayzafrir3e02b3b2018-06-12 17:06:52 +0300442 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
443 TEST_ASSERT( memcmp( expected_output->x, output,
444 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200445
446exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300447 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200448 psa_destroy_key( key_slot );
449 mbedtls_psa_crypto_free( );
450}
451/* END_CASE */
452
453/* BEGIN_CASE */
454void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300455 data_t *key,
456 data_t *input,
457 int first_part_size,
458 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +0200459{
460 int key_slot = 1;
461
462 psa_key_type_t key_type = key_type_arg;
463 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200464 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300465 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200466 size_t output_buffer_size = 0;
467 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200468 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200469 psa_cipher_operation_t operation;
470
Gilles Peskine50e586b2018-06-08 14:28:46 +0200471 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200472 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200473 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300474 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
475 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
476 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200477
478 memset( iv, 0x2a, sizeof( iv ) );
479
480 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
481
482 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300483 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200484
485 TEST_ASSERT( psa_decrypt_setup( &operation, key_slot, alg ) == PSA_SUCCESS );
486
487 TEST_ASSERT( psa_encrypt_set_iv( &operation,
488 iv, sizeof( iv ) ) == PSA_SUCCESS );
489
itayzafrir3e02b3b2018-06-12 17:06:52 +0300490 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200491 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300492 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200493
itayzafrir3e02b3b2018-06-12 17:06:52 +0300494 TEST_ASSERT( (unsigned int) first_part_size < (size_t) input->len );
495 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200496 output, output_buffer_size,
497 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200498 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200499 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300500 input->x + first_part_size,
501 (size_t) input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200502 output, output_buffer_size,
503 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200504 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200505 TEST_ASSERT( psa_cipher_finish( &operation,
506 output + function_output_length,
507 output_buffer_size,
508 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200509 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200510 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
511
itayzafrir3e02b3b2018-06-12 17:06:52 +0300512 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
513 TEST_ASSERT( memcmp( expected_output->x, output,
514 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200515
516exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300517 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200518 psa_destroy_key( key_slot );
519 mbedtls_psa_crypto_free( );
520}
521/* END_CASE */
522
523
524/* BEGIN_CASE */
525void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300526 data_t *key,
527 data_t *input, data_t *expected_output,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200528 int expected_status )
529{
530 int key_slot = 1;
531 psa_status_t status;
532 psa_key_type_t key_type = key_type_arg;
533 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200534 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300535 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200536 size_t output_buffer_size = 0;
537 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200538 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200539 psa_cipher_operation_t operation;
540
Gilles Peskine50e586b2018-06-08 14:28:46 +0200541 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200542 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200543 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300544 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
545 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
546 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200547
548 memset( iv, 0x2a, sizeof( iv ) );
549
550 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
551
552 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300553 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200554
555 TEST_ASSERT( psa_decrypt_setup( &operation, key_slot, alg ) == PSA_SUCCESS );
556
557 TEST_ASSERT( psa_encrypt_set_iv( &operation,
558 iv, sizeof( iv ) ) == PSA_SUCCESS );
559
itayzafrir3e02b3b2018-06-12 17:06:52 +0300560 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200561 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300562 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200563
itayzafrir3e02b3b2018-06-12 17:06:52 +0300564 TEST_ASSERT( psa_cipher_update( &operation, input->x, (size_t) input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200565 output, output_buffer_size,
566 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200567 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200568 status = psa_cipher_finish( &operation,
569 output + function_output_length,
570 output_buffer_size,
571 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200572 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200573 TEST_ASSERT( status == (psa_status_t) expected_status );
574
575 if( expected_status == PSA_SUCCESS )
576 {
577 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300578 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
579 TEST_ASSERT( memcmp( expected_output->x, output,
580 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200581 }
582
583
584exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300585 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200586 psa_destroy_key( key_slot );
587 mbedtls_psa_crypto_free( );
588}
589/* END_CASE */
590
591
592/* BEGIN_CASE */
593void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300594 data_t *key,
595 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +0200596{
597 int key_slot = 1;
598 psa_key_type_t key_type = key_type_arg;
599 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -0700600 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +0200601 size_t iv_size = 16;
602 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300603 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200604 size_t output1_size = 0;
605 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300606 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200607 size_t output2_size = 0;
608 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200609 size_t function_output_length = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200610 psa_cipher_operation_t operation1;
611 psa_cipher_operation_t operation2;
612
mohammad1603d7d7ba52018-03-12 18:51:53 +0200613 TEST_ASSERT( key != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200614 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300615 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
616 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200617
mohammad1603d7d7ba52018-03-12 18:51:53 +0200618 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
619
620 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300621 key->x, (size_t) key->len ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200622
Moran Pekerf55e8042018-05-29 16:28:28 +0300623 TEST_ASSERT( psa_encrypt_setup( &operation1, key_slot, alg ) == PSA_SUCCESS );
624 TEST_ASSERT( psa_decrypt_setup( &operation2, key_slot, alg ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200625
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200626 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
627 iv, iv_size,
628 &iv_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300629 output1_size = (size_t) input->len + operation1.block_size;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200630 output1 = mbedtls_calloc( 1, output1_size );
631 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300632
itayzafrir3e02b3b2018-06-12 17:06:52 +0300633 TEST_ASSERT( psa_cipher_update( &operation1, input->x, (size_t) input->len,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200634 output1, output1_size,
635 &output1_length ) == PSA_SUCCESS );
636 TEST_ASSERT( psa_cipher_finish( &operation1,
637 output1 + output1_length, output1_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200638 &function_output_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200639
Gilles Peskine048b7f02018-06-08 14:20:49 +0200640 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300641
642 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
643
644 output2_size = output1_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200645 output2 = mbedtls_calloc( 1, output2_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300646 TEST_ASSERT( output2 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300647
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200648 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
649 iv, iv_length ) == PSA_SUCCESS );
650 TEST_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
651 output2, output2_size,
652 &output2_length ) == PSA_SUCCESS );
Gilles Peskine048b7f02018-06-08 14:20:49 +0200653 function_output_length = 0;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200654 TEST_ASSERT( psa_cipher_finish( &operation2,
655 output2 + output2_length,
656 output2_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200657 &function_output_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300658
Gilles Peskine048b7f02018-06-08 14:20:49 +0200659 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200660
Moran Pekerded84402018-06-06 16:36:50 +0300661 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
662
itayzafrir3e02b3b2018-06-12 17:06:52 +0300663 TEST_ASSERT( (size_t) input->len == output2_length );
664 TEST_ASSERT( memcmp( input->x, output2, (size_t) input->len ) == 0 );
Moran Pekerded84402018-06-06 16:36:50 +0300665
666exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300667 mbedtls_free( output1 );
668 mbedtls_free( output2 );
Moran Pekerded84402018-06-06 16:36:50 +0300669 psa_destroy_key( key_slot );
670 mbedtls_psa_crypto_free( );
671}
672/* END_CASE */
673
674/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +0200675void cipher_verify_output_multipart( int alg_arg,
676 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300677 data_t *key,
678 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200679 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +0300680{
681 int key_slot = 1;
682 psa_key_type_t key_type = key_type_arg;
683 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +0300684 unsigned char iv[16] = {0};
685 size_t iv_size = 16;
686 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300687 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200688 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +0300689 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300690 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200691 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +0300692 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200693 size_t function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300694 psa_cipher_operation_t operation1;
695 psa_cipher_operation_t operation2;
696
Moran Pekerded84402018-06-06 16:36:50 +0300697 TEST_ASSERT( key != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300698 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300699 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
700 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200701
Moran Pekerded84402018-06-06 16:36:50 +0300702 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
703
704 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300705 key->x, (size_t) key->len ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300706
707 TEST_ASSERT( psa_encrypt_setup( &operation1, key_slot, alg ) == PSA_SUCCESS );
708 TEST_ASSERT( psa_decrypt_setup( &operation2, key_slot, alg ) == PSA_SUCCESS );
709
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200710 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
711 iv, iv_size,
712 &iv_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300713 output1_buffer_size = (size_t) input->len + operation1.block_size;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200714 output1 = mbedtls_calloc( 1, output1_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300715 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300716
itayzafrir3e02b3b2018-06-12 17:06:52 +0300717 TEST_ASSERT( (unsigned int) first_part_size < (size_t) input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200718
itayzafrir3e02b3b2018-06-12 17:06:52 +0300719 TEST_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200720 output1, output1_buffer_size,
721 &function_output_length ) == PSA_SUCCESS );
722 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300723
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200724 TEST_ASSERT( psa_cipher_update( &operation1,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300725 input->x + first_part_size,
726 (size_t) input->len - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200727 output1, output1_buffer_size,
728 &function_output_length ) == PSA_SUCCESS );
729 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300730
Gilles Peskine048b7f02018-06-08 14:20:49 +0200731 TEST_ASSERT( psa_cipher_finish( &operation1,
732 output1 + output1_length,
733 output1_buffer_size - output1_length,
734 &function_output_length ) == PSA_SUCCESS );
735 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200736
737 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
738
Gilles Peskine048b7f02018-06-08 14:20:49 +0200739 output2_buffer_size = output1_length;
740 output2 = mbedtls_calloc( 1, output2_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300741 TEST_ASSERT( output2 != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200742
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200743 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
744 iv, iv_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300745
746 TEST_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200747 output2, output2_buffer_size,
748 &function_output_length ) == PSA_SUCCESS );
749 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300750
Gilles Peskine048b7f02018-06-08 14:20:49 +0200751 TEST_ASSERT( psa_cipher_update( &operation2,
752 output1 + first_part_size,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200753 output1_length - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200754 output2, output2_buffer_size,
755 &function_output_length ) == PSA_SUCCESS );
756 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300757
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200758 TEST_ASSERT( psa_cipher_finish( &operation2,
759 output2 + output2_length,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200760 output2_buffer_size - output2_length,
761 &function_output_length ) == PSA_SUCCESS );
762 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200763
mohammad1603d7d7ba52018-03-12 18:51:53 +0200764 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
765
itayzafrir3e02b3b2018-06-12 17:06:52 +0300766 TEST_ASSERT( (size_t) input->len == output2_length );
767 TEST_ASSERT( memcmp( input->x, output2, (size_t) input->len ) == 0 );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200768
769exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300770 mbedtls_free( output1 );
771 mbedtls_free( output2 );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200772 psa_destroy_key( key_slot );
773 mbedtls_psa_crypto_free( );
774}
775/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +0200776
Gilles Peskine20035e32018-02-03 22:44:14 +0100777/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300778void aead_encrypt_decrypt( int key_type_arg, data_t * key_data,
779 int alg_arg, data_t * input_data, data_t * nonce,
780 data_t * additional_data, int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200781{
782 int slot = 1;
783 psa_key_type_t key_type = key_type_arg;
784 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200785 unsigned char *output_data = NULL;
786 size_t output_size = 0;
787 size_t output_length = 0;
788 unsigned char *output_data2 = NULL;
789 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200790 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200791 psa_status_t expected_result = (psa_status_t) expected_result_arg;
792 psa_key_policy_t policy = {0};
793
Gilles Peskinea1cac842018-06-11 19:33:02 +0200794 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200795 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300796 TEST_ASSERT( nonce != NULL );
797 TEST_ASSERT( additional_data != NULL );
798 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
799 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
800 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
801 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
802
803 output_size = (size_t) input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200804 output_data = mbedtls_calloc( 1, output_size );
805 TEST_ASSERT( output_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200806
807 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
808
809 psa_key_policy_init( &policy );
810
811 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT , alg );
812
813 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
814
815 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300816 key_data->x, (size_t) key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200817
818 TEST_ASSERT( psa_aead_encrypt( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300819 nonce->x, (size_t) nonce->len,
820 additional_data->x,
821 (size_t) additional_data->len,
822 input_data->x, (size_t) input_data->len,
823 output_data,
824 output_size, &output_length ) ==
825 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200826
827 if( PSA_SUCCESS == expected_result )
828 {
829 output_data2 = mbedtls_calloc( 1, output_length );
830 TEST_ASSERT( output_data2 != NULL );
831
832 TEST_ASSERT( psa_aead_decrypt( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300833 nonce->x, (size_t) nonce->len,
834 additional_data->x,
835 (size_t) additional_data->len,
Gilles Peskinea1cac842018-06-11 19:33:02 +0200836 output_data, output_length, output_data2,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300837 output_length, &output_length2 ) ==
838 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200839
840
itayzafrir3e02b3b2018-06-12 17:06:52 +0300841 TEST_ASSERT( memcmp( input_data->x, output_data2,
842 (size_t) input_data->len ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200843 }
844
845
846exit:
847 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200848 mbedtls_free( output_data );
849 mbedtls_free( output_data2 );
850 mbedtls_psa_crypto_free( );
851}
852/* END_CASE */
853
854/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300855void aead_encrypt( int key_type_arg, data_t * key_data,
856 int alg_arg, data_t * input_data,
857 data_t * additional_data, data_t * nonce,
858 data_t * expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200859{
860 int slot = 1;
861 psa_key_type_t key_type = key_type_arg;
862 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200863 unsigned char *output_data = NULL;
864 size_t output_size = 0;
865 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200866 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200867 psa_key_policy_t policy = {0};
868
Gilles Peskinea1cac842018-06-11 19:33:02 +0200869 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200870 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300871 TEST_ASSERT( additional_data != NULL );
872 TEST_ASSERT( nonce != NULL );
873 TEST_ASSERT( expected_result != NULL );
874 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
875 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
876 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
877 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
878 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_result->len ) );
879
880 output_size = (size_t) input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200881 output_data = mbedtls_calloc( 1, output_size );
882 TEST_ASSERT( output_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200883
884 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
885
886 psa_key_policy_init( &policy );
887
888 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
889
890 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
891
892 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300893 key_data->x, (size_t) key_data->len ) ==
894 PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200895
896 TEST_ASSERT( psa_aead_encrypt( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300897 nonce->x, (size_t) nonce->len,
898 additional_data->x,
899 (size_t) additional_data->len,
900 input_data->x, (size_t) input_data->len,
901 output_data,
Gilles Peskinea1cac842018-06-11 19:33:02 +0200902 output_size, &output_length ) == PSA_SUCCESS );
903
904
itayzafrir3e02b3b2018-06-12 17:06:52 +0300905 TEST_ASSERT( memcmp( output_data, expected_result->x,
Gilles Peskinea1cac842018-06-11 19:33:02 +0200906 output_length ) == 0 );
907
908
909exit:
910 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200911 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200912 mbedtls_psa_crypto_free( );
913}
914/* END_CASE */
915
916/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300917void aead_decrypt( int key_type_arg, data_t * key_data,
918 int alg_arg, data_t * input_data,
919 data_t * additional_data, data_t * nonce,
920 data_t * expected_data, int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200921{
922 int slot = 1;
923 psa_key_type_t key_type = key_type_arg;
924 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200925 unsigned char *output_data = NULL;
926 size_t output_size = 0;
927 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200928 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200929 psa_key_policy_t policy = {0};
930 psa_status_t expected_result = (psa_status_t) expected_result_arg;
931
932
Gilles Peskinea1cac842018-06-11 19:33:02 +0200933 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200934 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300935 TEST_ASSERT( additional_data != NULL );
936 TEST_ASSERT( nonce != NULL );
937 TEST_ASSERT( expected_data != NULL );
938 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
939 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
940 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
941 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
942 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
943
944 output_size = (size_t) input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200945 output_data = mbedtls_calloc( 1, output_size );
946 TEST_ASSERT( output_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200947
948 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
949
950 psa_key_policy_init( &policy );
951
952 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
953
954 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
955
956 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300957 key_data->x, (size_t) key_data->len ) ==
958 PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200959
960 TEST_ASSERT( psa_aead_decrypt( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300961 nonce->x, (size_t) nonce->len,
962 additional_data->x, (size_t) additional_data->len,
963 input_data->x, (size_t) input_data->len,
964 output_data,
965 output_size, &output_length ) ==
966 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200967
968
969 if ( expected_result == PSA_SUCCESS )
970 {
itayzafrir3e02b3b2018-06-12 17:06:52 +0300971 TEST_ASSERT( memcmp( output_data, expected_data->x,
Gilles Peskinea1cac842018-06-11 19:33:02 +0200972 output_length ) == 0 );
973 }
974
975
976
977exit:
978 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200979 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200980 mbedtls_psa_crypto_free( );
981}
982/* END_CASE */
983
984/* BEGIN_CASE */
Gilles Peskinee59236f2018-01-27 23:32:46 +0100985void signature_size( int type_arg, int bits, int alg_arg, int expected_size_arg )
986{
987 psa_key_type_t type = type_arg;
988 psa_algorithm_t alg = alg_arg;
989 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE(type, bits, alg);
990 TEST_ASSERT( actual_size == (size_t) expected_size_arg );
991exit:
992 ;
993}
994/* END_CASE */
995
996/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300997void sign_deterministic( int key_type_arg, data_t *key_data,
998 int alg_arg, data_t *input_data,
999 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01001000{
1001 int slot = 1;
1002 psa_key_type_t key_type = key_type_arg;
1003 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001004 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01001005 unsigned char *signature = NULL;
1006 size_t signature_size;
1007 size_t signature_length = 0xdeadbeef;
mohammad1603a97cb8c2018-03-28 03:46:26 -07001008 psa_key_policy_t policy = {0};
Gilles Peskine20035e32018-02-03 22:44:14 +01001009
Gilles Peskine20035e32018-02-03 22:44:14 +01001010 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001011 TEST_ASSERT( input_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001012 TEST_ASSERT( output_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001013 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1014 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1015 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( output_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01001016
1017 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1018
mohammad1603a97cb8c2018-03-28 03:46:26 -07001019 psa_key_policy_init( &policy );
1020
1021 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg_arg );
1022
1023 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1024
Gilles Peskine20035e32018-02-03 22:44:14 +01001025 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001026 key_data->x, (size_t) key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001027 TEST_ASSERT( psa_get_key_information( slot,
1028 NULL,
1029 &key_bits ) == PSA_SUCCESS );
1030
itayzafrir27fbaf72018-06-12 17:09:28 +03001031 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01001032 TEST_ASSERT( signature_size != 0 );
1033 signature = mbedtls_calloc( 1, signature_size );
1034 TEST_ASSERT( signature != NULL );
1035
1036 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001037 input_data->x, (size_t) input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001038 NULL, 0,
1039 signature, signature_size,
1040 &signature_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001041 TEST_ASSERT( signature_length == (size_t) output_data->len );
1042 TEST_ASSERT( memcmp( signature, output_data->x, (size_t) output_data->len )
1043 == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001044
1045exit:
1046 psa_destroy_key( slot );
Gilles Peskine0189e752018-02-03 23:57:22 +01001047 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01001048 mbedtls_psa_crypto_free( );
1049}
1050/* END_CASE */
1051
1052/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001053void sign_fail( int key_type_arg, data_t *key_data,
1054 int alg_arg, data_t *input_data,
Gilles Peskine20035e32018-02-03 22:44:14 +01001055 int signature_size, int expected_status_arg )
1056{
1057 int slot = 1;
1058 psa_key_type_t key_type = key_type_arg;
1059 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001060 psa_status_t actual_status;
1061 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01001062 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01001063 size_t signature_length = 0xdeadbeef;
mohammad1603a97cb8c2018-03-28 03:46:26 -07001064 psa_key_policy_t policy = {0};
Gilles Peskine20035e32018-02-03 22:44:14 +01001065
Gilles Peskine20035e32018-02-03 22:44:14 +01001066 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001067 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001068 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1069 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1070
Gilles Peskine20035e32018-02-03 22:44:14 +01001071 signature = mbedtls_calloc( 1, signature_size );
1072 TEST_ASSERT( signature != NULL );
1073
1074 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1075
mohammad1603a97cb8c2018-03-28 03:46:26 -07001076 psa_key_policy_init( &policy );
1077
1078 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg_arg );
1079
1080 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1081
Gilles Peskine20035e32018-02-03 22:44:14 +01001082 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001083 key_data->x, (size_t) key_data->len ) ==
1084 PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001085
1086 actual_status = psa_asymmetric_sign( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001087 input_data->x,
1088 (size_t) input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001089 NULL, 0,
1090 signature, signature_size,
1091 &signature_length );
1092 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine93aa0332018-02-03 23:58:03 +01001093 TEST_ASSERT( signature_length == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001094
1095exit:
1096 psa_destroy_key( slot );
Gilles Peskine20035e32018-02-03 22:44:14 +01001097 mbedtls_free( signature );
1098 mbedtls_psa_crypto_free( );
1099}
1100/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03001101
1102/* BEGIN_CASE */
1103void key_policy( int usage_arg, int alg_arg )
1104{
1105 int key_slot = 1;
mohammad16034eed7572018-03-28 05:14:59 -07001106 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
mohammad16038cc1cee2018-03-28 01:21:33 +03001107 unsigned char key[32] = {0};
1108 psa_key_policy_t policy_set = {0};
1109 psa_key_policy_t policy_get = {0};
mohammad1603804cd712018-03-20 22:44:08 +02001110
mohammad16038cc1cee2018-03-28 01:21:33 +03001111 memset( key, 0x2a, sizeof( key ) );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001112
mohammad16038cc1cee2018-03-28 01:21:33 +03001113 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1114
1115 psa_key_policy_init(& policy_set );
1116 psa_key_policy_init(& policy_get );
1117
1118 psa_key_policy_set_usage( &policy_set, usage_arg, alg_arg );
1119
1120 TEST_ASSERT( psa_key_policy_get_usage( &policy_set ) == ( psa_key_usage_t )usage_arg );
1121
1122 TEST_ASSERT( psa_key_policy_get_algorithm( &policy_set) == ( psa_algorithm_t )alg_arg );
1123
1124 TEST_ASSERT( psa_set_key_policy( key_slot, &policy_set ) == PSA_SUCCESS );
1125
1126 TEST_ASSERT( psa_import_key( key_slot, key_type,
1127 key, sizeof( key ) ) == PSA_SUCCESS );
1128
1129 TEST_ASSERT( psa_get_key_policy( key_slot, &policy_get ) == PSA_SUCCESS );
1130
1131 TEST_ASSERT( policy_get.usage == policy_set.usage );
1132 TEST_ASSERT( policy_get.alg == policy_set.alg );
1133
1134exit:
1135 psa_destroy_key( key_slot );
1136 mbedtls_psa_crypto_free( );
1137}
1138/* END_CASE */
1139
mohammad16034eed7572018-03-28 05:14:59 -07001140/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001141void key_policy_fail( int usage_arg, int alg_arg, int expected_status,
1142 data_t *keypair )
mohammad16034eed7572018-03-28 05:14:59 -07001143{
1144 int key_slot = 1;
mohammad16034eed7572018-03-28 05:14:59 -07001145 size_t signature_length = 0;
1146 psa_key_policy_t policy = {0};
1147 int actual_status = PSA_SUCCESS;
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001148
mohammad16034eed7572018-03-28 05:14:59 -07001149 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1150
1151 psa_key_policy_init( &policy );
1152
1153 psa_key_policy_set_usage( &policy, usage_arg, alg_arg );
1154
1155 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1156
mohammad16036df908f2018-04-02 08:34:15 -07001157 if( usage_arg & PSA_KEY_USAGE_EXPORT )
mohammad16034eed7572018-03-28 05:14:59 -07001158 {
mohammad16036df908f2018-04-02 08:34:15 -07001159 TEST_ASSERT( keypair != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001160 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
mohammad16036df908f2018-04-02 08:34:15 -07001161 TEST_ASSERT( psa_import_key( key_slot, PSA_KEY_TYPE_RSA_KEYPAIR,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001162 keypair->x, (size_t) keypair->len ) ==
1163 PSA_SUCCESS );
1164 actual_status = psa_asymmetric_sign( key_slot,
1165 ( psa_algorithm_t )alg_arg, NULL, 0, NULL, 0,
mohammad16036df908f2018-04-02 08:34:15 -07001166 NULL, 0, &signature_length );
1167 }
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001168
mohammad16036df908f2018-04-02 08:34:15 -07001169 if( usage_arg & PSA_KEY_USAGE_SIGN )
1170 {
mohammad1603d926b882018-04-16 01:53:20 -07001171 TEST_ASSERT( keypair != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001172 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
mohammad16036df908f2018-04-02 08:34:15 -07001173 TEST_ASSERT( psa_import_key( key_slot, PSA_KEY_TYPE_RSA_KEYPAIR,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001174 keypair->x, (size_t) keypair->len ) ==
1175 PSA_SUCCESS );
mohammad16036df908f2018-04-02 08:34:15 -07001176 actual_status = psa_export_key( key_slot, NULL, 0, NULL );
mohammad16034eed7572018-03-28 05:14:59 -07001177 }
1178
1179 TEST_ASSERT( actual_status == expected_status );
1180
1181exit:
1182 psa_destroy_key( key_slot );
1183 mbedtls_psa_crypto_free( );
1184}
1185/* END_CASE */
Gilles Peskinea0655c32018-04-30 17:06:50 +02001186
1187/* BEGIN_CASE */
1188void key_lifetime( int lifetime_arg )
1189{
1190 int key_slot = 1;
1191 psa_key_type_t key_type = PSA_ALG_CBC_BASE;
1192 unsigned char key[32] = {0};
1193 psa_key_lifetime_t lifetime_set = (psa_key_lifetime_t) lifetime_arg;
1194 psa_key_lifetime_t lifetime_get;
Gilles Peskine7268afc2018-06-06 15:19:24 +02001195
Gilles Peskinea0655c32018-04-30 17:06:50 +02001196 memset( key, 0x2a, sizeof( key ) );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001197
Gilles Peskinea0655c32018-04-30 17:06:50 +02001198 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001199
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001200 TEST_ASSERT( psa_set_key_lifetime( key_slot,
Gilles Peskinea0655c32018-04-30 17:06:50 +02001201 lifetime_set ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001202
Gilles Peskinea0655c32018-04-30 17:06:50 +02001203 TEST_ASSERT( psa_import_key( key_slot, key_type,
1204 key, sizeof( key ) ) == PSA_SUCCESS );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001205
1206 TEST_ASSERT( psa_get_key_lifetime( key_slot,
Gilles Peskinea0655c32018-04-30 17:06:50 +02001207 &lifetime_get ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001208
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001209 TEST_ASSERT( lifetime_get == lifetime_set );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001210
Gilles Peskinea0655c32018-04-30 17:06:50 +02001211exit:
1212 psa_destroy_key( key_slot );
1213 mbedtls_psa_crypto_free( );
1214}
1215/* END_CASE */
mohammad1603804cd712018-03-20 22:44:08 +02001216
Gilles Peskine7268afc2018-06-06 15:19:24 +02001217
mohammad1603804cd712018-03-20 22:44:08 +02001218/* BEGIN_CASE */
1219void key_lifetime_set_fail( int key_slot_arg, int lifetime_arg, int expected_status_arg )
1220{
1221 int key_slot = 1;
mohammad1603804cd712018-03-20 22:44:08 +02001222 psa_key_lifetime_t lifetime_set = (psa_key_lifetime_t) lifetime_arg;
1223 psa_status_t actual_status;
1224 psa_status_t expected_status = expected_status_arg;
1225
mohammad1603804cd712018-03-20 22:44:08 +02001226 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1227
mohammad1603804cd712018-03-20 22:44:08 +02001228 actual_status = psa_set_key_lifetime( key_slot_arg, lifetime_set );
1229
1230 if( actual_status == PSA_SUCCESS )
1231 actual_status = psa_set_key_lifetime( key_slot_arg, lifetime_set );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001232
mohammad1603804cd712018-03-20 22:44:08 +02001233 TEST_ASSERT( expected_status == actual_status );
1234
1235exit:
mohammad1603804cd712018-03-20 22:44:08 +02001236 psa_destroy_key( key_slot );
1237 mbedtls_psa_crypto_free( );
1238}
1239/* END_CASE */
itayzafrir5c753392018-05-08 11:18:38 +03001240
1241/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001242void asymmetric_verify( int key_type_arg, data_t *key_data,
1243 int alg_arg, data_t *hash_data,
1244 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03001245{
1246 int slot = 1;
1247 psa_key_type_t key_type = key_type_arg;
1248 psa_algorithm_t alg = alg_arg;
itayzafrir5c753392018-05-08 11:18:38 +03001249 psa_key_policy_t policy = {0};
1250
itayzafrir5c753392018-05-08 11:18:38 +03001251 TEST_ASSERT( key_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001252 TEST_ASSERT( hash_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001253 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001254 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1255 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1256 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03001257
1258 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1259
1260 psa_key_policy_init( &policy );
1261
1262 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg_arg );
1263
1264 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1265
1266 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001267 key_data->x, (size_t) key_data->len ) ==
1268 PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001269
1270 TEST_ASSERT( psa_asymmetric_verify( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001271 hash_data->x, (size_t) hash_data->len,
itayzafrir5c753392018-05-08 11:18:38 +03001272 NULL, 0,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001273 signature_data->x,
1274 (size_t) signature_data->len ) ==
itayzafrir5c753392018-05-08 11:18:38 +03001275 PSA_SUCCESS );
1276exit:
1277 psa_destroy_key( slot );
itayzafrir5c753392018-05-08 11:18:38 +03001278 mbedtls_psa_crypto_free( );
1279}
1280/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001281
1282/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001283void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
1284 int alg_arg, data_t *hash_data,
1285 data_t *signature_data,
1286 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001287{
1288
1289 int slot = 1;
1290 psa_key_type_t key_type = key_type_arg;
1291 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001292 psa_status_t actual_status;
1293 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001294 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001295
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001296 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001297 TEST_ASSERT( hash_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001298 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001299 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1300 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1301 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001302
1303 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1304
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001305 psa_key_policy_init( &policy );
1306
1307 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg_arg );
1308
1309 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1310
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001311 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001312 key_data->x, (size_t) key_data->len ) ==
1313 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001314
1315 actual_status = psa_asymmetric_verify( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001316 hash_data->x, (size_t) hash_data->len,
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001317 NULL, 0,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001318 signature_data->x,
1319 (size_t) signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001320
1321
1322 TEST_ASSERT( actual_status == expected_status );
1323
1324exit:
1325 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001326 mbedtls_psa_crypto_free( );
1327}
1328/* END_CASE */
1329
1330
1331/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001332void asymmetric_encrypt_decrypt( int key_type_arg, data_t *key_data,
1333 int alg_arg, data_t *input_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001334{
1335 int slot = 1;
1336 psa_key_type_t key_type = key_type_arg;
1337 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001338 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001339 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001340 size_t output_length = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001341 unsigned char *output2 = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001342 size_t output2_size = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001343 size_t output2_length = 0;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001344 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001345
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001346 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001347 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001348 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1349 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1350
1351 output_size = (size_t) key_data->len;
1352 output2_size = output_size;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001353 output = mbedtls_calloc( 1, output_size );
1354 TEST_ASSERT( output != NULL );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001355 output2 = mbedtls_calloc( 1, output2_size );
1356 TEST_ASSERT( output2 != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001357
1358 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1359
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001360 psa_key_policy_init( &policy );
1361 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg_arg );
1362 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1363
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001364 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001365 key_data->x, (size_t) key_data->len ) ==
1366 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001367
Gilles Peskineeebd7382018-06-08 18:11:54 +02001368 /* We test encryption by checking that encrypt-then-decrypt gives back
1369 * the original plaintext because of the non-optional random
1370 * part of encryption process which prevents using fixed vectors. */
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001371 TEST_ASSERT( psa_asymmetric_encrypt(slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001372 input_data->x,
1373 (size_t) input_data->len,
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001374 NULL, 0,
1375 output,
1376 output_size,
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001377 &output_length) == PSA_SUCCESS );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001378
1379 TEST_ASSERT( psa_asymmetric_decrypt(slot, alg,
1380 output,
1381 output_length,
1382 NULL, 0,
1383 output2,
1384 output2_size,
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001385 &output2_length) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001386 TEST_ASSERT( memcmp( input_data->x, output2, (size_t) input_data->len )
1387 == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001388
1389exit:
1390 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001391 mbedtls_free( output );
1392 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001393 mbedtls_psa_crypto_free( );
1394
1395}
1396/* END_CASE */
1397
1398
1399/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001400void asymmetric_encrypt_fail( int key_type_arg, data_t *key_data,
1401 int alg_arg, data_t *input_data,
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001402 int expected_status_arg )
1403{
1404
1405
1406 int slot = 1;
1407 psa_key_type_t key_type = key_type_arg;
1408 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001409 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001410 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001411 size_t output_length = 0;
1412 psa_status_t actual_status;
1413 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001414 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001415
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001416 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001417 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001418 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1419 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1420
1421 output_size = (size_t) key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001422 output = mbedtls_calloc( 1, output_size );
1423 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001424
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001425 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1426
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001427 psa_key_policy_init( &policy );
1428 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg_arg );
1429 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1430
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001431 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001432 key_data->x, (size_t) key_data->len ) ==
1433 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001434
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001435 actual_status = psa_asymmetric_encrypt(slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001436 input_data->x,
1437 (size_t) input_data->len,
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001438 NULL, 0,
1439 output,
1440 output_size,
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001441 &output_length);
1442 TEST_ASSERT( actual_status == expected_status );
1443
1444exit:
1445 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001446 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001447 mbedtls_psa_crypto_free( );
1448
1449}
1450/* END_CASE */
1451
1452/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001453void asymmetric_decrypt( int key_type_arg, data_t *key_data,
1454 int alg_arg, data_t *input_data,
1455 data_t *expected_data, int expected_size )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001456{
1457 int slot = 1;
1458 psa_key_type_t key_type = key_type_arg;
1459 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001460 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001461 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001462 size_t output_length = 0;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001463 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001464
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001465 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001466 TEST_ASSERT( input_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001467 TEST_ASSERT( expected_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001468 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1469 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1470 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
1471
1472 output_size = (size_t) key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001473 output = mbedtls_calloc( 1, output_size );
1474 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001475
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001476 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1477
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001478 psa_key_policy_init( &policy );
1479 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg_arg );
1480 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1481
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001482 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001483 key_data->x, (size_t) key_data->len ) ==
1484 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001485
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001486 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001487 input_data->x,
1488 (size_t) input_data->len,
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001489 NULL, 0,
1490 output,
1491 output_size,
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001492 &output_length) == PSA_SUCCESS );
1493 TEST_ASSERT( ((size_t)expected_size) == output_length );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001494 TEST_ASSERT( memcmp( expected_data->x, output, (output_length) ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001495
1496exit:
1497 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001498 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001499 mbedtls_psa_crypto_free( );
1500
1501
1502}
1503/* END_CASE */
1504
1505
1506/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001507void asymmetric_decrypt_fail( int key_type_arg, data_t *key_data,
1508 int alg_arg, data_t *input_data,
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001509 int expected_status_arg )
1510{
1511
1512 int slot = 1;
1513 psa_key_type_t key_type = key_type_arg;
1514 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001515 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001516 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001517 size_t output_length = 0;
1518 psa_status_t actual_status;
1519 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001520 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001521
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001522 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001523 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001524 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1525 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1526
1527 output_size = (size_t) key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001528 output = mbedtls_calloc( 1, output_size );
1529 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001530
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001531 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1532
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001533 psa_key_policy_init( &policy );
1534 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg_arg );
1535 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1536
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001537 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001538 key_data->x, (size_t) key_data->len ) ==
1539 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001540
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001541 actual_status = psa_asymmetric_decrypt(slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001542 input_data->x,
1543 (size_t) input_data->len,
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001544 NULL, 0,
1545 output,
1546 output_size,
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001547 &output_length);
1548 TEST_ASSERT( actual_status == expected_status );
1549
1550exit:
1551 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001552 mbedtls_free( output);
1553 mbedtls_psa_crypto_free( );
1554}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001555/* END_CASE */