blob: 5e66986ae8f4f6787a0fadc572a34ee8f609ecc6 [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)
Gilles Peskine2d277862018-06-18 15:41:12 +02007#define PSA_CRYPTO_TEST_SIZE_T_RANGE( x ) ( ( x ) <= SIZE_MAX )
itayzafrir3e02b3b2018-06-12 17:06:52 +03008#else
Gilles Peskine2d277862018-06-18 15:41:12 +02009#define PSA_CRYPTO_TEST_SIZE_T_RANGE( x ) 1
itayzafrir3e02b3b2018-06-12 17:06:52 +030010#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 */
Gilles Peskine2d277862018-06-18 15:41:12 +020019void init_deinit( )
Gilles Peskinee59236f2018-01-27 23:32:46 +010020{
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,
Gilles Peskine2d277862018-06-18 15:41:12 +0200151 int type_arg,
152 int alg_arg,
153 int expected_bits,
154 int public_key_expected_length,
155 int expected_export_status )
Moran Pekerf709f4a2018-06-06 17:26:04 +0300156{
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 ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200185 PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300186
187 /* Test the key information */
188 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200189 &got_type,
190 &got_bits ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300191 TEST_ASSERT( got_type == type );
192 TEST_ASSERT( got_bits == (size_t) expected_bits );
193
194 /* Export the key */
195 status = psa_export_public_key( slot,
Gilles Peskine2d277862018-06-18 15:41:12 +0200196 exported, export_size,
197 &exported_length );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300198 TEST_ASSERT( status == (psa_status_t) expected_export_status );
199 if( status != PSA_SUCCESS )
200 goto destroy;
201
202 TEST_ASSERT( exported_length == (size_t) public_key_expected_length );
203
204destroy:
205 /* Destroy the key */
206 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
207 TEST_ASSERT( psa_get_key_information(
208 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
209
210exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300211 mbedtls_free( exported );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300212 mbedtls_psa_crypto_free( );
213}
214/* END_CASE */
215
Gilles Peskine20035e32018-02-03 22:44:14 +0100216/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300217void hash_finish( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100218{
219 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100220 unsigned char actual_hash[MBEDTLS_MD_MAX_SIZE];
221 size_t actual_hash_length;
222 psa_hash_operation_t operation;
223
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100224 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300225 TEST_ASSERT( expected_hash != NULL );
226 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
227 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100228
229 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
230
231 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
232 TEST_ASSERT( psa_hash_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300233 input->x, (size_t) input->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200234 PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100235 TEST_ASSERT( psa_hash_finish( &operation,
236 actual_hash, sizeof( actual_hash ),
237 &actual_hash_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300238 TEST_ASSERT( actual_hash_length == (size_t) expected_hash->len );
239 TEST_ASSERT( memcmp( expected_hash->x, actual_hash,
240 (size_t) expected_hash->len ) == 0 );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100241
242exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100243 mbedtls_psa_crypto_free( );
244}
245/* END_CASE */
246
247/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300248void hash_verify( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100249{
250 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100251 psa_hash_operation_t operation;
252
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100253 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300254 TEST_ASSERT( expected_hash != NULL );
255 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
256 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100257
258 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
259
260 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
261 TEST_ASSERT( psa_hash_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300262 input->x, (size_t) input->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200263 PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100264 TEST_ASSERT( psa_hash_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300265 expected_hash->x,
266 (size_t) expected_hash->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200267 PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100268
269exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100270 mbedtls_psa_crypto_free( );
271}
272/* END_CASE */
273
274/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300275void mac_verify( int key_type_arg, data_t *key,
276 int alg_arg, data_t *iv,
277 data_t *input, data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +0100278{
279 int key_slot = 1;
280 psa_key_type_t key_type = key_type_arg;
281 psa_algorithm_t alg = alg_arg;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100282 psa_mac_operation_t operation;
mohammad16036df908f2018-04-02 08:34:15 -0700283 psa_key_policy_t policy;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100284
Gilles Peskine8c9def32018-02-08 10:02:12 +0100285 TEST_ASSERT( key != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300286 TEST_ASSERT( iv != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100287 TEST_ASSERT( input != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100288 TEST_ASSERT( expected_mac != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300289 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
290 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( iv->len ) );
291 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
292 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100293
294 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
295
mohammad16036df908f2018-04-02 08:34:15 -0700296 psa_key_policy_init( &policy );
297
298 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg_arg );
299
300 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
301
Gilles Peskine8c9def32018-02-08 10:02:12 +0100302 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300303 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100304 // TODO: support IV
305 TEST_ASSERT( psa_mac_start( &operation, key_slot, alg ) == PSA_SUCCESS );
306 TEST_ASSERT( psa_destroy_key( key_slot ) == PSA_SUCCESS );
307 TEST_ASSERT( psa_mac_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300308 input->x, (size_t) input->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200309 PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100310 TEST_ASSERT( psa_mac_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300311 expected_mac->x,
312 (size_t) expected_mac->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100313
314exit:
Gilles Peskine8c9def32018-02-08 10:02:12 +0100315 psa_destroy_key( key_slot );
316 mbedtls_psa_crypto_free( );
317}
318/* END_CASE */
319
Moran Peker7f878502018-06-06 17:09:40 +0300320
Gilles Peskine8c9def32018-02-08 10:02:12 +0100321/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +0200322void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300323 data_t *key,
324 data_t *input, data_t *expected_output,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200325 int expected_status )
326{
327 int key_slot = 1;
328 psa_status_t status;
329 psa_key_type_t key_type = key_type_arg;
330 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200331 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300332 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200333 size_t output_buffer_size = 0;
334 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200335 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200336 psa_cipher_operation_t operation;
337
Gilles Peskine50e586b2018-06-08 14:28:46 +0200338 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200339 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200340 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300341 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
342 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
343 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200344
345 memset( iv, 0x2a, sizeof( iv ) );
346
347 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
348
349 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300350 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200351
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200352 TEST_ASSERT( psa_encrypt_setup( &operation,
353 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200354
355 TEST_ASSERT( psa_encrypt_set_iv( &operation,
356 iv, sizeof( iv ) ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300357 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200358 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300359 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200360
itayzafrir3e02b3b2018-06-12 17:06:52 +0300361 TEST_ASSERT( psa_cipher_update( &operation, input->x, (size_t) input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200362 output, output_buffer_size,
363 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200364 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200365 status = psa_cipher_finish( &operation,
366 output + function_output_length,
367 output_buffer_size,
368 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200369 total_output_length += function_output_length;
370
Gilles Peskine50e586b2018-06-08 14:28:46 +0200371 TEST_ASSERT( status == (psa_status_t) expected_status );
372 if( expected_status == PSA_SUCCESS )
373 {
374 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300375 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
376 TEST_ASSERT( memcmp( expected_output->x, output,
377 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200378 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200379
Gilles Peskine50e586b2018-06-08 14:28:46 +0200380exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300381 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200382 psa_destroy_key( key_slot );
383 mbedtls_psa_crypto_free( );
384}
385/* END_CASE */
386
387/* BEGIN_CASE */
388void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300389 data_t *key,
390 data_t *input,
391 int first_part_size,
392 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +0200393{
394 int key_slot = 1;
395 psa_key_type_t key_type = key_type_arg;
396 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200397 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300398 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200399 size_t output_buffer_size = 0;
400 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200401 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200402 psa_cipher_operation_t operation;
403
Gilles Peskine50e586b2018-06-08 14:28:46 +0200404 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200405 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200406 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300407 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
408 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
409 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200410
411 memset( iv, 0x2a, sizeof( iv ) );
412
413 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
414
415 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300416 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200417
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200418 TEST_ASSERT( psa_encrypt_setup( &operation,
419 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200420
421 TEST_ASSERT( psa_encrypt_set_iv( &operation,
422 iv, sizeof( iv ) ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300423 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200424 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300425 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200426
itayzafrir3e02b3b2018-06-12 17:06:52 +0300427 TEST_ASSERT( (unsigned int) first_part_size < (size_t) input->len );
428 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200429 output, output_buffer_size,
430 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200431 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200432 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300433 input->x + first_part_size,
434 (size_t) input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200435 output, output_buffer_size,
436 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200437 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200438 TEST_ASSERT( psa_cipher_finish( &operation,
439 output + function_output_length,
440 output_buffer_size,
441 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200442 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200443 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
444
itayzafrir3e02b3b2018-06-12 17:06:52 +0300445 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
446 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine2d277862018-06-18 15:41:12 +0200447 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200448
449exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300450 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200451 psa_destroy_key( key_slot );
452 mbedtls_psa_crypto_free( );
453}
454/* END_CASE */
455
456/* BEGIN_CASE */
457void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300458 data_t *key,
459 data_t *input,
460 int first_part_size,
461 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +0200462{
463 int key_slot = 1;
464
465 psa_key_type_t key_type = key_type_arg;
466 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200467 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300468 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200469 size_t output_buffer_size = 0;
470 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200471 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200472 psa_cipher_operation_t operation;
473
Gilles Peskine50e586b2018-06-08 14:28:46 +0200474 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200475 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200476 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300477 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
478 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
479 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200480
481 memset( iv, 0x2a, sizeof( iv ) );
482
483 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
484
485 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300486 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200487
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200488 TEST_ASSERT( psa_decrypt_setup( &operation,
489 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200490
491 TEST_ASSERT( psa_encrypt_set_iv( &operation,
492 iv, sizeof( iv ) ) == PSA_SUCCESS );
493
itayzafrir3e02b3b2018-06-12 17:06:52 +0300494 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200495 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300496 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200497
itayzafrir3e02b3b2018-06-12 17:06:52 +0300498 TEST_ASSERT( (unsigned int) first_part_size < (size_t) input->len );
499 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200500 output, output_buffer_size,
501 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200502 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200503 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300504 input->x + first_part_size,
505 (size_t) input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200506 output, output_buffer_size,
507 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200508 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200509 TEST_ASSERT( psa_cipher_finish( &operation,
510 output + function_output_length,
511 output_buffer_size,
512 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200513 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200514 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
515
itayzafrir3e02b3b2018-06-12 17:06:52 +0300516 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
Gilles Peskine2d277862018-06-18 15:41:12 +0200517 TEST_ASSERT( memcmp( expected_output->x, output,
518 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200519
520exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300521 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200522 psa_destroy_key( key_slot );
523 mbedtls_psa_crypto_free( );
524}
525/* END_CASE */
526
527
528/* BEGIN_CASE */
529void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300530 data_t *key,
531 data_t *input, data_t *expected_output,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200532 int expected_status )
533{
534 int key_slot = 1;
535 psa_status_t status;
536 psa_key_type_t key_type = key_type_arg;
537 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200538 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300539 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200540 size_t output_buffer_size = 0;
541 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200542 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200543 psa_cipher_operation_t operation;
544
Gilles Peskine50e586b2018-06-08 14:28:46 +0200545 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200546 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200547 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300548 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
549 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
550 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200551
552 memset( iv, 0x2a, sizeof( iv ) );
553
554 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
555
556 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300557 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200558
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200559 TEST_ASSERT( psa_decrypt_setup( &operation,
560 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200561
562 TEST_ASSERT( psa_encrypt_set_iv( &operation,
563 iv, sizeof( iv ) ) == PSA_SUCCESS );
564
itayzafrir3e02b3b2018-06-12 17:06:52 +0300565 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200566 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300567 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200568
itayzafrir3e02b3b2018-06-12 17:06:52 +0300569 TEST_ASSERT( psa_cipher_update( &operation, input->x, (size_t) input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200570 output, output_buffer_size,
571 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200572 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200573 status = psa_cipher_finish( &operation,
574 output + function_output_length,
575 output_buffer_size,
576 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200577 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200578 TEST_ASSERT( status == (psa_status_t) expected_status );
579
580 if( expected_status == PSA_SUCCESS )
581 {
582 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300583 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
584 TEST_ASSERT( memcmp( expected_output->x, output,
585 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200586 }
587
588
589exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300590 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200591 psa_destroy_key( key_slot );
592 mbedtls_psa_crypto_free( );
593}
594/* END_CASE */
595
596
597/* BEGIN_CASE */
598void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300599 data_t *key,
600 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +0200601{
602 int key_slot = 1;
603 psa_key_type_t key_type = key_type_arg;
604 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -0700605 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +0200606 size_t iv_size = 16;
607 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300608 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200609 size_t output1_size = 0;
610 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300611 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200612 size_t output2_size = 0;
613 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200614 size_t function_output_length = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200615 psa_cipher_operation_t operation1;
616 psa_cipher_operation_t operation2;
617
mohammad1603d7d7ba52018-03-12 18:51:53 +0200618 TEST_ASSERT( key != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200619 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300620 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
621 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200622
mohammad1603d7d7ba52018-03-12 18:51:53 +0200623 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
624
625 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300626 key->x, (size_t) key->len ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200627
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200628 TEST_ASSERT( psa_encrypt_setup( &operation1,
629 key_slot, alg ) == PSA_SUCCESS );
630 TEST_ASSERT( psa_decrypt_setup( &operation2,
631 key_slot, alg ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200632
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200633 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
634 iv, iv_size,
635 &iv_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300636 output1_size = (size_t) input->len + operation1.block_size;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200637 output1 = mbedtls_calloc( 1, output1_size );
638 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300639
itayzafrir3e02b3b2018-06-12 17:06:52 +0300640 TEST_ASSERT( psa_cipher_update( &operation1, input->x, (size_t) input->len,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200641 output1, output1_size,
642 &output1_length ) == PSA_SUCCESS );
643 TEST_ASSERT( psa_cipher_finish( &operation1,
644 output1 + output1_length, output1_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200645 &function_output_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200646
Gilles Peskine048b7f02018-06-08 14:20:49 +0200647 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300648
649 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
650
651 output2_size = output1_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200652 output2 = mbedtls_calloc( 1, output2_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300653 TEST_ASSERT( output2 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300654
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200655 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
656 iv, iv_length ) == PSA_SUCCESS );
657 TEST_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
658 output2, output2_size,
659 &output2_length ) == PSA_SUCCESS );
Gilles Peskine048b7f02018-06-08 14:20:49 +0200660 function_output_length = 0;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200661 TEST_ASSERT( psa_cipher_finish( &operation2,
662 output2 + output2_length,
663 output2_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200664 &function_output_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300665
Gilles Peskine048b7f02018-06-08 14:20:49 +0200666 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200667
Moran Pekerded84402018-06-06 16:36:50 +0300668 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
669
itayzafrir3e02b3b2018-06-12 17:06:52 +0300670 TEST_ASSERT( (size_t) input->len == output2_length );
671 TEST_ASSERT( memcmp( input->x, output2, (size_t) input->len ) == 0 );
Moran Pekerded84402018-06-06 16:36:50 +0300672
673exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300674 mbedtls_free( output1 );
675 mbedtls_free( output2 );
Moran Pekerded84402018-06-06 16:36:50 +0300676 psa_destroy_key( key_slot );
677 mbedtls_psa_crypto_free( );
678}
679/* END_CASE */
680
681/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +0200682void cipher_verify_output_multipart( int alg_arg,
683 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300684 data_t *key,
685 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200686 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +0300687{
688 int key_slot = 1;
689 psa_key_type_t key_type = key_type_arg;
690 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +0300691 unsigned char iv[16] = {0};
692 size_t iv_size = 16;
693 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300694 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200695 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +0300696 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300697 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200698 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +0300699 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200700 size_t function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300701 psa_cipher_operation_t operation1;
702 psa_cipher_operation_t operation2;
703
Moran Pekerded84402018-06-06 16:36:50 +0300704 TEST_ASSERT( key != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300705 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300706 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
707 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200708
Moran Pekerded84402018-06-06 16:36:50 +0300709 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
710
711 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300712 key->x, (size_t) key->len ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300713
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200714 TEST_ASSERT( psa_encrypt_setup( &operation1,
715 key_slot, alg ) == PSA_SUCCESS );
716 TEST_ASSERT( psa_decrypt_setup( &operation2,
717 key_slot, alg ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300718
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200719 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
720 iv, iv_size,
721 &iv_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300722 output1_buffer_size = (size_t) input->len + operation1.block_size;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200723 output1 = mbedtls_calloc( 1, output1_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300724 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300725
itayzafrir3e02b3b2018-06-12 17:06:52 +0300726 TEST_ASSERT( (unsigned int) first_part_size < (size_t) input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200727
itayzafrir3e02b3b2018-06-12 17:06:52 +0300728 TEST_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200729 output1, output1_buffer_size,
730 &function_output_length ) == PSA_SUCCESS );
731 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300732
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200733 TEST_ASSERT( psa_cipher_update( &operation1,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300734 input->x + first_part_size,
735 (size_t) input->len - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200736 output1, output1_buffer_size,
737 &function_output_length ) == PSA_SUCCESS );
738 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300739
Gilles Peskine048b7f02018-06-08 14:20:49 +0200740 TEST_ASSERT( psa_cipher_finish( &operation1,
741 output1 + output1_length,
742 output1_buffer_size - output1_length,
743 &function_output_length ) == PSA_SUCCESS );
744 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200745
746 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
747
Gilles Peskine048b7f02018-06-08 14:20:49 +0200748 output2_buffer_size = output1_length;
749 output2 = mbedtls_calloc( 1, output2_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300750 TEST_ASSERT( output2 != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200751
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200752 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
753 iv, iv_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300754
755 TEST_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200756 output2, output2_buffer_size,
757 &function_output_length ) == PSA_SUCCESS );
758 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300759
Gilles Peskine048b7f02018-06-08 14:20:49 +0200760 TEST_ASSERT( psa_cipher_update( &operation2,
761 output1 + first_part_size,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200762 output1_length - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200763 output2, output2_buffer_size,
764 &function_output_length ) == PSA_SUCCESS );
765 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300766
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200767 TEST_ASSERT( psa_cipher_finish( &operation2,
768 output2 + output2_length,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200769 output2_buffer_size - output2_length,
770 &function_output_length ) == PSA_SUCCESS );
771 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200772
mohammad1603d7d7ba52018-03-12 18:51:53 +0200773 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
774
itayzafrir3e02b3b2018-06-12 17:06:52 +0300775 TEST_ASSERT( (size_t) input->len == output2_length );
776 TEST_ASSERT( memcmp( input->x, output2, (size_t) input->len ) == 0 );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200777
778exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300779 mbedtls_free( output1 );
780 mbedtls_free( output2 );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200781 psa_destroy_key( key_slot );
782 mbedtls_psa_crypto_free( );
783}
784/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +0200785
Gilles Peskine20035e32018-02-03 22:44:14 +0100786/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200787void aead_encrypt_decrypt( int key_type_arg,
788 data_t * key_data,
789 int alg_arg,
790 data_t * input_data,
791 data_t * nonce,
792 data_t * additional_data,
793 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200794{
795 int slot = 1;
796 psa_key_type_t key_type = key_type_arg;
797 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200798 unsigned char *output_data = NULL;
799 size_t output_size = 0;
800 size_t output_length = 0;
801 unsigned char *output_data2 = NULL;
802 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200803 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200804 psa_status_t expected_result = (psa_status_t) expected_result_arg;
805 psa_key_policy_t policy = {0};
806
Gilles Peskinea1cac842018-06-11 19:33:02 +0200807 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200808 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300809 TEST_ASSERT( nonce != NULL );
810 TEST_ASSERT( additional_data != NULL );
811 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
812 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
813 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
814 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
815
816 output_size = (size_t) input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200817 output_data = mbedtls_calloc( 1, output_size );
818 TEST_ASSERT( output_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200819
820 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
821
822 psa_key_policy_init( &policy );
823
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200824 psa_key_policy_set_usage( &policy,
825 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
826 alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200827
828 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
829
830 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300831 key_data->x, (size_t) key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200832
833 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +0200834 nonce->x, (size_t) nonce->len,
835 additional_data->x,
836 (size_t) additional_data->len,
837 input_data->x, (size_t) input_data->len,
838 output_data,
839 output_size, &output_length ) ==
840 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200841
842 if( PSA_SUCCESS == expected_result )
843 {
844 output_data2 = mbedtls_calloc( 1, output_length );
845 TEST_ASSERT( output_data2 != NULL );
846
847 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +0200848 nonce->x, (size_t) nonce->len,
849 additional_data->x,
850 (size_t) additional_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200851 output_data, output_length,
852 output_data2, output_length,
853 &output_length2 ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200854 expected_result );
855
Gilles Peskinea1cac842018-06-11 19:33:02 +0200856
itayzafrir3e02b3b2018-06-12 17:06:52 +0300857 TEST_ASSERT( memcmp( input_data->x, output_data2,
Gilles Peskine2d277862018-06-18 15:41:12 +0200858 (size_t) input_data->len ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200859 }
Gilles Peskine2d277862018-06-18 15:41:12 +0200860
Gilles Peskinea1cac842018-06-11 19:33:02 +0200861
862exit:
863 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200864 mbedtls_free( output_data );
865 mbedtls_free( output_data2 );
866 mbedtls_psa_crypto_free( );
867}
868/* END_CASE */
869
870/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300871void aead_encrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200872 int alg_arg, data_t * input_data,
873 data_t * additional_data, data_t * nonce,
874 data_t * expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200875{
876 int slot = 1;
877 psa_key_type_t key_type = key_type_arg;
878 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200879 unsigned char *output_data = NULL;
880 size_t output_size = 0;
881 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200882 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200883 psa_key_policy_t policy = {0};
884
Gilles Peskinea1cac842018-06-11 19:33:02 +0200885 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200886 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300887 TEST_ASSERT( additional_data != NULL );
888 TEST_ASSERT( nonce != NULL );
889 TEST_ASSERT( expected_result != NULL );
890 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
891 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
892 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
893 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
894 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_result->len ) );
895
896 output_size = (size_t) input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200897 output_data = mbedtls_calloc( 1, output_size );
898 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +0200899
Gilles Peskinea1cac842018-06-11 19:33:02 +0200900 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
901
902 psa_key_policy_init( &policy );
903
904 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
905
906 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
907
908 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300909 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200910 PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200911
912 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +0200913 nonce->x, (size_t) nonce->len,
914 additional_data->x,
915 (size_t) additional_data->len,
916 input_data->x, (size_t) input_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200917 output_data, output_size,
918 &output_length ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200919
920
itayzafrir3e02b3b2018-06-12 17:06:52 +0300921 TEST_ASSERT( memcmp( output_data, expected_result->x,
Gilles Peskine2d277862018-06-18 15:41:12 +0200922 output_length ) == 0 );
923
Gilles Peskinea1cac842018-06-11 19:33:02 +0200924
925exit:
926 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200927 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200928 mbedtls_psa_crypto_free( );
929}
930/* END_CASE */
931
932/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300933void aead_decrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200934 int alg_arg, data_t * input_data,
935 data_t * additional_data, data_t * nonce,
936 data_t * expected_data, int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200937{
938 int slot = 1;
939 psa_key_type_t key_type = key_type_arg;
940 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200941 unsigned char *output_data = NULL;
942 size_t output_size = 0;
943 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200944 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200945 psa_key_policy_t policy = {0};
946 psa_status_t expected_result = (psa_status_t) expected_result_arg;
947
948
Gilles Peskinea1cac842018-06-11 19:33:02 +0200949 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200950 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300951 TEST_ASSERT( additional_data != NULL );
952 TEST_ASSERT( nonce != NULL );
953 TEST_ASSERT( expected_data != NULL );
954 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
955 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
956 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
957 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
958 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
959
960 output_size = (size_t) input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200961 output_data = mbedtls_calloc( 1, output_size );
962 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +0200963
Gilles Peskinea1cac842018-06-11 19:33:02 +0200964 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
965
966 psa_key_policy_init( &policy );
967
968 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
969
970 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
971
972 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300973 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200974 PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200975
976 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +0200977 nonce->x, (size_t) nonce->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200978 additional_data->x,
979 (size_t) additional_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +0200980 input_data->x, (size_t) input_data->len,
981 output_data,
982 output_size, &output_length ) ==
983 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200984
985
Gilles Peskine2d277862018-06-18 15:41:12 +0200986 if( expected_result == PSA_SUCCESS )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200987 {
itayzafrir3e02b3b2018-06-12 17:06:52 +0300988 TEST_ASSERT( memcmp( output_data, expected_data->x,
Gilles Peskine2d277862018-06-18 15:41:12 +0200989 output_length ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200990 }
991
Gilles Peskine2d277862018-06-18 15:41:12 +0200992
Gilles Peskinea1cac842018-06-11 19:33:02 +0200993
994exit:
995 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200996 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200997 mbedtls_psa_crypto_free( );
998}
999/* END_CASE */
1000
1001/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001002void signature_size( int type_arg,
1003 int bits,
1004 int alg_arg,
1005 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01001006{
1007 psa_key_type_t type = type_arg;
1008 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +02001009 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinee59236f2018-01-27 23:32:46 +01001010 TEST_ASSERT( actual_size == (size_t) expected_size_arg );
1011exit:
1012 ;
1013}
1014/* END_CASE */
1015
1016/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001017void sign_deterministic( int key_type_arg, data_t *key_data,
1018 int alg_arg, data_t *input_data,
1019 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01001020{
1021 int slot = 1;
1022 psa_key_type_t key_type = key_type_arg;
1023 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001024 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01001025 unsigned char *signature = NULL;
1026 size_t signature_size;
1027 size_t signature_length = 0xdeadbeef;
mohammad1603a97cb8c2018-03-28 03:46:26 -07001028 psa_key_policy_t policy = {0};
Gilles Peskine20035e32018-02-03 22:44:14 +01001029
Gilles Peskine20035e32018-02-03 22:44:14 +01001030 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001031 TEST_ASSERT( input_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001032 TEST_ASSERT( output_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001033 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1034 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1035 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( output_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01001036
1037 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1038
mohammad1603a97cb8c2018-03-28 03:46:26 -07001039 psa_key_policy_init( &policy );
1040
1041 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg_arg );
1042
1043 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1044
Gilles Peskine20035e32018-02-03 22:44:14 +01001045 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001046 key_data->x, (size_t) key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001047 TEST_ASSERT( psa_get_key_information( slot,
1048 NULL,
1049 &key_bits ) == PSA_SUCCESS );
1050
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001051 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
1052 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01001053 TEST_ASSERT( signature_size != 0 );
1054 signature = mbedtls_calloc( 1, signature_size );
1055 TEST_ASSERT( signature != NULL );
1056
1057 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001058 input_data->x, (size_t) input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001059 NULL, 0,
1060 signature, signature_size,
1061 &signature_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001062 TEST_ASSERT( signature_length == (size_t) output_data->len );
Gilles Peskine2d277862018-06-18 15:41:12 +02001063 TEST_ASSERT( memcmp( signature, output_data->x,
1064 (size_t) output_data->len ) == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001065
1066exit:
1067 psa_destroy_key( slot );
Gilles Peskine0189e752018-02-03 23:57:22 +01001068 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01001069 mbedtls_psa_crypto_free( );
1070}
1071/* END_CASE */
1072
1073/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001074void sign_fail( int key_type_arg, data_t *key_data,
1075 int alg_arg, data_t *input_data,
Gilles Peskine20035e32018-02-03 22:44:14 +01001076 int signature_size, int expected_status_arg )
1077{
1078 int slot = 1;
1079 psa_key_type_t key_type = key_type_arg;
1080 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001081 psa_status_t actual_status;
1082 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01001083 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01001084 size_t signature_length = 0xdeadbeef;
mohammad1603a97cb8c2018-03-28 03:46:26 -07001085 psa_key_policy_t policy = {0};
Gilles Peskine20035e32018-02-03 22:44:14 +01001086
Gilles Peskine20035e32018-02-03 22:44:14 +01001087 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001088 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001089 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1090 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1091
Gilles Peskine20035e32018-02-03 22:44:14 +01001092 signature = mbedtls_calloc( 1, signature_size );
1093 TEST_ASSERT( signature != NULL );
1094
1095 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1096
mohammad1603a97cb8c2018-03-28 03:46:26 -07001097 psa_key_policy_init( &policy );
1098
1099 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg_arg );
1100
1101 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1102
Gilles Peskine20035e32018-02-03 22:44:14 +01001103 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001104 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001105 PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001106
1107 actual_status = psa_asymmetric_sign( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001108 input_data->x,
1109 (size_t) input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001110 NULL, 0,
1111 signature, signature_size,
1112 &signature_length );
1113 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine93aa0332018-02-03 23:58:03 +01001114 TEST_ASSERT( signature_length == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001115
1116exit:
1117 psa_destroy_key( slot );
Gilles Peskine20035e32018-02-03 22:44:14 +01001118 mbedtls_free( signature );
1119 mbedtls_psa_crypto_free( );
1120}
1121/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03001122
1123/* BEGIN_CASE */
1124void key_policy( int usage_arg, int alg_arg )
1125{
1126 int key_slot = 1;
mohammad16034eed7572018-03-28 05:14:59 -07001127 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
mohammad16038cc1cee2018-03-28 01:21:33 +03001128 unsigned char key[32] = {0};
1129 psa_key_policy_t policy_set = {0};
1130 psa_key_policy_t policy_get = {0};
mohammad1603804cd712018-03-20 22:44:08 +02001131
mohammad16038cc1cee2018-03-28 01:21:33 +03001132 memset( key, 0x2a, sizeof( key ) );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001133
mohammad16038cc1cee2018-03-28 01:21:33 +03001134 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1135
Gilles Peskine2d277862018-06-18 15:41:12 +02001136 psa_key_policy_init( &policy_set );
1137 psa_key_policy_init( &policy_get );
mohammad16038cc1cee2018-03-28 01:21:33 +03001138
1139 psa_key_policy_set_usage( &policy_set, usage_arg, alg_arg );
1140
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001141 TEST_ASSERT( psa_key_policy_get_usage( &policy_set ) ==
1142 (psa_key_usage_t) usage_arg );
mohammad16038cc1cee2018-03-28 01:21:33 +03001143
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001144 TEST_ASSERT( psa_key_policy_get_algorithm( &policy_set ) ==
1145 (psa_algorithm_t) alg_arg );
mohammad16038cc1cee2018-03-28 01:21:33 +03001146
1147 TEST_ASSERT( psa_set_key_policy( key_slot, &policy_set ) == PSA_SUCCESS );
1148
1149 TEST_ASSERT( psa_import_key( key_slot, key_type,
1150 key, sizeof( key ) ) == PSA_SUCCESS );
1151
1152 TEST_ASSERT( psa_get_key_policy( key_slot, &policy_get ) == PSA_SUCCESS );
1153
1154 TEST_ASSERT( policy_get.usage == policy_set.usage );
1155 TEST_ASSERT( policy_get.alg == policy_set.alg );
1156
1157exit:
1158 psa_destroy_key( key_slot );
1159 mbedtls_psa_crypto_free( );
1160}
1161/* END_CASE */
1162
mohammad16034eed7572018-03-28 05:14:59 -07001163/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001164void key_policy_fail( int usage_arg, int alg_arg, int expected_status,
1165 data_t *keypair )
mohammad16034eed7572018-03-28 05:14:59 -07001166{
1167 int key_slot = 1;
mohammad16034eed7572018-03-28 05:14:59 -07001168 size_t signature_length = 0;
1169 psa_key_policy_t policy = {0};
1170 int actual_status = PSA_SUCCESS;
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001171
mohammad16034eed7572018-03-28 05:14:59 -07001172 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1173
1174 psa_key_policy_init( &policy );
1175
1176 psa_key_policy_set_usage( &policy, usage_arg, alg_arg );
1177
1178 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1179
mohammad16036df908f2018-04-02 08:34:15 -07001180 if( usage_arg & PSA_KEY_USAGE_EXPORT )
mohammad16034eed7572018-03-28 05:14:59 -07001181 {
mohammad16036df908f2018-04-02 08:34:15 -07001182 TEST_ASSERT( keypair != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001183 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
mohammad16036df908f2018-04-02 08:34:15 -07001184 TEST_ASSERT( psa_import_key( key_slot, PSA_KEY_TYPE_RSA_KEYPAIR,
Gilles Peskine2d277862018-06-18 15:41:12 +02001185 keypair->x, (size_t) keypair->len ) ==
1186 PSA_SUCCESS );
1187 actual_status = psa_asymmetric_sign( key_slot,
1188 (psa_algorithm_t) alg_arg,
1189 NULL, 0,
1190 NULL, 0,
1191 NULL, 0, &signature_length );
mohammad16036df908f2018-04-02 08:34:15 -07001192 }
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001193
mohammad16036df908f2018-04-02 08:34:15 -07001194 if( usage_arg & PSA_KEY_USAGE_SIGN )
1195 {
mohammad1603d926b882018-04-16 01:53:20 -07001196 TEST_ASSERT( keypair != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001197 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
mohammad16036df908f2018-04-02 08:34:15 -07001198 TEST_ASSERT( psa_import_key( key_slot, PSA_KEY_TYPE_RSA_KEYPAIR,
Gilles Peskine2d277862018-06-18 15:41:12 +02001199 keypair->x, (size_t) keypair->len ) ==
1200 PSA_SUCCESS );
mohammad16036df908f2018-04-02 08:34:15 -07001201 actual_status = psa_export_key( key_slot, NULL, 0, NULL );
mohammad16034eed7572018-03-28 05:14:59 -07001202 }
1203
1204 TEST_ASSERT( actual_status == expected_status );
1205
1206exit:
1207 psa_destroy_key( key_slot );
1208 mbedtls_psa_crypto_free( );
1209}
1210/* END_CASE */
Gilles Peskinea0655c32018-04-30 17:06:50 +02001211
1212/* BEGIN_CASE */
1213void key_lifetime( int lifetime_arg )
1214{
1215 int key_slot = 1;
1216 psa_key_type_t key_type = PSA_ALG_CBC_BASE;
1217 unsigned char key[32] = {0};
1218 psa_key_lifetime_t lifetime_set = (psa_key_lifetime_t) lifetime_arg;
1219 psa_key_lifetime_t lifetime_get;
Gilles Peskine7268afc2018-06-06 15:19:24 +02001220
Gilles Peskinea0655c32018-04-30 17:06:50 +02001221 memset( key, 0x2a, sizeof( key ) );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001222
Gilles Peskinea0655c32018-04-30 17:06:50 +02001223 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001224
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001225 TEST_ASSERT( psa_set_key_lifetime( key_slot,
Gilles Peskine2d277862018-06-18 15:41:12 +02001226 lifetime_set ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001227
Gilles Peskinea0655c32018-04-30 17:06:50 +02001228 TEST_ASSERT( psa_import_key( key_slot, key_type,
1229 key, sizeof( key ) ) == PSA_SUCCESS );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001230
1231 TEST_ASSERT( psa_get_key_lifetime( key_slot,
Gilles Peskine2d277862018-06-18 15:41:12 +02001232 &lifetime_get ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001233
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001234 TEST_ASSERT( lifetime_get == lifetime_set );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001235
Gilles Peskinea0655c32018-04-30 17:06:50 +02001236exit:
1237 psa_destroy_key( key_slot );
1238 mbedtls_psa_crypto_free( );
1239}
1240/* END_CASE */
mohammad1603804cd712018-03-20 22:44:08 +02001241
Gilles Peskine7268afc2018-06-06 15:19:24 +02001242
mohammad1603804cd712018-03-20 22:44:08 +02001243/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001244void key_lifetime_set_fail( int key_slot_arg,
1245 int lifetime_arg,
1246 int expected_status_arg )
mohammad1603804cd712018-03-20 22:44:08 +02001247{
1248 int key_slot = 1;
mohammad1603804cd712018-03-20 22:44:08 +02001249 psa_key_lifetime_t lifetime_set = (psa_key_lifetime_t) lifetime_arg;
1250 psa_status_t actual_status;
1251 psa_status_t expected_status = expected_status_arg;
1252
mohammad1603804cd712018-03-20 22:44:08 +02001253 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1254
mohammad1603804cd712018-03-20 22:44:08 +02001255 actual_status = psa_set_key_lifetime( key_slot_arg, lifetime_set );
1256
1257 if( actual_status == PSA_SUCCESS )
1258 actual_status = psa_set_key_lifetime( key_slot_arg, lifetime_set );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001259
mohammad1603804cd712018-03-20 22:44:08 +02001260 TEST_ASSERT( expected_status == actual_status );
1261
1262exit:
mohammad1603804cd712018-03-20 22:44:08 +02001263 psa_destroy_key( key_slot );
1264 mbedtls_psa_crypto_free( );
1265}
1266/* END_CASE */
itayzafrir5c753392018-05-08 11:18:38 +03001267
1268/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001269void asymmetric_verify( int key_type_arg, data_t *key_data,
1270 int alg_arg, data_t *hash_data,
1271 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03001272{
1273 int slot = 1;
1274 psa_key_type_t key_type = key_type_arg;
1275 psa_algorithm_t alg = alg_arg;
itayzafrir5c753392018-05-08 11:18:38 +03001276 psa_key_policy_t policy = {0};
1277
itayzafrir5c753392018-05-08 11:18:38 +03001278 TEST_ASSERT( key_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001279 TEST_ASSERT( hash_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001280 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001281 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1282 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1283 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03001284
1285 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1286
1287 psa_key_policy_init( &policy );
1288
1289 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg_arg );
1290
1291 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1292
1293 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001294 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001295 PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001296
1297 TEST_ASSERT( psa_asymmetric_verify( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001298 hash_data->x, (size_t) hash_data->len,
itayzafrir5c753392018-05-08 11:18:38 +03001299 NULL, 0,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001300 signature_data->x,
1301 (size_t) signature_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001302 PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001303exit:
1304 psa_destroy_key( slot );
itayzafrir5c753392018-05-08 11:18:38 +03001305 mbedtls_psa_crypto_free( );
1306}
1307/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001308
1309/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001310void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
1311 int alg_arg, data_t *hash_data,
1312 data_t *signature_data,
1313 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001314{
1315
1316 int slot = 1;
1317 psa_key_type_t key_type = key_type_arg;
1318 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001319 psa_status_t actual_status;
1320 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001321 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001322
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001323 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001324 TEST_ASSERT( hash_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001325 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001326 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1327 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1328 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001329
1330 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1331
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001332 psa_key_policy_init( &policy );
1333
1334 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg_arg );
1335
1336 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1337
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001338 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001339 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001340 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001341
1342 actual_status = psa_asymmetric_verify( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +02001343 hash_data->x, (size_t) hash_data->len,
1344 NULL, 0,
1345 signature_data->x,
1346 (size_t) signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001347
1348
1349 TEST_ASSERT( actual_status == expected_status );
1350
1351exit:
1352 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001353 mbedtls_psa_crypto_free( );
1354}
1355/* END_CASE */
1356
1357
1358/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001359void asymmetric_encrypt_decrypt( int key_type_arg, data_t *key_data,
1360 int alg_arg, data_t *input_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001361{
1362 int slot = 1;
1363 psa_key_type_t key_type = key_type_arg;
1364 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001365 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001366 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001367 size_t output_length = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001368 unsigned char *output2 = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001369 size_t output2_size = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001370 size_t output2_length = 0;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001371 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001372
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001373 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001374 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001375 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1376 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1377
1378 output_size = (size_t) key_data->len;
1379 output2_size = output_size;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001380 output = mbedtls_calloc( 1, output_size );
1381 TEST_ASSERT( output != NULL );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001382 output2 = mbedtls_calloc( 1, output2_size );
1383 TEST_ASSERT( output2 != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001384
1385 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1386
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001387 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001388 psa_key_policy_set_usage( &policy,
1389 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
1390 alg_arg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001391 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1392
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001393 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001394 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001395 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001396
Gilles Peskineeebd7382018-06-08 18:11:54 +02001397 /* We test encryption by checking that encrypt-then-decrypt gives back
1398 * the original plaintext because of the non-optional random
1399 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine2d277862018-06-18 15:41:12 +02001400 TEST_ASSERT( psa_asymmetric_encrypt( slot, alg,
1401 input_data->x,
1402 (size_t) input_data->len,
1403 NULL, 0,
1404 output,
1405 output_size,
1406 &output_length ) == PSA_SUCCESS );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001407
Gilles Peskine2d277862018-06-18 15:41:12 +02001408 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
1409 output,
1410 output_length,
1411 NULL, 0,
1412 output2,
1413 output2_size,
1414 &output2_length ) == PSA_SUCCESS );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001415 TEST_ASSERT( memcmp( input_data->x, output2,
1416 (size_t) input_data->len ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001417
1418exit:
1419 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001420 mbedtls_free( output );
1421 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001422 mbedtls_psa_crypto_free( );
1423
1424}
1425/* END_CASE */
1426
1427
1428/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001429void asymmetric_encrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001430 int alg_arg, data_t *input_data,
1431 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001432{
1433
1434
1435 int slot = 1;
1436 psa_key_type_t key_type = key_type_arg;
1437 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001438 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001439 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001440 size_t output_length = 0;
1441 psa_status_t actual_status;
1442 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001443 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001444
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001445 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001446 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001447 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1448 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1449
1450 output_size = (size_t) key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001451 output = mbedtls_calloc( 1, output_size );
1452 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001453
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001454 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1455
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001456 psa_key_policy_init( &policy );
1457 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg_arg );
1458 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1459
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001460 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001461 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001462 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001463
Gilles Peskine2d277862018-06-18 15:41:12 +02001464 actual_status = psa_asymmetric_encrypt( slot, alg,
1465 input_data->x,
1466 (size_t) input_data->len,
1467 NULL, 0,
1468 output,
1469 output_size,
1470 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001471 TEST_ASSERT( actual_status == expected_status );
1472
1473exit:
1474 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001475 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001476 mbedtls_psa_crypto_free( );
1477
1478}
1479/* END_CASE */
1480
1481/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001482void asymmetric_decrypt( int key_type_arg, data_t *key_data,
1483 int alg_arg, data_t *input_data,
1484 data_t *expected_data, int expected_size )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001485{
1486 int slot = 1;
1487 psa_key_type_t key_type = key_type_arg;
1488 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001489 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001490 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001491 size_t output_length = 0;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001492 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001493
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001494 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001495 TEST_ASSERT( input_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001496 TEST_ASSERT( expected_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001497 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1498 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1499 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
1500
1501 output_size = (size_t) key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001502 output = mbedtls_calloc( 1, output_size );
1503 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001504
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001505 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1506
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001507 psa_key_policy_init( &policy );
1508 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg_arg );
1509 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1510
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001511 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001512 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001513 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001514
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001515 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +02001516 input_data->x,
1517 (size_t) input_data->len,
1518 NULL, 0,
1519 output,
1520 output_size,
1521 &output_length ) == PSA_SUCCESS );
1522 TEST_ASSERT( ( (size_t) expected_size ) == output_length );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001523 TEST_ASSERT( memcmp( expected_data->x, output, output_length ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001524
1525exit:
1526 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001527 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001528 mbedtls_psa_crypto_free( );
1529
1530
1531}
1532/* END_CASE */
1533
1534
1535/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001536void asymmetric_decrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001537 int alg_arg, data_t *input_data,
1538 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001539{
1540
1541 int slot = 1;
1542 psa_key_type_t key_type = key_type_arg;
1543 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001544 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001545 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001546 size_t output_length = 0;
1547 psa_status_t actual_status;
1548 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001549 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001550
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001551 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001552 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001553 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1554 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1555
1556 output_size = (size_t) key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001557 output = mbedtls_calloc( 1, output_size );
1558 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001559
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001560 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1561
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001562 psa_key_policy_init( &policy );
1563 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg_arg );
1564 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1565
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001566 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001567 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001568 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001569
Gilles Peskine2d277862018-06-18 15:41:12 +02001570 actual_status = psa_asymmetric_decrypt( slot, alg,
1571 input_data->x,
1572 (size_t) input_data->len,
1573 NULL, 0,
1574 output,
1575 output_size,
1576 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001577 TEST_ASSERT( actual_status == expected_status );
1578
1579exit:
1580 psa_destroy_key( slot );
Gilles Peskine2d277862018-06-18 15:41:12 +02001581 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001582 mbedtls_psa_crypto_free( );
1583}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001584/* END_CASE */