blob: 3de4745bf3f9d29a3e227f2d4fb93e32589dc35e [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/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300149void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200150 int type_arg,
151 int alg_arg,
152 int expected_bits,
153 int public_key_expected_length,
154 int expected_export_status )
Moran Pekerf709f4a2018-06-06 17:26:04 +0300155{
156 int slot = 1;
157 psa_key_type_t type = type_arg;
158 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 );
175
176 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT,
177 alg_arg );
178
179 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
180
181 /* Import the key */
182 TEST_ASSERT( psa_import_key( slot, type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300183 data->x, (size_t) data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200184 PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300185
186 /* Test the key information */
187 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200188 &got_type,
189 &got_bits ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300190 TEST_ASSERT( got_type == type );
191 TEST_ASSERT( got_bits == (size_t) expected_bits );
192
193 /* Export the key */
194 status = psa_export_public_key( slot,
Gilles Peskine2d277862018-06-18 15:41:12 +0200195 exported, export_size,
196 &exported_length );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300197 TEST_ASSERT( status == (psa_status_t) expected_export_status );
198 if( status != PSA_SUCCESS )
199 goto destroy;
200
201 TEST_ASSERT( exported_length == (size_t) public_key_expected_length );
202
203destroy:
204 /* Destroy the key */
205 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
206 TEST_ASSERT( psa_get_key_information(
207 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
208
209exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300210 mbedtls_free( exported );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300211 mbedtls_psa_crypto_free( );
212}
213/* END_CASE */
214
Gilles Peskine20035e32018-02-03 22:44:14 +0100215/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300216void hash_finish( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100217{
218 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100219 unsigned char actual_hash[MBEDTLS_MD_MAX_SIZE];
220 size_t actual_hash_length;
221 psa_hash_operation_t operation;
222
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100223 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300224 TEST_ASSERT( expected_hash != NULL );
225 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
226 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100227
228 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
229
230 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
231 TEST_ASSERT( psa_hash_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300232 input->x, (size_t) input->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200233 PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100234 TEST_ASSERT( psa_hash_finish( &operation,
235 actual_hash, sizeof( actual_hash ),
236 &actual_hash_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300237 TEST_ASSERT( actual_hash_length == (size_t) expected_hash->len );
238 TEST_ASSERT( memcmp( expected_hash->x, actual_hash,
239 (size_t) expected_hash->len ) == 0 );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100240
241exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100242 mbedtls_psa_crypto_free( );
243}
244/* END_CASE */
245
246/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300247void hash_verify( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100248{
249 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100250 psa_hash_operation_t operation;
251
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100252 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300253 TEST_ASSERT( expected_hash != NULL );
254 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
255 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100256
257 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
258
259 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
260 TEST_ASSERT( psa_hash_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300261 input->x, (size_t) input->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200262 PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100263 TEST_ASSERT( psa_hash_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300264 expected_hash->x,
265 (size_t) expected_hash->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200266 PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100267
268exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100269 mbedtls_psa_crypto_free( );
270}
271/* END_CASE */
272
273/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300274void mac_verify( int key_type_arg, data_t *key,
275 int alg_arg, data_t *iv,
276 data_t *input, data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +0100277{
278 int key_slot = 1;
279 psa_key_type_t key_type = key_type_arg;
280 psa_algorithm_t alg = alg_arg;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100281 psa_mac_operation_t operation;
mohammad16036df908f2018-04-02 08:34:15 -0700282 psa_key_policy_t policy;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100283
Gilles Peskine8c9def32018-02-08 10:02:12 +0100284 TEST_ASSERT( key != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300285 TEST_ASSERT( iv != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100286 TEST_ASSERT( input != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100287 TEST_ASSERT( expected_mac != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300288 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
289 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( iv->len ) );
290 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
291 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100292
293 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
294
mohammad16036df908f2018-04-02 08:34:15 -0700295 psa_key_policy_init( &policy );
296
297 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg_arg );
298
299 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
300
Gilles Peskine8c9def32018-02-08 10:02:12 +0100301 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300302 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100303 // TODO: support IV
304 TEST_ASSERT( psa_mac_start( &operation, key_slot, alg ) == PSA_SUCCESS );
305 TEST_ASSERT( psa_destroy_key( key_slot ) == PSA_SUCCESS );
306 TEST_ASSERT( psa_mac_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300307 input->x, (size_t) input->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200308 PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100309 TEST_ASSERT( psa_mac_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300310 expected_mac->x,
311 (size_t) expected_mac->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100312
313exit:
Gilles Peskine8c9def32018-02-08 10:02:12 +0100314 psa_destroy_key( key_slot );
315 mbedtls_psa_crypto_free( );
316}
317/* END_CASE */
318
319/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +0200320void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300321 data_t *key,
322 data_t *input, data_t *expected_output,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200323 int expected_status )
324{
325 int key_slot = 1;
326 psa_status_t status;
327 psa_key_type_t key_type = key_type_arg;
328 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200329 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300330 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200331 size_t output_buffer_size = 0;
332 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200333 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200334 psa_cipher_operation_t operation;
335
Gilles Peskine50e586b2018-06-08 14:28:46 +0200336 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200337 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200338 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300339 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
340 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
341 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200342
343 memset( iv, 0x2a, sizeof( iv ) );
344
345 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
346
347 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300348 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200349
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200350 TEST_ASSERT( psa_encrypt_setup( &operation,
351 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200352
353 TEST_ASSERT( psa_encrypt_set_iv( &operation,
354 iv, sizeof( iv ) ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300355 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200356 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300357 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200358
itayzafrir3e02b3b2018-06-12 17:06:52 +0300359 TEST_ASSERT( psa_cipher_update( &operation, input->x, (size_t) input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200360 output, output_buffer_size,
361 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200362 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200363 status = psa_cipher_finish( &operation,
364 output + function_output_length,
365 output_buffer_size,
366 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200367 total_output_length += function_output_length;
368
Gilles Peskine50e586b2018-06-08 14:28:46 +0200369 TEST_ASSERT( status == (psa_status_t) expected_status );
370 if( expected_status == PSA_SUCCESS )
371 {
372 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300373 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
374 TEST_ASSERT( memcmp( expected_output->x, output,
375 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200376 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200377
Gilles Peskine50e586b2018-06-08 14:28:46 +0200378exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300379 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200380 psa_destroy_key( key_slot );
381 mbedtls_psa_crypto_free( );
382}
383/* END_CASE */
384
385/* BEGIN_CASE */
386void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300387 data_t *key,
388 data_t *input,
389 int first_part_size,
390 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +0200391{
392 int key_slot = 1;
393 psa_key_type_t key_type = key_type_arg;
394 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200395 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300396 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200397 size_t output_buffer_size = 0;
398 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200399 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200400 psa_cipher_operation_t operation;
401
Gilles Peskine50e586b2018-06-08 14:28:46 +0200402 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200403 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200404 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300405 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
406 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
407 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200408
409 memset( iv, 0x2a, sizeof( iv ) );
410
411 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
412
413 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300414 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200415
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200416 TEST_ASSERT( psa_encrypt_setup( &operation,
417 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200418
419 TEST_ASSERT( psa_encrypt_set_iv( &operation,
420 iv, sizeof( iv ) ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300421 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200422 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300423 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200424
itayzafrir3e02b3b2018-06-12 17:06:52 +0300425 TEST_ASSERT( (unsigned int) first_part_size < (size_t) input->len );
426 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200427 output, output_buffer_size,
428 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200429 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200430 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300431 input->x + first_part_size,
432 (size_t) input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200433 output, output_buffer_size,
434 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200435 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200436 TEST_ASSERT( psa_cipher_finish( &operation,
437 output + function_output_length,
438 output_buffer_size,
439 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200440 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200441 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
442
itayzafrir3e02b3b2018-06-12 17:06:52 +0300443 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
444 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine2d277862018-06-18 15:41:12 +0200445 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200446
447exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300448 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200449 psa_destroy_key( key_slot );
450 mbedtls_psa_crypto_free( );
451}
452/* END_CASE */
453
454/* BEGIN_CASE */
455void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300456 data_t *key,
457 data_t *input,
458 int first_part_size,
459 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +0200460{
461 int key_slot = 1;
462
463 psa_key_type_t key_type = key_type_arg;
464 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200465 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300466 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200467 size_t output_buffer_size = 0;
468 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200469 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200470 psa_cipher_operation_t operation;
471
Gilles Peskine50e586b2018-06-08 14:28:46 +0200472 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200473 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200474 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300475 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
476 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
477 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200478
479 memset( iv, 0x2a, sizeof( iv ) );
480
481 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
482
483 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300484 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200485
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200486 TEST_ASSERT( psa_decrypt_setup( &operation,
487 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200488
489 TEST_ASSERT( psa_encrypt_set_iv( &operation,
490 iv, sizeof( iv ) ) == PSA_SUCCESS );
491
itayzafrir3e02b3b2018-06-12 17:06:52 +0300492 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200493 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300494 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200495
itayzafrir3e02b3b2018-06-12 17:06:52 +0300496 TEST_ASSERT( (unsigned int) first_part_size < (size_t) input->len );
497 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200498 output, output_buffer_size,
499 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200500 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200501 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300502 input->x + first_part_size,
503 (size_t) input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200504 output, output_buffer_size,
505 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200506 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200507 TEST_ASSERT( psa_cipher_finish( &operation,
508 output + function_output_length,
509 output_buffer_size,
510 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200511 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200512 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
513
itayzafrir3e02b3b2018-06-12 17:06:52 +0300514 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
Gilles Peskine2d277862018-06-18 15:41:12 +0200515 TEST_ASSERT( memcmp( expected_output->x, output,
516 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200517
518exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300519 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200520 psa_destroy_key( key_slot );
521 mbedtls_psa_crypto_free( );
522}
523/* END_CASE */
524
Gilles Peskine50e586b2018-06-08 14:28:46 +0200525/* BEGIN_CASE */
526void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300527 data_t *key,
528 data_t *input, data_t *expected_output,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200529 int expected_status )
530{
531 int key_slot = 1;
532 psa_status_t status;
533 psa_key_type_t key_type = key_type_arg;
534 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200535 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300536 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200537 size_t output_buffer_size = 0;
538 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200539 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200540 psa_cipher_operation_t operation;
541
Gilles Peskine50e586b2018-06-08 14:28:46 +0200542 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200543 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200544 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300545 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
546 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
547 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200548
549 memset( iv, 0x2a, sizeof( iv ) );
550
551 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
552
553 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300554 key->x, (size_t) key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200555
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200556 TEST_ASSERT( psa_decrypt_setup( &operation,
557 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200558
559 TEST_ASSERT( psa_encrypt_set_iv( &operation,
560 iv, sizeof( iv ) ) == PSA_SUCCESS );
561
itayzafrir3e02b3b2018-06-12 17:06:52 +0300562 output_buffer_size = (size_t) input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200563 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300564 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200565
itayzafrir3e02b3b2018-06-12 17:06:52 +0300566 TEST_ASSERT( psa_cipher_update( &operation, input->x, (size_t) input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200567 output, output_buffer_size,
568 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200569 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200570 status = psa_cipher_finish( &operation,
571 output + function_output_length,
572 output_buffer_size,
573 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200574 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200575 TEST_ASSERT( status == (psa_status_t) expected_status );
576
577 if( expected_status == PSA_SUCCESS )
578 {
579 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300580 TEST_ASSERT( total_output_length == (size_t) expected_output->len );
581 TEST_ASSERT( memcmp( expected_output->x, output,
582 (size_t) expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200583 }
584
Gilles Peskine50e586b2018-06-08 14:28:46 +0200585exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300586 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200587 psa_destroy_key( key_slot );
588 mbedtls_psa_crypto_free( );
589}
590/* END_CASE */
591
Gilles Peskine50e586b2018-06-08 14:28:46 +0200592/* BEGIN_CASE */
593void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300594 data_t *key,
595 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +0200596{
597 int key_slot = 1;
598 psa_key_type_t key_type = key_type_arg;
599 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -0700600 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +0200601 size_t iv_size = 16;
602 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300603 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200604 size_t output1_size = 0;
605 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300606 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200607 size_t output2_size = 0;
608 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200609 size_t function_output_length = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200610 psa_cipher_operation_t operation1;
611 psa_cipher_operation_t operation2;
612
mohammad1603d7d7ba52018-03-12 18:51:53 +0200613 TEST_ASSERT( key != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200614 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300615 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
616 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200617
mohammad1603d7d7ba52018-03-12 18:51:53 +0200618 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
619
620 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300621 key->x, (size_t) key->len ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200622
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200623 TEST_ASSERT( psa_encrypt_setup( &operation1,
624 key_slot, alg ) == PSA_SUCCESS );
625 TEST_ASSERT( psa_decrypt_setup( &operation2,
626 key_slot, alg ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200627
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200628 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
629 iv, iv_size,
630 &iv_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300631 output1_size = (size_t) input->len + operation1.block_size;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200632 output1 = mbedtls_calloc( 1, output1_size );
633 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300634
itayzafrir3e02b3b2018-06-12 17:06:52 +0300635 TEST_ASSERT( psa_cipher_update( &operation1, input->x, (size_t) input->len,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200636 output1, output1_size,
637 &output1_length ) == PSA_SUCCESS );
638 TEST_ASSERT( psa_cipher_finish( &operation1,
639 output1 + output1_length, output1_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200640 &function_output_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200641
Gilles Peskine048b7f02018-06-08 14:20:49 +0200642 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300643
644 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
645
646 output2_size = output1_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200647 output2 = mbedtls_calloc( 1, output2_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300648 TEST_ASSERT( output2 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300649
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200650 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
651 iv, iv_length ) == PSA_SUCCESS );
652 TEST_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
653 output2, output2_size,
654 &output2_length ) == PSA_SUCCESS );
Gilles Peskine048b7f02018-06-08 14:20:49 +0200655 function_output_length = 0;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200656 TEST_ASSERT( psa_cipher_finish( &operation2,
657 output2 + output2_length,
658 output2_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200659 &function_output_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300660
Gilles Peskine048b7f02018-06-08 14:20:49 +0200661 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200662
Moran Pekerded84402018-06-06 16:36:50 +0300663 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
664
itayzafrir3e02b3b2018-06-12 17:06:52 +0300665 TEST_ASSERT( (size_t) input->len == output2_length );
666 TEST_ASSERT( memcmp( input->x, output2, (size_t) input->len ) == 0 );
Moran Pekerded84402018-06-06 16:36:50 +0300667
668exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300669 mbedtls_free( output1 );
670 mbedtls_free( output2 );
Moran Pekerded84402018-06-06 16:36:50 +0300671 psa_destroy_key( key_slot );
672 mbedtls_psa_crypto_free( );
673}
674/* END_CASE */
675
676/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +0200677void cipher_verify_output_multipart( int alg_arg,
678 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300679 data_t *key,
680 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200681 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +0300682{
683 int key_slot = 1;
684 psa_key_type_t key_type = key_type_arg;
685 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +0300686 unsigned char iv[16] = {0};
687 size_t iv_size = 16;
688 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300689 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200690 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +0300691 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300692 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200693 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +0300694 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200695 size_t function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300696 psa_cipher_operation_t operation1;
697 psa_cipher_operation_t operation2;
698
Moran Pekerded84402018-06-06 16:36:50 +0300699 TEST_ASSERT( key != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300700 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300701 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
702 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200703
Moran Pekerded84402018-06-06 16:36:50 +0300704 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
705
706 TEST_ASSERT( psa_import_key( key_slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300707 key->x, (size_t) key->len ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300708
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200709 TEST_ASSERT( psa_encrypt_setup( &operation1,
710 key_slot, alg ) == PSA_SUCCESS );
711 TEST_ASSERT( psa_decrypt_setup( &operation2,
712 key_slot, alg ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300713
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200714 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
715 iv, iv_size,
716 &iv_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300717 output1_buffer_size = (size_t) input->len + operation1.block_size;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200718 output1 = mbedtls_calloc( 1, output1_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300719 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300720
itayzafrir3e02b3b2018-06-12 17:06:52 +0300721 TEST_ASSERT( (unsigned int) first_part_size < (size_t) input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200722
itayzafrir3e02b3b2018-06-12 17:06:52 +0300723 TEST_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200724 output1, output1_buffer_size,
725 &function_output_length ) == PSA_SUCCESS );
726 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300727
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200728 TEST_ASSERT( psa_cipher_update( &operation1,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300729 input->x + first_part_size,
730 (size_t) input->len - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200731 output1, output1_buffer_size,
732 &function_output_length ) == PSA_SUCCESS );
733 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300734
Gilles Peskine048b7f02018-06-08 14:20:49 +0200735 TEST_ASSERT( psa_cipher_finish( &operation1,
736 output1 + output1_length,
737 output1_buffer_size - output1_length,
738 &function_output_length ) == PSA_SUCCESS );
739 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200740
741 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
742
Gilles Peskine048b7f02018-06-08 14:20:49 +0200743 output2_buffer_size = output1_length;
744 output2 = mbedtls_calloc( 1, output2_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300745 TEST_ASSERT( output2 != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200746
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200747 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
748 iv, iv_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300749
750 TEST_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200751 output2, output2_buffer_size,
752 &function_output_length ) == PSA_SUCCESS );
753 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300754
Gilles Peskine048b7f02018-06-08 14:20:49 +0200755 TEST_ASSERT( psa_cipher_update( &operation2,
756 output1 + first_part_size,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200757 output1_length - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200758 output2, output2_buffer_size,
759 &function_output_length ) == PSA_SUCCESS );
760 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300761
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200762 TEST_ASSERT( psa_cipher_finish( &operation2,
763 output2 + output2_length,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200764 output2_buffer_size - output2_length,
765 &function_output_length ) == PSA_SUCCESS );
766 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200767
mohammad1603d7d7ba52018-03-12 18:51:53 +0200768 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
769
itayzafrir3e02b3b2018-06-12 17:06:52 +0300770 TEST_ASSERT( (size_t) input->len == output2_length );
771 TEST_ASSERT( memcmp( input->x, output2, (size_t) input->len ) == 0 );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200772
773exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300774 mbedtls_free( output1 );
775 mbedtls_free( output2 );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200776 psa_destroy_key( key_slot );
777 mbedtls_psa_crypto_free( );
778}
779/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +0200780
Gilles Peskine20035e32018-02-03 22:44:14 +0100781/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200782void aead_encrypt_decrypt( int key_type_arg,
783 data_t * key_data,
784 int alg_arg,
785 data_t * input_data,
786 data_t * nonce,
787 data_t * additional_data,
788 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200789{
790 int slot = 1;
791 psa_key_type_t key_type = key_type_arg;
792 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200793 unsigned char *output_data = NULL;
794 size_t output_size = 0;
795 size_t output_length = 0;
796 unsigned char *output_data2 = NULL;
797 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200798 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200799 psa_status_t expected_result = (psa_status_t) expected_result_arg;
800 psa_key_policy_t policy = {0};
801
Gilles Peskinea1cac842018-06-11 19:33:02 +0200802 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200803 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300804 TEST_ASSERT( nonce != NULL );
805 TEST_ASSERT( additional_data != NULL );
806 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
807 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
808 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
809 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
810
811 output_size = (size_t) input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200812 output_data = mbedtls_calloc( 1, output_size );
813 TEST_ASSERT( output_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200814
815 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
816
817 psa_key_policy_init( &policy );
818
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200819 psa_key_policy_set_usage( &policy,
820 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
821 alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200822
823 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
824
825 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300826 key_data->x, (size_t) key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200827
828 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +0200829 nonce->x, (size_t) nonce->len,
830 additional_data->x,
831 (size_t) additional_data->len,
832 input_data->x, (size_t) input_data->len,
833 output_data,
834 output_size, &output_length ) ==
835 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200836
837 if( PSA_SUCCESS == expected_result )
838 {
839 output_data2 = mbedtls_calloc( 1, output_length );
840 TEST_ASSERT( output_data2 != NULL );
841
842 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +0200843 nonce->x, (size_t) nonce->len,
844 additional_data->x,
845 (size_t) additional_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200846 output_data, output_length,
847 output_data2, output_length,
848 &output_length2 ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200849 expected_result );
850
itayzafrir3e02b3b2018-06-12 17:06:52 +0300851 TEST_ASSERT( memcmp( input_data->x, output_data2,
Gilles Peskine2d277862018-06-18 15:41:12 +0200852 (size_t) input_data->len ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200853 }
Gilles Peskine2d277862018-06-18 15:41:12 +0200854
Gilles Peskinea1cac842018-06-11 19:33:02 +0200855exit:
856 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200857 mbedtls_free( output_data );
858 mbedtls_free( output_data2 );
859 mbedtls_psa_crypto_free( );
860}
861/* END_CASE */
862
863/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300864void aead_encrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200865 int alg_arg, data_t * input_data,
866 data_t * additional_data, data_t * nonce,
867 data_t * expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200868{
869 int slot = 1;
870 psa_key_type_t key_type = key_type_arg;
871 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200872 unsigned char *output_data = NULL;
873 size_t output_size = 0;
874 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200875 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200876 psa_key_policy_t policy = {0};
877
Gilles Peskinea1cac842018-06-11 19:33:02 +0200878 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200879 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300880 TEST_ASSERT( additional_data != NULL );
881 TEST_ASSERT( nonce != NULL );
882 TEST_ASSERT( expected_result != NULL );
883 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
884 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
885 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
886 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
887 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_result->len ) );
888
889 output_size = (size_t) input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200890 output_data = mbedtls_calloc( 1, output_size );
891 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +0200892
Gilles Peskinea1cac842018-06-11 19:33:02 +0200893 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
894
895 psa_key_policy_init( &policy );
896
897 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
898
899 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
900
901 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300902 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200903 PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200904
905 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +0200906 nonce->x, (size_t) nonce->len,
907 additional_data->x,
908 (size_t) additional_data->len,
909 input_data->x, (size_t) input_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200910 output_data, output_size,
911 &output_length ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200912
itayzafrir3e02b3b2018-06-12 17:06:52 +0300913 TEST_ASSERT( memcmp( output_data, expected_result->x,
Gilles Peskine2d277862018-06-18 15:41:12 +0200914 output_length ) == 0 );
915
Gilles Peskinea1cac842018-06-11 19:33:02 +0200916exit:
917 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200918 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200919 mbedtls_psa_crypto_free( );
920}
921/* END_CASE */
922
923/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300924void aead_decrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200925 int alg_arg, data_t * input_data,
926 data_t * additional_data, data_t * nonce,
927 data_t * expected_data, int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200928{
929 int slot = 1;
930 psa_key_type_t key_type = key_type_arg;
931 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200932 unsigned char *output_data = NULL;
933 size_t output_size = 0;
934 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200935 size_t tag_length = 16;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200936 psa_key_policy_t policy = {0};
937 psa_status_t expected_result = (psa_status_t) expected_result_arg;
938
Gilles Peskinea1cac842018-06-11 19:33:02 +0200939 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200940 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300941 TEST_ASSERT( additional_data != NULL );
942 TEST_ASSERT( nonce != NULL );
943 TEST_ASSERT( expected_data != NULL );
944 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
945 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
946 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
947 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
948 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
949
950 output_size = (size_t) input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200951 output_data = mbedtls_calloc( 1, output_size );
952 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +0200953
Gilles Peskinea1cac842018-06-11 19:33:02 +0200954 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
955
956 psa_key_policy_init( &policy );
957
958 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
959
960 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
961
962 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300963 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +0200964 PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200965
966 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +0200967 nonce->x, (size_t) nonce->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200968 additional_data->x,
969 (size_t) additional_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +0200970 input_data->x, (size_t) input_data->len,
971 output_data,
972 output_size, &output_length ) ==
973 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200974
Gilles Peskine2d277862018-06-18 15:41:12 +0200975 if( expected_result == PSA_SUCCESS )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200976 {
itayzafrir3e02b3b2018-06-12 17:06:52 +0300977 TEST_ASSERT( memcmp( output_data, expected_data->x,
Gilles Peskine2d277862018-06-18 15:41:12 +0200978 output_length ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200979 }
980
Gilles Peskinea1cac842018-06-11 19:33:02 +0200981exit:
982 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200983 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200984 mbedtls_psa_crypto_free( );
985}
986/* END_CASE */
987
988/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200989void signature_size( int type_arg,
990 int bits,
991 int alg_arg,
992 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +0100993{
994 psa_key_type_t type = type_arg;
995 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +0200996 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinee59236f2018-01-27 23:32:46 +0100997 TEST_ASSERT( actual_size == (size_t) expected_size_arg );
998exit:
999 ;
1000}
1001/* END_CASE */
1002
1003/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001004void sign_deterministic( int key_type_arg, data_t *key_data,
1005 int alg_arg, data_t *input_data,
1006 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01001007{
1008 int slot = 1;
1009 psa_key_type_t key_type = key_type_arg;
1010 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001011 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01001012 unsigned char *signature = NULL;
1013 size_t signature_size;
1014 size_t signature_length = 0xdeadbeef;
mohammad1603a97cb8c2018-03-28 03:46:26 -07001015 psa_key_policy_t policy = {0};
Gilles Peskine20035e32018-02-03 22:44:14 +01001016
Gilles Peskine20035e32018-02-03 22:44:14 +01001017 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001018 TEST_ASSERT( input_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001019 TEST_ASSERT( output_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001020 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1021 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1022 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( output_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01001023
1024 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1025
mohammad1603a97cb8c2018-03-28 03:46:26 -07001026 psa_key_policy_init( &policy );
1027
1028 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg_arg );
1029
1030 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1031
Gilles Peskine20035e32018-02-03 22:44:14 +01001032 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001033 key_data->x, (size_t) key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001034 TEST_ASSERT( psa_get_key_information( slot,
1035 NULL,
1036 &key_bits ) == PSA_SUCCESS );
1037
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001038 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
1039 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01001040 TEST_ASSERT( signature_size != 0 );
1041 signature = mbedtls_calloc( 1, signature_size );
1042 TEST_ASSERT( signature != NULL );
1043
1044 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001045 input_data->x, (size_t) input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001046 NULL, 0,
1047 signature, signature_size,
1048 &signature_length ) == PSA_SUCCESS );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001049 TEST_ASSERT( signature_length == (size_t) output_data->len );
Gilles Peskine2d277862018-06-18 15:41:12 +02001050 TEST_ASSERT( memcmp( signature, output_data->x,
1051 (size_t) output_data->len ) == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001052
1053exit:
1054 psa_destroy_key( slot );
Gilles Peskine0189e752018-02-03 23:57:22 +01001055 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01001056 mbedtls_psa_crypto_free( );
1057}
1058/* END_CASE */
1059
1060/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001061void sign_fail( int key_type_arg, data_t *key_data,
1062 int alg_arg, data_t *input_data,
Gilles Peskine20035e32018-02-03 22:44:14 +01001063 int signature_size, int expected_status_arg )
1064{
1065 int slot = 1;
1066 psa_key_type_t key_type = key_type_arg;
1067 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001068 psa_status_t actual_status;
1069 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01001070 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01001071 size_t signature_length = 0xdeadbeef;
mohammad1603a97cb8c2018-03-28 03:46:26 -07001072 psa_key_policy_t policy = {0};
Gilles Peskine20035e32018-02-03 22:44:14 +01001073
Gilles Peskine20035e32018-02-03 22:44:14 +01001074 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001075 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001076 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1077 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1078
Gilles Peskine20035e32018-02-03 22:44:14 +01001079 signature = mbedtls_calloc( 1, signature_size );
1080 TEST_ASSERT( signature != NULL );
1081
1082 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1083
mohammad1603a97cb8c2018-03-28 03:46:26 -07001084 psa_key_policy_init( &policy );
1085
1086 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg_arg );
1087
1088 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1089
Gilles Peskine20035e32018-02-03 22:44:14 +01001090 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001091 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001092 PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001093
1094 actual_status = psa_asymmetric_sign( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001095 input_data->x,
1096 (size_t) input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001097 NULL, 0,
1098 signature, signature_size,
1099 &signature_length );
1100 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine93aa0332018-02-03 23:58:03 +01001101 TEST_ASSERT( signature_length == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001102
1103exit:
1104 psa_destroy_key( slot );
Gilles Peskine20035e32018-02-03 22:44:14 +01001105 mbedtls_free( signature );
1106 mbedtls_psa_crypto_free( );
1107}
1108/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03001109
1110/* BEGIN_CASE */
1111void key_policy( int usage_arg, int alg_arg )
1112{
1113 int key_slot = 1;
mohammad16034eed7572018-03-28 05:14:59 -07001114 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
mohammad16038cc1cee2018-03-28 01:21:33 +03001115 unsigned char key[32] = {0};
1116 psa_key_policy_t policy_set = {0};
1117 psa_key_policy_t policy_get = {0};
mohammad1603804cd712018-03-20 22:44:08 +02001118
mohammad16038cc1cee2018-03-28 01:21:33 +03001119 memset( key, 0x2a, sizeof( key ) );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001120
mohammad16038cc1cee2018-03-28 01:21:33 +03001121 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1122
Gilles Peskine2d277862018-06-18 15:41:12 +02001123 psa_key_policy_init( &policy_set );
1124 psa_key_policy_init( &policy_get );
mohammad16038cc1cee2018-03-28 01:21:33 +03001125
1126 psa_key_policy_set_usage( &policy_set, usage_arg, alg_arg );
1127
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001128 TEST_ASSERT( psa_key_policy_get_usage( &policy_set ) ==
1129 (psa_key_usage_t) usage_arg );
mohammad16038cc1cee2018-03-28 01:21:33 +03001130
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001131 TEST_ASSERT( psa_key_policy_get_algorithm( &policy_set ) ==
1132 (psa_algorithm_t) alg_arg );
mohammad16038cc1cee2018-03-28 01:21:33 +03001133
1134 TEST_ASSERT( psa_set_key_policy( key_slot, &policy_set ) == PSA_SUCCESS );
1135
1136 TEST_ASSERT( psa_import_key( key_slot, key_type,
1137 key, sizeof( key ) ) == PSA_SUCCESS );
1138
1139 TEST_ASSERT( psa_get_key_policy( key_slot, &policy_get ) == PSA_SUCCESS );
1140
1141 TEST_ASSERT( policy_get.usage == policy_set.usage );
1142 TEST_ASSERT( policy_get.alg == policy_set.alg );
1143
1144exit:
1145 psa_destroy_key( key_slot );
1146 mbedtls_psa_crypto_free( );
1147}
1148/* END_CASE */
1149
mohammad16034eed7572018-03-28 05:14:59 -07001150/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001151void key_policy_fail( int usage_arg, int alg_arg, int expected_status,
1152 data_t *keypair )
mohammad16034eed7572018-03-28 05:14:59 -07001153{
1154 int key_slot = 1;
mohammad16034eed7572018-03-28 05:14:59 -07001155 size_t signature_length = 0;
1156 psa_key_policy_t policy = {0};
1157 int actual_status = PSA_SUCCESS;
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001158
mohammad16034eed7572018-03-28 05:14:59 -07001159 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1160
1161 psa_key_policy_init( &policy );
1162
1163 psa_key_policy_set_usage( &policy, usage_arg, alg_arg );
1164
1165 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1166
mohammad16036df908f2018-04-02 08:34:15 -07001167 if( usage_arg & PSA_KEY_USAGE_EXPORT )
mohammad16034eed7572018-03-28 05:14:59 -07001168 {
mohammad16036df908f2018-04-02 08:34:15 -07001169 TEST_ASSERT( keypair != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001170 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
mohammad16036df908f2018-04-02 08:34:15 -07001171 TEST_ASSERT( psa_import_key( key_slot, PSA_KEY_TYPE_RSA_KEYPAIR,
Gilles Peskine2d277862018-06-18 15:41:12 +02001172 keypair->x, (size_t) keypair->len ) ==
1173 PSA_SUCCESS );
1174 actual_status = psa_asymmetric_sign( key_slot,
1175 (psa_algorithm_t) alg_arg,
1176 NULL, 0,
1177 NULL, 0,
1178 NULL, 0, &signature_length );
mohammad16036df908f2018-04-02 08:34:15 -07001179 }
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001180
mohammad16036df908f2018-04-02 08:34:15 -07001181 if( usage_arg & PSA_KEY_USAGE_SIGN )
1182 {
mohammad1603d926b882018-04-16 01:53:20 -07001183 TEST_ASSERT( keypair != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001184 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
mohammad16036df908f2018-04-02 08:34:15 -07001185 TEST_ASSERT( psa_import_key( key_slot, PSA_KEY_TYPE_RSA_KEYPAIR,
Gilles Peskine2d277862018-06-18 15:41:12 +02001186 keypair->x, (size_t) keypair->len ) ==
1187 PSA_SUCCESS );
mohammad16036df908f2018-04-02 08:34:15 -07001188 actual_status = psa_export_key( key_slot, NULL, 0, NULL );
mohammad16034eed7572018-03-28 05:14:59 -07001189 }
1190
1191 TEST_ASSERT( actual_status == expected_status );
1192
1193exit:
1194 psa_destroy_key( key_slot );
1195 mbedtls_psa_crypto_free( );
1196}
1197/* END_CASE */
Gilles Peskinea0655c32018-04-30 17:06:50 +02001198
1199/* BEGIN_CASE */
1200void key_lifetime( int lifetime_arg )
1201{
1202 int key_slot = 1;
1203 psa_key_type_t key_type = PSA_ALG_CBC_BASE;
1204 unsigned char key[32] = {0};
1205 psa_key_lifetime_t lifetime_set = (psa_key_lifetime_t) lifetime_arg;
1206 psa_key_lifetime_t lifetime_get;
Gilles Peskine7268afc2018-06-06 15:19:24 +02001207
Gilles Peskinea0655c32018-04-30 17:06:50 +02001208 memset( key, 0x2a, sizeof( key ) );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001209
Gilles Peskinea0655c32018-04-30 17:06:50 +02001210 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001211
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001212 TEST_ASSERT( psa_set_key_lifetime( key_slot,
Gilles Peskine2d277862018-06-18 15:41:12 +02001213 lifetime_set ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001214
Gilles Peskinea0655c32018-04-30 17:06:50 +02001215 TEST_ASSERT( psa_import_key( key_slot, key_type,
1216 key, sizeof( key ) ) == PSA_SUCCESS );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001217
1218 TEST_ASSERT( psa_get_key_lifetime( key_slot,
Gilles Peskine2d277862018-06-18 15:41:12 +02001219 &lifetime_get ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001220
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001221 TEST_ASSERT( lifetime_get == lifetime_set );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001222
Gilles Peskinea0655c32018-04-30 17:06:50 +02001223exit:
1224 psa_destroy_key( key_slot );
1225 mbedtls_psa_crypto_free( );
1226}
1227/* END_CASE */
mohammad1603804cd712018-03-20 22:44:08 +02001228
1229/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001230void key_lifetime_set_fail( int key_slot_arg,
1231 int lifetime_arg,
1232 int expected_status_arg )
mohammad1603804cd712018-03-20 22:44:08 +02001233{
1234 int key_slot = 1;
mohammad1603804cd712018-03-20 22:44:08 +02001235 psa_key_lifetime_t lifetime_set = (psa_key_lifetime_t) lifetime_arg;
1236 psa_status_t actual_status;
1237 psa_status_t expected_status = expected_status_arg;
1238
mohammad1603804cd712018-03-20 22:44:08 +02001239 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1240
mohammad1603804cd712018-03-20 22:44:08 +02001241 actual_status = psa_set_key_lifetime( key_slot_arg, lifetime_set );
1242
1243 if( actual_status == PSA_SUCCESS )
1244 actual_status = psa_set_key_lifetime( key_slot_arg, lifetime_set );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001245
mohammad1603804cd712018-03-20 22:44:08 +02001246 TEST_ASSERT( expected_status == actual_status );
1247
1248exit:
mohammad1603804cd712018-03-20 22:44:08 +02001249 psa_destroy_key( key_slot );
1250 mbedtls_psa_crypto_free( );
1251}
1252/* END_CASE */
itayzafrir5c753392018-05-08 11:18:38 +03001253
1254/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001255void asymmetric_verify( int key_type_arg, data_t *key_data,
1256 int alg_arg, data_t *hash_data,
1257 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03001258{
1259 int slot = 1;
1260 psa_key_type_t key_type = key_type_arg;
1261 psa_algorithm_t alg = alg_arg;
itayzafrir5c753392018-05-08 11:18:38 +03001262 psa_key_policy_t policy = {0};
1263
itayzafrir5c753392018-05-08 11:18:38 +03001264 TEST_ASSERT( key_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001265 TEST_ASSERT( hash_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001266 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001267 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1268 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1269 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03001270
1271 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1272
1273 psa_key_policy_init( &policy );
1274
1275 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg_arg );
1276
1277 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1278
1279 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001280 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001281 PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001282
1283 TEST_ASSERT( psa_asymmetric_verify( slot, alg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001284 hash_data->x, (size_t) hash_data->len,
itayzafrir5c753392018-05-08 11:18:38 +03001285 NULL, 0,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001286 signature_data->x,
1287 (size_t) signature_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001288 PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001289exit:
1290 psa_destroy_key( slot );
itayzafrir5c753392018-05-08 11:18:38 +03001291 mbedtls_psa_crypto_free( );
1292}
1293/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001294
1295/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001296void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
1297 int alg_arg, data_t *hash_data,
1298 data_t *signature_data,
1299 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001300{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001301 int slot = 1;
1302 psa_key_type_t key_type = key_type_arg;
1303 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001304 psa_status_t actual_status;
1305 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001306 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001307
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001308 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001309 TEST_ASSERT( hash_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001310 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001311 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1312 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1313 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001314
1315 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1316
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001317 psa_key_policy_init( &policy );
1318
1319 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg_arg );
1320
1321 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1322
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001323 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001324 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001325 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001326
1327 actual_status = psa_asymmetric_verify( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +02001328 hash_data->x, (size_t) hash_data->len,
1329 NULL, 0,
1330 signature_data->x,
1331 (size_t) signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001332
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001333 TEST_ASSERT( actual_status == expected_status );
1334
1335exit:
1336 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001337 mbedtls_psa_crypto_free( );
1338}
1339/* END_CASE */
1340
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001341/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001342void asymmetric_encrypt_decrypt( int key_type_arg, data_t *key_data,
1343 int alg_arg, data_t *input_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001344{
1345 int slot = 1;
1346 psa_key_type_t key_type = key_type_arg;
1347 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001348 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001349 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001350 size_t output_length = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001351 unsigned char *output2 = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001352 size_t output2_size = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001353 size_t output2_length = 0;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001354 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001355
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001356 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001357 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001358 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1359 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1360
1361 output_size = (size_t) key_data->len;
1362 output2_size = output_size;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001363 output = mbedtls_calloc( 1, output_size );
1364 TEST_ASSERT( output != NULL );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001365 output2 = mbedtls_calloc( 1, output2_size );
1366 TEST_ASSERT( output2 != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001367
1368 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1369
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001370 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001371 psa_key_policy_set_usage( &policy,
1372 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
1373 alg_arg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001374 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1375
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001376 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001377 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001378 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001379
Gilles Peskineeebd7382018-06-08 18:11:54 +02001380 /* We test encryption by checking that encrypt-then-decrypt gives back
1381 * the original plaintext because of the non-optional random
1382 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine2d277862018-06-18 15:41:12 +02001383 TEST_ASSERT( psa_asymmetric_encrypt( slot, alg,
1384 input_data->x,
1385 (size_t) input_data->len,
1386 NULL, 0,
1387 output,
1388 output_size,
1389 &output_length ) == PSA_SUCCESS );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001390
Gilles Peskine2d277862018-06-18 15:41:12 +02001391 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
1392 output,
1393 output_length,
1394 NULL, 0,
1395 output2,
1396 output2_size,
1397 &output2_length ) == PSA_SUCCESS );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001398 TEST_ASSERT( memcmp( input_data->x, output2,
1399 (size_t) input_data->len ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001400
1401exit:
1402 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001403 mbedtls_free( output );
1404 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001405 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001406}
1407/* END_CASE */
1408
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001409/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001410void asymmetric_encrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001411 int alg_arg, data_t *input_data,
1412 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001413{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001414 int slot = 1;
1415 psa_key_type_t key_type = key_type_arg;
1416 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001417 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001418 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001419 size_t output_length = 0;
1420 psa_status_t actual_status;
1421 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001422 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001423
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001424 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001425 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001426 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1427 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1428
1429 output_size = (size_t) key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001430 output = mbedtls_calloc( 1, output_size );
1431 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001432
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001433 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1434
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001435 psa_key_policy_init( &policy );
1436 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg_arg );
1437 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1438
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001439 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001440 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001441 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001442
Gilles Peskine2d277862018-06-18 15:41:12 +02001443 actual_status = psa_asymmetric_encrypt( slot, alg,
1444 input_data->x,
1445 (size_t) input_data->len,
1446 NULL, 0,
1447 output,
1448 output_size,
1449 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001450 TEST_ASSERT( actual_status == expected_status );
1451
1452exit:
1453 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001454 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001455 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001456}
1457/* END_CASE */
1458
1459/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001460void asymmetric_decrypt( int key_type_arg, data_t *key_data,
1461 int alg_arg, data_t *input_data,
1462 data_t *expected_data, int expected_size )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001463{
1464 int slot = 1;
1465 psa_key_type_t key_type = key_type_arg;
1466 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001467 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001468 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001469 size_t output_length = 0;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001470 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001471
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001472 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001473 TEST_ASSERT( input_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001474 TEST_ASSERT( expected_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001475 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1476 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1477 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
1478
1479 output_size = (size_t) key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001480 output = mbedtls_calloc( 1, output_size );
1481 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001482
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001483 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1484
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001485 psa_key_policy_init( &policy );
1486 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg_arg );
1487 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1488
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001489 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001490 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001491 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001492
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001493 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +02001494 input_data->x,
1495 (size_t) input_data->len,
1496 NULL, 0,
1497 output,
1498 output_size,
1499 &output_length ) == PSA_SUCCESS );
1500 TEST_ASSERT( ( (size_t) expected_size ) == output_length );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001501 TEST_ASSERT( memcmp( expected_data->x, output, output_length ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001502
1503exit:
1504 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001505 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001506 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001507}
1508/* END_CASE */
1509
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001510/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001511void asymmetric_decrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001512 int alg_arg, data_t *input_data,
1513 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001514{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001515 int slot = 1;
1516 psa_key_type_t key_type = key_type_arg;
1517 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001518 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001519 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001520 size_t output_length = 0;
1521 psa_status_t actual_status;
1522 psa_status_t expected_status = expected_status_arg;
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001523 psa_key_policy_t policy = {0};
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001524
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001525 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001526 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001527 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1528 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1529
1530 output_size = (size_t) key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001531 output = mbedtls_calloc( 1, output_size );
1532 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001533
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001534 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1535
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001536 psa_key_policy_init( &policy );
1537 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg_arg );
1538 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1539
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001540 TEST_ASSERT( psa_import_key( slot, key_type,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001541 key_data->x, (size_t) key_data->len ) ==
Gilles Peskine2d277862018-06-18 15:41:12 +02001542 PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001543
Gilles Peskine2d277862018-06-18 15:41:12 +02001544 actual_status = psa_asymmetric_decrypt( slot, alg,
1545 input_data->x,
1546 (size_t) input_data->len,
1547 NULL, 0,
1548 output,
1549 output_size,
1550 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001551 TEST_ASSERT( actual_status == expected_status );
1552
1553exit:
1554 psa_destroy_key( slot );
Gilles Peskine2d277862018-06-18 15:41:12 +02001555 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001556 mbedtls_psa_crypto_free( );
1557}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001558/* END_CASE */