blob: cbb3f37b267545b882c1768981cc3aa0ea393390 [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,
146 mac, sizeof( input ),
147 &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 Peskine9911b022018-06-29 17:30:48 +02002017 /* Verify that the signature is what is expected. */
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 */
Gilles Peskine9911b022018-06-29 17:30:48 +02002082void sign_verify( int key_type_arg, data_t *key_data,
2083 int alg_arg, data_t *input_data )
2084{
2085 int slot = 1;
2086 psa_key_type_t key_type = key_type_arg;
2087 psa_algorithm_t alg = alg_arg;
2088 size_t key_bits;
2089 unsigned char *signature = NULL;
2090 size_t signature_size;
2091 size_t signature_length = 0xdeadbeef;
2092 psa_key_policy_t policy;
2093
2094 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2095
2096 psa_key_policy_init( &policy );
2097 psa_key_policy_set_usage( &policy,
2098 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
2099 alg );
2100 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2101
2102 TEST_ASSERT( psa_import_key( slot, key_type,
2103 key_data->x,
2104 key_data->len ) == PSA_SUCCESS );
2105 TEST_ASSERT( psa_get_key_information( slot,
2106 NULL,
2107 &key_bits ) == PSA_SUCCESS );
2108
2109 /* Allocate a buffer which has the size advertized by the
2110 * library. */
2111 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
2112 key_bits, alg );
2113 TEST_ASSERT( signature_size != 0 );
2114 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
2115 signature = mbedtls_calloc( 1, signature_size );
2116 TEST_ASSERT( signature != NULL );
2117
2118 /* Perform the signature. */
2119 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
2120 input_data->x, input_data->len,
2121 NULL, 0,
2122 signature, signature_size,
2123 &signature_length ) == PSA_SUCCESS );
2124 /* Check that the signature length looks sensible. */
2125 TEST_ASSERT( signature_length <= signature_size );
2126 TEST_ASSERT( signature_length > 0 );
2127
2128 /* Use the library to verify that the signature is correct. */
2129 TEST_ASSERT( psa_asymmetric_verify(
2130 slot, alg,
2131 input_data->x, input_data->len,
2132 NULL, 0,
2133 signature, signature_length ) == PSA_SUCCESS );
2134
2135 if( input_data->len != 0 )
2136 {
2137 /* Flip a bit in the input and verify that the signature is now
2138 * detected as invalid. Flip a bit at the beginning, not at the end,
2139 * because ECDSA may ignore the last few bits of the input. */
2140 input_data->x[0] ^= 1;
2141 TEST_ASSERT( psa_asymmetric_verify(
2142 slot, alg,
2143 input_data->x, input_data->len,
2144 NULL, 0,
2145 signature,
2146 signature_length ) == PSA_ERROR_INVALID_SIGNATURE );
2147 }
2148
2149exit:
2150 psa_destroy_key( slot );
2151 mbedtls_free( signature );
2152 mbedtls_psa_crypto_free( );
2153}
2154/* END_CASE */
2155
2156/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002157void asymmetric_verify( int key_type_arg, data_t *key_data,
2158 int alg_arg, data_t *hash_data,
2159 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03002160{
2161 int slot = 1;
2162 psa_key_type_t key_type = key_type_arg;
2163 psa_algorithm_t alg = alg_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002164 psa_key_policy_t policy;
itayzafrir5c753392018-05-08 11:18:38 +03002165
Gilles Peskine69c12672018-06-28 00:07:19 +02002166 TEST_ASSERT( signature_data->len <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
2167
itayzafrir5c753392018-05-08 11:18:38 +03002168 TEST_ASSERT( key_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03002169 TEST_ASSERT( hash_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03002170 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002171 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2172 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
2173 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03002174
2175 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2176
2177 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002178 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
itayzafrir5c753392018-05-08 11:18:38 +03002179 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2180
2181 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002182 key_data->x,
2183 key_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03002184
2185 TEST_ASSERT( psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002186 hash_data->x, hash_data->len,
itayzafrir5c753392018-05-08 11:18:38 +03002187 NULL, 0,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002188 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002189 signature_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03002190exit:
2191 psa_destroy_key( slot );
itayzafrir5c753392018-05-08 11:18:38 +03002192 mbedtls_psa_crypto_free( );
2193}
2194/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002195
2196/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002197void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
2198 int alg_arg, data_t *hash_data,
2199 data_t *signature_data,
2200 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002201{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002202 int slot = 1;
2203 psa_key_type_t key_type = key_type_arg;
2204 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002205 psa_status_t actual_status;
2206 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002207 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002208
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002209 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002210 TEST_ASSERT( hash_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002211 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002212 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2213 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
2214 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002215
2216 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2217
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002218 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002219 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002220 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2221
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002222 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002223 key_data->x,
2224 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002225
2226 actual_status = psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002227 hash_data->x, hash_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002228 NULL, 0,
2229 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002230 signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002231
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002232 TEST_ASSERT( actual_status == expected_status );
2233
2234exit:
2235 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002236 mbedtls_psa_crypto_free( );
2237}
2238/* END_CASE */
2239
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002240/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002241void asymmetric_encrypt_decrypt( int key_type_arg, data_t *key_data,
2242 int alg_arg, data_t *input_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002243{
2244 int slot = 1;
2245 psa_key_type_t key_type = key_type_arg;
2246 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002247 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002248 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002249 size_t output_length = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002250 unsigned char *output2 = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002251 size_t output2_size = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002252 size_t output2_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02002253 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002254
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002255 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002256 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002257 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2258 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2259
Gilles Peskine4abf7412018-06-18 16:35:34 +02002260 output_size = key_data->len;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002261 output2_size = output_size;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002262 output = mbedtls_calloc( 1, output_size );
2263 TEST_ASSERT( output != NULL );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002264 output2 = mbedtls_calloc( 1, output2_size );
2265 TEST_ASSERT( output2 != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002266
2267 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2268
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002269 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002270 psa_key_policy_set_usage( &policy,
2271 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002272 alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002273 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2274
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002275 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002276 key_data->x,
2277 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002278
Gilles Peskineeebd7382018-06-08 18:11:54 +02002279 /* We test encryption by checking that encrypt-then-decrypt gives back
2280 * the original plaintext because of the non-optional random
2281 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine2d277862018-06-18 15:41:12 +02002282 TEST_ASSERT( psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002283 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002284 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002285 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002286 &output_length ) == PSA_SUCCESS );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002287
Gilles Peskine2d277862018-06-18 15:41:12 +02002288 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002289 output, output_length,
Gilles Peskine2d277862018-06-18 15:41:12 +02002290 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002291 output2, output2_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002292 &output2_length ) == PSA_SUCCESS );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002293 TEST_ASSERT( memcmp( input_data->x, output2,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002294 input_data->len ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002295
2296exit:
2297 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002298 mbedtls_free( output );
2299 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002300 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002301}
2302/* END_CASE */
2303
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002304/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002305void asymmetric_encrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02002306 int alg_arg, data_t *input_data,
2307 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002308{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002309 int slot = 1;
2310 psa_key_type_t key_type = key_type_arg;
2311 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002312 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002313 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002314 size_t output_length = 0;
2315 psa_status_t actual_status;
2316 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002317 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002318
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002319 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002320 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002321 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2322 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2323
Gilles Peskine4abf7412018-06-18 16:35:34 +02002324 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002325 output = mbedtls_calloc( 1, output_size );
2326 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002327
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002328 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2329
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002330 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002331 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002332 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2333
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002334 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002335 key_data->x,
2336 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002337
Gilles Peskine2d277862018-06-18 15:41:12 +02002338 actual_status = psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002339 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002340 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002341 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002342 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002343 TEST_ASSERT( actual_status == expected_status );
2344
2345exit:
2346 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002347 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002348 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002349}
2350/* END_CASE */
2351
2352/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002353void asymmetric_decrypt( int key_type_arg, data_t *key_data,
2354 int alg_arg, data_t *input_data,
2355 data_t *expected_data, int expected_size )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002356{
2357 int slot = 1;
2358 psa_key_type_t key_type = key_type_arg;
2359 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002360 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002361 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002362 size_t output_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02002363 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002364
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002365 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002366 TEST_ASSERT( input_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002367 TEST_ASSERT( expected_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002368 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2369 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2370 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
2371
Gilles Peskine4abf7412018-06-18 16:35:34 +02002372 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002373 output = mbedtls_calloc( 1, output_size );
2374 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002375
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002376 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2377
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002378 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002379 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002380 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2381
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002382 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002383 key_data->x,
2384 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002385
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002386 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002387 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002388 NULL, 0,
2389 output,
2390 output_size,
2391 &output_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002392 TEST_ASSERT( (size_t) expected_size == output_length );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002393 TEST_ASSERT( memcmp( expected_data->x, output, output_length ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002394
2395exit:
2396 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002397 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002398 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002399}
2400/* END_CASE */
2401
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002402/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002403void asymmetric_decrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02002404 int alg_arg, data_t *input_data,
2405 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002406{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002407 int slot = 1;
2408 psa_key_type_t key_type = key_type_arg;
2409 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002410 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002411 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002412 size_t output_length = 0;
2413 psa_status_t actual_status;
2414 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002415 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002416
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002417 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002418 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002419 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2420 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2421
Gilles Peskine4abf7412018-06-18 16:35:34 +02002422 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002423 output = mbedtls_calloc( 1, output_size );
2424 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002425
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002426 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2427
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002428 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002429 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002430 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2431
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002432 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002433 key_data->x,
2434 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002435
Gilles Peskine2d277862018-06-18 15:41:12 +02002436 actual_status = psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002437 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002438 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002439 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002440 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002441 TEST_ASSERT( actual_status == expected_status );
2442
2443exit:
2444 psa_destroy_key( slot );
Gilles Peskine2d277862018-06-18 15:41:12 +02002445 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002446 mbedtls_psa_crypto_free( );
2447}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002448/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02002449
2450/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02002451void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02002452{
Gilles Peskinea50d7392018-06-21 10:22:13 +02002453 size_t bytes = bytes_arg;
2454 const unsigned char trail[] = "don't overwrite me";
2455 unsigned char *output = mbedtls_calloc( 1, bytes + sizeof( trail ) );
2456 unsigned char *changed = mbedtls_calloc( 1, bytes );
2457 size_t i;
2458 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02002459
Gilles Peskinea50d7392018-06-21 10:22:13 +02002460 TEST_ASSERT( output != NULL );
2461 TEST_ASSERT( changed != NULL );
2462 memcpy( output + bytes, trail, sizeof( trail ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02002463
2464 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2465
Gilles Peskinea50d7392018-06-21 10:22:13 +02002466 /* Run several times, to ensure that every output byte will be
2467 * nonzero at least once with overwhelming probability
2468 * (2^(-8*number_of_runs)). */
2469 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02002470 {
Gilles Peskinea50d7392018-06-21 10:22:13 +02002471 memset( output, 0, bytes );
2472 TEST_ASSERT( psa_generate_random( output, bytes ) == PSA_SUCCESS );
2473
2474 /* Check that no more than bytes have been overwritten */
2475 TEST_ASSERT( memcmp( output + bytes, trail, sizeof( trail ) ) == 0 );
2476
2477 for( i = 0; i < bytes; i++ )
2478 {
2479 if( output[i] != 0 )
2480 ++changed[i];
2481 }
Gilles Peskine05d69892018-06-19 22:00:52 +02002482 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02002483
2484 /* Check that every byte was changed to nonzero at least once. This
2485 * validates that psa_generate_random is overwriting every byte of
2486 * the output buffer. */
2487 for( i = 0; i < bytes; i++ )
2488 {
2489 TEST_ASSERT( changed[i] != 0 );
2490 }
Gilles Peskine05d69892018-06-19 22:00:52 +02002491
2492exit:
2493 mbedtls_psa_crypto_free( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02002494 mbedtls_free( output );
2495 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02002496}
2497/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02002498
2499/* BEGIN_CASE */
2500void generate_key( int type_arg,
2501 int bits_arg,
2502 int usage_arg,
2503 int alg_arg,
2504 int expected_status_arg )
2505{
2506 int slot = 1;
2507 psa_key_type_t type = type_arg;
2508 psa_key_usage_t usage = usage_arg;
2509 size_t bits = bits_arg;
2510 psa_algorithm_t alg = alg_arg;
2511 psa_status_t expected_status = expected_status_arg;
2512 psa_key_type_t got_type;
2513 size_t got_bits;
2514 unsigned char exported[616] = {0}; /* enough for a 1024-bit RSA key */
2515 size_t exported_length;
2516 psa_status_t expected_export_status =
2517 usage & PSA_KEY_USAGE_EXPORT ? PSA_SUCCESS : PSA_ERROR_NOT_PERMITTED;
2518 psa_status_t expected_info_status =
2519 expected_status == PSA_SUCCESS ? PSA_SUCCESS : PSA_ERROR_EMPTY_SLOT;
2520 psa_key_policy_t policy;
2521
2522 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2523
2524 psa_key_policy_init( &policy );
2525 psa_key_policy_set_usage( &policy, usage, alg );
2526 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2527
2528 /* Generate a key */
2529 TEST_ASSERT( psa_generate_key( slot, type, bits,
2530 NULL, 0 ) == expected_status );
2531
2532 /* Test the key information */
2533 TEST_ASSERT( psa_get_key_information( slot,
2534 &got_type,
2535 &got_bits ) == expected_info_status );
2536 if( expected_info_status != PSA_SUCCESS )
2537 goto exit;
2538 TEST_ASSERT( got_type == type );
2539 TEST_ASSERT( got_bits == bits );
2540
2541 /* Export the key */
2542 TEST_ASSERT( psa_export_key( slot,
2543 exported, sizeof( exported ),
2544 &exported_length ) == expected_export_status );
2545 if( expected_export_status == PSA_SUCCESS )
2546 {
Gilles Peskine48c0ea12018-06-21 14:15:31 +02002547 if( key_type_is_raw_bytes( type ) )
Gilles Peskine12313cd2018-06-20 00:20:32 +02002548 TEST_ASSERT( exported_length == ( bits + 7 ) / 8 );
2549#if defined(MBEDTLS_DES_C)
2550 if( type == PSA_KEY_TYPE_DES )
2551 {
2552 /* Check the parity bits. */
2553 unsigned i;
2554 for( i = 0; i < bits / 8; i++ )
2555 {
2556 unsigned bit_count = 0;
2557 unsigned m;
2558 for( m = 1; m <= 0x100; m <<= 1 )
2559 {
2560 if( exported[i] & m )
2561 ++bit_count;
2562 }
2563 TEST_ASSERT( bit_count % 2 != 0 );
2564 }
2565 }
2566#endif
2567#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_PARSE_C)
2568 if( type == PSA_KEY_TYPE_RSA_KEYPAIR )
2569 {
2570 /* Sanity check: does this look like the beginning of a PKCS#8
2571 * RSA key pair? Assumes bits is a multiple of 8. */
2572 size_t n_bytes = bits / 8 + 1;
2573 size_t n_encoded_bytes;
2574 unsigned char *n_end;
2575 TEST_ASSERT( exported_length >= 7 + ( n_bytes + 3 ) * 9 / 2 );
2576 TEST_ASSERT( exported[0] == 0x30 );
2577 TEST_ASSERT( exported[1] == 0x82 ); // assumes >=416-bit key
2578 TEST_ASSERT( exported[4] == 0x02 );
2579 TEST_ASSERT( exported[5] == 0x01 );
2580 TEST_ASSERT( exported[6] == 0x00 );
2581 TEST_ASSERT( exported[7] == 0x02 );
2582 n_encoded_bytes = exported[8];
2583 n_end = exported + 9 + n_encoded_bytes;
2584 if( n_encoded_bytes & 0x80 )
2585 {
2586 n_encoded_bytes = ( n_encoded_bytes & 0x7f ) << 7;
2587 n_encoded_bytes |= exported[9] & 0x7f;
2588 n_end += 1;
2589 }
2590 /* The encoding of n should start with a 0 byte since it should
2591 * have its high bit set. However Mbed TLS is not compliant and
2592 * generates an invalid, but widely tolerated, encoding of
2593 * positive INTEGERs with a bit size that is a multiple of 8
2594 * with no leading 0 byte. Accept this here. */
2595 TEST_ASSERT( n_bytes == n_encoded_bytes ||
2596 n_bytes == n_encoded_bytes + 1 );
2597 if( n_bytes == n_encoded_bytes )
2598 TEST_ASSERT( exported[n_encoded_bytes <= 127 ? 9 : 10] == 0x00 );
2599 /* Sanity check: e must be 3 */
2600 TEST_ASSERT( n_end[0] == 0x02 );
2601 TEST_ASSERT( n_end[1] == 0x03 );
2602 TEST_ASSERT( n_end[2] == 0x01 );
2603 TEST_ASSERT( n_end[3] == 0x00 );
2604 TEST_ASSERT( n_end[4] == 0x01 );
2605 TEST_ASSERT( n_end[5] == 0x02 );
2606 }
2607#endif /* MBEDTLS_RSA_C */
2608#if defined(MBEDTLS_ECP_C)
2609 if( PSA_KEY_TYPE_IS_ECC( type ) )
2610 {
2611 /* Sanity check: does this look like the beginning of a PKCS#8
2612 * elliptic curve key pair? */
2613 TEST_ASSERT( exported_length >= bits * 3 / 8 + 10 );
2614 TEST_ASSERT( exported[0] == 0x30 );
2615 }
2616#endif /* MBEDTLS_ECP_C */
2617 }
2618
Gilles Peskine818ca122018-06-20 18:16:48 +02002619 /* Do something with the key according to its type and permitted usage. */
Gilles Peskine02b75072018-07-01 22:31:34 +02002620 if( ! exercise_key( slot, usage, alg ) )
2621 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02002622
2623exit:
2624 psa_destroy_key( slot );
2625 mbedtls_psa_crypto_free( );
2626}
2627/* END_CASE */