blob: 71523689659bdf6bcd969fb5cbbf5489fac3a59a [file] [log] [blame]
Gilles Peskinee59236f2018-01-27 23:32:46 +01001/* BEGIN_HEADER */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002#include <stdint.h>
mohammad160327010052018-07-03 13:16:15 +03003
4#if defined(MBEDTLS_PSA_CRYPTO_SPM)
5#include "spm/psa_defs.h"
6#endif
7
Gilles Peskine0b352bc2018-06-28 00:16:11 +02008#include "mbedtls/asn1write.h"
Gilles Peskinee59236f2018-01-27 23:32:46 +01009#include "psa/crypto.h"
itayzafrir3e02b3b2018-06-12 17:06:52 +030010
11#if(UINT32_MAX > SIZE_MAX)
Gilles Peskine2d277862018-06-18 15:41:12 +020012#define PSA_CRYPTO_TEST_SIZE_T_RANGE( x ) ( ( x ) <= SIZE_MAX )
itayzafrir3e02b3b2018-06-12 17:06:52 +030013#else
Gilles Peskine2d277862018-06-18 15:41:12 +020014#define PSA_CRYPTO_TEST_SIZE_T_RANGE( x ) 1
itayzafrir3e02b3b2018-06-12 17:06:52 +030015#endif
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020016
Jaeden Amerof24c7f82018-06-27 17:20:43 +010017/** An invalid export length that will never be set by psa_export_key(). */
18static const size_t INVALID_EXPORT_LENGTH = ~0U;
19
Gilles Peskined35a1cc2018-06-26 21:26:10 +020020/** Test if a buffer is all-bits zero.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020021 *
22 * \param buffer Pointer to the beginning of the buffer.
23 * \param size Size of the buffer in bytes.
24 *
Gilles Peskine3f669c32018-06-21 09:21:51 +020025 * \return 1 if the buffer is all-bits-zero.
26 * \return 0 if there is at least one nonzero byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020027 */
Gilles Peskine3f669c32018-06-21 09:21:51 +020028static int mem_is_zero( void *buffer, size_t size )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020029{
30 size_t i;
31 for( i = 0; i < size; i++ )
32 {
33 if( ( (unsigned char *) buffer )[i] != 0 )
Gilles Peskine3f669c32018-06-21 09:21:51 +020034 return( 0 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020035 }
Gilles Peskine3f669c32018-06-21 09:21:51 +020036 return( 1 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020037}
Gilles Peskine818ca122018-06-20 18:16:48 +020038
Gilles Peskine48c0ea12018-06-21 14:15:31 +020039static int key_type_is_raw_bytes( psa_key_type_t type )
40{
41 psa_key_type_t category = type & PSA_KEY_TYPE_CATEGORY_MASK;
42 return( category == PSA_KEY_TYPE_RAW_DATA ||
43 category == PSA_KEY_TYPE_CATEGORY_SYMMETRIC );
44}
45
Gilles Peskine0b352bc2018-06-28 00:16:11 +020046/* Write the ASN.1 INTEGER with the value 2^(bits-1)+x backwards from *p. */
47static int asn1_write_10x( unsigned char **p,
48 unsigned char *start,
49 size_t bits,
50 unsigned char x )
51{
52 int ret;
53 int len = bits / 8 + 1;
Gilles Peskine480416a2018-06-28 19:04:07 +020054 if( bits == 0 )
55 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
56 if( bits <= 8 && x >= 1 << ( bits - 1 ) )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020057 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
58 if( *p < start || *p - start < (ssize_t) len )
59 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
60 *p -= len;
61 ( *p )[len-1] = x;
62 if( bits % 8 == 0 )
63 ( *p )[1] |= 1;
64 else
65 ( *p )[0] |= 1 << ( bits % 8 );
66 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
67 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
68 MBEDTLS_ASN1_INTEGER ) );
69 return( len );
70}
71
72static int construct_fake_rsa_key( unsigned char *buffer,
73 size_t buffer_size,
74 unsigned char **p,
75 size_t bits,
76 int keypair )
77{
78 size_t half_bits = ( bits + 1 ) / 2;
79 int ret;
80 int len = 0;
81 /* Construct something that looks like a DER encoding of
82 * as defined by PKCS#1 v2.2 (RFC 8017) section A.1.2:
83 * RSAPrivateKey ::= SEQUENCE {
84 * version Version,
85 * modulus INTEGER, -- n
86 * publicExponent INTEGER, -- e
87 * privateExponent INTEGER, -- d
88 * prime1 INTEGER, -- p
89 * prime2 INTEGER, -- q
90 * exponent1 INTEGER, -- d mod (p-1)
91 * exponent2 INTEGER, -- d mod (q-1)
92 * coefficient INTEGER, -- (inverse of q) mod p
93 * otherPrimeInfos OtherPrimeInfos OPTIONAL
94 * }
95 * Or, for a public key, the same structure with only
96 * version, modulus and publicExponent.
97 */
98 *p = buffer + buffer_size;
99 if( keypair )
100 {
101 MBEDTLS_ASN1_CHK_ADD( len, /* pq */
102 asn1_write_10x( p, buffer, half_bits, 1 ) );
103 MBEDTLS_ASN1_CHK_ADD( len, /* dq */
104 asn1_write_10x( p, buffer, half_bits, 1 ) );
105 MBEDTLS_ASN1_CHK_ADD( len, /* dp */
106 asn1_write_10x( p, buffer, half_bits, 1 ) );
107 MBEDTLS_ASN1_CHK_ADD( len, /* q */
108 asn1_write_10x( p, buffer, half_bits, 1 ) );
109 MBEDTLS_ASN1_CHK_ADD( len, /* p != q to pass mbedtls sanity checks */
110 asn1_write_10x( p, buffer, half_bits, 3 ) );
111 MBEDTLS_ASN1_CHK_ADD( len, /* d */
112 asn1_write_10x( p, buffer, bits, 1 ) );
113 }
114 MBEDTLS_ASN1_CHK_ADD( len, /* e = 65537 */
115 asn1_write_10x( p, buffer, 17, 1 ) );
116 MBEDTLS_ASN1_CHK_ADD( len, /* n */
117 asn1_write_10x( p, buffer, bits, 1 ) );
118 if( keypair )
119 MBEDTLS_ASN1_CHK_ADD( len, /* version = 0 */
120 mbedtls_asn1_write_int( p, buffer, 0 ) );
121 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, buffer, len ) );
122 {
123 const unsigned char tag =
124 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE;
125 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, buffer, tag ) );
126 }
127 return( len );
128}
129
Gilles Peskine818ca122018-06-20 18:16:48 +0200130static int exercise_mac_key( psa_key_slot_t key,
131 psa_key_usage_t usage,
132 psa_algorithm_t alg )
133{
134 psa_mac_operation_t operation;
135 const unsigned char input[] = "foo";
Gilles Peskine69c12672018-06-28 00:07:19 +0200136 unsigned char mac[PSA_MAC_MAX_SIZE] = {0};
Gilles Peskine818ca122018-06-20 18:16:48 +0200137 size_t mac_length = sizeof( mac );
138
139 if( usage & PSA_KEY_USAGE_SIGN )
140 {
141 TEST_ASSERT( psa_mac_start( &operation, key, alg ) == PSA_SUCCESS );
142 TEST_ASSERT( psa_mac_update( &operation,
143 input, sizeof( input ) ) == PSA_SUCCESS );
144 TEST_ASSERT( psa_mac_finish( &operation,
145 mac, sizeof( input ),
146 &mac_length ) == PSA_SUCCESS );
147 }
148
149 if( usage & PSA_KEY_USAGE_VERIFY )
150 {
151 psa_status_t verify_status =
152 ( usage & PSA_KEY_USAGE_SIGN ?
153 PSA_SUCCESS :
154 PSA_ERROR_INVALID_SIGNATURE );
155 TEST_ASSERT( psa_mac_start( &operation, key, alg ) == PSA_SUCCESS );
156 TEST_ASSERT( psa_mac_update( &operation,
157 input, sizeof( input ) ) == PSA_SUCCESS );
158 TEST_ASSERT( psa_mac_verify( &operation, mac, mac_length ) == verify_status );
159 }
160
161 return( 1 );
162
163exit:
164 psa_mac_abort( &operation );
165 return( 0 );
166}
167
168static int exercise_cipher_key( psa_key_slot_t key,
169 psa_key_usage_t usage,
170 psa_algorithm_t alg )
171{
172 psa_cipher_operation_t operation;
173 unsigned char iv[16] = {0};
174 size_t iv_length = sizeof( iv );
175 const unsigned char plaintext[16] = "Hello, world...";
176 unsigned char ciphertext[32] = "(wabblewebblewibblewobblewubble)";
177 size_t ciphertext_length = sizeof( ciphertext );
178 unsigned char decrypted[sizeof( ciphertext )];
179 size_t part_length;
180
181 if( usage & PSA_KEY_USAGE_ENCRYPT )
182 {
183 TEST_ASSERT( psa_encrypt_setup( &operation, key, alg ) == PSA_SUCCESS );
184 TEST_ASSERT( psa_encrypt_generate_iv( &operation,
185 iv, sizeof( iv ),
186 &iv_length ) == PSA_SUCCESS );
187 TEST_ASSERT( psa_cipher_update( &operation,
188 plaintext, sizeof( plaintext ),
189 ciphertext, sizeof( ciphertext ),
190 &ciphertext_length ) == PSA_SUCCESS );
191 TEST_ASSERT( psa_cipher_finish( &operation,
192 ciphertext + ciphertext_length,
193 sizeof( ciphertext ) - ciphertext_length,
194 &part_length ) == PSA_SUCCESS );
195 ciphertext_length += part_length;
196 }
197
198 if( usage & PSA_KEY_USAGE_DECRYPT )
199 {
200 psa_status_t status;
Mohammad AboMokhadb9b232018-06-28 01:52:54 -0700201 psa_key_type_t type = PSA_KEY_TYPE_NONE;
Gilles Peskine818ca122018-06-20 18:16:48 +0200202 if( ! ( usage & PSA_KEY_USAGE_ENCRYPT ) )
203 {
Gilles Peskine818ca122018-06-20 18:16:48 +0200204 size_t bits;
205 TEST_ASSERT( psa_get_key_information( key, &type, &bits ) );
206 iv_length = PSA_BLOCK_CIPHER_BLOCK_SIZE( type );
207 }
208 TEST_ASSERT( psa_decrypt_setup( &operation, key, alg ) == PSA_SUCCESS );
209 TEST_ASSERT( psa_encrypt_set_iv( &operation,
210 iv, iv_length ) == PSA_SUCCESS );
211 TEST_ASSERT( psa_cipher_update( &operation,
212 ciphertext, ciphertext_length,
213 decrypted, sizeof( decrypted ),
214 &part_length ) == PSA_SUCCESS );
215 status = psa_cipher_finish( &operation,
216 decrypted + part_length,
217 sizeof( decrypted ) - part_length,
218 &part_length );
219 /* For a stream cipher, all inputs are valid. For a block cipher,
220 * if the input is some aribtrary data rather than an actual
221 ciphertext, a padding error is likely. */
Mohammad AboMokh65fa0b82018-06-28 02:14:00 -0700222 if( ( usage & PSA_KEY_USAGE_ENCRYPT ) ||
Mohammad AboMokhadb9b232018-06-28 01:52:54 -0700223 PSA_BLOCK_CIPHER_BLOCK_SIZE( type ) == 1 )
Gilles Peskine818ca122018-06-20 18:16:48 +0200224 TEST_ASSERT( status == PSA_SUCCESS );
225 else
226 TEST_ASSERT( status == PSA_SUCCESS ||
227 status == PSA_ERROR_INVALID_PADDING );
228 }
229
230 return( 1 );
231
232exit:
233 psa_cipher_abort( &operation );
234 return( 0 );
235}
236
237static int exercise_aead_key( psa_key_slot_t key,
238 psa_key_usage_t usage,
239 psa_algorithm_t alg )
240{
241 unsigned char nonce[16] = {0};
242 size_t nonce_length = sizeof( nonce );
243 unsigned char plaintext[16] = "Hello, world...";
244 unsigned char ciphertext[48] = "(wabblewebblewibblewobblewubble)";
245 size_t ciphertext_length = sizeof( ciphertext );
246 size_t plaintext_length = sizeof( ciphertext );
247
248 if( usage & PSA_KEY_USAGE_ENCRYPT )
249 {
250 TEST_ASSERT( psa_aead_encrypt( key, alg,
251 nonce, nonce_length,
252 NULL, 0,
253 plaintext, sizeof( plaintext ),
254 ciphertext, sizeof( ciphertext ),
255 &ciphertext_length ) == PSA_SUCCESS );
256 }
257
258 if( usage & PSA_KEY_USAGE_DECRYPT )
259 {
260 psa_status_t verify_status =
261 ( usage & PSA_KEY_USAGE_ENCRYPT ?
262 PSA_SUCCESS :
263 PSA_ERROR_INVALID_SIGNATURE );
264 TEST_ASSERT( psa_aead_decrypt( key, alg,
265 nonce, nonce_length,
266 NULL, 0,
267 ciphertext, ciphertext_length,
268 plaintext, sizeof( plaintext ),
269 &plaintext_length ) == verify_status );
270 }
271
272 return( 1 );
273
274exit:
275 return( 0 );
276}
277
278static int exercise_signature_key( psa_key_slot_t key,
279 psa_key_usage_t usage,
280 psa_algorithm_t alg )
281{
Gilles Peskineca45c352018-06-26 16:13:09 +0200282 unsigned char payload[16] = {1};
Gilles Peskine818ca122018-06-20 18:16:48 +0200283 size_t payload_length = sizeof( payload );
Gilles Peskine69c12672018-06-28 00:07:19 +0200284 unsigned char signature[PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE] = {0};
Gilles Peskine818ca122018-06-20 18:16:48 +0200285 size_t signature_length = sizeof( signature );
286
287 if( usage & PSA_KEY_USAGE_SIGN )
288 {
289 TEST_ASSERT( psa_asymmetric_sign( key, alg,
290 payload, payload_length,
291 NULL, 0,
292 signature, sizeof( signature ),
293 &signature_length ) == PSA_SUCCESS );
294 }
295
296 if( usage & PSA_KEY_USAGE_VERIFY )
297 {
298 psa_status_t verify_status =
299 ( usage & PSA_KEY_USAGE_SIGN ?
300 PSA_SUCCESS :
301 PSA_ERROR_INVALID_SIGNATURE );
302 TEST_ASSERT( psa_asymmetric_verify( key, alg,
303 payload, payload_length,
304 NULL, 0,
305 signature, signature_length ) ==
306 verify_status );
307 }
308
309 return( 1 );
310
311exit:
312 return( 0 );
313}
314
315static int exercise_asymmetric_encryption_key( psa_key_slot_t key,
316 psa_key_usage_t usage,
317 psa_algorithm_t alg )
318{
319 unsigned char plaintext[256] = "Hello, world...";
320 unsigned char ciphertext[256] = "(wabblewebblewibblewobblewubble)";
321 size_t ciphertext_length = sizeof( ciphertext );
322 size_t plaintext_length = 16;
323
324 if( usage & PSA_KEY_USAGE_ENCRYPT )
325 {
326 TEST_ASSERT(
327 psa_asymmetric_encrypt( key, alg,
328 plaintext, plaintext_length,
329 NULL, 0,
330 ciphertext, sizeof( ciphertext ),
331 &ciphertext_length ) == PSA_SUCCESS );
332 }
333
334 if( usage & PSA_KEY_USAGE_DECRYPT )
335 {
336 psa_status_t status =
337 psa_asymmetric_decrypt( key, alg,
338 ciphertext, ciphertext_length,
339 NULL, 0,
340 plaintext, sizeof( plaintext ),
341 &plaintext_length );
342 TEST_ASSERT( status == PSA_SUCCESS ||
343 ( ( usage & PSA_KEY_USAGE_ENCRYPT ) == 0 &&
344 ( status == PSA_ERROR_INVALID_ARGUMENT ||
345 status == PSA_ERROR_INVALID_PADDING ) ) );
346 }
347
348 return( 1 );
349
350exit:
351 return( 0 );
352}
Gilles Peskine02b75072018-07-01 22:31:34 +0200353
354static int exercise_key( psa_key_slot_t slot,
355 psa_key_usage_t usage,
356 psa_algorithm_t alg )
357{
358 int ok;
359 if( alg == 0 )
360 ok = 1; /* If no algorihm, do nothing (used for raw data "keys"). */
361 else if( PSA_ALG_IS_MAC( alg ) )
362 ok = exercise_mac_key( slot, usage, alg );
363 else if( PSA_ALG_IS_CIPHER( alg ) )
364 ok = exercise_cipher_key( slot, usage, alg );
365 else if( PSA_ALG_IS_AEAD( alg ) )
366 ok = exercise_aead_key( slot, usage, alg );
367 else if( PSA_ALG_IS_SIGN( alg ) )
368 ok = exercise_signature_key( slot, usage, alg );
369 else if( PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) )
370 ok = exercise_asymmetric_encryption_key( slot, usage, alg );
371 else
372 {
373 char message[40];
374 mbedtls_snprintf( message, sizeof( message ),
375 "No code to exercise alg=0x%08lx",
376 (unsigned long) alg );
377 test_fail( message, __LINE__, __FILE__ );
378 ok = 0;
379 }
380 return( ok );
381}
382
Gilles Peskinee59236f2018-01-27 23:32:46 +0100383/* END_HEADER */
384
385/* BEGIN_DEPENDENCIES
386 * depends_on:MBEDTLS_PSA_CRYPTO_C
387 * END_DEPENDENCIES
388 */
389
390/* BEGIN_CASE */
Gilles Peskine2d277862018-06-18 15:41:12 +0200391void init_deinit( )
Gilles Peskinee59236f2018-01-27 23:32:46 +0100392{
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100393 psa_status_t status;
Gilles Peskinee59236f2018-01-27 23:32:46 +0100394 int i;
395 for( i = 0; i <= 1; i++ )
396 {
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100397 status = psa_crypto_init( );
398 TEST_ASSERT( status == PSA_SUCCESS );
399 status = psa_crypto_init( );
400 TEST_ASSERT( status == PSA_SUCCESS );
Gilles Peskinee59236f2018-01-27 23:32:46 +0100401 mbedtls_psa_crypto_free( );
402 }
403}
404/* END_CASE */
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100405
406/* BEGIN_CASE */
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200407void import( data_t *data, int type, int expected_status_arg )
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100408{
409 int slot = 1;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200410 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100411 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100412
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100413 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300414 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100415 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
416
Gilles Peskine4abf7412018-06-18 16:35:34 +0200417 status = psa_import_key( slot, type, data->x, data->len );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200418 TEST_ASSERT( status == expected_status );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100419 if( status == PSA_SUCCESS )
420 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
421
422exit:
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100423 mbedtls_psa_crypto_free( );
424}
425/* END_CASE */
426
427/* BEGIN_CASE */
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200428void import_rsa_made_up( int bits_arg, int keypair, int expected_status_arg )
429{
430 int slot = 1;
431 size_t bits = bits_arg;
432 psa_status_t expected_status = expected_status_arg;
433 psa_status_t status;
434 psa_key_type_t type =
435 keypair ? PSA_KEY_TYPE_RSA_KEYPAIR : PSA_KEY_TYPE_RSA_PUBLIC_KEY;
436 size_t buffer_size = /* Slight overapproximations */
437 keypair ? bits * 9 / 16 + 80 : bits / 8 + 20;
438 unsigned char *buffer = mbedtls_calloc( 1, buffer_size );
439 unsigned char *p;
440 int ret;
441 size_t length;
442
443 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
444 TEST_ASSERT( buffer != NULL );
445
446 TEST_ASSERT( ( ret = construct_fake_rsa_key( buffer, buffer_size, &p,
447 bits, keypair ) ) >= 0 );
448 length = ret;
449
450 /* Try importing the key */
451 status = psa_import_key( slot, type, p, length );
452 TEST_ASSERT( status == expected_status );
453 if( status == PSA_SUCCESS )
454 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
455
456exit:
457 mbedtls_free( buffer );
458 mbedtls_psa_crypto_free( );
459}
460/* END_CASE */
461
462/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300463void import_export( data_t *data,
Moran Pekera964a8f2018-06-04 18:42:36 +0300464 int type_arg,
465 int alg_arg,
466 int usage_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100467 int expected_bits,
468 int export_size_delta,
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200469 int expected_export_status_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100470 int canonical_input )
471{
472 int slot = 1;
473 int slot2 = slot + 1;
474 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200475 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200476 psa_status_t expected_export_status = expected_export_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100477 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100478 unsigned char *exported = NULL;
479 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100480 size_t export_size;
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100481 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100482 size_t reexported_length;
483 psa_key_type_t got_type;
484 size_t got_bits;
Gilles Peskinedec72612018-06-18 18:12:37 +0200485 psa_key_policy_t policy;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100486
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100487 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300488 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
489 export_size = (ssize_t) data->len + export_size_delta;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100490 exported = mbedtls_calloc( 1, export_size );
491 TEST_ASSERT( exported != NULL );
492 if( ! canonical_input )
493 {
494 reexported = mbedtls_calloc( 1, export_size );
495 TEST_ASSERT( reexported != NULL );
496 }
497 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
498
mohammad1603a97cb8c2018-03-28 03:46:26 -0700499 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200500 psa_key_policy_set_usage( &policy, usage_arg, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -0700501 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
502
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100503 /* Import the key */
504 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200505 data->x, data->len ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100506
507 /* Test the key information */
508 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200509 &got_type,
510 &got_bits ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100511 TEST_ASSERT( got_type == type );
512 TEST_ASSERT( got_bits == (size_t) expected_bits );
513
514 /* Export the key */
515 status = psa_export_key( slot,
516 exported, export_size,
517 &exported_length );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200518 TEST_ASSERT( status == expected_export_status );
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100519
520 /* The exported length must be set by psa_export_key() to a value between 0
521 * and export_size. On errors, the exported length must be 0. */
522 TEST_ASSERT( exported_length != INVALID_EXPORT_LENGTH );
523 TEST_ASSERT( status == PSA_SUCCESS || exported_length == 0 );
524 TEST_ASSERT( exported_length <= export_size );
525
Gilles Peskine3f669c32018-06-21 09:21:51 +0200526 TEST_ASSERT( mem_is_zero( exported + exported_length,
527 export_size - exported_length ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100528 if( status != PSA_SUCCESS )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200529 {
530 TEST_ASSERT( exported_length == 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100531 goto destroy;
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200532 }
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100533
534 if( canonical_input )
535 {
Gilles Peskine4abf7412018-06-18 16:35:34 +0200536 TEST_ASSERT( exported_length == data->len );
537 TEST_ASSERT( memcmp( exported, data->x, data->len ) == 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100538 }
539 else
540 {
mohammad1603a97cb8c2018-03-28 03:46:26 -0700541 TEST_ASSERT( psa_set_key_policy( slot2, &policy ) == PSA_SUCCESS );
542
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100543 TEST_ASSERT( psa_import_key( slot2, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200544 exported,
545 export_size ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100546 TEST_ASSERT( psa_export_key( slot2,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200547 reexported,
548 export_size,
549 &reexported_length ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100550 TEST_ASSERT( reexported_length == exported_length );
551 TEST_ASSERT( memcmp( reexported, exported,
552 exported_length ) == 0 );
553 }
554
555destroy:
556 /* Destroy the key */
557 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
558 TEST_ASSERT( psa_get_key_information(
559 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
560
561exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300562 mbedtls_free( exported );
563 mbedtls_free( reexported );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100564 mbedtls_psa_crypto_free( );
565}
566/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100567
Moran Pekerf709f4a2018-06-06 17:26:04 +0300568/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300569void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200570 int type_arg,
571 int alg_arg,
572 int expected_bits,
573 int public_key_expected_length,
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200574 int expected_export_status_arg )
Moran Pekerf709f4a2018-06-06 17:26:04 +0300575{
576 int slot = 1;
577 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200578 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200579 psa_status_t expected_export_status = expected_export_status_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300580 psa_status_t status;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300581 unsigned char *exported = NULL;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300582 size_t export_size;
Jaeden Amero2a671e92018-06-27 17:47:40 +0100583 size_t exported_length = INVALID_EXPORT_LENGTH;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300584 psa_key_type_t got_type;
585 size_t got_bits;
Gilles Peskinedec72612018-06-18 18:12:37 +0200586 psa_key_policy_t policy;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300587
Moran Pekerf709f4a2018-06-06 17:26:04 +0300588 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300589 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
590 export_size = (ssize_t) data->len;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300591 exported = mbedtls_calloc( 1, export_size );
592 TEST_ASSERT( exported != NULL );
593
594 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
595
596 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200597 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, alg );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300598 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
599
600 /* Import the key */
601 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200602 data->x, data->len ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300603
604 /* Test the key information */
605 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200606 &got_type,
607 &got_bits ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300608 TEST_ASSERT( got_type == type );
609 TEST_ASSERT( got_bits == (size_t) expected_bits );
610
611 /* Export the key */
612 status = psa_export_public_key( slot,
Gilles Peskine2d277862018-06-18 15:41:12 +0200613 exported, export_size,
614 &exported_length );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200615 TEST_ASSERT( status == expected_export_status );
Jaeden Amero2a671e92018-06-27 17:47:40 +0100616 TEST_ASSERT( exported_length == (size_t) public_key_expected_length );
617 TEST_ASSERT( mem_is_zero( exported + exported_length,
618 export_size - exported_length ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300619 if( status != PSA_SUCCESS )
620 goto destroy;
621
Moran Pekerf709f4a2018-06-06 17:26:04 +0300622destroy:
623 /* Destroy the key */
624 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
625 TEST_ASSERT( psa_get_key_information(
626 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
627
628exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300629 mbedtls_free( exported );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300630 mbedtls_psa_crypto_free( );
631}
632/* END_CASE */
633
Gilles Peskine20035e32018-02-03 22:44:14 +0100634/* BEGIN_CASE */
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200635void import_and_exercise_key( data_t *data,
636 int type_arg,
637 int bits_arg,
638 int alg_arg )
639{
640 int slot = 1;
641 psa_key_type_t type = type_arg;
642 size_t bits = bits_arg;
643 psa_algorithm_t alg = alg_arg;
644 psa_key_usage_t usage =
645 ( PSA_ALG_IS_MAC( alg ) || PSA_ALG_IS_SIGN( alg ) ?
646 ( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ?
647 PSA_KEY_USAGE_VERIFY :
648 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY ) :
649 PSA_ALG_IS_CIPHER( alg ) || PSA_ALG_IS_AEAD( alg ) ||
650 PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) ?
651 ( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ?
652 PSA_KEY_USAGE_ENCRYPT :
653 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT ) :
654 0 );
655 psa_key_policy_t policy;
656 psa_key_type_t got_type;
657 size_t got_bits;
658 psa_status_t status;
659
660 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
661
662 psa_key_policy_init( &policy );
663 psa_key_policy_set_usage( &policy, usage, alg );
664 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
665
666 /* Import the key */
667 status = psa_import_key( slot, type, data->x, data->len );
668 TEST_ASSERT( status == PSA_SUCCESS );
669
670 /* Test the key information */
671 TEST_ASSERT( psa_get_key_information( slot,
672 &got_type,
673 &got_bits ) == PSA_SUCCESS );
674 TEST_ASSERT( got_type == type );
675 TEST_ASSERT( got_bits == bits );
676
677 /* Do something with the key according to its type and permitted usage. */
Gilles Peskine02b75072018-07-01 22:31:34 +0200678 if( ! exercise_key( slot, usage, alg ) )
679 goto exit;
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200680
681exit:
682 psa_destroy_key( slot );
683 mbedtls_psa_crypto_free( );
684}
685/* END_CASE */
686
687/* BEGIN_CASE */
Gilles Peskined5b33222018-06-18 22:20:03 +0200688void key_policy( int usage_arg, int alg_arg )
689{
690 int key_slot = 1;
691 psa_algorithm_t alg = alg_arg;
692 psa_key_usage_t usage = usage_arg;
693 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
694 unsigned char key[32] = {0};
695 psa_key_policy_t policy_set;
696 psa_key_policy_t policy_get;
697
698 memset( key, 0x2a, sizeof( key ) );
699
700 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
701
702 psa_key_policy_init( &policy_set );
703 psa_key_policy_init( &policy_get );
704
705 psa_key_policy_set_usage( &policy_set, usage, alg );
706
707 TEST_ASSERT( psa_key_policy_get_usage( &policy_set ) == usage );
708 TEST_ASSERT( psa_key_policy_get_algorithm( &policy_set ) == alg );
709 TEST_ASSERT( psa_set_key_policy( key_slot, &policy_set ) == PSA_SUCCESS );
710
711 TEST_ASSERT( psa_import_key( key_slot, key_type,
712 key, sizeof( key ) ) == PSA_SUCCESS );
713
714 TEST_ASSERT( psa_get_key_policy( key_slot, &policy_get ) == PSA_SUCCESS );
715
716 TEST_ASSERT( policy_get.usage == policy_set.usage );
717 TEST_ASSERT( policy_get.alg == policy_set.alg );
718
719exit:
720 psa_destroy_key( key_slot );
721 mbedtls_psa_crypto_free( );
722}
723/* END_CASE */
724
725/* BEGIN_CASE */
726void key_policy_fail( int usage_arg, int alg_arg, int expected_status,
727 data_t *keypair )
728{
729 int key_slot = 1;
730 psa_algorithm_t alg = alg_arg;
731 psa_key_usage_t usage = usage_arg;
732 size_t signature_length = 0;
733 psa_key_policy_t policy;
734 int actual_status = PSA_SUCCESS;
735
736 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
737
738 psa_key_policy_init( &policy );
739 psa_key_policy_set_usage( &policy, usage, alg );
740 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
741
742 if( usage & PSA_KEY_USAGE_EXPORT )
743 {
744 TEST_ASSERT( keypair != NULL );
745 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
746 TEST_ASSERT( psa_import_key( key_slot,
747 PSA_KEY_TYPE_RSA_KEYPAIR,
748 keypair->x,
749 keypair->len ) == PSA_SUCCESS );
750 actual_status = psa_asymmetric_sign( key_slot, alg,
751 NULL, 0,
752 NULL, 0,
753 NULL, 0, &signature_length );
754 }
755
756 if( usage & PSA_KEY_USAGE_SIGN )
757 {
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100758 size_t data_length;
Gilles Peskined5b33222018-06-18 22:20:03 +0200759 TEST_ASSERT( keypair != NULL );
760 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
761 TEST_ASSERT( psa_import_key( key_slot,
762 PSA_KEY_TYPE_RSA_KEYPAIR,
763 keypair->x,
764 keypair->len ) == PSA_SUCCESS );
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100765 actual_status = psa_export_key( key_slot, NULL, 0, &data_length );
Gilles Peskined5b33222018-06-18 22:20:03 +0200766 }
767
768 TEST_ASSERT( actual_status == expected_status );
769
770exit:
771 psa_destroy_key( key_slot );
772 mbedtls_psa_crypto_free( );
773}
774/* END_CASE */
775
776/* BEGIN_CASE */
777void key_lifetime( int lifetime_arg )
778{
779 int key_slot = 1;
780 psa_key_type_t key_type = PSA_ALG_CBC_BASE;
781 unsigned char key[32] = {0};
782 psa_key_lifetime_t lifetime_set = lifetime_arg;
783 psa_key_lifetime_t lifetime_get;
784
785 memset( key, 0x2a, sizeof( key ) );
786
787 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
788
789 TEST_ASSERT( psa_set_key_lifetime( key_slot,
790 lifetime_set ) == PSA_SUCCESS );
791
792 TEST_ASSERT( psa_import_key( key_slot, key_type,
793 key, sizeof( key ) ) == PSA_SUCCESS );
794
795 TEST_ASSERT( psa_get_key_lifetime( key_slot,
796 &lifetime_get ) == PSA_SUCCESS );
797
798 TEST_ASSERT( lifetime_get == lifetime_set );
799
800exit:
801 psa_destroy_key( key_slot );
802 mbedtls_psa_crypto_free( );
803}
804/* END_CASE */
805
806/* BEGIN_CASE */
807void key_lifetime_set_fail( int key_slot_arg,
808 int lifetime_arg,
809 int expected_status_arg )
810{
811 psa_key_slot_t key_slot = key_slot_arg;
812 psa_key_lifetime_t lifetime_set = lifetime_arg;
813 psa_status_t actual_status;
814 psa_status_t expected_status = expected_status_arg;
815
816 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
817
818 actual_status = psa_set_key_lifetime( key_slot, lifetime_set );
819
820 if( actual_status == PSA_SUCCESS )
821 actual_status = psa_set_key_lifetime( key_slot, lifetime_set );
822
823 TEST_ASSERT( expected_status == actual_status );
824
825exit:
826 psa_destroy_key( key_slot );
827 mbedtls_psa_crypto_free( );
828}
829/* END_CASE */
830
831/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200832void hash_setup( int alg_arg,
833 int expected_status_arg )
834{
835 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200836 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200837 psa_hash_operation_t operation;
838 psa_status_t status;
839
840 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
841
842 status = psa_hash_start( &operation, alg );
843 psa_hash_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200844 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200845
846exit:
847 mbedtls_psa_crypto_free( );
848}
849/* END_CASE */
850
851/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300852void hash_finish( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100853{
854 psa_algorithm_t alg = alg_arg;
Gilles Peskineb3e6e5d2018-06-18 22:16:43 +0200855 unsigned char actual_hash[PSA_HASH_MAX_SIZE];
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100856 size_t actual_hash_length;
857 psa_hash_operation_t operation;
858
Gilles Peskine69c12672018-06-28 00:07:19 +0200859 TEST_ASSERT( expected_hash->len == PSA_HASH_SIZE( alg ) );
860 TEST_ASSERT( expected_hash->len <= PSA_HASH_MAX_SIZE );
861
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100862 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300863 TEST_ASSERT( expected_hash != NULL );
864 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
865 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100866
867 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
868
869 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
870 TEST_ASSERT( psa_hash_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200871 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100872 TEST_ASSERT( psa_hash_finish( &operation,
873 actual_hash, sizeof( actual_hash ),
874 &actual_hash_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200875 TEST_ASSERT( actual_hash_length == expected_hash->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300876 TEST_ASSERT( memcmp( expected_hash->x, actual_hash,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200877 expected_hash->len ) == 0 );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100878
879exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100880 mbedtls_psa_crypto_free( );
881}
882/* END_CASE */
883
884/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300885void hash_verify( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100886{
887 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100888 psa_hash_operation_t operation;
889
Gilles Peskine69c12672018-06-28 00:07:19 +0200890 TEST_ASSERT( expected_hash->len == PSA_HASH_SIZE( alg ) );
891 TEST_ASSERT( expected_hash->len <= PSA_HASH_MAX_SIZE );
892
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100893 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300894 TEST_ASSERT( expected_hash != NULL );
895 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
896 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100897
898 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
899
900 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
901 TEST_ASSERT( psa_hash_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200902 input->x,
903 input->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100904 TEST_ASSERT( psa_hash_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300905 expected_hash->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200906 expected_hash->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100907
908exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100909 mbedtls_psa_crypto_free( );
910}
911/* END_CASE */
912
913/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200914void mac_setup( int key_type_arg,
915 data_t *key,
916 int alg_arg,
917 int expected_status_arg )
918{
919 int key_slot = 1;
920 psa_key_type_t key_type = key_type_arg;
921 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200922 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200923 psa_mac_operation_t operation;
924 psa_key_policy_t policy;
925 psa_status_t status;
926
927 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
928
929 psa_key_policy_init( &policy );
930 psa_key_policy_set_usage( &policy,
931 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
932 alg );
933 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
934
935 TEST_ASSERT( psa_import_key( key_slot, key_type,
936 key->x, key->len ) == PSA_SUCCESS );
937
938 status = psa_mac_start( &operation, key_slot, alg );
939 psa_mac_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200940 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200941
942exit:
943 psa_destroy_key( key_slot );
944 mbedtls_psa_crypto_free( );
945}
946/* END_CASE */
947
948/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +0200949void mac_verify( int key_type_arg,
950 data_t *key,
951 int alg_arg,
952 data_t *input,
953 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +0100954{
955 int key_slot = 1;
956 psa_key_type_t key_type = key_type_arg;
957 psa_algorithm_t alg = alg_arg;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100958 psa_mac_operation_t operation;
mohammad16036df908f2018-04-02 08:34:15 -0700959 psa_key_policy_t policy;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100960
Gilles Peskine69c12672018-06-28 00:07:19 +0200961 TEST_ASSERT( expected_mac->len <= PSA_MAC_MAX_SIZE );
962
Gilles Peskine8c9def32018-02-08 10:02:12 +0100963 TEST_ASSERT( key != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100964 TEST_ASSERT( input != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100965 TEST_ASSERT( expected_mac != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300966 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300967 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
968 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100969
970 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
971
mohammad16036df908f2018-04-02 08:34:15 -0700972 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200973 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
mohammad16036df908f2018-04-02 08:34:15 -0700974 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
975
Gilles Peskine8c9def32018-02-08 10:02:12 +0100976 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200977 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskinec0ec9722018-06-18 17:03:37 +0200978
Gilles Peskine8c9def32018-02-08 10:02:12 +0100979 TEST_ASSERT( psa_mac_start( &operation, key_slot, alg ) == PSA_SUCCESS );
980 TEST_ASSERT( psa_destroy_key( key_slot ) == PSA_SUCCESS );
981 TEST_ASSERT( psa_mac_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200982 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100983 TEST_ASSERT( psa_mac_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300984 expected_mac->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200985 expected_mac->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100986
987exit:
Gilles Peskine8c9def32018-02-08 10:02:12 +0100988 psa_destroy_key( key_slot );
989 mbedtls_psa_crypto_free( );
990}
991/* END_CASE */
992
993/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200994void cipher_setup( int key_type_arg,
995 data_t *key,
996 int alg_arg,
997 int expected_status_arg )
998{
999 int key_slot = 1;
1000 psa_key_type_t key_type = key_type_arg;
1001 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001002 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001003 psa_cipher_operation_t operation;
1004 psa_key_policy_t policy;
1005 psa_status_t status;
1006
1007 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1008
1009 psa_key_policy_init( &policy );
1010 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
1011 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1012
1013 TEST_ASSERT( psa_import_key( key_slot, key_type,
1014 key->x, key->len ) == PSA_SUCCESS );
1015
1016 status = psa_encrypt_setup( &operation, key_slot, alg );
1017 psa_cipher_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001018 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001019
1020exit:
1021 psa_destroy_key( key_slot );
1022 mbedtls_psa_crypto_free( );
1023}
1024/* END_CASE */
1025
1026/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02001027void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001028 data_t *key,
1029 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001030 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001031{
1032 int key_slot = 1;
1033 psa_status_t status;
1034 psa_key_type_t key_type = key_type_arg;
1035 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001036 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001037 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001038 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001039 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001040 size_t output_buffer_size = 0;
1041 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001042 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001043 psa_cipher_operation_t operation;
1044
Gilles Peskine50e586b2018-06-08 14:28:46 +02001045 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001046 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001047 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001048 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1049 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1050 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001051
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001052 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1053 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001054
1055 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1056
1057 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001058 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001059
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001060 TEST_ASSERT( psa_encrypt_setup( &operation,
1061 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001062
1063 TEST_ASSERT( psa_encrypt_set_iv( &operation,
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001064 iv, iv_size ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03001065 output_buffer_size = (size_t) input->len +
1066 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001067 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001068 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001069
Gilles Peskine4abf7412018-06-18 16:35:34 +02001070 TEST_ASSERT( psa_cipher_update( &operation,
1071 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001072 output, output_buffer_size,
1073 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001074 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001075 status = psa_cipher_finish( &operation,
1076 output + function_output_length,
1077 output_buffer_size,
1078 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001079 total_output_length += function_output_length;
1080
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001081 TEST_ASSERT( status == expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001082 if( expected_status == PSA_SUCCESS )
1083 {
1084 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001085 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001086 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001087 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001088 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001089
Gilles Peskine50e586b2018-06-08 14:28:46 +02001090exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001091 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001092 psa_destroy_key( key_slot );
1093 mbedtls_psa_crypto_free( );
1094}
1095/* END_CASE */
1096
1097/* BEGIN_CASE */
1098void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001099 data_t *key,
1100 data_t *input,
1101 int first_part_size,
1102 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001103{
1104 int key_slot = 1;
1105 psa_key_type_t key_type = key_type_arg;
1106 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001107 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001108 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001109 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001110 size_t output_buffer_size = 0;
1111 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001112 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001113 psa_cipher_operation_t operation;
1114
Gilles Peskine50e586b2018-06-08 14:28:46 +02001115 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001116 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001117 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001118 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1119 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1120 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001121
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001122 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1123 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001124
1125 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1126
1127 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001128 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001129
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001130 TEST_ASSERT( psa_encrypt_setup( &operation,
1131 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001132
1133 TEST_ASSERT( psa_encrypt_set_iv( &operation,
1134 iv, sizeof( iv ) ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03001135 output_buffer_size = (size_t) input->len +
1136 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001137 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001138 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001139
Gilles Peskine4abf7412018-06-18 16:35:34 +02001140 TEST_ASSERT( (unsigned int) first_part_size < input->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001141 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001142 output, output_buffer_size,
1143 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001144 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001145 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001146 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001147 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001148 output, output_buffer_size,
1149 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001150 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001151 TEST_ASSERT( psa_cipher_finish( &operation,
1152 output + function_output_length,
1153 output_buffer_size,
1154 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001155 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001156 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
1157
Gilles Peskine4abf7412018-06-18 16:35:34 +02001158 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001159 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001160 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001161
1162exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001163 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001164 psa_destroy_key( key_slot );
1165 mbedtls_psa_crypto_free( );
1166}
1167/* END_CASE */
1168
1169/* BEGIN_CASE */
1170void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001171 data_t *key,
1172 data_t *input,
1173 int first_part_size,
1174 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001175{
1176 int key_slot = 1;
1177
1178 psa_key_type_t key_type = key_type_arg;
1179 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001180 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001181 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001182 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001183 size_t output_buffer_size = 0;
1184 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001185 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001186 psa_cipher_operation_t operation;
1187
Gilles Peskine50e586b2018-06-08 14:28:46 +02001188 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001189 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001190 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001191 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1192 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1193 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001194
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001195 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1196 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001197
1198 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1199
1200 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001201 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001202
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001203 TEST_ASSERT( psa_decrypt_setup( &operation,
1204 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001205
1206 TEST_ASSERT( psa_encrypt_set_iv( &operation,
1207 iv, sizeof( iv ) ) == PSA_SUCCESS );
1208
mohammad16033d91abe2018-07-03 13:15:54 +03001209 output_buffer_size = (size_t) input->len +
1210 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001211 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001212 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001213
Gilles Peskine4abf7412018-06-18 16:35:34 +02001214 TEST_ASSERT( (unsigned int) first_part_size < input->len );
1215 TEST_ASSERT( psa_cipher_update( &operation,
1216 input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001217 output, output_buffer_size,
1218 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001219 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001220 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001221 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001222 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001223 output, output_buffer_size,
1224 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001225 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001226 TEST_ASSERT( psa_cipher_finish( &operation,
1227 output + function_output_length,
1228 output_buffer_size,
1229 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001230 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001231 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
1232
Gilles Peskine4abf7412018-06-18 16:35:34 +02001233 TEST_ASSERT( total_output_length == expected_output->len );
Gilles Peskine2d277862018-06-18 15:41:12 +02001234 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001235 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001236
1237exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001238 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001239 psa_destroy_key( key_slot );
1240 mbedtls_psa_crypto_free( );
1241}
1242/* END_CASE */
1243
Gilles Peskine50e586b2018-06-08 14:28:46 +02001244/* BEGIN_CASE */
1245void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001246 data_t *key,
1247 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001248 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001249{
1250 int key_slot = 1;
1251 psa_status_t status;
1252 psa_key_type_t key_type = key_type_arg;
1253 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001254 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001255 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001256 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001257 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001258 size_t output_buffer_size = 0;
1259 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001260 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001261 psa_cipher_operation_t operation;
1262
Gilles Peskine50e586b2018-06-08 14:28:46 +02001263 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001264 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001265 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001266 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1267 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1268 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001269
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001270 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1271 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001272
1273 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1274
1275 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001276 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001277
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001278 TEST_ASSERT( psa_decrypt_setup( &operation,
1279 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001280
1281 TEST_ASSERT( psa_encrypt_set_iv( &operation,
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001282 iv, iv_size ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001283
mohammad16033d91abe2018-07-03 13:15:54 +03001284 output_buffer_size = (size_t) input->len +
1285 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001286 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001287 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001288
Gilles Peskine4abf7412018-06-18 16:35:34 +02001289 TEST_ASSERT( psa_cipher_update( &operation,
1290 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001291 output, output_buffer_size,
1292 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001293 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001294 status = psa_cipher_finish( &operation,
1295 output + function_output_length,
1296 output_buffer_size,
1297 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001298 total_output_length += function_output_length;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001299 TEST_ASSERT( status == expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001300
1301 if( expected_status == PSA_SUCCESS )
1302 {
1303 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001304 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001305 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001306 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001307 }
1308
Gilles Peskine50e586b2018-06-08 14:28:46 +02001309exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001310 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001311 psa_destroy_key( key_slot );
1312 mbedtls_psa_crypto_free( );
1313}
1314/* END_CASE */
1315
Gilles Peskine50e586b2018-06-08 14:28:46 +02001316/* BEGIN_CASE */
1317void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001318 data_t *key,
1319 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02001320{
1321 int key_slot = 1;
1322 psa_key_type_t key_type = key_type_arg;
1323 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -07001324 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +02001325 size_t iv_size = 16;
1326 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001327 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001328 size_t output1_size = 0;
1329 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001330 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001331 size_t output2_size = 0;
1332 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001333 size_t function_output_length = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001334 psa_cipher_operation_t operation1;
1335 psa_cipher_operation_t operation2;
1336
mohammad1603d7d7ba52018-03-12 18:51:53 +02001337 TEST_ASSERT( key != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001338 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001339 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1340 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001341
mohammad1603d7d7ba52018-03-12 18:51:53 +02001342 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1343
1344 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001345 key->x, key->len ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001346
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001347 TEST_ASSERT( psa_encrypt_setup( &operation1,
1348 key_slot, alg ) == PSA_SUCCESS );
1349 TEST_ASSERT( psa_decrypt_setup( &operation2,
1350 key_slot, alg ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001351
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001352 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
1353 iv, iv_size,
1354 &iv_length ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03001355 output1_size = (size_t) input->len +
1356 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001357 output1 = mbedtls_calloc( 1, output1_size );
1358 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001359
Gilles Peskine4abf7412018-06-18 16:35:34 +02001360 TEST_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001361 output1, output1_size,
1362 &output1_length ) == PSA_SUCCESS );
1363 TEST_ASSERT( psa_cipher_finish( &operation1,
1364 output1 + output1_length, output1_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001365 &function_output_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001366
Gilles Peskine048b7f02018-06-08 14:20:49 +02001367 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001368
1369 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
1370
1371 output2_size = output1_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001372 output2 = mbedtls_calloc( 1, output2_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001373 TEST_ASSERT( output2 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001374
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001375 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
1376 iv, iv_length ) == PSA_SUCCESS );
1377 TEST_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
1378 output2, output2_size,
1379 &output2_length ) == PSA_SUCCESS );
Gilles Peskine048b7f02018-06-08 14:20:49 +02001380 function_output_length = 0;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001381 TEST_ASSERT( psa_cipher_finish( &operation2,
1382 output2 + output2_length,
1383 output2_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001384 &function_output_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001385
Gilles Peskine048b7f02018-06-08 14:20:49 +02001386 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001387
Janos Follath25c4fa82018-07-06 16:23:25 +01001388 TEST_ASSERT( psa_cipher_abort( &operation2 ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001389
Gilles Peskine4abf7412018-06-18 16:35:34 +02001390 TEST_ASSERT( input->len == output2_length );
1391 TEST_ASSERT( memcmp( input->x, output2, input->len ) == 0 );
Moran Pekerded84402018-06-06 16:36:50 +03001392
1393exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001394 mbedtls_free( output1 );
1395 mbedtls_free( output2 );
Moran Pekerded84402018-06-06 16:36:50 +03001396 psa_destroy_key( key_slot );
1397 mbedtls_psa_crypto_free( );
1398}
1399/* END_CASE */
1400
1401/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02001402void cipher_verify_output_multipart( int alg_arg,
1403 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001404 data_t *key,
1405 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001406 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +03001407{
1408 int key_slot = 1;
1409 psa_key_type_t key_type = key_type_arg;
1410 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +03001411 unsigned char iv[16] = {0};
1412 size_t iv_size = 16;
1413 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001414 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001415 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03001416 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001417 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001418 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03001419 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001420 size_t function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001421 psa_cipher_operation_t operation1;
1422 psa_cipher_operation_t operation2;
1423
Moran Pekerded84402018-06-06 16:36:50 +03001424 TEST_ASSERT( key != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001425 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001426 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1427 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001428
Moran Pekerded84402018-06-06 16:36:50 +03001429 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1430
1431 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001432 key->x, key->len ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001433
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001434 TEST_ASSERT( psa_encrypt_setup( &operation1,
1435 key_slot, alg ) == PSA_SUCCESS );
1436 TEST_ASSERT( psa_decrypt_setup( &operation2,
1437 key_slot, alg ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001438
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001439 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
1440 iv, iv_size,
1441 &iv_length ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03001442 output1_buffer_size = (size_t) input->len +
1443 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine048b7f02018-06-08 14:20:49 +02001444 output1 = mbedtls_calloc( 1, output1_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001445 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001446
Gilles Peskine4abf7412018-06-18 16:35:34 +02001447 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001448
itayzafrir3e02b3b2018-06-12 17:06:52 +03001449 TEST_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001450 output1, output1_buffer_size,
1451 &function_output_length ) == PSA_SUCCESS );
1452 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001453
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001454 TEST_ASSERT( psa_cipher_update( &operation1,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001455 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001456 input->len - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001457 output1, output1_buffer_size,
1458 &function_output_length ) == PSA_SUCCESS );
1459 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001460
Gilles Peskine048b7f02018-06-08 14:20:49 +02001461 TEST_ASSERT( psa_cipher_finish( &operation1,
1462 output1 + output1_length,
1463 output1_buffer_size - output1_length,
1464 &function_output_length ) == PSA_SUCCESS );
1465 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001466
1467 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
1468
Gilles Peskine048b7f02018-06-08 14:20:49 +02001469 output2_buffer_size = output1_length;
1470 output2 = mbedtls_calloc( 1, output2_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001471 TEST_ASSERT( output2 != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001472
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001473 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
1474 iv, iv_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001475
1476 TEST_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001477 output2, output2_buffer_size,
1478 &function_output_length ) == PSA_SUCCESS );
1479 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001480
Gilles Peskine048b7f02018-06-08 14:20:49 +02001481 TEST_ASSERT( psa_cipher_update( &operation2,
1482 output1 + first_part_size,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001483 output1_length - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001484 output2, output2_buffer_size,
1485 &function_output_length ) == PSA_SUCCESS );
1486 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001487
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001488 TEST_ASSERT( psa_cipher_finish( &operation2,
1489 output2 + output2_length,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001490 output2_buffer_size - output2_length,
1491 &function_output_length ) == PSA_SUCCESS );
1492 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001493
Janos Follath25c4fa82018-07-06 16:23:25 +01001494 TEST_ASSERT( psa_cipher_abort( &operation2 ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001495
Gilles Peskine4abf7412018-06-18 16:35:34 +02001496 TEST_ASSERT( input->len == output2_length );
1497 TEST_ASSERT( memcmp( input->x, output2, input->len ) == 0 );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001498
1499exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001500 mbedtls_free( output1 );
1501 mbedtls_free( output2 );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001502 psa_destroy_key( key_slot );
1503 mbedtls_psa_crypto_free( );
1504}
1505/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02001506
Gilles Peskine20035e32018-02-03 22:44:14 +01001507/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001508void aead_encrypt_decrypt( int key_type_arg,
1509 data_t * key_data,
1510 int alg_arg,
1511 data_t * input_data,
1512 data_t * nonce,
1513 data_t * additional_data,
1514 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001515{
1516 int slot = 1;
1517 psa_key_type_t key_type = key_type_arg;
1518 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001519 unsigned char *output_data = NULL;
1520 size_t output_size = 0;
1521 size_t output_length = 0;
1522 unsigned char *output_data2 = NULL;
1523 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001524 size_t tag_length = 16;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001525 psa_status_t expected_result = expected_result_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001526 psa_key_policy_t policy;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001527
Gilles Peskinea1cac842018-06-11 19:33:02 +02001528 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001529 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001530 TEST_ASSERT( nonce != NULL );
1531 TEST_ASSERT( additional_data != NULL );
1532 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1533 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1534 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
1535 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
1536
Gilles Peskine4abf7412018-06-18 16:35:34 +02001537 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001538 output_data = mbedtls_calloc( 1, output_size );
1539 TEST_ASSERT( output_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001540
1541 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1542
1543 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001544 psa_key_policy_set_usage( &policy,
1545 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
1546 alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001547 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1548
1549 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001550 key_data->x, key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001551
1552 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001553 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001554 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001555 additional_data->len,
1556 input_data->x, input_data->len,
1557 output_data, output_size,
1558 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001559
1560 if( PSA_SUCCESS == expected_result )
1561 {
1562 output_data2 = mbedtls_calloc( 1, output_length );
1563 TEST_ASSERT( output_data2 != NULL );
1564
1565 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001566 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001567 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001568 additional_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001569 output_data, output_length,
1570 output_data2, output_length,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001571 &output_length2 ) == expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02001572
itayzafrir3e02b3b2018-06-12 17:06:52 +03001573 TEST_ASSERT( memcmp( input_data->x, output_data2,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001574 input_data->len ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001575 }
Gilles Peskine2d277862018-06-18 15:41:12 +02001576
Gilles Peskinea1cac842018-06-11 19:33:02 +02001577exit:
1578 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001579 mbedtls_free( output_data );
1580 mbedtls_free( output_data2 );
1581 mbedtls_psa_crypto_free( );
1582}
1583/* END_CASE */
1584
1585/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001586void aead_encrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001587 int alg_arg, data_t * input_data,
1588 data_t * additional_data, data_t * nonce,
1589 data_t * expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001590{
1591 int slot = 1;
1592 psa_key_type_t key_type = key_type_arg;
1593 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001594 unsigned char *output_data = NULL;
1595 size_t output_size = 0;
1596 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001597 size_t tag_length = 16;
Gilles Peskinedec72612018-06-18 18:12:37 +02001598 psa_key_policy_t policy;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001599
Gilles Peskinea1cac842018-06-11 19:33:02 +02001600 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001601 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001602 TEST_ASSERT( additional_data != NULL );
1603 TEST_ASSERT( nonce != NULL );
1604 TEST_ASSERT( expected_result != NULL );
1605 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1606 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1607 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
1608 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
1609 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_result->len ) );
1610
Gilles Peskine4abf7412018-06-18 16:35:34 +02001611 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001612 output_data = mbedtls_calloc( 1, output_size );
1613 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +02001614
Gilles Peskinea1cac842018-06-11 19:33:02 +02001615 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1616
1617 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001618 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001619 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1620
1621 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001622 key_data->x,
1623 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001624
1625 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001626 nonce->x, nonce->len,
1627 additional_data->x, additional_data->len,
1628 input_data->x, input_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001629 output_data, output_size,
1630 &output_length ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001631
itayzafrir3e02b3b2018-06-12 17:06:52 +03001632 TEST_ASSERT( memcmp( output_data, expected_result->x,
Gilles Peskine2d277862018-06-18 15:41:12 +02001633 output_length ) == 0 );
1634
Gilles Peskinea1cac842018-06-11 19:33:02 +02001635exit:
1636 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001637 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001638 mbedtls_psa_crypto_free( );
1639}
1640/* END_CASE */
1641
1642/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001643void aead_decrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001644 int alg_arg, data_t * input_data,
1645 data_t * additional_data, data_t * nonce,
1646 data_t * expected_data, int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001647{
1648 int slot = 1;
1649 psa_key_type_t key_type = key_type_arg;
1650 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001651 unsigned char *output_data = NULL;
1652 size_t output_size = 0;
1653 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001654 size_t tag_length = 16;
Gilles Peskinedec72612018-06-18 18:12:37 +02001655 psa_key_policy_t policy;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001656 psa_status_t expected_result = expected_result_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001657
Gilles Peskinea1cac842018-06-11 19:33:02 +02001658 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001659 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001660 TEST_ASSERT( additional_data != NULL );
1661 TEST_ASSERT( nonce != NULL );
1662 TEST_ASSERT( expected_data != NULL );
1663 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1664 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1665 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
1666 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
1667 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
1668
Gilles Peskine4abf7412018-06-18 16:35:34 +02001669 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001670 output_data = mbedtls_calloc( 1, output_size );
1671 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +02001672
Gilles Peskinea1cac842018-06-11 19:33:02 +02001673 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1674
1675 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001676 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001677 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1678
1679 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001680 key_data->x,
1681 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001682
1683 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001684 nonce->x, nonce->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001685 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001686 additional_data->len,
1687 input_data->x, input_data->len,
1688 output_data, output_size,
1689 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001690
Gilles Peskine2d277862018-06-18 15:41:12 +02001691 if( expected_result == PSA_SUCCESS )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001692 {
itayzafrir3e02b3b2018-06-12 17:06:52 +03001693 TEST_ASSERT( memcmp( output_data, expected_data->x,
Gilles Peskine2d277862018-06-18 15:41:12 +02001694 output_length ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001695 }
1696
Gilles Peskinea1cac842018-06-11 19:33:02 +02001697exit:
1698 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001699 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001700 mbedtls_psa_crypto_free( );
1701}
1702/* END_CASE */
1703
1704/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001705void signature_size( int type_arg,
1706 int bits,
1707 int alg_arg,
1708 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01001709{
1710 psa_key_type_t type = type_arg;
1711 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +02001712 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinee59236f2018-01-27 23:32:46 +01001713 TEST_ASSERT( actual_size == (size_t) expected_size_arg );
1714exit:
1715 ;
1716}
1717/* END_CASE */
1718
1719/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001720void sign_deterministic( int key_type_arg, data_t *key_data,
1721 int alg_arg, data_t *input_data,
1722 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01001723{
1724 int slot = 1;
1725 psa_key_type_t key_type = key_type_arg;
1726 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001727 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01001728 unsigned char *signature = NULL;
1729 size_t signature_size;
1730 size_t signature_length = 0xdeadbeef;
Gilles Peskinedec72612018-06-18 18:12:37 +02001731 psa_key_policy_t policy;
Gilles Peskine20035e32018-02-03 22:44:14 +01001732
Gilles Peskine20035e32018-02-03 22:44:14 +01001733 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001734 TEST_ASSERT( input_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001735 TEST_ASSERT( output_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001736 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1737 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1738 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( output_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01001739
1740 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1741
mohammad1603a97cb8c2018-03-28 03:46:26 -07001742 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001743 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001744 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1745
Gilles Peskine20035e32018-02-03 22:44:14 +01001746 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001747 key_data->x,
1748 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001749 TEST_ASSERT( psa_get_key_information( slot,
1750 NULL,
1751 &key_bits ) == PSA_SUCCESS );
1752
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001753 /* Allocate a buffer which has the size advertized by the
1754 * library. */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001755 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
1756 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01001757 TEST_ASSERT( signature_size != 0 );
Gilles Peskine69c12672018-06-28 00:07:19 +02001758 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine20035e32018-02-03 22:44:14 +01001759 signature = mbedtls_calloc( 1, signature_size );
1760 TEST_ASSERT( signature != NULL );
1761
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001762 /* Perform the signature. */
Gilles Peskine20035e32018-02-03 22:44:14 +01001763 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001764 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001765 NULL, 0,
1766 signature, signature_size,
1767 &signature_length ) == PSA_SUCCESS );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001768 /* Verify that the signature is correct. */
Gilles Peskine4abf7412018-06-18 16:35:34 +02001769 TEST_ASSERT( signature_length == output_data->len );
Gilles Peskine2d277862018-06-18 15:41:12 +02001770 TEST_ASSERT( memcmp( signature, output_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001771 output_data->len ) == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001772
1773exit:
1774 psa_destroy_key( slot );
Gilles Peskine0189e752018-02-03 23:57:22 +01001775 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01001776 mbedtls_psa_crypto_free( );
1777}
1778/* END_CASE */
1779
1780/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001781void sign_fail( int key_type_arg, data_t *key_data,
1782 int alg_arg, data_t *input_data,
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001783 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01001784{
1785 int slot = 1;
1786 psa_key_type_t key_type = key_type_arg;
1787 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001788 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001789 psa_status_t actual_status;
1790 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01001791 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01001792 size_t signature_length = 0xdeadbeef;
Gilles Peskinedec72612018-06-18 18:12:37 +02001793 psa_key_policy_t policy;
Gilles Peskine20035e32018-02-03 22:44:14 +01001794
Gilles Peskine20035e32018-02-03 22:44:14 +01001795 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001796 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001797 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1798 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1799
Gilles Peskine20035e32018-02-03 22:44:14 +01001800 signature = mbedtls_calloc( 1, signature_size );
1801 TEST_ASSERT( signature != NULL );
1802
1803 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1804
mohammad1603a97cb8c2018-03-28 03:46:26 -07001805 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001806 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001807 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1808
Gilles Peskine20035e32018-02-03 22:44:14 +01001809 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001810 key_data->x,
1811 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001812
1813 actual_status = psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001814 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001815 NULL, 0,
1816 signature, signature_size,
1817 &signature_length );
1818 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001819 /* The value of *signature_length is unspecified on error, but
1820 * whatever it is, it should be less than signature_size, so that
1821 * if the caller tries to read *signature_length bytes without
1822 * checking the error code then they don't overflow a buffer. */
1823 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01001824
1825exit:
1826 psa_destroy_key( slot );
Gilles Peskine20035e32018-02-03 22:44:14 +01001827 mbedtls_free( signature );
1828 mbedtls_psa_crypto_free( );
1829}
1830/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03001831
1832/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001833void asymmetric_verify( int key_type_arg, data_t *key_data,
1834 int alg_arg, data_t *hash_data,
1835 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03001836{
1837 int slot = 1;
1838 psa_key_type_t key_type = key_type_arg;
1839 psa_algorithm_t alg = alg_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001840 psa_key_policy_t policy;
itayzafrir5c753392018-05-08 11:18:38 +03001841
Gilles Peskine69c12672018-06-28 00:07:19 +02001842 TEST_ASSERT( signature_data->len <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
1843
itayzafrir5c753392018-05-08 11:18:38 +03001844 TEST_ASSERT( key_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001845 TEST_ASSERT( hash_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001846 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001847 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1848 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1849 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03001850
1851 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1852
1853 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001854 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
itayzafrir5c753392018-05-08 11:18:38 +03001855 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1856
1857 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001858 key_data->x,
1859 key_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001860
1861 TEST_ASSERT( psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001862 hash_data->x, hash_data->len,
itayzafrir5c753392018-05-08 11:18:38 +03001863 NULL, 0,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001864 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001865 signature_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001866exit:
1867 psa_destroy_key( slot );
itayzafrir5c753392018-05-08 11:18:38 +03001868 mbedtls_psa_crypto_free( );
1869}
1870/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001871
1872/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001873void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
1874 int alg_arg, data_t *hash_data,
1875 data_t *signature_data,
1876 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001877{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001878 int slot = 1;
1879 psa_key_type_t key_type = key_type_arg;
1880 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001881 psa_status_t actual_status;
1882 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001883 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001884
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001885 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001886 TEST_ASSERT( hash_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001887 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001888 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1889 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1890 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001891
1892 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1893
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001894 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001895 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001896 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1897
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001898 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001899 key_data->x,
1900 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001901
1902 actual_status = psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001903 hash_data->x, hash_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001904 NULL, 0,
1905 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001906 signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001907
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001908 TEST_ASSERT( actual_status == expected_status );
1909
1910exit:
1911 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001912 mbedtls_psa_crypto_free( );
1913}
1914/* END_CASE */
1915
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001916/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001917void asymmetric_encrypt_decrypt( int key_type_arg, data_t *key_data,
1918 int alg_arg, data_t *input_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001919{
1920 int slot = 1;
1921 psa_key_type_t key_type = key_type_arg;
1922 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001923 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001924 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001925 size_t output_length = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001926 unsigned char *output2 = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001927 size_t output2_size = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001928 size_t output2_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02001929 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001930
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001931 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001932 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001933 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1934 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1935
Gilles Peskine4abf7412018-06-18 16:35:34 +02001936 output_size = key_data->len;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001937 output2_size = output_size;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001938 output = mbedtls_calloc( 1, output_size );
1939 TEST_ASSERT( output != NULL );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001940 output2 = mbedtls_calloc( 1, output2_size );
1941 TEST_ASSERT( output2 != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001942
1943 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1944
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001945 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001946 psa_key_policy_set_usage( &policy,
1947 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001948 alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001949 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1950
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001951 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001952 key_data->x,
1953 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001954
Gilles Peskineeebd7382018-06-08 18:11:54 +02001955 /* We test encryption by checking that encrypt-then-decrypt gives back
1956 * the original plaintext because of the non-optional random
1957 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine2d277862018-06-18 15:41:12 +02001958 TEST_ASSERT( psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001959 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001960 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001961 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001962 &output_length ) == PSA_SUCCESS );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001963
Gilles Peskine2d277862018-06-18 15:41:12 +02001964 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001965 output, output_length,
Gilles Peskine2d277862018-06-18 15:41:12 +02001966 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001967 output2, output2_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001968 &output2_length ) == PSA_SUCCESS );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001969 TEST_ASSERT( memcmp( input_data->x, output2,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001970 input_data->len ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001971
1972exit:
1973 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001974 mbedtls_free( output );
1975 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001976 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001977}
1978/* END_CASE */
1979
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001980/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001981void asymmetric_encrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001982 int alg_arg, data_t *input_data,
1983 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001984{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001985 int slot = 1;
1986 psa_key_type_t key_type = key_type_arg;
1987 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001988 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001989 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001990 size_t output_length = 0;
1991 psa_status_t actual_status;
1992 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001993 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001994
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001995 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001996 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001997 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1998 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1999
Gilles Peskine4abf7412018-06-18 16:35:34 +02002000 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002001 output = mbedtls_calloc( 1, output_size );
2002 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002003
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002004 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2005
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002006 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002007 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002008 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2009
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002010 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002011 key_data->x,
2012 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002013
Gilles Peskine2d277862018-06-18 15:41:12 +02002014 actual_status = psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002015 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002016 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002017 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002018 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002019 TEST_ASSERT( actual_status == expected_status );
2020
2021exit:
2022 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002023 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002024 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002025}
2026/* END_CASE */
2027
2028/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002029void asymmetric_decrypt( int key_type_arg, data_t *key_data,
2030 int alg_arg, data_t *input_data,
2031 data_t *expected_data, int expected_size )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002032{
2033 int slot = 1;
2034 psa_key_type_t key_type = key_type_arg;
2035 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002036 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002037 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002038 size_t output_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02002039 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002040
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002041 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002042 TEST_ASSERT( input_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002043 TEST_ASSERT( expected_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002044 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2045 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2046 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
2047
Gilles Peskine4abf7412018-06-18 16:35:34 +02002048 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002049 output = mbedtls_calloc( 1, output_size );
2050 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002051
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002052 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2053
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002054 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002055 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002056 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2057
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002058 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002059 key_data->x,
2060 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002061
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002062 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002063 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002064 NULL, 0,
2065 output,
2066 output_size,
2067 &output_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002068 TEST_ASSERT( (size_t) expected_size == output_length );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002069 TEST_ASSERT( memcmp( expected_data->x, output, output_length ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002070
2071exit:
2072 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002073 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002074 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002075}
2076/* END_CASE */
2077
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002078/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002079void asymmetric_decrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02002080 int alg_arg, data_t *input_data,
2081 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002082{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002083 int slot = 1;
2084 psa_key_type_t key_type = key_type_arg;
2085 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002086 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002087 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002088 size_t output_length = 0;
2089 psa_status_t actual_status;
2090 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002091 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002092
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002093 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002094 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002095 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2096 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2097
Gilles Peskine4abf7412018-06-18 16:35:34 +02002098 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002099 output = mbedtls_calloc( 1, output_size );
2100 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002101
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002102 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2103
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002104 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002105 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002106 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2107
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002108 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002109 key_data->x,
2110 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002111
Gilles Peskine2d277862018-06-18 15:41:12 +02002112 actual_status = psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002113 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002114 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002115 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002116 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002117 TEST_ASSERT( actual_status == expected_status );
2118
2119exit:
2120 psa_destroy_key( slot );
Gilles Peskine2d277862018-06-18 15:41:12 +02002121 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002122 mbedtls_psa_crypto_free( );
2123}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002124/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02002125
2126/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02002127void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02002128{
Gilles Peskinea50d7392018-06-21 10:22:13 +02002129 size_t bytes = bytes_arg;
2130 const unsigned char trail[] = "don't overwrite me";
2131 unsigned char *output = mbedtls_calloc( 1, bytes + sizeof( trail ) );
2132 unsigned char *changed = mbedtls_calloc( 1, bytes );
2133 size_t i;
2134 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02002135
Gilles Peskinea50d7392018-06-21 10:22:13 +02002136 TEST_ASSERT( output != NULL );
2137 TEST_ASSERT( changed != NULL );
2138 memcpy( output + bytes, trail, sizeof( trail ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02002139
2140 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2141
Gilles Peskinea50d7392018-06-21 10:22:13 +02002142 /* Run several times, to ensure that every output byte will be
2143 * nonzero at least once with overwhelming probability
2144 * (2^(-8*number_of_runs)). */
2145 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02002146 {
Gilles Peskinea50d7392018-06-21 10:22:13 +02002147 memset( output, 0, bytes );
2148 TEST_ASSERT( psa_generate_random( output, bytes ) == PSA_SUCCESS );
2149
2150 /* Check that no more than bytes have been overwritten */
2151 TEST_ASSERT( memcmp( output + bytes, trail, sizeof( trail ) ) == 0 );
2152
2153 for( i = 0; i < bytes; i++ )
2154 {
2155 if( output[i] != 0 )
2156 ++changed[i];
2157 }
Gilles Peskine05d69892018-06-19 22:00:52 +02002158 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02002159
2160 /* Check that every byte was changed to nonzero at least once. This
2161 * validates that psa_generate_random is overwriting every byte of
2162 * the output buffer. */
2163 for( i = 0; i < bytes; i++ )
2164 {
2165 TEST_ASSERT( changed[i] != 0 );
2166 }
Gilles Peskine05d69892018-06-19 22:00:52 +02002167
2168exit:
2169 mbedtls_psa_crypto_free( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02002170 mbedtls_free( output );
2171 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02002172}
2173/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02002174
2175/* BEGIN_CASE */
2176void generate_key( int type_arg,
2177 int bits_arg,
2178 int usage_arg,
2179 int alg_arg,
2180 int expected_status_arg )
2181{
2182 int slot = 1;
2183 psa_key_type_t type = type_arg;
2184 psa_key_usage_t usage = usage_arg;
2185 size_t bits = bits_arg;
2186 psa_algorithm_t alg = alg_arg;
2187 psa_status_t expected_status = expected_status_arg;
2188 psa_key_type_t got_type;
2189 size_t got_bits;
2190 unsigned char exported[616] = {0}; /* enough for a 1024-bit RSA key */
2191 size_t exported_length;
2192 psa_status_t expected_export_status =
2193 usage & PSA_KEY_USAGE_EXPORT ? PSA_SUCCESS : PSA_ERROR_NOT_PERMITTED;
2194 psa_status_t expected_info_status =
2195 expected_status == PSA_SUCCESS ? PSA_SUCCESS : PSA_ERROR_EMPTY_SLOT;
2196 psa_key_policy_t policy;
2197
2198 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2199
2200 psa_key_policy_init( &policy );
2201 psa_key_policy_set_usage( &policy, usage, alg );
2202 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2203
2204 /* Generate a key */
2205 TEST_ASSERT( psa_generate_key( slot, type, bits,
2206 NULL, 0 ) == expected_status );
2207
2208 /* Test the key information */
2209 TEST_ASSERT( psa_get_key_information( slot,
2210 &got_type,
2211 &got_bits ) == expected_info_status );
2212 if( expected_info_status != PSA_SUCCESS )
2213 goto exit;
2214 TEST_ASSERT( got_type == type );
2215 TEST_ASSERT( got_bits == bits );
2216
2217 /* Export the key */
2218 TEST_ASSERT( psa_export_key( slot,
2219 exported, sizeof( exported ),
2220 &exported_length ) == expected_export_status );
2221 if( expected_export_status == PSA_SUCCESS )
2222 {
Gilles Peskine48c0ea12018-06-21 14:15:31 +02002223 if( key_type_is_raw_bytes( type ) )
Gilles Peskine12313cd2018-06-20 00:20:32 +02002224 TEST_ASSERT( exported_length == ( bits + 7 ) / 8 );
2225#if defined(MBEDTLS_DES_C)
2226 if( type == PSA_KEY_TYPE_DES )
2227 {
2228 /* Check the parity bits. */
2229 unsigned i;
2230 for( i = 0; i < bits / 8; i++ )
2231 {
2232 unsigned bit_count = 0;
2233 unsigned m;
2234 for( m = 1; m <= 0x100; m <<= 1 )
2235 {
2236 if( exported[i] & m )
2237 ++bit_count;
2238 }
2239 TEST_ASSERT( bit_count % 2 != 0 );
2240 }
2241 }
2242#endif
2243#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_PARSE_C)
2244 if( type == PSA_KEY_TYPE_RSA_KEYPAIR )
2245 {
2246 /* Sanity check: does this look like the beginning of a PKCS#8
2247 * RSA key pair? Assumes bits is a multiple of 8. */
2248 size_t n_bytes = bits / 8 + 1;
2249 size_t n_encoded_bytes;
2250 unsigned char *n_end;
2251 TEST_ASSERT( exported_length >= 7 + ( n_bytes + 3 ) * 9 / 2 );
2252 TEST_ASSERT( exported[0] == 0x30 );
2253 TEST_ASSERT( exported[1] == 0x82 ); // assumes >=416-bit key
2254 TEST_ASSERT( exported[4] == 0x02 );
2255 TEST_ASSERT( exported[5] == 0x01 );
2256 TEST_ASSERT( exported[6] == 0x00 );
2257 TEST_ASSERT( exported[7] == 0x02 );
2258 n_encoded_bytes = exported[8];
2259 n_end = exported + 9 + n_encoded_bytes;
2260 if( n_encoded_bytes & 0x80 )
2261 {
2262 n_encoded_bytes = ( n_encoded_bytes & 0x7f ) << 7;
2263 n_encoded_bytes |= exported[9] & 0x7f;
2264 n_end += 1;
2265 }
2266 /* The encoding of n should start with a 0 byte since it should
2267 * have its high bit set. However Mbed TLS is not compliant and
2268 * generates an invalid, but widely tolerated, encoding of
2269 * positive INTEGERs with a bit size that is a multiple of 8
2270 * with no leading 0 byte. Accept this here. */
2271 TEST_ASSERT( n_bytes == n_encoded_bytes ||
2272 n_bytes == n_encoded_bytes + 1 );
2273 if( n_bytes == n_encoded_bytes )
2274 TEST_ASSERT( exported[n_encoded_bytes <= 127 ? 9 : 10] == 0x00 );
2275 /* Sanity check: e must be 3 */
2276 TEST_ASSERT( n_end[0] == 0x02 );
2277 TEST_ASSERT( n_end[1] == 0x03 );
2278 TEST_ASSERT( n_end[2] == 0x01 );
2279 TEST_ASSERT( n_end[3] == 0x00 );
2280 TEST_ASSERT( n_end[4] == 0x01 );
2281 TEST_ASSERT( n_end[5] == 0x02 );
2282 }
2283#endif /* MBEDTLS_RSA_C */
2284#if defined(MBEDTLS_ECP_C)
2285 if( PSA_KEY_TYPE_IS_ECC( type ) )
2286 {
2287 /* Sanity check: does this look like the beginning of a PKCS#8
2288 * elliptic curve key pair? */
2289 TEST_ASSERT( exported_length >= bits * 3 / 8 + 10 );
2290 TEST_ASSERT( exported[0] == 0x30 );
2291 }
2292#endif /* MBEDTLS_ECP_C */
2293 }
2294
Gilles Peskine818ca122018-06-20 18:16:48 +02002295 /* Do something with the key according to its type and permitted usage. */
Gilles Peskine02b75072018-07-01 22:31:34 +02002296 if( ! exercise_key( slot, usage, alg ) )
2297 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02002298
2299exit:
2300 psa_destroy_key( slot );
2301 mbedtls_psa_crypto_free( );
2302}
2303/* END_CASE */