blob: 37d6aca3fc3e0a8767354d25b37d1305f1ff2c45 [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 {
Gilles Peskine89167cb2018-07-08 20:12:23 +0200141 TEST_ASSERT( psa_mac_sign_setup( &operation,
142 key, alg ) == PSA_SUCCESS );
Gilles Peskine818ca122018-06-20 18:16:48 +0200143 TEST_ASSERT( psa_mac_update( &operation,
144 input, sizeof( input ) ) == PSA_SUCCESS );
Gilles Peskineacd4be32018-07-08 19:56:25 +0200145 TEST_ASSERT( psa_mac_sign_finish( &operation,
Gilles Peskineef0cb402018-07-12 16:55:59 +0200146 mac, sizeof( mac ),
Gilles Peskineacd4be32018-07-08 19:56:25 +0200147 &mac_length ) == PSA_SUCCESS );
Gilles Peskine818ca122018-06-20 18:16:48 +0200148 }
149
150 if( usage & PSA_KEY_USAGE_VERIFY )
151 {
152 psa_status_t verify_status =
153 ( usage & PSA_KEY_USAGE_SIGN ?
154 PSA_SUCCESS :
155 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine89167cb2018-07-08 20:12:23 +0200156 TEST_ASSERT( psa_mac_verify_setup( &operation,
157 key, alg ) == PSA_SUCCESS );
Gilles Peskine818ca122018-06-20 18:16:48 +0200158 TEST_ASSERT( psa_mac_update( &operation,
159 input, sizeof( input ) ) == PSA_SUCCESS );
Gilles Peskineacd4be32018-07-08 19:56:25 +0200160 TEST_ASSERT( psa_mac_verify_finish( &operation,
161 mac,
162 mac_length ) == verify_status );
Gilles Peskine818ca122018-06-20 18:16:48 +0200163 }
164
165 return( 1 );
166
167exit:
168 psa_mac_abort( &operation );
169 return( 0 );
170}
171
172static int exercise_cipher_key( psa_key_slot_t key,
173 psa_key_usage_t usage,
174 psa_algorithm_t alg )
175{
176 psa_cipher_operation_t operation;
177 unsigned char iv[16] = {0};
178 size_t iv_length = sizeof( iv );
179 const unsigned char plaintext[16] = "Hello, world...";
180 unsigned char ciphertext[32] = "(wabblewebblewibblewobblewubble)";
181 size_t ciphertext_length = sizeof( ciphertext );
182 unsigned char decrypted[sizeof( ciphertext )];
183 size_t part_length;
184
185 if( usage & PSA_KEY_USAGE_ENCRYPT )
186 {
Gilles Peskinefe119512018-07-08 21:39:34 +0200187 TEST_ASSERT( psa_cipher_encrypt_setup( &operation,
188 key, alg ) == PSA_SUCCESS );
189 TEST_ASSERT( psa_cipher_generate_iv( &operation,
190 iv, sizeof( iv ),
191 &iv_length ) == PSA_SUCCESS );
Gilles Peskine818ca122018-06-20 18:16:48 +0200192 TEST_ASSERT( psa_cipher_update( &operation,
193 plaintext, sizeof( plaintext ),
194 ciphertext, sizeof( ciphertext ),
195 &ciphertext_length ) == PSA_SUCCESS );
196 TEST_ASSERT( psa_cipher_finish( &operation,
197 ciphertext + ciphertext_length,
198 sizeof( ciphertext ) - ciphertext_length,
199 &part_length ) == PSA_SUCCESS );
200 ciphertext_length += part_length;
201 }
202
203 if( usage & PSA_KEY_USAGE_DECRYPT )
204 {
205 psa_status_t status;
Mohammad AboMokhadb9b232018-06-28 01:52:54 -0700206 psa_key_type_t type = PSA_KEY_TYPE_NONE;
Gilles Peskine818ca122018-06-20 18:16:48 +0200207 if( ! ( usage & PSA_KEY_USAGE_ENCRYPT ) )
208 {
Gilles Peskine818ca122018-06-20 18:16:48 +0200209 size_t bits;
210 TEST_ASSERT( psa_get_key_information( key, &type, &bits ) );
211 iv_length = PSA_BLOCK_CIPHER_BLOCK_SIZE( type );
212 }
Gilles Peskinefe119512018-07-08 21:39:34 +0200213 TEST_ASSERT( psa_cipher_decrypt_setup( &operation,
214 key, alg ) == PSA_SUCCESS );
215 TEST_ASSERT( psa_cipher_set_iv( &operation,
216 iv, iv_length ) == PSA_SUCCESS );
Gilles Peskine818ca122018-06-20 18:16:48 +0200217 TEST_ASSERT( psa_cipher_update( &operation,
218 ciphertext, ciphertext_length,
219 decrypted, sizeof( decrypted ),
220 &part_length ) == PSA_SUCCESS );
221 status = psa_cipher_finish( &operation,
222 decrypted + part_length,
223 sizeof( decrypted ) - part_length,
224 &part_length );
225 /* For a stream cipher, all inputs are valid. For a block cipher,
226 * if the input is some aribtrary data rather than an actual
227 ciphertext, a padding error is likely. */
Mohammad AboMokh65fa0b82018-06-28 02:14:00 -0700228 if( ( usage & PSA_KEY_USAGE_ENCRYPT ) ||
Mohammad AboMokhadb9b232018-06-28 01:52:54 -0700229 PSA_BLOCK_CIPHER_BLOCK_SIZE( type ) == 1 )
Gilles Peskine818ca122018-06-20 18:16:48 +0200230 TEST_ASSERT( status == PSA_SUCCESS );
231 else
232 TEST_ASSERT( status == PSA_SUCCESS ||
233 status == PSA_ERROR_INVALID_PADDING );
234 }
235
236 return( 1 );
237
238exit:
239 psa_cipher_abort( &operation );
240 return( 0 );
241}
242
243static int exercise_aead_key( psa_key_slot_t key,
244 psa_key_usage_t usage,
245 psa_algorithm_t alg )
246{
247 unsigned char nonce[16] = {0};
248 size_t nonce_length = sizeof( nonce );
249 unsigned char plaintext[16] = "Hello, world...";
250 unsigned char ciphertext[48] = "(wabblewebblewibblewobblewubble)";
251 size_t ciphertext_length = sizeof( ciphertext );
252 size_t plaintext_length = sizeof( ciphertext );
253
254 if( usage & PSA_KEY_USAGE_ENCRYPT )
255 {
256 TEST_ASSERT( psa_aead_encrypt( key, alg,
257 nonce, nonce_length,
258 NULL, 0,
259 plaintext, sizeof( plaintext ),
260 ciphertext, sizeof( ciphertext ),
261 &ciphertext_length ) == PSA_SUCCESS );
262 }
263
264 if( usage & PSA_KEY_USAGE_DECRYPT )
265 {
266 psa_status_t verify_status =
267 ( usage & PSA_KEY_USAGE_ENCRYPT ?
268 PSA_SUCCESS :
269 PSA_ERROR_INVALID_SIGNATURE );
270 TEST_ASSERT( psa_aead_decrypt( key, alg,
271 nonce, nonce_length,
272 NULL, 0,
273 ciphertext, ciphertext_length,
274 plaintext, sizeof( plaintext ),
275 &plaintext_length ) == verify_status );
276 }
277
278 return( 1 );
279
280exit:
281 return( 0 );
282}
283
284static int exercise_signature_key( psa_key_slot_t key,
285 psa_key_usage_t usage,
286 psa_algorithm_t alg )
287{
Gilles Peskineca45c352018-06-26 16:13:09 +0200288 unsigned char payload[16] = {1};
Gilles Peskine818ca122018-06-20 18:16:48 +0200289 size_t payload_length = sizeof( payload );
Gilles Peskine69c12672018-06-28 00:07:19 +0200290 unsigned char signature[PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE] = {0};
Gilles Peskine818ca122018-06-20 18:16:48 +0200291 size_t signature_length = sizeof( signature );
292
293 if( usage & PSA_KEY_USAGE_SIGN )
294 {
295 TEST_ASSERT( psa_asymmetric_sign( key, alg,
296 payload, payload_length,
297 NULL, 0,
298 signature, sizeof( signature ),
299 &signature_length ) == PSA_SUCCESS );
300 }
301
302 if( usage & PSA_KEY_USAGE_VERIFY )
303 {
304 psa_status_t verify_status =
305 ( usage & PSA_KEY_USAGE_SIGN ?
306 PSA_SUCCESS :
307 PSA_ERROR_INVALID_SIGNATURE );
308 TEST_ASSERT( psa_asymmetric_verify( key, alg,
309 payload, payload_length,
310 NULL, 0,
311 signature, signature_length ) ==
312 verify_status );
313 }
314
315 return( 1 );
316
317exit:
318 return( 0 );
319}
320
321static int exercise_asymmetric_encryption_key( psa_key_slot_t key,
322 psa_key_usage_t usage,
323 psa_algorithm_t alg )
324{
325 unsigned char plaintext[256] = "Hello, world...";
326 unsigned char ciphertext[256] = "(wabblewebblewibblewobblewubble)";
327 size_t ciphertext_length = sizeof( ciphertext );
328 size_t plaintext_length = 16;
329
330 if( usage & PSA_KEY_USAGE_ENCRYPT )
331 {
332 TEST_ASSERT(
333 psa_asymmetric_encrypt( key, alg,
334 plaintext, plaintext_length,
335 NULL, 0,
336 ciphertext, sizeof( ciphertext ),
337 &ciphertext_length ) == PSA_SUCCESS );
338 }
339
340 if( usage & PSA_KEY_USAGE_DECRYPT )
341 {
342 psa_status_t status =
343 psa_asymmetric_decrypt( key, alg,
344 ciphertext, ciphertext_length,
345 NULL, 0,
346 plaintext, sizeof( plaintext ),
347 &plaintext_length );
348 TEST_ASSERT( status == PSA_SUCCESS ||
349 ( ( usage & PSA_KEY_USAGE_ENCRYPT ) == 0 &&
350 ( status == PSA_ERROR_INVALID_ARGUMENT ||
351 status == PSA_ERROR_INVALID_PADDING ) ) );
352 }
353
354 return( 1 );
355
356exit:
357 return( 0 );
358}
Gilles Peskine02b75072018-07-01 22:31:34 +0200359
360static int exercise_key( psa_key_slot_t slot,
361 psa_key_usage_t usage,
362 psa_algorithm_t alg )
363{
364 int ok;
365 if( alg == 0 )
366 ok = 1; /* If no algorihm, do nothing (used for raw data "keys"). */
367 else if( PSA_ALG_IS_MAC( alg ) )
368 ok = exercise_mac_key( slot, usage, alg );
369 else if( PSA_ALG_IS_CIPHER( alg ) )
370 ok = exercise_cipher_key( slot, usage, alg );
371 else if( PSA_ALG_IS_AEAD( alg ) )
372 ok = exercise_aead_key( slot, usage, alg );
373 else if( PSA_ALG_IS_SIGN( alg ) )
374 ok = exercise_signature_key( slot, usage, alg );
375 else if( PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) )
376 ok = exercise_asymmetric_encryption_key( slot, usage, alg );
377 else
378 {
379 char message[40];
380 mbedtls_snprintf( message, sizeof( message ),
381 "No code to exercise alg=0x%08lx",
382 (unsigned long) alg );
383 test_fail( message, __LINE__, __FILE__ );
384 ok = 0;
385 }
386 return( ok );
387}
388
Gilles Peskinee59236f2018-01-27 23:32:46 +0100389/* END_HEADER */
390
391/* BEGIN_DEPENDENCIES
392 * depends_on:MBEDTLS_PSA_CRYPTO_C
393 * END_DEPENDENCIES
394 */
395
396/* BEGIN_CASE */
Gilles Peskine2d277862018-06-18 15:41:12 +0200397void init_deinit( )
Gilles Peskinee59236f2018-01-27 23:32:46 +0100398{
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100399 psa_status_t status;
Gilles Peskinee59236f2018-01-27 23:32:46 +0100400 int i;
401 for( i = 0; i <= 1; i++ )
402 {
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100403 status = psa_crypto_init( );
404 TEST_ASSERT( status == PSA_SUCCESS );
405 status = psa_crypto_init( );
406 TEST_ASSERT( status == PSA_SUCCESS );
Gilles Peskinee59236f2018-01-27 23:32:46 +0100407 mbedtls_psa_crypto_free( );
408 }
409}
410/* END_CASE */
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100411
412/* BEGIN_CASE */
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200413void import( data_t *data, int type, int expected_status_arg )
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100414{
415 int slot = 1;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200416 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100417 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100418
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100419 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300420 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100421 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
422
Gilles Peskine4abf7412018-06-18 16:35:34 +0200423 status = psa_import_key( slot, type, data->x, data->len );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200424 TEST_ASSERT( status == expected_status );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100425 if( status == PSA_SUCCESS )
426 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
427
428exit:
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100429 mbedtls_psa_crypto_free( );
430}
431/* END_CASE */
432
433/* BEGIN_CASE */
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200434void import_rsa_made_up( int bits_arg, int keypair, int expected_status_arg )
435{
436 int slot = 1;
437 size_t bits = bits_arg;
438 psa_status_t expected_status = expected_status_arg;
439 psa_status_t status;
440 psa_key_type_t type =
441 keypair ? PSA_KEY_TYPE_RSA_KEYPAIR : PSA_KEY_TYPE_RSA_PUBLIC_KEY;
442 size_t buffer_size = /* Slight overapproximations */
443 keypair ? bits * 9 / 16 + 80 : bits / 8 + 20;
444 unsigned char *buffer = mbedtls_calloc( 1, buffer_size );
445 unsigned char *p;
446 int ret;
447 size_t length;
448
449 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
450 TEST_ASSERT( buffer != NULL );
451
452 TEST_ASSERT( ( ret = construct_fake_rsa_key( buffer, buffer_size, &p,
453 bits, keypair ) ) >= 0 );
454 length = ret;
455
456 /* Try importing the key */
457 status = psa_import_key( slot, type, p, length );
458 TEST_ASSERT( status == expected_status );
459 if( status == PSA_SUCCESS )
460 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
461
462exit:
463 mbedtls_free( buffer );
464 mbedtls_psa_crypto_free( );
465}
466/* END_CASE */
467
468/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300469void import_export( data_t *data,
Moran Pekera964a8f2018-06-04 18:42:36 +0300470 int type_arg,
471 int alg_arg,
472 int usage_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100473 int expected_bits,
474 int export_size_delta,
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200475 int expected_export_status_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100476 int canonical_input )
477{
478 int slot = 1;
479 int slot2 = slot + 1;
480 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200481 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200482 psa_status_t expected_export_status = expected_export_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100483 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100484 unsigned char *exported = NULL;
485 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100486 size_t export_size;
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100487 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100488 size_t reexported_length;
489 psa_key_type_t got_type;
490 size_t got_bits;
Gilles Peskinedec72612018-06-18 18:12:37 +0200491 psa_key_policy_t policy;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100492
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100493 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300494 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
495 export_size = (ssize_t) data->len + export_size_delta;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100496 exported = mbedtls_calloc( 1, export_size );
497 TEST_ASSERT( exported != NULL );
498 if( ! canonical_input )
499 {
500 reexported = mbedtls_calloc( 1, export_size );
501 TEST_ASSERT( reexported != NULL );
502 }
503 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
504
mohammad1603a97cb8c2018-03-28 03:46:26 -0700505 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200506 psa_key_policy_set_usage( &policy, usage_arg, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -0700507 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
508
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100509 /* Import the key */
510 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200511 data->x, data->len ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100512
513 /* Test the key information */
514 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200515 &got_type,
516 &got_bits ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100517 TEST_ASSERT( got_type == type );
518 TEST_ASSERT( got_bits == (size_t) expected_bits );
519
520 /* Export the key */
521 status = psa_export_key( slot,
522 exported, export_size,
523 &exported_length );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200524 TEST_ASSERT( status == expected_export_status );
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100525
526 /* The exported length must be set by psa_export_key() to a value between 0
527 * and export_size. On errors, the exported length must be 0. */
528 TEST_ASSERT( exported_length != INVALID_EXPORT_LENGTH );
529 TEST_ASSERT( status == PSA_SUCCESS || exported_length == 0 );
530 TEST_ASSERT( exported_length <= export_size );
531
Gilles Peskine3f669c32018-06-21 09:21:51 +0200532 TEST_ASSERT( mem_is_zero( exported + exported_length,
533 export_size - exported_length ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100534 if( status != PSA_SUCCESS )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200535 {
536 TEST_ASSERT( exported_length == 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100537 goto destroy;
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200538 }
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100539
540 if( canonical_input )
541 {
Gilles Peskine4abf7412018-06-18 16:35:34 +0200542 TEST_ASSERT( exported_length == data->len );
543 TEST_ASSERT( memcmp( exported, data->x, data->len ) == 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100544 }
545 else
546 {
mohammad1603a97cb8c2018-03-28 03:46:26 -0700547 TEST_ASSERT( psa_set_key_policy( slot2, &policy ) == PSA_SUCCESS );
548
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100549 TEST_ASSERT( psa_import_key( slot2, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200550 exported,
551 export_size ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100552 TEST_ASSERT( psa_export_key( slot2,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200553 reexported,
554 export_size,
555 &reexported_length ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100556 TEST_ASSERT( reexported_length == exported_length );
557 TEST_ASSERT( memcmp( reexported, exported,
558 exported_length ) == 0 );
559 }
560
561destroy:
562 /* Destroy the key */
563 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
564 TEST_ASSERT( psa_get_key_information(
565 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
566
567exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300568 mbedtls_free( exported );
569 mbedtls_free( reexported );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100570 mbedtls_psa_crypto_free( );
571}
572/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100573
Moran Pekerf709f4a2018-06-06 17:26:04 +0300574/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300575void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200576 int type_arg,
577 int alg_arg,
578 int expected_bits,
579 int public_key_expected_length,
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200580 int expected_export_status_arg )
Moran Pekerf709f4a2018-06-06 17:26:04 +0300581{
582 int slot = 1;
583 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200584 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200585 psa_status_t expected_export_status = expected_export_status_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300586 psa_status_t status;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300587 unsigned char *exported = NULL;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300588 size_t export_size;
Jaeden Amero2a671e92018-06-27 17:47:40 +0100589 size_t exported_length = INVALID_EXPORT_LENGTH;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300590 psa_key_type_t got_type;
591 size_t got_bits;
Gilles Peskinedec72612018-06-18 18:12:37 +0200592 psa_key_policy_t policy;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300593
Moran Pekerf709f4a2018-06-06 17:26:04 +0300594 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300595 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
596 export_size = (ssize_t) data->len;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300597 exported = mbedtls_calloc( 1, export_size );
598 TEST_ASSERT( exported != NULL );
599
600 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
601
602 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200603 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, alg );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300604 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
605
606 /* Import the key */
607 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200608 data->x, data->len ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300609
610 /* Test the key information */
611 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200612 &got_type,
613 &got_bits ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300614 TEST_ASSERT( got_type == type );
615 TEST_ASSERT( got_bits == (size_t) expected_bits );
616
617 /* Export the key */
618 status = psa_export_public_key( slot,
Gilles Peskine2d277862018-06-18 15:41:12 +0200619 exported, export_size,
620 &exported_length );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200621 TEST_ASSERT( status == expected_export_status );
Jaeden Amero2a671e92018-06-27 17:47:40 +0100622 TEST_ASSERT( exported_length == (size_t) public_key_expected_length );
623 TEST_ASSERT( mem_is_zero( exported + exported_length,
624 export_size - exported_length ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300625 if( status != PSA_SUCCESS )
626 goto destroy;
627
Moran Pekerf709f4a2018-06-06 17:26:04 +0300628destroy:
629 /* Destroy the key */
630 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
631 TEST_ASSERT( psa_get_key_information(
632 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
633
634exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300635 mbedtls_free( exported );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300636 mbedtls_psa_crypto_free( );
637}
638/* END_CASE */
639
Gilles Peskine20035e32018-02-03 22:44:14 +0100640/* BEGIN_CASE */
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200641void import_and_exercise_key( data_t *data,
642 int type_arg,
643 int bits_arg,
644 int alg_arg )
645{
646 int slot = 1;
647 psa_key_type_t type = type_arg;
648 size_t bits = bits_arg;
649 psa_algorithm_t alg = alg_arg;
650 psa_key_usage_t usage =
651 ( PSA_ALG_IS_MAC( alg ) || PSA_ALG_IS_SIGN( alg ) ?
652 ( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ?
653 PSA_KEY_USAGE_VERIFY :
654 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY ) :
655 PSA_ALG_IS_CIPHER( alg ) || PSA_ALG_IS_AEAD( alg ) ||
656 PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) ?
657 ( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ?
658 PSA_KEY_USAGE_ENCRYPT :
659 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT ) :
660 0 );
661 psa_key_policy_t policy;
662 psa_key_type_t got_type;
663 size_t got_bits;
664 psa_status_t status;
665
666 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
667
668 psa_key_policy_init( &policy );
669 psa_key_policy_set_usage( &policy, usage, alg );
670 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
671
672 /* Import the key */
673 status = psa_import_key( slot, type, data->x, data->len );
674 TEST_ASSERT( status == PSA_SUCCESS );
675
676 /* Test the key information */
677 TEST_ASSERT( psa_get_key_information( slot,
678 &got_type,
679 &got_bits ) == PSA_SUCCESS );
680 TEST_ASSERT( got_type == type );
681 TEST_ASSERT( got_bits == bits );
682
683 /* Do something with the key according to its type and permitted usage. */
Gilles Peskine02b75072018-07-01 22:31:34 +0200684 if( ! exercise_key( slot, usage, alg ) )
685 goto exit;
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200686
687exit:
688 psa_destroy_key( slot );
689 mbedtls_psa_crypto_free( );
690}
691/* END_CASE */
692
693/* BEGIN_CASE */
Gilles Peskined5b33222018-06-18 22:20:03 +0200694void key_policy( int usage_arg, int alg_arg )
695{
696 int key_slot = 1;
697 psa_algorithm_t alg = alg_arg;
698 psa_key_usage_t usage = usage_arg;
699 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
700 unsigned char key[32] = {0};
701 psa_key_policy_t policy_set;
702 psa_key_policy_t policy_get;
703
704 memset( key, 0x2a, sizeof( key ) );
705
706 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
707
708 psa_key_policy_init( &policy_set );
709 psa_key_policy_init( &policy_get );
710
711 psa_key_policy_set_usage( &policy_set, usage, alg );
712
713 TEST_ASSERT( psa_key_policy_get_usage( &policy_set ) == usage );
714 TEST_ASSERT( psa_key_policy_get_algorithm( &policy_set ) == alg );
715 TEST_ASSERT( psa_set_key_policy( key_slot, &policy_set ) == PSA_SUCCESS );
716
717 TEST_ASSERT( psa_import_key( key_slot, key_type,
718 key, sizeof( key ) ) == PSA_SUCCESS );
719
720 TEST_ASSERT( psa_get_key_policy( key_slot, &policy_get ) == PSA_SUCCESS );
721
722 TEST_ASSERT( policy_get.usage == policy_set.usage );
723 TEST_ASSERT( policy_get.alg == policy_set.alg );
724
725exit:
726 psa_destroy_key( key_slot );
727 mbedtls_psa_crypto_free( );
728}
729/* END_CASE */
730
731/* BEGIN_CASE */
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200732void mac_key_policy( int policy_usage,
733 int policy_alg,
734 int key_type,
735 data_t *key_data,
736 int exercise_alg )
Gilles Peskined5b33222018-06-18 22:20:03 +0200737{
738 int key_slot = 1;
Gilles Peskined5b33222018-06-18 22:20:03 +0200739 psa_key_policy_t policy;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200740 psa_mac_operation_t operation;
741 psa_status_t status;
742 unsigned char mac[PSA_MAC_MAX_SIZE];
Gilles Peskined5b33222018-06-18 22:20:03 +0200743
744 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
745
746 psa_key_policy_init( &policy );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200747 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
Gilles Peskined5b33222018-06-18 22:20:03 +0200748 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
749
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200750 TEST_ASSERT( psa_import_key( key_slot, key_type,
751 key_data->x, key_data->len ) == PSA_SUCCESS );
Gilles Peskined5b33222018-06-18 22:20:03 +0200752
Gilles Peskine89167cb2018-07-08 20:12:23 +0200753 status = psa_mac_sign_setup( &operation, key_slot, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200754 if( policy_alg == exercise_alg &&
755 ( policy_usage & PSA_KEY_USAGE_SIGN ) != 0 )
756 TEST_ASSERT( status == PSA_SUCCESS );
757 else
758 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
759 psa_mac_abort( &operation );
Gilles Peskined5b33222018-06-18 22:20:03 +0200760
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200761 memset( mac, 0, sizeof( mac ) );
Gilles Peskine89167cb2018-07-08 20:12:23 +0200762 status = psa_mac_verify_setup( &operation, key_slot, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200763 if( policy_alg == exercise_alg &&
764 ( policy_usage & PSA_KEY_USAGE_VERIFY ) != 0 )
Gilles Peskine89167cb2018-07-08 20:12:23 +0200765 TEST_ASSERT( status == PSA_SUCCESS );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200766 else
767 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
768
769exit:
770 psa_mac_abort( &operation );
771 psa_destroy_key( key_slot );
772 mbedtls_psa_crypto_free( );
773}
774/* END_CASE */
775
776/* BEGIN_CASE */
777void cipher_key_policy( int policy_usage,
778 int policy_alg,
779 int key_type,
780 data_t *key_data,
781 int exercise_alg )
782{
783 int key_slot = 1;
784 psa_key_policy_t policy;
785 psa_cipher_operation_t operation;
786 psa_status_t status;
787
788 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
789
790 psa_key_policy_init( &policy );
791 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
792 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
793
794 TEST_ASSERT( psa_import_key( key_slot, key_type,
795 key_data->x, key_data->len ) == PSA_SUCCESS );
796
Gilles Peskinefe119512018-07-08 21:39:34 +0200797 status = psa_cipher_encrypt_setup( &operation, key_slot, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200798 if( policy_alg == exercise_alg &&
799 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
800 TEST_ASSERT( status == PSA_SUCCESS );
801 else
802 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
803 psa_cipher_abort( &operation );
804
Gilles Peskinefe119512018-07-08 21:39:34 +0200805 status = psa_cipher_decrypt_setup( &operation, key_slot, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200806 if( policy_alg == exercise_alg &&
807 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
808 TEST_ASSERT( status == PSA_SUCCESS );
809 else
810 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
811
812exit:
813 psa_cipher_abort( &operation );
814 psa_destroy_key( key_slot );
815 mbedtls_psa_crypto_free( );
816}
817/* END_CASE */
818
819/* BEGIN_CASE */
820void aead_key_policy( int policy_usage,
821 int policy_alg,
822 int key_type,
823 data_t *key_data,
824 int nonce_length_arg,
825 int tag_length_arg,
826 int exercise_alg )
827{
828 int key_slot = 1;
829 psa_key_policy_t policy;
830 psa_status_t status;
831 unsigned char nonce[16] = {0};
832 size_t nonce_length = nonce_length_arg;
833 unsigned char tag[16];
834 size_t tag_length = tag_length_arg;
835 size_t output_length;
836
837 TEST_ASSERT( nonce_length <= sizeof( nonce ) );
838 TEST_ASSERT( tag_length <= sizeof( tag ) );
839
840 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
841
842 psa_key_policy_init( &policy );
843 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
844 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
845
846 TEST_ASSERT( psa_import_key( key_slot, key_type,
847 key_data->x, key_data->len ) == PSA_SUCCESS );
848
849 status = psa_aead_encrypt( key_slot, exercise_alg,
850 nonce, nonce_length,
851 NULL, 0,
852 NULL, 0,
853 tag, tag_length,
854 &output_length );
855 if( policy_alg == exercise_alg &&
856 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
857 TEST_ASSERT( status == PSA_SUCCESS );
858 else
859 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
860
861 memset( tag, 0, sizeof( tag ) );
862 status = psa_aead_decrypt( key_slot, exercise_alg,
863 nonce, nonce_length,
864 NULL, 0,
865 tag, tag_length,
866 NULL, 0,
867 &output_length );
868 if( policy_alg == exercise_alg &&
869 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
870 TEST_ASSERT( status == PSA_ERROR_INVALID_SIGNATURE );
871 else
872 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
873
874exit:
875 psa_destroy_key( key_slot );
876 mbedtls_psa_crypto_free( );
877}
878/* END_CASE */
879
880/* BEGIN_CASE */
881void asymmetric_encryption_key_policy( int policy_usage,
882 int policy_alg,
883 int key_type,
884 data_t *key_data,
885 int exercise_alg )
886{
887 int key_slot = 1;
888 psa_key_policy_t policy;
889 psa_status_t status;
890 size_t key_bits;
891 size_t buffer_length;
892 unsigned char *buffer = NULL;
893 size_t output_length;
894
895 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
896
897 psa_key_policy_init( &policy );
898 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
899 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
900
901 TEST_ASSERT( psa_import_key( key_slot, key_type,
902 key_data->x, key_data->len ) == PSA_SUCCESS );
903
904 TEST_ASSERT( psa_get_key_information( key_slot,
905 NULL,
906 &key_bits ) == PSA_SUCCESS );
907 buffer_length = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits,
908 exercise_alg );
909 buffer = mbedtls_calloc( 1, buffer_length );
910 TEST_ASSERT( buffer != NULL );
911
912 status = psa_asymmetric_encrypt( key_slot, exercise_alg,
913 NULL, 0,
914 NULL, 0,
915 buffer, buffer_length,
916 &output_length );
917 if( policy_alg == exercise_alg &&
918 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
919 TEST_ASSERT( status == PSA_SUCCESS );
920 else
921 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
922
923 memset( buffer, 0, buffer_length );
924 status = psa_asymmetric_decrypt( key_slot, exercise_alg,
925 buffer, buffer_length,
926 NULL, 0,
927 buffer, buffer_length,
928 &output_length );
929 if( policy_alg == exercise_alg &&
930 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
931 TEST_ASSERT( status == PSA_ERROR_INVALID_PADDING );
932 else
933 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
934
935exit:
936 psa_destroy_key( key_slot );
937 mbedtls_psa_crypto_free( );
938 mbedtls_free( buffer );
939}
940/* END_CASE */
941
942/* BEGIN_CASE */
943void asymmetric_signature_key_policy( int policy_usage,
944 int policy_alg,
945 int key_type,
946 data_t *key_data,
947 int exercise_alg )
948{
949 int key_slot = 1;
950 psa_key_policy_t policy;
951 psa_status_t status;
952 unsigned char payload[16] = {1};
953 size_t payload_length = sizeof( payload );
954 unsigned char signature[PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE] = {0};
955 size_t signature_length;
956
957 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
958
959 psa_key_policy_init( &policy );
960 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
961 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
962
963 TEST_ASSERT( psa_import_key( key_slot, key_type,
964 key_data->x, key_data->len ) == PSA_SUCCESS );
965
966 status = psa_asymmetric_sign( key_slot, exercise_alg,
967 payload, payload_length,
968 NULL, 0,
969 signature, sizeof( signature ),
970 &signature_length );
971 if( policy_alg == exercise_alg &&
972 ( policy_usage & PSA_KEY_USAGE_SIGN ) != 0 )
973 TEST_ASSERT( status == PSA_SUCCESS );
974 else
975 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
976
977 memset( signature, 0, sizeof( signature ) );
978 status = psa_asymmetric_verify( key_slot, exercise_alg,
979 payload, payload_length,
980 NULL, 0,
981 signature, sizeof( signature ) );
982 if( policy_alg == exercise_alg &&
983 ( policy_usage & PSA_KEY_USAGE_VERIFY ) != 0 )
984 TEST_ASSERT( status == PSA_ERROR_INVALID_SIGNATURE );
985 else
986 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
Gilles Peskined5b33222018-06-18 22:20:03 +0200987
988exit:
989 psa_destroy_key( key_slot );
990 mbedtls_psa_crypto_free( );
991}
992/* END_CASE */
993
994/* BEGIN_CASE */
995void key_lifetime( int lifetime_arg )
996{
997 int key_slot = 1;
998 psa_key_type_t key_type = PSA_ALG_CBC_BASE;
999 unsigned char key[32] = {0};
1000 psa_key_lifetime_t lifetime_set = lifetime_arg;
1001 psa_key_lifetime_t lifetime_get;
1002
1003 memset( key, 0x2a, sizeof( key ) );
1004
1005 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1006
1007 TEST_ASSERT( psa_set_key_lifetime( key_slot,
1008 lifetime_set ) == PSA_SUCCESS );
1009
1010 TEST_ASSERT( psa_import_key( key_slot, key_type,
1011 key, sizeof( key ) ) == PSA_SUCCESS );
1012
1013 TEST_ASSERT( psa_get_key_lifetime( key_slot,
1014 &lifetime_get ) == PSA_SUCCESS );
1015
1016 TEST_ASSERT( lifetime_get == lifetime_set );
1017
1018exit:
1019 psa_destroy_key( key_slot );
1020 mbedtls_psa_crypto_free( );
1021}
1022/* END_CASE */
1023
1024/* BEGIN_CASE */
1025void key_lifetime_set_fail( int key_slot_arg,
1026 int lifetime_arg,
1027 int expected_status_arg )
1028{
1029 psa_key_slot_t key_slot = key_slot_arg;
1030 psa_key_lifetime_t lifetime_set = lifetime_arg;
1031 psa_status_t actual_status;
1032 psa_status_t expected_status = expected_status_arg;
1033
1034 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1035
1036 actual_status = psa_set_key_lifetime( key_slot, lifetime_set );
1037
1038 if( actual_status == PSA_SUCCESS )
1039 actual_status = psa_set_key_lifetime( key_slot, lifetime_set );
1040
1041 TEST_ASSERT( expected_status == actual_status );
1042
1043exit:
1044 psa_destroy_key( key_slot );
1045 mbedtls_psa_crypto_free( );
1046}
1047/* END_CASE */
1048
1049/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001050void hash_setup( int alg_arg,
1051 int expected_status_arg )
1052{
1053 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001054 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001055 psa_hash_operation_t operation;
1056 psa_status_t status;
1057
1058 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1059
Gilles Peskineda8191d1c2018-07-08 19:46:38 +02001060 status = psa_hash_setup( &operation, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001061 psa_hash_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001062 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001063
1064exit:
1065 mbedtls_psa_crypto_free( );
1066}
1067/* END_CASE */
1068
1069/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001070void hash_finish( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001071{
1072 psa_algorithm_t alg = alg_arg;
Gilles Peskineb3e6e5d2018-06-18 22:16:43 +02001073 unsigned char actual_hash[PSA_HASH_MAX_SIZE];
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001074 size_t actual_hash_length;
1075 psa_hash_operation_t operation;
1076
Gilles Peskine69c12672018-06-28 00:07:19 +02001077 TEST_ASSERT( expected_hash->len == PSA_HASH_SIZE( alg ) );
1078 TEST_ASSERT( expected_hash->len <= PSA_HASH_MAX_SIZE );
1079
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001080 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001081 TEST_ASSERT( expected_hash != NULL );
1082 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1083 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001084
1085 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1086
Gilles Peskineda8191d1c2018-07-08 19:46:38 +02001087 TEST_ASSERT( psa_hash_setup( &operation, alg ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001088 TEST_ASSERT( psa_hash_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001089 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001090 TEST_ASSERT( psa_hash_finish( &operation,
1091 actual_hash, sizeof( actual_hash ),
1092 &actual_hash_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001093 TEST_ASSERT( actual_hash_length == expected_hash->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001094 TEST_ASSERT( memcmp( expected_hash->x, actual_hash,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001095 expected_hash->len ) == 0 );
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001096
1097exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001098 mbedtls_psa_crypto_free( );
1099}
1100/* END_CASE */
1101
1102/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001103void hash_verify( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001104{
1105 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001106 psa_hash_operation_t operation;
1107
Gilles Peskine69c12672018-06-28 00:07:19 +02001108 TEST_ASSERT( expected_hash->len == PSA_HASH_SIZE( alg ) );
1109 TEST_ASSERT( expected_hash->len <= PSA_HASH_MAX_SIZE );
1110
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001111 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001112 TEST_ASSERT( expected_hash != NULL );
1113 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1114 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001115
1116 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1117
Gilles Peskineda8191d1c2018-07-08 19:46:38 +02001118 TEST_ASSERT( psa_hash_setup( &operation, alg ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001119 TEST_ASSERT( psa_hash_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001120 input->x,
1121 input->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001122 TEST_ASSERT( psa_hash_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001123 expected_hash->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001124 expected_hash->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001125
1126exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001127 mbedtls_psa_crypto_free( );
1128}
1129/* END_CASE */
1130
1131/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001132void mac_setup( int key_type_arg,
1133 data_t *key,
1134 int alg_arg,
1135 int expected_status_arg )
1136{
1137 int key_slot = 1;
1138 psa_key_type_t key_type = key_type_arg;
1139 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001140 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001141 psa_mac_operation_t operation;
1142 psa_key_policy_t policy;
1143 psa_status_t status;
1144
1145 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1146
1147 psa_key_policy_init( &policy );
1148 psa_key_policy_set_usage( &policy,
1149 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
1150 alg );
1151 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1152
1153 TEST_ASSERT( psa_import_key( key_slot, key_type,
1154 key->x, key->len ) == PSA_SUCCESS );
1155
Gilles Peskine89167cb2018-07-08 20:12:23 +02001156 status = psa_mac_sign_setup( &operation, key_slot, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001157 psa_mac_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001158 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001159
1160exit:
1161 psa_destroy_key( key_slot );
1162 mbedtls_psa_crypto_free( );
1163}
1164/* END_CASE */
1165
1166/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +02001167void mac_verify( int key_type_arg,
1168 data_t *key,
1169 int alg_arg,
1170 data_t *input,
1171 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +01001172{
1173 int key_slot = 1;
1174 psa_key_type_t key_type = key_type_arg;
1175 psa_algorithm_t alg = alg_arg;
Gilles Peskine8c9def32018-02-08 10:02:12 +01001176 psa_mac_operation_t operation;
mohammad16036df908f2018-04-02 08:34:15 -07001177 psa_key_policy_t policy;
Gilles Peskine8c9def32018-02-08 10:02:12 +01001178
Gilles Peskine69c12672018-06-28 00:07:19 +02001179 TEST_ASSERT( expected_mac->len <= PSA_MAC_MAX_SIZE );
1180
Gilles Peskine8c9def32018-02-08 10:02:12 +01001181 TEST_ASSERT( key != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +01001182 TEST_ASSERT( input != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +01001183 TEST_ASSERT( expected_mac != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001184 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001185 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1186 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01001187
1188 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1189
mohammad16036df908f2018-04-02 08:34:15 -07001190 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001191 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
mohammad16036df908f2018-04-02 08:34:15 -07001192 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1193
Gilles Peskine8c9def32018-02-08 10:02:12 +01001194 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001195 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskinec0ec9722018-06-18 17:03:37 +02001196
Gilles Peskine89167cb2018-07-08 20:12:23 +02001197 TEST_ASSERT( psa_mac_verify_setup( &operation,
1198 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +01001199 TEST_ASSERT( psa_destroy_key( key_slot ) == PSA_SUCCESS );
1200 TEST_ASSERT( psa_mac_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001201 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskineacd4be32018-07-08 19:56:25 +02001202 TEST_ASSERT( psa_mac_verify_finish( &operation,
1203 expected_mac->x,
1204 expected_mac->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +01001205
1206exit:
Gilles Peskine8c9def32018-02-08 10:02:12 +01001207 psa_destroy_key( key_slot );
1208 mbedtls_psa_crypto_free( );
1209}
1210/* END_CASE */
1211
1212/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001213void cipher_setup( int key_type_arg,
1214 data_t *key,
1215 int alg_arg,
1216 int expected_status_arg )
1217{
1218 int key_slot = 1;
1219 psa_key_type_t key_type = key_type_arg;
1220 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001221 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001222 psa_cipher_operation_t operation;
1223 psa_key_policy_t policy;
1224 psa_status_t status;
1225
1226 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1227
1228 psa_key_policy_init( &policy );
1229 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
1230 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1231
1232 TEST_ASSERT( psa_import_key( key_slot, key_type,
1233 key->x, key->len ) == PSA_SUCCESS );
1234
Gilles Peskinefe119512018-07-08 21:39:34 +02001235 status = psa_cipher_encrypt_setup( &operation, key_slot, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001236 psa_cipher_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001237 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001238
1239exit:
1240 psa_destroy_key( key_slot );
1241 mbedtls_psa_crypto_free( );
1242}
1243/* END_CASE */
1244
1245/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02001246void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001247 data_t *key,
1248 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001249 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001250{
1251 int key_slot = 1;
1252 psa_status_t status;
1253 psa_key_type_t key_type = key_type_arg;
1254 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001255 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001256 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001257 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001258 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001259 size_t output_buffer_size = 0;
1260 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001261 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001262 psa_cipher_operation_t operation;
Moran Pekered346952018-07-05 15:22:45 +03001263 psa_key_policy_t policy;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001264
Gilles Peskine50e586b2018-06-08 14:28:46 +02001265 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001266 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001267 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001268 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1269 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1270 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001271
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001272 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1273 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001274
1275 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1276
Moran Pekered346952018-07-05 15:22:45 +03001277 psa_key_policy_init( &policy );
1278 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
1279 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1280
Gilles Peskine50e586b2018-06-08 14:28:46 +02001281 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001282 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001283
Gilles Peskinefe119512018-07-08 21:39:34 +02001284 TEST_ASSERT( psa_cipher_encrypt_setup( &operation,
1285 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001286
Gilles Peskinefe119512018-07-08 21:39:34 +02001287 TEST_ASSERT( psa_cipher_set_iv( &operation,
1288 iv, iv_size ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03001289 output_buffer_size = (size_t) input->len +
1290 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001291 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001292 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001293
Gilles Peskine4abf7412018-06-18 16:35:34 +02001294 TEST_ASSERT( psa_cipher_update( &operation,
1295 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001296 output, output_buffer_size,
1297 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001298 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001299 status = psa_cipher_finish( &operation,
1300 output + function_output_length,
1301 output_buffer_size,
1302 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001303 total_output_length += function_output_length;
1304
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001305 TEST_ASSERT( status == expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001306 if( expected_status == PSA_SUCCESS )
1307 {
1308 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001309 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001310 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001311 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001312 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001313
Gilles Peskine50e586b2018-06-08 14:28:46 +02001314exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001315 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001316 psa_destroy_key( key_slot );
1317 mbedtls_psa_crypto_free( );
1318}
1319/* END_CASE */
1320
1321/* BEGIN_CASE */
1322void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001323 data_t *key,
1324 data_t *input,
1325 int first_part_size,
1326 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001327{
1328 int key_slot = 1;
1329 psa_key_type_t key_type = key_type_arg;
1330 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001331 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001332 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001333 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001334 size_t output_buffer_size = 0;
1335 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001336 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001337 psa_cipher_operation_t operation;
Moran Pekered346952018-07-05 15:22:45 +03001338 psa_key_policy_t policy;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001339
Gilles Peskine50e586b2018-06-08 14:28:46 +02001340 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001341 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001342 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001343 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1344 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1345 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001346
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001347 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1348 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001349
1350 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1351
Moran Pekered346952018-07-05 15:22:45 +03001352 psa_key_policy_init( &policy );
1353 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
1354 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1355
Gilles Peskine50e586b2018-06-08 14:28:46 +02001356 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001357 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001358
Gilles Peskinefe119512018-07-08 21:39:34 +02001359 TEST_ASSERT( psa_cipher_encrypt_setup( &operation,
1360 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001361
Gilles Peskinefe119512018-07-08 21:39:34 +02001362 TEST_ASSERT( psa_cipher_set_iv( &operation,
1363 iv, sizeof( iv ) ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03001364 output_buffer_size = (size_t) input->len +
1365 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001366 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001367 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001368
Gilles Peskine4abf7412018-06-18 16:35:34 +02001369 TEST_ASSERT( (unsigned int) first_part_size < input->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001370 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001371 output, output_buffer_size,
1372 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001373 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001374 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001375 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001376 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001377 output, output_buffer_size,
1378 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001379 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001380 TEST_ASSERT( psa_cipher_finish( &operation,
1381 output + function_output_length,
1382 output_buffer_size,
1383 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001384 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001385 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
1386
Gilles Peskine4abf7412018-06-18 16:35:34 +02001387 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001388 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001389 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001390
1391exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001392 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001393 psa_destroy_key( key_slot );
1394 mbedtls_psa_crypto_free( );
1395}
1396/* END_CASE */
1397
1398/* BEGIN_CASE */
1399void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001400 data_t *key,
1401 data_t *input,
1402 int first_part_size,
1403 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001404{
1405 int key_slot = 1;
1406
1407 psa_key_type_t key_type = key_type_arg;
1408 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001409 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001410 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001411 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001412 size_t output_buffer_size = 0;
1413 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001414 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001415 psa_cipher_operation_t operation;
Moran Pekered346952018-07-05 15:22:45 +03001416 psa_key_policy_t policy;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001417
Gilles Peskine50e586b2018-06-08 14:28:46 +02001418 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001419 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001420 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001421 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1422 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1423 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001424
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001425 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1426 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001427
1428 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1429
Moran Pekered346952018-07-05 15:22:45 +03001430 psa_key_policy_init( &policy );
1431 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
1432 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1433
Gilles Peskine50e586b2018-06-08 14:28:46 +02001434 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001435 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001436
Gilles Peskinefe119512018-07-08 21:39:34 +02001437 TEST_ASSERT( psa_cipher_decrypt_setup( &operation,
1438 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001439
Gilles Peskinefe119512018-07-08 21:39:34 +02001440 TEST_ASSERT( psa_cipher_set_iv( &operation,
1441 iv, sizeof( iv ) ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001442
mohammad16033d91abe2018-07-03 13:15:54 +03001443 output_buffer_size = (size_t) input->len +
1444 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001445 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001446 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001447
Gilles Peskine4abf7412018-06-18 16:35:34 +02001448 TEST_ASSERT( (unsigned int) first_part_size < input->len );
1449 TEST_ASSERT( psa_cipher_update( &operation,
1450 input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001451 output, output_buffer_size,
1452 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001453 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001454 TEST_ASSERT( psa_cipher_update( &operation,
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 Peskine50e586b2018-06-08 14:28:46 +02001457 output, output_buffer_size,
1458 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001459 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001460 TEST_ASSERT( psa_cipher_finish( &operation,
1461 output + function_output_length,
1462 output_buffer_size,
1463 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001464 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001465 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
1466
Gilles Peskine4abf7412018-06-18 16:35:34 +02001467 TEST_ASSERT( total_output_length == expected_output->len );
Gilles Peskine2d277862018-06-18 15:41:12 +02001468 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001469 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001470
1471exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001472 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001473 psa_destroy_key( key_slot );
1474 mbedtls_psa_crypto_free( );
1475}
1476/* END_CASE */
1477
Gilles Peskine50e586b2018-06-08 14:28:46 +02001478/* BEGIN_CASE */
1479void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001480 data_t *key,
1481 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001482 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001483{
1484 int key_slot = 1;
1485 psa_status_t status;
1486 psa_key_type_t key_type = key_type_arg;
1487 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001488 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001489 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001490 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001491 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001492 size_t output_buffer_size = 0;
1493 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001494 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001495 psa_cipher_operation_t operation;
Moran Pekered346952018-07-05 15:22:45 +03001496 psa_key_policy_t policy;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001497
Gilles Peskine50e586b2018-06-08 14:28:46 +02001498 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001499 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001500 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001501 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1502 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1503 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001504
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001505 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1506 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001507
1508 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1509
Moran Pekered346952018-07-05 15:22:45 +03001510 psa_key_policy_init( &policy );
1511 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
1512 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1513
Gilles Peskine50e586b2018-06-08 14:28:46 +02001514 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001515 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001516
Gilles Peskinefe119512018-07-08 21:39:34 +02001517 TEST_ASSERT( psa_cipher_decrypt_setup( &operation,
1518 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001519
Gilles Peskinefe119512018-07-08 21:39:34 +02001520 TEST_ASSERT( psa_cipher_set_iv( &operation,
1521 iv, iv_size ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001522
mohammad16033d91abe2018-07-03 13:15:54 +03001523 output_buffer_size = (size_t) input->len +
1524 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001525 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001526 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001527
Gilles Peskine4abf7412018-06-18 16:35:34 +02001528 TEST_ASSERT( psa_cipher_update( &operation,
1529 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001530 output, output_buffer_size,
1531 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001532 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001533 status = psa_cipher_finish( &operation,
1534 output + function_output_length,
1535 output_buffer_size,
1536 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001537 total_output_length += function_output_length;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001538 TEST_ASSERT( status == expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001539
1540 if( expected_status == PSA_SUCCESS )
1541 {
1542 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001543 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001544 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001545 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001546 }
1547
Gilles Peskine50e586b2018-06-08 14:28:46 +02001548exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001549 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001550 psa_destroy_key( key_slot );
1551 mbedtls_psa_crypto_free( );
1552}
1553/* END_CASE */
1554
Gilles Peskine50e586b2018-06-08 14:28:46 +02001555/* BEGIN_CASE */
1556void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001557 data_t *key,
1558 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02001559{
1560 int key_slot = 1;
1561 psa_key_type_t key_type = key_type_arg;
1562 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -07001563 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +02001564 size_t iv_size = 16;
1565 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001566 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001567 size_t output1_size = 0;
1568 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001569 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001570 size_t output2_size = 0;
1571 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001572 size_t function_output_length = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001573 psa_cipher_operation_t operation1;
1574 psa_cipher_operation_t operation2;
Moran Pekered346952018-07-05 15:22:45 +03001575 psa_key_policy_t policy;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001576
mohammad1603d7d7ba52018-03-12 18:51:53 +02001577 TEST_ASSERT( key != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001578 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001579 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1580 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001581
mohammad1603d7d7ba52018-03-12 18:51:53 +02001582 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1583
Moran Pekered346952018-07-05 15:22:45 +03001584 psa_key_policy_init( &policy );
1585 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg );
1586 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1587
mohammad1603d7d7ba52018-03-12 18:51:53 +02001588 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001589 key->x, key->len ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001590
Gilles Peskinefe119512018-07-08 21:39:34 +02001591 TEST_ASSERT( psa_cipher_encrypt_setup( &operation1,
1592 key_slot, alg ) == PSA_SUCCESS );
1593 TEST_ASSERT( psa_cipher_decrypt_setup( &operation2,
1594 key_slot, alg ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001595
Gilles Peskinefe119512018-07-08 21:39:34 +02001596 TEST_ASSERT( psa_cipher_generate_iv( &operation1,
1597 iv, iv_size,
1598 &iv_length ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03001599 output1_size = (size_t) input->len +
1600 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001601 output1 = mbedtls_calloc( 1, output1_size );
1602 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001603
Gilles Peskine4abf7412018-06-18 16:35:34 +02001604 TEST_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001605 output1, output1_size,
1606 &output1_length ) == PSA_SUCCESS );
1607 TEST_ASSERT( psa_cipher_finish( &operation1,
1608 output1 + output1_length, output1_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001609 &function_output_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001610
Gilles Peskine048b7f02018-06-08 14:20:49 +02001611 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001612
1613 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
1614
1615 output2_size = output1_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001616 output2 = mbedtls_calloc( 1, output2_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001617 TEST_ASSERT( output2 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001618
Gilles Peskinefe119512018-07-08 21:39:34 +02001619 TEST_ASSERT( psa_cipher_set_iv( &operation2,
1620 iv, iv_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001621 TEST_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
1622 output2, output2_size,
1623 &output2_length ) == PSA_SUCCESS );
Gilles Peskine048b7f02018-06-08 14:20:49 +02001624 function_output_length = 0;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001625 TEST_ASSERT( psa_cipher_finish( &operation2,
1626 output2 + output2_length,
1627 output2_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001628 &function_output_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001629
Gilles Peskine048b7f02018-06-08 14:20:49 +02001630 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001631
Janos Follath25c4fa82018-07-06 16:23:25 +01001632 TEST_ASSERT( psa_cipher_abort( &operation2 ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001633
Gilles Peskine4abf7412018-06-18 16:35:34 +02001634 TEST_ASSERT( input->len == output2_length );
1635 TEST_ASSERT( memcmp( input->x, output2, input->len ) == 0 );
Moran Pekerded84402018-06-06 16:36:50 +03001636
1637exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001638 mbedtls_free( output1 );
1639 mbedtls_free( output2 );
Moran Pekerded84402018-06-06 16:36:50 +03001640 psa_destroy_key( key_slot );
1641 mbedtls_psa_crypto_free( );
1642}
1643/* END_CASE */
1644
1645/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02001646void cipher_verify_output_multipart( int alg_arg,
1647 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001648 data_t *key,
1649 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001650 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +03001651{
1652 int key_slot = 1;
1653 psa_key_type_t key_type = key_type_arg;
1654 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +03001655 unsigned char iv[16] = {0};
1656 size_t iv_size = 16;
1657 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001658 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001659 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03001660 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001661 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001662 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03001663 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001664 size_t function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001665 psa_cipher_operation_t operation1;
1666 psa_cipher_operation_t operation2;
Moran Pekered346952018-07-05 15:22:45 +03001667 psa_key_policy_t policy;
Moran Pekerded84402018-06-06 16:36:50 +03001668
Moran Pekerded84402018-06-06 16:36:50 +03001669 TEST_ASSERT( key != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001670 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001671 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1672 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001673
Moran Pekerded84402018-06-06 16:36:50 +03001674 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1675
Moran Pekered346952018-07-05 15:22:45 +03001676 psa_key_policy_init( &policy );
1677 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg );
1678 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1679
Moran Pekerded84402018-06-06 16:36:50 +03001680 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001681 key->x, key->len ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001682
Gilles Peskinefe119512018-07-08 21:39:34 +02001683 TEST_ASSERT( psa_cipher_encrypt_setup( &operation1,
1684 key_slot, alg ) == PSA_SUCCESS );
1685 TEST_ASSERT( psa_cipher_decrypt_setup( &operation2,
1686 key_slot, alg ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001687
Gilles Peskinefe119512018-07-08 21:39:34 +02001688 TEST_ASSERT( psa_cipher_generate_iv( &operation1,
1689 iv, iv_size,
1690 &iv_length ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03001691 output1_buffer_size = (size_t) input->len +
1692 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine048b7f02018-06-08 14:20:49 +02001693 output1 = mbedtls_calloc( 1, output1_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001694 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001695
Gilles Peskine4abf7412018-06-18 16:35:34 +02001696 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001697
itayzafrir3e02b3b2018-06-12 17:06:52 +03001698 TEST_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001699 output1, output1_buffer_size,
1700 &function_output_length ) == PSA_SUCCESS );
1701 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001702
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001703 TEST_ASSERT( psa_cipher_update( &operation1,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001704 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001705 input->len - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001706 output1, output1_buffer_size,
1707 &function_output_length ) == PSA_SUCCESS );
1708 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001709
Gilles Peskine048b7f02018-06-08 14:20:49 +02001710 TEST_ASSERT( psa_cipher_finish( &operation1,
1711 output1 + output1_length,
1712 output1_buffer_size - output1_length,
1713 &function_output_length ) == PSA_SUCCESS );
1714 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001715
1716 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
1717
Gilles Peskine048b7f02018-06-08 14:20:49 +02001718 output2_buffer_size = output1_length;
1719 output2 = mbedtls_calloc( 1, output2_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001720 TEST_ASSERT( output2 != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001721
Gilles Peskinefe119512018-07-08 21:39:34 +02001722 TEST_ASSERT( psa_cipher_set_iv( &operation2,
1723 iv, iv_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001724
1725 TEST_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001726 output2, output2_buffer_size,
1727 &function_output_length ) == PSA_SUCCESS );
1728 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001729
Gilles Peskine048b7f02018-06-08 14:20:49 +02001730 TEST_ASSERT( psa_cipher_update( &operation2,
1731 output1 + first_part_size,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001732 output1_length - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001733 output2, output2_buffer_size,
1734 &function_output_length ) == PSA_SUCCESS );
1735 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001736
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001737 TEST_ASSERT( psa_cipher_finish( &operation2,
1738 output2 + output2_length,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001739 output2_buffer_size - output2_length,
1740 &function_output_length ) == PSA_SUCCESS );
1741 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001742
Janos Follath25c4fa82018-07-06 16:23:25 +01001743 TEST_ASSERT( psa_cipher_abort( &operation2 ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001744
Gilles Peskine4abf7412018-06-18 16:35:34 +02001745 TEST_ASSERT( input->len == output2_length );
1746 TEST_ASSERT( memcmp( input->x, output2, input->len ) == 0 );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001747
1748exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001749 mbedtls_free( output1 );
1750 mbedtls_free( output2 );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001751 psa_destroy_key( key_slot );
1752 mbedtls_psa_crypto_free( );
1753}
1754/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02001755
Gilles Peskine20035e32018-02-03 22:44:14 +01001756/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001757void aead_encrypt_decrypt( int key_type_arg,
1758 data_t * key_data,
1759 int alg_arg,
1760 data_t * input_data,
1761 data_t * nonce,
1762 data_t * additional_data,
1763 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001764{
1765 int slot = 1;
1766 psa_key_type_t key_type = key_type_arg;
1767 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001768 unsigned char *output_data = NULL;
1769 size_t output_size = 0;
1770 size_t output_length = 0;
1771 unsigned char *output_data2 = NULL;
1772 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001773 size_t tag_length = 16;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001774 psa_status_t expected_result = expected_result_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001775 psa_key_policy_t policy;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001776
Gilles Peskinea1cac842018-06-11 19:33:02 +02001777 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001778 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001779 TEST_ASSERT( nonce != NULL );
1780 TEST_ASSERT( additional_data != NULL );
1781 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1782 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1783 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
1784 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
1785
Gilles Peskine4abf7412018-06-18 16:35:34 +02001786 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001787 output_data = mbedtls_calloc( 1, output_size );
1788 TEST_ASSERT( output_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001789
1790 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1791
1792 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001793 psa_key_policy_set_usage( &policy,
1794 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
1795 alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001796 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1797
1798 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001799 key_data->x, key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001800
1801 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001802 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001803 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001804 additional_data->len,
1805 input_data->x, input_data->len,
1806 output_data, output_size,
1807 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001808
1809 if( PSA_SUCCESS == expected_result )
1810 {
1811 output_data2 = mbedtls_calloc( 1, output_length );
1812 TEST_ASSERT( output_data2 != NULL );
1813
1814 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001815 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001816 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001817 additional_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001818 output_data, output_length,
1819 output_data2, output_length,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001820 &output_length2 ) == expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02001821
itayzafrir3e02b3b2018-06-12 17:06:52 +03001822 TEST_ASSERT( memcmp( input_data->x, output_data2,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001823 input_data->len ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001824 }
Gilles Peskine2d277862018-06-18 15:41:12 +02001825
Gilles Peskinea1cac842018-06-11 19:33:02 +02001826exit:
1827 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001828 mbedtls_free( output_data );
1829 mbedtls_free( output_data2 );
1830 mbedtls_psa_crypto_free( );
1831}
1832/* END_CASE */
1833
1834/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001835void aead_encrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001836 int alg_arg, data_t * input_data,
1837 data_t * additional_data, data_t * nonce,
1838 data_t * expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001839{
1840 int slot = 1;
1841 psa_key_type_t key_type = key_type_arg;
1842 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001843 unsigned char *output_data = NULL;
1844 size_t output_size = 0;
1845 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001846 size_t tag_length = 16;
Gilles Peskinedec72612018-06-18 18:12:37 +02001847 psa_key_policy_t policy;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001848
Gilles Peskinea1cac842018-06-11 19:33:02 +02001849 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001850 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001851 TEST_ASSERT( additional_data != NULL );
1852 TEST_ASSERT( nonce != NULL );
1853 TEST_ASSERT( expected_result != NULL );
1854 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1855 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1856 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
1857 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
1858 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_result->len ) );
1859
Gilles Peskine4abf7412018-06-18 16:35:34 +02001860 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001861 output_data = mbedtls_calloc( 1, output_size );
1862 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +02001863
Gilles Peskinea1cac842018-06-11 19:33:02 +02001864 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1865
1866 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001867 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001868 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1869
1870 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001871 key_data->x,
1872 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001873
1874 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001875 nonce->x, nonce->len,
1876 additional_data->x, additional_data->len,
1877 input_data->x, input_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001878 output_data, output_size,
1879 &output_length ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001880
itayzafrir3e02b3b2018-06-12 17:06:52 +03001881 TEST_ASSERT( memcmp( output_data, expected_result->x,
Gilles Peskine2d277862018-06-18 15:41:12 +02001882 output_length ) == 0 );
1883
Gilles Peskinea1cac842018-06-11 19:33:02 +02001884exit:
1885 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001886 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001887 mbedtls_psa_crypto_free( );
1888}
1889/* END_CASE */
1890
1891/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001892void aead_decrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001893 int alg_arg, data_t * input_data,
1894 data_t * additional_data, data_t * nonce,
1895 data_t * expected_data, int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001896{
1897 int slot = 1;
1898 psa_key_type_t key_type = key_type_arg;
1899 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001900 unsigned char *output_data = NULL;
1901 size_t output_size = 0;
1902 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001903 size_t tag_length = 16;
Gilles Peskinedec72612018-06-18 18:12:37 +02001904 psa_key_policy_t policy;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001905 psa_status_t expected_result = expected_result_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001906
Gilles Peskinea1cac842018-06-11 19:33:02 +02001907 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001908 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001909 TEST_ASSERT( additional_data != NULL );
1910 TEST_ASSERT( nonce != NULL );
1911 TEST_ASSERT( expected_data != NULL );
1912 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1913 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1914 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
1915 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
1916 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
1917
Gilles Peskine4abf7412018-06-18 16:35:34 +02001918 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001919 output_data = mbedtls_calloc( 1, output_size );
1920 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +02001921
Gilles Peskinea1cac842018-06-11 19:33:02 +02001922 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1923
1924 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001925 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001926 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1927
1928 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001929 key_data->x,
1930 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001931
1932 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001933 nonce->x, nonce->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001934 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001935 additional_data->len,
1936 input_data->x, input_data->len,
1937 output_data, output_size,
1938 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001939
Gilles Peskine2d277862018-06-18 15:41:12 +02001940 if( expected_result == PSA_SUCCESS )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001941 {
itayzafrir3e02b3b2018-06-12 17:06:52 +03001942 TEST_ASSERT( memcmp( output_data, expected_data->x,
Gilles Peskine2d277862018-06-18 15:41:12 +02001943 output_length ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001944 }
1945
Gilles Peskinea1cac842018-06-11 19:33:02 +02001946exit:
1947 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001948 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001949 mbedtls_psa_crypto_free( );
1950}
1951/* END_CASE */
1952
1953/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001954void signature_size( int type_arg,
1955 int bits,
1956 int alg_arg,
1957 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01001958{
1959 psa_key_type_t type = type_arg;
1960 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +02001961 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinee59236f2018-01-27 23:32:46 +01001962 TEST_ASSERT( actual_size == (size_t) expected_size_arg );
1963exit:
1964 ;
1965}
1966/* END_CASE */
1967
1968/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001969void sign_deterministic( int key_type_arg, data_t *key_data,
1970 int alg_arg, data_t *input_data,
1971 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01001972{
1973 int slot = 1;
1974 psa_key_type_t key_type = key_type_arg;
1975 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001976 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01001977 unsigned char *signature = NULL;
1978 size_t signature_size;
1979 size_t signature_length = 0xdeadbeef;
Gilles Peskinedec72612018-06-18 18:12:37 +02001980 psa_key_policy_t policy;
Gilles Peskine20035e32018-02-03 22:44:14 +01001981
Gilles Peskine20035e32018-02-03 22:44:14 +01001982 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001983 TEST_ASSERT( input_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001984 TEST_ASSERT( output_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001985 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1986 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1987 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( output_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01001988
1989 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1990
mohammad1603a97cb8c2018-03-28 03:46:26 -07001991 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001992 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001993 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1994
Gilles Peskine20035e32018-02-03 22:44:14 +01001995 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001996 key_data->x,
1997 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001998 TEST_ASSERT( psa_get_key_information( slot,
1999 NULL,
2000 &key_bits ) == PSA_SUCCESS );
2001
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002002 /* Allocate a buffer which has the size advertized by the
2003 * library. */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002004 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
2005 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01002006 TEST_ASSERT( signature_size != 0 );
Gilles Peskine69c12672018-06-28 00:07:19 +02002007 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine20035e32018-02-03 22:44:14 +01002008 signature = mbedtls_calloc( 1, signature_size );
2009 TEST_ASSERT( signature != NULL );
2010
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002011 /* Perform the signature. */
Gilles Peskine20035e32018-02-03 22:44:14 +01002012 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002013 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01002014 NULL, 0,
2015 signature, signature_size,
2016 &signature_length ) == PSA_SUCCESS );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002017 /* Verify that the signature is correct. */
Gilles Peskine4abf7412018-06-18 16:35:34 +02002018 TEST_ASSERT( signature_length == output_data->len );
Gilles Peskine2d277862018-06-18 15:41:12 +02002019 TEST_ASSERT( memcmp( signature, output_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002020 output_data->len ) == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01002021
2022exit:
2023 psa_destroy_key( slot );
Gilles Peskine0189e752018-02-03 23:57:22 +01002024 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01002025 mbedtls_psa_crypto_free( );
2026}
2027/* END_CASE */
2028
2029/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002030void sign_fail( int key_type_arg, data_t *key_data,
2031 int alg_arg, data_t *input_data,
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002032 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01002033{
2034 int slot = 1;
2035 psa_key_type_t key_type = key_type_arg;
2036 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002037 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01002038 psa_status_t actual_status;
2039 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01002040 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01002041 size_t signature_length = 0xdeadbeef;
Gilles Peskinedec72612018-06-18 18:12:37 +02002042 psa_key_policy_t policy;
Gilles Peskine20035e32018-02-03 22:44:14 +01002043
Gilles Peskine20035e32018-02-03 22:44:14 +01002044 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01002045 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002046 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2047 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2048
Gilles Peskine20035e32018-02-03 22:44:14 +01002049 signature = mbedtls_calloc( 1, signature_size );
2050 TEST_ASSERT( signature != NULL );
2051
2052 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2053
mohammad1603a97cb8c2018-03-28 03:46:26 -07002054 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002055 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07002056 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2057
Gilles Peskine20035e32018-02-03 22:44:14 +01002058 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 );
Gilles Peskine20035e32018-02-03 22:44:14 +01002061
2062 actual_status = psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002063 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01002064 NULL, 0,
2065 signature, signature_size,
2066 &signature_length );
2067 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002068 /* The value of *signature_length is unspecified on error, but
2069 * whatever it is, it should be less than signature_size, so that
2070 * if the caller tries to read *signature_length bytes without
2071 * checking the error code then they don't overflow a buffer. */
2072 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01002073
2074exit:
2075 psa_destroy_key( slot );
Gilles Peskine20035e32018-02-03 22:44:14 +01002076 mbedtls_free( signature );
2077 mbedtls_psa_crypto_free( );
2078}
2079/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03002080
2081/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002082void asymmetric_verify( int key_type_arg, data_t *key_data,
2083 int alg_arg, data_t *hash_data,
2084 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03002085{
2086 int slot = 1;
2087 psa_key_type_t key_type = key_type_arg;
2088 psa_algorithm_t alg = alg_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002089 psa_key_policy_t policy;
itayzafrir5c753392018-05-08 11:18:38 +03002090
Gilles Peskine69c12672018-06-28 00:07:19 +02002091 TEST_ASSERT( signature_data->len <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
2092
itayzafrir5c753392018-05-08 11:18:38 +03002093 TEST_ASSERT( key_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03002094 TEST_ASSERT( hash_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03002095 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002096 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2097 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
2098 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03002099
2100 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2101
2102 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002103 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
itayzafrir5c753392018-05-08 11:18:38 +03002104 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2105
2106 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002107 key_data->x,
2108 key_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03002109
2110 TEST_ASSERT( psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002111 hash_data->x, hash_data->len,
itayzafrir5c753392018-05-08 11:18:38 +03002112 NULL, 0,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002113 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002114 signature_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03002115exit:
2116 psa_destroy_key( slot );
itayzafrir5c753392018-05-08 11:18:38 +03002117 mbedtls_psa_crypto_free( );
2118}
2119/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002120
2121/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002122void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
2123 int alg_arg, data_t *hash_data,
2124 data_t *signature_data,
2125 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002126{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002127 int slot = 1;
2128 psa_key_type_t key_type = key_type_arg;
2129 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002130 psa_status_t actual_status;
2131 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002132 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002133
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002134 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002135 TEST_ASSERT( hash_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002136 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002137 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2138 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
2139 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002140
2141 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2142
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002143 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002144 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002145 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2146
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002147 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002148 key_data->x,
2149 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002150
2151 actual_status = psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002152 hash_data->x, hash_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002153 NULL, 0,
2154 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002155 signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002156
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002157 TEST_ASSERT( actual_status == expected_status );
2158
2159exit:
2160 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002161 mbedtls_psa_crypto_free( );
2162}
2163/* END_CASE */
2164
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002165/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002166void asymmetric_encrypt_decrypt( int key_type_arg, data_t *key_data,
2167 int alg_arg, data_t *input_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002168{
2169 int slot = 1;
2170 psa_key_type_t key_type = key_type_arg;
2171 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002172 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002173 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002174 size_t output_length = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002175 unsigned char *output2 = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002176 size_t output2_size = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002177 size_t output2_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02002178 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002179
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002180 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002181 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002182 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2183 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2184
Gilles Peskine4abf7412018-06-18 16:35:34 +02002185 output_size = key_data->len;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002186 output2_size = output_size;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002187 output = mbedtls_calloc( 1, output_size );
2188 TEST_ASSERT( output != NULL );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002189 output2 = mbedtls_calloc( 1, output2_size );
2190 TEST_ASSERT( output2 != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002191
2192 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2193
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002194 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002195 psa_key_policy_set_usage( &policy,
2196 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002197 alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002198 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2199
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002200 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002201 key_data->x,
2202 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002203
Gilles Peskineeebd7382018-06-08 18:11:54 +02002204 /* We test encryption by checking that encrypt-then-decrypt gives back
2205 * the original plaintext because of the non-optional random
2206 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine2d277862018-06-18 15:41:12 +02002207 TEST_ASSERT( psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002208 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002209 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002210 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002211 &output_length ) == PSA_SUCCESS );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002212
Gilles Peskine2d277862018-06-18 15:41:12 +02002213 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002214 output, output_length,
Gilles Peskine2d277862018-06-18 15:41:12 +02002215 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002216 output2, output2_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002217 &output2_length ) == PSA_SUCCESS );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002218 TEST_ASSERT( memcmp( input_data->x, output2,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002219 input_data->len ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002220
2221exit:
2222 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002223 mbedtls_free( output );
2224 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002225 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002226}
2227/* END_CASE */
2228
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002229/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002230void asymmetric_encrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02002231 int alg_arg, data_t *input_data,
2232 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002233{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002234 int slot = 1;
2235 psa_key_type_t key_type = key_type_arg;
2236 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002237 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002238 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002239 size_t output_length = 0;
2240 psa_status_t actual_status;
2241 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002242 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002243
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002244 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002245 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002246 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2247 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2248
Gilles Peskine4abf7412018-06-18 16:35:34 +02002249 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002250 output = mbedtls_calloc( 1, output_size );
2251 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002252
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002253 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2254
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002255 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002256 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002257 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2258
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002259 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002260 key_data->x,
2261 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002262
Gilles Peskine2d277862018-06-18 15:41:12 +02002263 actual_status = psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002264 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002265 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002266 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002267 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002268 TEST_ASSERT( actual_status == expected_status );
2269
2270exit:
2271 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002272 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002273 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002274}
2275/* END_CASE */
2276
2277/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002278void asymmetric_decrypt( int key_type_arg, data_t *key_data,
2279 int alg_arg, data_t *input_data,
2280 data_t *expected_data, int expected_size )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002281{
2282 int slot = 1;
2283 psa_key_type_t key_type = key_type_arg;
2284 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002285 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002286 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002287 size_t output_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02002288 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002289
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002290 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002291 TEST_ASSERT( input_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002292 TEST_ASSERT( expected_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002293 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2294 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2295 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
2296
Gilles Peskine4abf7412018-06-18 16:35:34 +02002297 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002298 output = mbedtls_calloc( 1, output_size );
2299 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002300
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002301 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2302
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002303 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002304 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002305 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2306
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002307 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002308 key_data->x,
2309 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002310
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002311 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002312 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002313 NULL, 0,
2314 output,
2315 output_size,
2316 &output_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002317 TEST_ASSERT( (size_t) expected_size == output_length );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002318 TEST_ASSERT( memcmp( expected_data->x, output, output_length ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002319
2320exit:
2321 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002322 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002323 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002324}
2325/* END_CASE */
2326
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002327/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002328void asymmetric_decrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02002329 int alg_arg, data_t *input_data,
2330 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002331{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002332 int slot = 1;
2333 psa_key_type_t key_type = key_type_arg;
2334 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002335 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002336 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002337 size_t output_length = 0;
2338 psa_status_t actual_status;
2339 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002340 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002341
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002342 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002343 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002344 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2345 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2346
Gilles Peskine4abf7412018-06-18 16:35:34 +02002347 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002348 output = mbedtls_calloc( 1, output_size );
2349 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002350
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002351 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2352
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002353 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002354 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002355 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2356
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002357 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002358 key_data->x,
2359 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002360
Gilles Peskine2d277862018-06-18 15:41:12 +02002361 actual_status = psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002362 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002363 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002364 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002365 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002366 TEST_ASSERT( actual_status == expected_status );
2367
2368exit:
2369 psa_destroy_key( slot );
Gilles Peskine2d277862018-06-18 15:41:12 +02002370 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002371 mbedtls_psa_crypto_free( );
2372}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002373/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02002374
2375/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02002376void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02002377{
Gilles Peskinea50d7392018-06-21 10:22:13 +02002378 size_t bytes = bytes_arg;
2379 const unsigned char trail[] = "don't overwrite me";
2380 unsigned char *output = mbedtls_calloc( 1, bytes + sizeof( trail ) );
2381 unsigned char *changed = mbedtls_calloc( 1, bytes );
2382 size_t i;
2383 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02002384
Gilles Peskinea50d7392018-06-21 10:22:13 +02002385 TEST_ASSERT( output != NULL );
2386 TEST_ASSERT( changed != NULL );
2387 memcpy( output + bytes, trail, sizeof( trail ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02002388
2389 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2390
Gilles Peskinea50d7392018-06-21 10:22:13 +02002391 /* Run several times, to ensure that every output byte will be
2392 * nonzero at least once with overwhelming probability
2393 * (2^(-8*number_of_runs)). */
2394 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02002395 {
Gilles Peskinea50d7392018-06-21 10:22:13 +02002396 memset( output, 0, bytes );
2397 TEST_ASSERT( psa_generate_random( output, bytes ) == PSA_SUCCESS );
2398
2399 /* Check that no more than bytes have been overwritten */
2400 TEST_ASSERT( memcmp( output + bytes, trail, sizeof( trail ) ) == 0 );
2401
2402 for( i = 0; i < bytes; i++ )
2403 {
2404 if( output[i] != 0 )
2405 ++changed[i];
2406 }
Gilles Peskine05d69892018-06-19 22:00:52 +02002407 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02002408
2409 /* Check that every byte was changed to nonzero at least once. This
2410 * validates that psa_generate_random is overwriting every byte of
2411 * the output buffer. */
2412 for( i = 0; i < bytes; i++ )
2413 {
2414 TEST_ASSERT( changed[i] != 0 );
2415 }
Gilles Peskine05d69892018-06-19 22:00:52 +02002416
2417exit:
2418 mbedtls_psa_crypto_free( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02002419 mbedtls_free( output );
2420 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02002421}
2422/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02002423
2424/* BEGIN_CASE */
2425void generate_key( int type_arg,
2426 int bits_arg,
2427 int usage_arg,
2428 int alg_arg,
2429 int expected_status_arg )
2430{
2431 int slot = 1;
2432 psa_key_type_t type = type_arg;
2433 psa_key_usage_t usage = usage_arg;
2434 size_t bits = bits_arg;
2435 psa_algorithm_t alg = alg_arg;
2436 psa_status_t expected_status = expected_status_arg;
2437 psa_key_type_t got_type;
2438 size_t got_bits;
2439 unsigned char exported[616] = {0}; /* enough for a 1024-bit RSA key */
2440 size_t exported_length;
2441 psa_status_t expected_export_status =
2442 usage & PSA_KEY_USAGE_EXPORT ? PSA_SUCCESS : PSA_ERROR_NOT_PERMITTED;
2443 psa_status_t expected_info_status =
2444 expected_status == PSA_SUCCESS ? PSA_SUCCESS : PSA_ERROR_EMPTY_SLOT;
2445 psa_key_policy_t policy;
2446
2447 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2448
2449 psa_key_policy_init( &policy );
2450 psa_key_policy_set_usage( &policy, usage, alg );
2451 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2452
2453 /* Generate a key */
2454 TEST_ASSERT( psa_generate_key( slot, type, bits,
2455 NULL, 0 ) == expected_status );
2456
2457 /* Test the key information */
2458 TEST_ASSERT( psa_get_key_information( slot,
2459 &got_type,
2460 &got_bits ) == expected_info_status );
2461 if( expected_info_status != PSA_SUCCESS )
2462 goto exit;
2463 TEST_ASSERT( got_type == type );
2464 TEST_ASSERT( got_bits == bits );
2465
2466 /* Export the key */
2467 TEST_ASSERT( psa_export_key( slot,
2468 exported, sizeof( exported ),
2469 &exported_length ) == expected_export_status );
2470 if( expected_export_status == PSA_SUCCESS )
2471 {
Gilles Peskine48c0ea12018-06-21 14:15:31 +02002472 if( key_type_is_raw_bytes( type ) )
Gilles Peskine12313cd2018-06-20 00:20:32 +02002473 TEST_ASSERT( exported_length == ( bits + 7 ) / 8 );
2474#if defined(MBEDTLS_DES_C)
2475 if( type == PSA_KEY_TYPE_DES )
2476 {
2477 /* Check the parity bits. */
2478 unsigned i;
2479 for( i = 0; i < bits / 8; i++ )
2480 {
2481 unsigned bit_count = 0;
2482 unsigned m;
2483 for( m = 1; m <= 0x100; m <<= 1 )
2484 {
2485 if( exported[i] & m )
2486 ++bit_count;
2487 }
2488 TEST_ASSERT( bit_count % 2 != 0 );
2489 }
2490 }
2491#endif
2492#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_PARSE_C)
2493 if( type == PSA_KEY_TYPE_RSA_KEYPAIR )
2494 {
2495 /* Sanity check: does this look like the beginning of a PKCS#8
2496 * RSA key pair? Assumes bits is a multiple of 8. */
2497 size_t n_bytes = bits / 8 + 1;
2498 size_t n_encoded_bytes;
2499 unsigned char *n_end;
2500 TEST_ASSERT( exported_length >= 7 + ( n_bytes + 3 ) * 9 / 2 );
2501 TEST_ASSERT( exported[0] == 0x30 );
2502 TEST_ASSERT( exported[1] == 0x82 ); // assumes >=416-bit key
2503 TEST_ASSERT( exported[4] == 0x02 );
2504 TEST_ASSERT( exported[5] == 0x01 );
2505 TEST_ASSERT( exported[6] == 0x00 );
2506 TEST_ASSERT( exported[7] == 0x02 );
2507 n_encoded_bytes = exported[8];
2508 n_end = exported + 9 + n_encoded_bytes;
2509 if( n_encoded_bytes & 0x80 )
2510 {
2511 n_encoded_bytes = ( n_encoded_bytes & 0x7f ) << 7;
2512 n_encoded_bytes |= exported[9] & 0x7f;
2513 n_end += 1;
2514 }
2515 /* The encoding of n should start with a 0 byte since it should
2516 * have its high bit set. However Mbed TLS is not compliant and
2517 * generates an invalid, but widely tolerated, encoding of
2518 * positive INTEGERs with a bit size that is a multiple of 8
2519 * with no leading 0 byte. Accept this here. */
2520 TEST_ASSERT( n_bytes == n_encoded_bytes ||
2521 n_bytes == n_encoded_bytes + 1 );
2522 if( n_bytes == n_encoded_bytes )
2523 TEST_ASSERT( exported[n_encoded_bytes <= 127 ? 9 : 10] == 0x00 );
2524 /* Sanity check: e must be 3 */
2525 TEST_ASSERT( n_end[0] == 0x02 );
2526 TEST_ASSERT( n_end[1] == 0x03 );
2527 TEST_ASSERT( n_end[2] == 0x01 );
2528 TEST_ASSERT( n_end[3] == 0x00 );
2529 TEST_ASSERT( n_end[4] == 0x01 );
2530 TEST_ASSERT( n_end[5] == 0x02 );
2531 }
2532#endif /* MBEDTLS_RSA_C */
2533#if defined(MBEDTLS_ECP_C)
2534 if( PSA_KEY_TYPE_IS_ECC( type ) )
2535 {
2536 /* Sanity check: does this look like the beginning of a PKCS#8
2537 * elliptic curve key pair? */
2538 TEST_ASSERT( exported_length >= bits * 3 / 8 + 10 );
2539 TEST_ASSERT( exported[0] == 0x30 );
2540 }
2541#endif /* MBEDTLS_ECP_C */
2542 }
2543
Gilles Peskine818ca122018-06-20 18:16:48 +02002544 /* Do something with the key according to its type and permitted usage. */
Gilles Peskine02b75072018-07-01 22:31:34 +02002545 if( ! exercise_key( slot, usage, alg ) )
2546 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02002547
2548exit:
2549 psa_destroy_key( slot );
2550 mbedtls_psa_crypto_free( );
2551}
2552/* END_CASE */