blob: 3786e57a30d2c61e54c3a1d3b941f9715ee17955 [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
Gilles Peskine4abf7412018-06-18 16:35:34 +020044 status = psa_import_key( slot, type, data->x, 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;
Gilles Peskine4abf7412018-06-18 16:35:34 +020067 psa_algorithm_t alg = alg_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010068 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010069 unsigned char *exported = NULL;
70 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010071 size_t export_size;
72 size_t exported_length;
73 size_t reexported_length;
74 psa_key_type_t got_type;
75 size_t got_bits;
mohammad1603a97cb8c2018-03-28 03:46:26 -070076 psa_key_policy_t policy = {0};
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010077
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010078 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +030079 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
80 export_size = (ssize_t) data->len + export_size_delta;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010081 exported = mbedtls_calloc( 1, export_size );
82 TEST_ASSERT( exported != NULL );
83 if( ! canonical_input )
84 {
85 reexported = mbedtls_calloc( 1, export_size );
86 TEST_ASSERT( reexported != NULL );
87 }
88 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
89
mohammad1603a97cb8c2018-03-28 03:46:26 -070090 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +020091 psa_key_policy_set_usage( &policy, usage_arg, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -070092 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
93
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010094 /* Import the key */
95 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +020096 data->x, data->len ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010097
98 /* Test the key information */
99 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200100 &got_type,
101 &got_bits ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100102 TEST_ASSERT( got_type == type );
103 TEST_ASSERT( got_bits == (size_t) expected_bits );
104
105 /* Export the key */
106 status = psa_export_key( slot,
107 exported, export_size,
108 &exported_length );
109 TEST_ASSERT( status == (psa_status_t) expected_export_status );
110 if( status != PSA_SUCCESS )
111 goto destroy;
112
113 if( canonical_input )
114 {
Gilles Peskine4abf7412018-06-18 16:35:34 +0200115 TEST_ASSERT( exported_length == data->len );
116 TEST_ASSERT( memcmp( exported, data->x, data->len ) == 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100117 }
118 else
119 {
mohammad1603a97cb8c2018-03-28 03:46:26 -0700120 TEST_ASSERT( psa_set_key_policy( slot2, &policy ) == PSA_SUCCESS );
121
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100122 TEST_ASSERT( psa_import_key( slot2, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200123 exported,
124 export_size ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100125 TEST_ASSERT( psa_export_key( slot2,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200126 reexported,
127 export_size,
128 &reexported_length ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100129 TEST_ASSERT( reexported_length == exported_length );
130 TEST_ASSERT( memcmp( reexported, exported,
131 exported_length ) == 0 );
132 }
133
134destroy:
135 /* Destroy the key */
136 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
137 TEST_ASSERT( psa_get_key_information(
138 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
139
140exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300141 mbedtls_free( exported );
142 mbedtls_free( reexported );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100143 mbedtls_psa_crypto_free( );
144}
145/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100146
Moran Pekerf709f4a2018-06-06 17:26:04 +0300147/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300148void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200149 int type_arg,
150 int alg_arg,
151 int expected_bits,
152 int public_key_expected_length,
153 int expected_export_status )
Moran Pekerf709f4a2018-06-06 17:26:04 +0300154{
155 int slot = 1;
156 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200157 psa_algorithm_t alg = alg_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300158 psa_status_t status;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300159 unsigned char *exported = NULL;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300160 size_t export_size;
161 size_t exported_length;
162 psa_key_type_t got_type;
163 size_t got_bits;
164 psa_key_policy_t policy = {0};
165
Moran Pekerf709f4a2018-06-06 17:26:04 +0300166 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300167 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
168 export_size = (ssize_t) data->len;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300169 exported = mbedtls_calloc( 1, export_size );
170 TEST_ASSERT( exported != NULL );
171
172 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
173
174 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200175 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, alg );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300176 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
177
178 /* Import the key */
179 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200180 data->x, data->len ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300181
182 /* Test the key information */
183 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200184 &got_type,
185 &got_bits ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300186 TEST_ASSERT( got_type == type );
187 TEST_ASSERT( got_bits == (size_t) expected_bits );
188
189 /* Export the key */
190 status = psa_export_public_key( slot,
Gilles Peskine2d277862018-06-18 15:41:12 +0200191 exported, export_size,
192 &exported_length );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300193 TEST_ASSERT( status == (psa_status_t) expected_export_status );
194 if( status != PSA_SUCCESS )
195 goto destroy;
196
197 TEST_ASSERT( exported_length == (size_t) public_key_expected_length );
198
199destroy:
200 /* Destroy the key */
201 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
202 TEST_ASSERT( psa_get_key_information(
203 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
204
205exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300206 mbedtls_free( exported );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300207 mbedtls_psa_crypto_free( );
208}
209/* END_CASE */
210
Gilles Peskine20035e32018-02-03 22:44:14 +0100211/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300212void hash_finish( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100213{
214 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100215 unsigned char actual_hash[MBEDTLS_MD_MAX_SIZE];
216 size_t actual_hash_length;
217 psa_hash_operation_t operation;
218
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100219 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300220 TEST_ASSERT( expected_hash != NULL );
221 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
222 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100223
224 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
225
226 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
227 TEST_ASSERT( psa_hash_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200228 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100229 TEST_ASSERT( psa_hash_finish( &operation,
230 actual_hash, sizeof( actual_hash ),
231 &actual_hash_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200232 TEST_ASSERT( actual_hash_length == expected_hash->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300233 TEST_ASSERT( memcmp( expected_hash->x, actual_hash,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200234 expected_hash->len ) == 0 );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100235
236exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100237 mbedtls_psa_crypto_free( );
238}
239/* END_CASE */
240
241/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300242void hash_verify( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100243{
244 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100245 psa_hash_operation_t operation;
246
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100247 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300248 TEST_ASSERT( expected_hash != NULL );
249 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
250 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100251
252 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
253
254 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
255 TEST_ASSERT( psa_hash_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200256 input->x,
257 input->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100258 TEST_ASSERT( psa_hash_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300259 expected_hash->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200260 expected_hash->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100261
262exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100263 mbedtls_psa_crypto_free( );
264}
265/* END_CASE */
266
267/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300268void mac_verify( int key_type_arg, data_t *key,
269 int alg_arg, data_t *iv,
270 data_t *input, data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +0100271{
272 int key_slot = 1;
273 psa_key_type_t key_type = key_type_arg;
274 psa_algorithm_t alg = alg_arg;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100275 psa_mac_operation_t operation;
mohammad16036df908f2018-04-02 08:34:15 -0700276 psa_key_policy_t policy;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100277
Gilles Peskine8c9def32018-02-08 10:02:12 +0100278 TEST_ASSERT( key != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300279 TEST_ASSERT( iv != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100280 TEST_ASSERT( input != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100281 TEST_ASSERT( expected_mac != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300282 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
283 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( iv->len ) );
284 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
285 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100286
287 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
288
mohammad16036df908f2018-04-02 08:34:15 -0700289 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200290 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
mohammad16036df908f2018-04-02 08:34:15 -0700291 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
292
Gilles Peskine8c9def32018-02-08 10:02:12 +0100293 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200294 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100295 // TODO: support IV
296 TEST_ASSERT( psa_mac_start( &operation, key_slot, alg ) == PSA_SUCCESS );
297 TEST_ASSERT( psa_destroy_key( key_slot ) == PSA_SUCCESS );
298 TEST_ASSERT( psa_mac_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200299 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100300 TEST_ASSERT( psa_mac_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300301 expected_mac->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200302 expected_mac->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100303
304exit:
Gilles Peskine8c9def32018-02-08 10:02:12 +0100305 psa_destroy_key( key_slot );
306 mbedtls_psa_crypto_free( );
307}
308/* END_CASE */
309
310/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +0200311void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300312 data_t *key,
313 data_t *input, data_t *expected_output,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200314 int expected_status )
315{
316 int key_slot = 1;
317 psa_status_t status;
318 psa_key_type_t key_type = key_type_arg;
319 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200320 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300321 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200322 size_t output_buffer_size = 0;
323 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200324 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200325 psa_cipher_operation_t operation;
326
Gilles Peskine50e586b2018-06-08 14:28:46 +0200327 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200328 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200329 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300330 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
331 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
332 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200333
334 memset( iv, 0x2a, sizeof( iv ) );
335
336 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
337
338 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200339 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200340
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200341 TEST_ASSERT( psa_encrypt_setup( &operation,
342 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200343
344 TEST_ASSERT( psa_encrypt_set_iv( &operation,
345 iv, sizeof( iv ) ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200346 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200347 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300348 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200349
Gilles Peskine4abf7412018-06-18 16:35:34 +0200350 TEST_ASSERT( psa_cipher_update( &operation,
351 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200352 output, output_buffer_size,
353 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200354 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200355 status = psa_cipher_finish( &operation,
356 output + function_output_length,
357 output_buffer_size,
358 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200359 total_output_length += function_output_length;
360
Gilles Peskine50e586b2018-06-08 14:28:46 +0200361 TEST_ASSERT( status == (psa_status_t) expected_status );
362 if( expected_status == PSA_SUCCESS )
363 {
364 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200365 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300366 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200367 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200368 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200369
Gilles Peskine50e586b2018-06-08 14:28:46 +0200370exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300371 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200372 psa_destroy_key( key_slot );
373 mbedtls_psa_crypto_free( );
374}
375/* END_CASE */
376
377/* BEGIN_CASE */
378void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300379 data_t *key,
380 data_t *input,
381 int first_part_size,
382 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +0200383{
384 int key_slot = 1;
385 psa_key_type_t key_type = key_type_arg;
386 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200387 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300388 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200389 size_t output_buffer_size = 0;
390 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200391 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200392 psa_cipher_operation_t operation;
393
Gilles Peskine50e586b2018-06-08 14:28:46 +0200394 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200395 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200396 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300397 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
398 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
399 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200400
401 memset( iv, 0x2a, sizeof( iv ) );
402
403 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
404
405 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200406 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200407
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200408 TEST_ASSERT( psa_encrypt_setup( &operation,
409 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200410
411 TEST_ASSERT( psa_encrypt_set_iv( &operation,
412 iv, sizeof( iv ) ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200413 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200414 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300415 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200416
Gilles Peskine4abf7412018-06-18 16:35:34 +0200417 TEST_ASSERT( (unsigned int) first_part_size < input->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300418 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200419 output, output_buffer_size,
420 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200421 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200422 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300423 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200424 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200425 output, output_buffer_size,
426 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200427 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200428 TEST_ASSERT( psa_cipher_finish( &operation,
429 output + function_output_length,
430 output_buffer_size,
431 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200432 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200433 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
434
Gilles Peskine4abf7412018-06-18 16:35:34 +0200435 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300436 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200437 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200438
439exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300440 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200441 psa_destroy_key( key_slot );
442 mbedtls_psa_crypto_free( );
443}
444/* END_CASE */
445
446/* BEGIN_CASE */
447void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300448 data_t *key,
449 data_t *input,
450 int first_part_size,
451 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +0200452{
453 int key_slot = 1;
454
455 psa_key_type_t key_type = key_type_arg;
456 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200457 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300458 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200459 size_t output_buffer_size = 0;
460 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200461 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200462 psa_cipher_operation_t operation;
463
Gilles Peskine50e586b2018-06-08 14:28:46 +0200464 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200465 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200466 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300467 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
468 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
469 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200470
471 memset( iv, 0x2a, sizeof( iv ) );
472
473 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
474
475 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200476 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200477
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200478 TEST_ASSERT( psa_decrypt_setup( &operation,
479 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200480
481 TEST_ASSERT( psa_encrypt_set_iv( &operation,
482 iv, sizeof( iv ) ) == PSA_SUCCESS );
483
Gilles Peskine4abf7412018-06-18 16:35:34 +0200484 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200485 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300486 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200487
Gilles Peskine4abf7412018-06-18 16:35:34 +0200488 TEST_ASSERT( (unsigned int) first_part_size < input->len );
489 TEST_ASSERT( psa_cipher_update( &operation,
490 input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200491 output, output_buffer_size,
492 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200493 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200494 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300495 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200496 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200497 output, output_buffer_size,
498 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200499 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200500 TEST_ASSERT( psa_cipher_finish( &operation,
501 output + function_output_length,
502 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_abort( &operation ) == PSA_SUCCESS );
506
Gilles Peskine4abf7412018-06-18 16:35:34 +0200507 TEST_ASSERT( total_output_length == expected_output->len );
Gilles Peskine2d277862018-06-18 15:41:12 +0200508 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200509 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200510
511exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300512 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200513 psa_destroy_key( key_slot );
514 mbedtls_psa_crypto_free( );
515}
516/* END_CASE */
517
Gilles Peskine50e586b2018-06-08 14:28:46 +0200518/* BEGIN_CASE */
519void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300520 data_t *key,
521 data_t *input, data_t *expected_output,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200522 int expected_status )
523{
524 int key_slot = 1;
525 psa_status_t status;
526 psa_key_type_t key_type = key_type_arg;
527 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200528 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300529 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200530 size_t output_buffer_size = 0;
531 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200532 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200533 psa_cipher_operation_t operation;
534
Gilles Peskine50e586b2018-06-08 14:28:46 +0200535 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200536 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200537 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300538 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
539 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
540 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200541
542 memset( iv, 0x2a, sizeof( iv ) );
543
544 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
545
546 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200547 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200548
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200549 TEST_ASSERT( psa_decrypt_setup( &operation,
550 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200551
552 TEST_ASSERT( psa_encrypt_set_iv( &operation,
553 iv, sizeof( iv ) ) == PSA_SUCCESS );
554
Gilles Peskine4abf7412018-06-18 16:35:34 +0200555 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200556 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300557 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200558
Gilles Peskine4abf7412018-06-18 16:35:34 +0200559 TEST_ASSERT( psa_cipher_update( &operation,
560 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200561 output, output_buffer_size,
562 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200563 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200564 status = psa_cipher_finish( &operation,
565 output + function_output_length,
566 output_buffer_size,
567 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200568 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200569 TEST_ASSERT( status == (psa_status_t) expected_status );
570
571 if( expected_status == PSA_SUCCESS )
572 {
573 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200574 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300575 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200576 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200577 }
578
Gilles Peskine50e586b2018-06-08 14:28:46 +0200579exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300580 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200581 psa_destroy_key( key_slot );
582 mbedtls_psa_crypto_free( );
583}
584/* END_CASE */
585
Gilles Peskine50e586b2018-06-08 14:28:46 +0200586/* BEGIN_CASE */
587void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300588 data_t *key,
589 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +0200590{
591 int key_slot = 1;
592 psa_key_type_t key_type = key_type_arg;
593 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -0700594 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +0200595 size_t iv_size = 16;
596 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300597 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200598 size_t output1_size = 0;
599 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300600 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200601 size_t output2_size = 0;
602 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200603 size_t function_output_length = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200604 psa_cipher_operation_t operation1;
605 psa_cipher_operation_t operation2;
606
mohammad1603d7d7ba52018-03-12 18:51:53 +0200607 TEST_ASSERT( key != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200608 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300609 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
610 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200611
mohammad1603d7d7ba52018-03-12 18:51:53 +0200612 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
613
614 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200615 key->x, key->len ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200616
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200617 TEST_ASSERT( psa_encrypt_setup( &operation1,
618 key_slot, alg ) == PSA_SUCCESS );
619 TEST_ASSERT( psa_decrypt_setup( &operation2,
620 key_slot, alg ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200621
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200622 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
623 iv, iv_size,
624 &iv_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200625 output1_size = input->len + operation1.block_size;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200626 output1 = mbedtls_calloc( 1, output1_size );
627 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300628
Gilles Peskine4abf7412018-06-18 16:35:34 +0200629 TEST_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200630 output1, output1_size,
631 &output1_length ) == PSA_SUCCESS );
632 TEST_ASSERT( psa_cipher_finish( &operation1,
633 output1 + output1_length, output1_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200634 &function_output_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200635
Gilles Peskine048b7f02018-06-08 14:20:49 +0200636 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300637
638 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
639
640 output2_size = output1_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200641 output2 = mbedtls_calloc( 1, output2_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300642 TEST_ASSERT( output2 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300643
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200644 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
645 iv, iv_length ) == PSA_SUCCESS );
646 TEST_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
647 output2, output2_size,
648 &output2_length ) == PSA_SUCCESS );
Gilles Peskine048b7f02018-06-08 14:20:49 +0200649 function_output_length = 0;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200650 TEST_ASSERT( psa_cipher_finish( &operation2,
651 output2 + output2_length,
652 output2_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200653 &function_output_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300654
Gilles Peskine048b7f02018-06-08 14:20:49 +0200655 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200656
Moran Pekerded84402018-06-06 16:36:50 +0300657 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
658
Gilles Peskine4abf7412018-06-18 16:35:34 +0200659 TEST_ASSERT( input->len == output2_length );
660 TEST_ASSERT( memcmp( input->x, output2, input->len ) == 0 );
Moran Pekerded84402018-06-06 16:36:50 +0300661
662exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300663 mbedtls_free( output1 );
664 mbedtls_free( output2 );
Moran Pekerded84402018-06-06 16:36:50 +0300665 psa_destroy_key( key_slot );
666 mbedtls_psa_crypto_free( );
667}
668/* END_CASE */
669
670/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +0200671void cipher_verify_output_multipart( int alg_arg,
672 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300673 data_t *key,
674 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200675 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +0300676{
677 int key_slot = 1;
678 psa_key_type_t key_type = key_type_arg;
679 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +0300680 unsigned char iv[16] = {0};
681 size_t iv_size = 16;
682 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300683 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200684 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +0300685 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300686 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200687 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +0300688 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200689 size_t function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300690 psa_cipher_operation_t operation1;
691 psa_cipher_operation_t operation2;
692
Moran Pekerded84402018-06-06 16:36:50 +0300693 TEST_ASSERT( key != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300694 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300695 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
696 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200697
Moran Pekerded84402018-06-06 16:36:50 +0300698 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
699
700 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200701 key->x, key->len ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300702
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200703 TEST_ASSERT( psa_encrypt_setup( &operation1,
704 key_slot, alg ) == PSA_SUCCESS );
705 TEST_ASSERT( psa_decrypt_setup( &operation2,
706 key_slot, alg ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300707
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200708 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
709 iv, iv_size,
710 &iv_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200711 output1_buffer_size = input->len + operation1.block_size;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200712 output1 = mbedtls_calloc( 1, output1_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300713 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300714
Gilles Peskine4abf7412018-06-18 16:35:34 +0200715 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200716
itayzafrir3e02b3b2018-06-12 17:06:52 +0300717 TEST_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200718 output1, output1_buffer_size,
719 &function_output_length ) == PSA_SUCCESS );
720 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300721
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200722 TEST_ASSERT( psa_cipher_update( &operation1,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300723 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200724 input->len - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200725 output1, output1_buffer_size,
726 &function_output_length ) == PSA_SUCCESS );
727 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300728
Gilles Peskine048b7f02018-06-08 14:20:49 +0200729 TEST_ASSERT( psa_cipher_finish( &operation1,
730 output1 + output1_length,
731 output1_buffer_size - output1_length,
732 &function_output_length ) == PSA_SUCCESS );
733 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200734
735 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
736
Gilles Peskine048b7f02018-06-08 14:20:49 +0200737 output2_buffer_size = output1_length;
738 output2 = mbedtls_calloc( 1, output2_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300739 TEST_ASSERT( output2 != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200740
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200741 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
742 iv, iv_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300743
744 TEST_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200745 output2, output2_buffer_size,
746 &function_output_length ) == PSA_SUCCESS );
747 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300748
Gilles Peskine048b7f02018-06-08 14:20:49 +0200749 TEST_ASSERT( psa_cipher_update( &operation2,
750 output1 + first_part_size,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200751 output1_length - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200752 output2, output2_buffer_size,
753 &function_output_length ) == PSA_SUCCESS );
754 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300755
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200756 TEST_ASSERT( psa_cipher_finish( &operation2,
757 output2 + output2_length,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200758 output2_buffer_size - output2_length,
759 &function_output_length ) == PSA_SUCCESS );
760 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200761
mohammad1603d7d7ba52018-03-12 18:51:53 +0200762 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
763
Gilles Peskine4abf7412018-06-18 16:35:34 +0200764 TEST_ASSERT( input->len == output2_length );
765 TEST_ASSERT( memcmp( input->x, output2, input->len ) == 0 );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200766
767exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300768 mbedtls_free( output1 );
769 mbedtls_free( output2 );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200770 psa_destroy_key( key_slot );
771 mbedtls_psa_crypto_free( );
772}
773/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +0200774
Gilles Peskine20035e32018-02-03 22:44:14 +0100775/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200776void aead_encrypt_decrypt( int key_type_arg,
777 data_t * key_data,
778 int alg_arg,
779 data_t * input_data,
780 data_t * nonce,
781 data_t * additional_data,
782 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200783{
784 int slot = 1;
785 psa_key_type_t key_type = key_type_arg;
786 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200787 unsigned char *output_data = NULL;
788 size_t output_size = 0;
789 size_t output_length = 0;
790 unsigned char *output_data2 = NULL;
791 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200792 size_t tag_length = 16;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200793 psa_status_t expected_result = expected_result_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200794 psa_key_policy_t policy = {0};
795
Gilles Peskinea1cac842018-06-11 19:33:02 +0200796 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200797 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300798 TEST_ASSERT( nonce != NULL );
799 TEST_ASSERT( additional_data != NULL );
800 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
801 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
802 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
803 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
804
Gilles Peskine4abf7412018-06-18 16:35:34 +0200805 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200806 output_data = mbedtls_calloc( 1, output_size );
807 TEST_ASSERT( output_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200808
809 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
810
811 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200812 psa_key_policy_set_usage( &policy,
813 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
814 alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200815 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
816
817 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200818 key_data->x, key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200819
820 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200821 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +0200822 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200823 additional_data->len,
824 input_data->x, input_data->len,
825 output_data, output_size,
826 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200827
828 if( PSA_SUCCESS == expected_result )
829 {
830 output_data2 = mbedtls_calloc( 1, output_length );
831 TEST_ASSERT( output_data2 != NULL );
832
833 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200834 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +0200835 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200836 additional_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200837 output_data, output_length,
838 output_data2, output_length,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200839 &output_length2 ) == expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +0200840
itayzafrir3e02b3b2018-06-12 17:06:52 +0300841 TEST_ASSERT( memcmp( input_data->x, output_data2,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200842 input_data->len ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200843 }
Gilles Peskine2d277862018-06-18 15:41:12 +0200844
Gilles Peskinea1cac842018-06-11 19:33:02 +0200845exit:
846 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200847 mbedtls_free( output_data );
848 mbedtls_free( output_data2 );
849 mbedtls_psa_crypto_free( );
850}
851/* END_CASE */
852
853/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300854void aead_encrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200855 int alg_arg, data_t * input_data,
856 data_t * additional_data, data_t * nonce,
857 data_t * expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200858{
859 int slot = 1;
860 psa_key_type_t key_type = key_type_arg;
861 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200862 unsigned char *output_data = NULL;
863 size_t output_size = 0;
864 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200865 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200866 psa_key_policy_t policy = {0};
867
Gilles Peskinea1cac842018-06-11 19:33:02 +0200868 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200869 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300870 TEST_ASSERT( additional_data != NULL );
871 TEST_ASSERT( nonce != NULL );
872 TEST_ASSERT( expected_result != NULL );
873 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
874 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
875 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
876 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
877 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_result->len ) );
878
Gilles Peskine4abf7412018-06-18 16:35:34 +0200879 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200880 output_data = mbedtls_calloc( 1, output_size );
881 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +0200882
Gilles Peskinea1cac842018-06-11 19:33:02 +0200883 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
884
885 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200886 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200887 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
888
889 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200890 key_data->x,
891 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200892
893 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200894 nonce->x, nonce->len,
895 additional_data->x, additional_data->len,
896 input_data->x, input_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200897 output_data, output_size,
898 &output_length ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200899
itayzafrir3e02b3b2018-06-12 17:06:52 +0300900 TEST_ASSERT( memcmp( output_data, expected_result->x,
Gilles Peskine2d277862018-06-18 15:41:12 +0200901 output_length ) == 0 );
902
Gilles Peskinea1cac842018-06-11 19:33:02 +0200903exit:
904 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200905 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200906 mbedtls_psa_crypto_free( );
907}
908/* END_CASE */
909
910/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300911void aead_decrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200912 int alg_arg, data_t * input_data,
913 data_t * additional_data, data_t * nonce,
914 data_t * expected_data, int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200915{
916 int slot = 1;
917 psa_key_type_t key_type = key_type_arg;
918 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200919 unsigned char *output_data = NULL;
920 size_t output_size = 0;
921 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200922 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200923 psa_key_policy_t policy = {0};
Gilles Peskine4abf7412018-06-18 16:35:34 +0200924 psa_status_t expected_result = expected_result_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200925
Gilles Peskinea1cac842018-06-11 19:33:02 +0200926 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200927 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300928 TEST_ASSERT( additional_data != NULL );
929 TEST_ASSERT( nonce != NULL );
930 TEST_ASSERT( expected_data != NULL );
931 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
932 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
933 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
934 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
935 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
936
Gilles Peskine4abf7412018-06-18 16:35:34 +0200937 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200938 output_data = mbedtls_calloc( 1, output_size );
939 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +0200940
Gilles Peskinea1cac842018-06-11 19:33:02 +0200941 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
942
943 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200944 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200945 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
946
947 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200948 key_data->x,
949 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200950
951 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200952 nonce->x, nonce->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200953 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200954 additional_data->len,
955 input_data->x, input_data->len,
956 output_data, output_size,
957 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200958
Gilles Peskine2d277862018-06-18 15:41:12 +0200959 if( expected_result == PSA_SUCCESS )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200960 {
itayzafrir3e02b3b2018-06-12 17:06:52 +0300961 TEST_ASSERT( memcmp( output_data, expected_data->x,
Gilles Peskine2d277862018-06-18 15:41:12 +0200962 output_length ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200963 }
964
Gilles Peskinea1cac842018-06-11 19:33:02 +0200965exit:
966 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200967 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200968 mbedtls_psa_crypto_free( );
969}
970/* END_CASE */
971
972/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200973void signature_size( int type_arg,
974 int bits,
975 int alg_arg,
976 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +0100977{
978 psa_key_type_t type = type_arg;
979 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +0200980 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinee59236f2018-01-27 23:32:46 +0100981 TEST_ASSERT( actual_size == (size_t) expected_size_arg );
982exit:
983 ;
984}
985/* END_CASE */
986
987/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300988void sign_deterministic( int key_type_arg, data_t *key_data,
989 int alg_arg, data_t *input_data,
990 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +0100991{
992 int slot = 1;
993 psa_key_type_t key_type = key_type_arg;
994 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +0100995 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +0100996 unsigned char *signature = NULL;
997 size_t signature_size;
998 size_t signature_length = 0xdeadbeef;
mohammad1603a97cb8c2018-03-28 03:46:26 -0700999 psa_key_policy_t policy = {0};
Gilles Peskine20035e32018-02-03 22:44:14 +01001000
Gilles Peskine20035e32018-02-03 22:44:14 +01001001 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001002 TEST_ASSERT( input_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001003 TEST_ASSERT( output_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001004 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1005 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1006 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( output_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01001007
1008 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1009
mohammad1603a97cb8c2018-03-28 03:46:26 -07001010 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001011 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001012 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1013
Gilles Peskine20035e32018-02-03 22:44:14 +01001014 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001015 key_data->x,
1016 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001017 TEST_ASSERT( psa_get_key_information( slot,
1018 NULL,
1019 &key_bits ) == PSA_SUCCESS );
1020
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001021 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
1022 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01001023 TEST_ASSERT( signature_size != 0 );
1024 signature = mbedtls_calloc( 1, signature_size );
1025 TEST_ASSERT( signature != NULL );
1026
1027 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001028 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001029 NULL, 0,
1030 signature, signature_size,
1031 &signature_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001032 TEST_ASSERT( signature_length == output_data->len );
Gilles Peskine2d277862018-06-18 15:41:12 +02001033 TEST_ASSERT( memcmp( signature, output_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001034 output_data->len ) == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001035
1036exit:
1037 psa_destroy_key( slot );
Gilles Peskine0189e752018-02-03 23:57:22 +01001038 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01001039 mbedtls_psa_crypto_free( );
1040}
1041/* END_CASE */
1042
1043/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001044void sign_fail( int key_type_arg, data_t *key_data,
1045 int alg_arg, data_t *input_data,
Gilles Peskine20035e32018-02-03 22:44:14 +01001046 int signature_size, int expected_status_arg )
1047{
1048 int slot = 1;
1049 psa_key_type_t key_type = key_type_arg;
1050 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001051 psa_status_t actual_status;
1052 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01001053 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01001054 size_t signature_length = 0xdeadbeef;
mohammad1603a97cb8c2018-03-28 03:46:26 -07001055 psa_key_policy_t policy = {0};
Gilles Peskine20035e32018-02-03 22:44:14 +01001056
Gilles Peskine20035e32018-02-03 22:44:14 +01001057 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001058 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001059 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1060 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1061
Gilles Peskine20035e32018-02-03 22:44:14 +01001062 signature = mbedtls_calloc( 1, signature_size );
1063 TEST_ASSERT( signature != NULL );
1064
1065 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1066
mohammad1603a97cb8c2018-03-28 03:46:26 -07001067 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001068 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001069 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1070
Gilles Peskine20035e32018-02-03 22:44:14 +01001071 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001072 key_data->x,
1073 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001074
1075 actual_status = psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001076 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001077 NULL, 0,
1078 signature, signature_size,
1079 &signature_length );
1080 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine93aa0332018-02-03 23:58:03 +01001081 TEST_ASSERT( signature_length == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001082
1083exit:
1084 psa_destroy_key( slot );
Gilles Peskine20035e32018-02-03 22:44:14 +01001085 mbedtls_free( signature );
1086 mbedtls_psa_crypto_free( );
1087}
1088/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03001089
1090/* BEGIN_CASE */
1091void key_policy( int usage_arg, int alg_arg )
1092{
1093 int key_slot = 1;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001094 psa_algorithm_t alg = alg_arg;
1095 psa_key_usage_t usage = usage_arg;
mohammad16034eed7572018-03-28 05:14:59 -07001096 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
mohammad16038cc1cee2018-03-28 01:21:33 +03001097 unsigned char key[32] = {0};
1098 psa_key_policy_t policy_set = {0};
1099 psa_key_policy_t policy_get = {0};
mohammad1603804cd712018-03-20 22:44:08 +02001100
mohammad16038cc1cee2018-03-28 01:21:33 +03001101 memset( key, 0x2a, sizeof( key ) );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001102
mohammad16038cc1cee2018-03-28 01:21:33 +03001103 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1104
Gilles Peskine2d277862018-06-18 15:41:12 +02001105 psa_key_policy_init( &policy_set );
1106 psa_key_policy_init( &policy_get );
mohammad16038cc1cee2018-03-28 01:21:33 +03001107
Gilles Peskine4abf7412018-06-18 16:35:34 +02001108 psa_key_policy_set_usage( &policy_set, usage, alg );
mohammad16038cc1cee2018-03-28 01:21:33 +03001109
Gilles Peskine4abf7412018-06-18 16:35:34 +02001110 TEST_ASSERT( psa_key_policy_get_usage( &policy_set ) == usage );
1111 TEST_ASSERT( psa_key_policy_get_algorithm( &policy_set ) == alg );
mohammad16038cc1cee2018-03-28 01:21:33 +03001112 TEST_ASSERT( psa_set_key_policy( key_slot, &policy_set ) == PSA_SUCCESS );
1113
1114 TEST_ASSERT( psa_import_key( key_slot, key_type,
1115 key, sizeof( key ) ) == PSA_SUCCESS );
1116
1117 TEST_ASSERT( psa_get_key_policy( key_slot, &policy_get ) == PSA_SUCCESS );
1118
1119 TEST_ASSERT( policy_get.usage == policy_set.usage );
1120 TEST_ASSERT( policy_get.alg == policy_set.alg );
1121
1122exit:
1123 psa_destroy_key( key_slot );
1124 mbedtls_psa_crypto_free( );
1125}
1126/* END_CASE */
1127
mohammad16034eed7572018-03-28 05:14:59 -07001128/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001129void key_policy_fail( int usage_arg, int alg_arg, int expected_status,
1130 data_t *keypair )
mohammad16034eed7572018-03-28 05:14:59 -07001131{
1132 int key_slot = 1;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001133 psa_algorithm_t alg = alg_arg;
1134 psa_key_usage_t usage = usage_arg;
mohammad16034eed7572018-03-28 05:14:59 -07001135 size_t signature_length = 0;
1136 psa_key_policy_t policy = {0};
1137 int actual_status = PSA_SUCCESS;
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001138
mohammad16034eed7572018-03-28 05:14:59 -07001139 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1140
1141 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001142 psa_key_policy_set_usage( &policy, usage, alg );
mohammad16034eed7572018-03-28 05:14:59 -07001143 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1144
Gilles Peskine4abf7412018-06-18 16:35:34 +02001145 if( usage & PSA_KEY_USAGE_EXPORT )
mohammad16034eed7572018-03-28 05:14:59 -07001146 {
mohammad16036df908f2018-04-02 08:34:15 -07001147 TEST_ASSERT( keypair != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001148 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001149 TEST_ASSERT( psa_import_key( key_slot,
1150 PSA_KEY_TYPE_RSA_KEYPAIR,
1151 keypair->x,
1152 keypair->len ) == PSA_SUCCESS );
1153 actual_status = psa_asymmetric_sign( key_slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +02001154 NULL, 0,
1155 NULL, 0,
1156 NULL, 0, &signature_length );
mohammad16036df908f2018-04-02 08:34:15 -07001157 }
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001158
Gilles Peskine4abf7412018-06-18 16:35:34 +02001159 if( usage & PSA_KEY_USAGE_SIGN )
mohammad16036df908f2018-04-02 08:34:15 -07001160 {
mohammad1603d926b882018-04-16 01:53:20 -07001161 TEST_ASSERT( keypair != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001162 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001163 TEST_ASSERT( psa_import_key( key_slot,
1164 PSA_KEY_TYPE_RSA_KEYPAIR,
1165 keypair->x,
1166 keypair->len ) == PSA_SUCCESS );
mohammad16036df908f2018-04-02 08:34:15 -07001167 actual_status = psa_export_key( key_slot, NULL, 0, NULL );
mohammad16034eed7572018-03-28 05:14:59 -07001168 }
1169
1170 TEST_ASSERT( actual_status == expected_status );
1171
1172exit:
1173 psa_destroy_key( key_slot );
1174 mbedtls_psa_crypto_free( );
1175}
1176/* END_CASE */
Gilles Peskinea0655c32018-04-30 17:06:50 +02001177
1178/* BEGIN_CASE */
1179void key_lifetime( int lifetime_arg )
1180{
1181 int key_slot = 1;
1182 psa_key_type_t key_type = PSA_ALG_CBC_BASE;
1183 unsigned char key[32] = {0};
Gilles Peskine4abf7412018-06-18 16:35:34 +02001184 psa_key_lifetime_t lifetime_set = lifetime_arg;
Gilles Peskinea0655c32018-04-30 17:06:50 +02001185 psa_key_lifetime_t lifetime_get;
Gilles Peskine7268afc2018-06-06 15:19:24 +02001186
Gilles Peskinea0655c32018-04-30 17:06:50 +02001187 memset( key, 0x2a, sizeof( key ) );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001188
Gilles Peskinea0655c32018-04-30 17:06:50 +02001189 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001190
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001191 TEST_ASSERT( psa_set_key_lifetime( key_slot,
Gilles Peskine2d277862018-06-18 15:41:12 +02001192 lifetime_set ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001193
Gilles Peskinea0655c32018-04-30 17:06:50 +02001194 TEST_ASSERT( psa_import_key( key_slot, key_type,
1195 key, sizeof( key ) ) == PSA_SUCCESS );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001196
1197 TEST_ASSERT( psa_get_key_lifetime( key_slot,
Gilles Peskine2d277862018-06-18 15:41:12 +02001198 &lifetime_get ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001199
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001200 TEST_ASSERT( lifetime_get == lifetime_set );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001201
Gilles Peskinea0655c32018-04-30 17:06:50 +02001202exit:
1203 psa_destroy_key( key_slot );
1204 mbedtls_psa_crypto_free( );
1205}
1206/* END_CASE */
mohammad1603804cd712018-03-20 22:44:08 +02001207
1208/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001209void key_lifetime_set_fail( int key_slot_arg,
1210 int lifetime_arg,
1211 int expected_status_arg )
mohammad1603804cd712018-03-20 22:44:08 +02001212{
1213 int key_slot = 1;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001214 psa_key_lifetime_t lifetime_set = lifetime_arg;
mohammad1603804cd712018-03-20 22:44:08 +02001215 psa_status_t actual_status;
1216 psa_status_t expected_status = expected_status_arg;
1217
mohammad1603804cd712018-03-20 22:44:08 +02001218 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1219
mohammad1603804cd712018-03-20 22:44:08 +02001220 actual_status = psa_set_key_lifetime( key_slot_arg, lifetime_set );
1221
1222 if( actual_status == PSA_SUCCESS )
1223 actual_status = psa_set_key_lifetime( key_slot_arg, lifetime_set );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001224
mohammad1603804cd712018-03-20 22:44:08 +02001225 TEST_ASSERT( expected_status == actual_status );
1226
1227exit:
mohammad1603804cd712018-03-20 22:44:08 +02001228 psa_destroy_key( key_slot );
1229 mbedtls_psa_crypto_free( );
1230}
1231/* END_CASE */
itayzafrir5c753392018-05-08 11:18:38 +03001232
1233/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001234void asymmetric_verify( int key_type_arg, data_t *key_data,
1235 int alg_arg, data_t *hash_data,
1236 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03001237{
1238 int slot = 1;
1239 psa_key_type_t key_type = key_type_arg;
1240 psa_algorithm_t alg = alg_arg;
itayzafrir5c753392018-05-08 11:18:38 +03001241 psa_key_policy_t policy = {0};
1242
itayzafrir5c753392018-05-08 11:18:38 +03001243 TEST_ASSERT( key_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001244 TEST_ASSERT( hash_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001245 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001246 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1247 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1248 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03001249
1250 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1251
1252 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001253 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
itayzafrir5c753392018-05-08 11:18:38 +03001254 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1255
1256 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001257 key_data->x,
1258 key_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001259
1260 TEST_ASSERT( psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001261 hash_data->x, hash_data->len,
itayzafrir5c753392018-05-08 11:18:38 +03001262 NULL, 0,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001263 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001264 signature_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001265exit:
1266 psa_destroy_key( slot );
itayzafrir5c753392018-05-08 11:18:38 +03001267 mbedtls_psa_crypto_free( );
1268}
1269/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001270
1271/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001272void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
1273 int alg_arg, data_t *hash_data,
1274 data_t *signature_data,
1275 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001276{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001277 int slot = 1;
1278 psa_key_type_t key_type = key_type_arg;
1279 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001280 psa_status_t actual_status;
1281 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001282 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001283
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001284 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001285 TEST_ASSERT( hash_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001286 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001287 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1288 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1289 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001290
1291 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1292
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001293 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001294 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001295 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1296
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001297 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001298 key_data->x,
1299 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001300
1301 actual_status = psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001302 hash_data->x, hash_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001303 NULL, 0,
1304 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001305 signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001306
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001307 TEST_ASSERT( actual_status == expected_status );
1308
1309exit:
1310 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001311 mbedtls_psa_crypto_free( );
1312}
1313/* END_CASE */
1314
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001315/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001316void asymmetric_encrypt_decrypt( int key_type_arg, data_t *key_data,
1317 int alg_arg, data_t *input_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001318{
1319 int slot = 1;
1320 psa_key_type_t key_type = key_type_arg;
1321 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001322 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001323 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001324 size_t output_length = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001325 unsigned char *output2 = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001326 size_t output2_size = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001327 size_t output2_length = 0;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001328 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001329
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001330 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001331 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001332 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1333 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1334
Gilles Peskine4abf7412018-06-18 16:35:34 +02001335 output_size = key_data->len;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001336 output2_size = output_size;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001337 output = mbedtls_calloc( 1, output_size );
1338 TEST_ASSERT( output != NULL );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001339 output2 = mbedtls_calloc( 1, output2_size );
1340 TEST_ASSERT( output2 != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001341
1342 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1343
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001344 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001345 psa_key_policy_set_usage( &policy,
1346 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001347 alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001348 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1349
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001350 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001351 key_data->x,
1352 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001353
Gilles Peskineeebd7382018-06-08 18:11:54 +02001354 /* We test encryption by checking that encrypt-then-decrypt gives back
1355 * the original plaintext because of the non-optional random
1356 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine2d277862018-06-18 15:41:12 +02001357 TEST_ASSERT( psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001358 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001359 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001360 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001361 &output_length ) == PSA_SUCCESS );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001362
Gilles Peskine2d277862018-06-18 15:41:12 +02001363 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001364 output, output_length,
Gilles Peskine2d277862018-06-18 15:41:12 +02001365 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001366 output2, output2_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001367 &output2_length ) == PSA_SUCCESS );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001368 TEST_ASSERT( memcmp( input_data->x, output2,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001369 input_data->len ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001370
1371exit:
1372 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001373 mbedtls_free( output );
1374 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001375 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001376}
1377/* END_CASE */
1378
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001379/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001380void asymmetric_encrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001381 int alg_arg, data_t *input_data,
1382 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001383{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001384 int slot = 1;
1385 psa_key_type_t key_type = key_type_arg;
1386 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001387 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001388 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001389 size_t output_length = 0;
1390 psa_status_t actual_status;
1391 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001392 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001393
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001394 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001395 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001396 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1397 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1398
Gilles Peskine4abf7412018-06-18 16:35:34 +02001399 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001400 output = mbedtls_calloc( 1, output_size );
1401 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001402
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001403 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1404
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001405 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001406 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001407 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1408
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001409 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001410 key_data->x,
1411 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001412
Gilles Peskine2d277862018-06-18 15:41:12 +02001413 actual_status = psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001414 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001415 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001416 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001417 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001418 TEST_ASSERT( actual_status == expected_status );
1419
1420exit:
1421 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001422 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001423 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001424}
1425/* END_CASE */
1426
1427/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001428void asymmetric_decrypt( int key_type_arg, data_t *key_data,
1429 int alg_arg, data_t *input_data,
1430 data_t *expected_data, int expected_size )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001431{
1432 int slot = 1;
1433 psa_key_type_t key_type = key_type_arg;
1434 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001435 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001436 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001437 size_t output_length = 0;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001438 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001439
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001440 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001441 TEST_ASSERT( input_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001442 TEST_ASSERT( expected_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001443 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1444 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1445 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
1446
Gilles Peskine4abf7412018-06-18 16:35:34 +02001447 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001448 output = mbedtls_calloc( 1, output_size );
1449 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001450
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001451 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1452
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001453 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001454 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001455 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1456
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001457 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001458 key_data->x,
1459 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001460
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001461 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001462 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001463 NULL, 0,
1464 output,
1465 output_size,
1466 &output_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001467 TEST_ASSERT( (size_t) expected_size == output_length );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001468 TEST_ASSERT( memcmp( expected_data->x, output, output_length ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001469
1470exit:
1471 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001472 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001473 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001474}
1475/* END_CASE */
1476
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001477/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001478void asymmetric_decrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001479 int alg_arg, data_t *input_data,
1480 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001481{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001482 int slot = 1;
1483 psa_key_type_t key_type = key_type_arg;
1484 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001485 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001486 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001487 size_t output_length = 0;
1488 psa_status_t actual_status;
1489 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001490 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001491
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001492 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001493 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001494 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1495 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1496
Gilles Peskine4abf7412018-06-18 16:35:34 +02001497 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001498 output = mbedtls_calloc( 1, output_size );
1499 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001500
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001501 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1502
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001503 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001504 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001505 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1506
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001507 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001508 key_data->x,
1509 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001510
Gilles Peskine2d277862018-06-18 15:41:12 +02001511 actual_status = psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001512 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001513 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001514 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001515 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001516 TEST_ASSERT( actual_status == expected_status );
1517
1518exit:
1519 psa_destroy_key( slot );
Gilles Peskine2d277862018-06-18 15:41:12 +02001520 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001521 mbedtls_psa_crypto_free( );
1522}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001523/* END_CASE */