blob: 2499102a5589d8d1dfbdfb6f190e78ff728bdbf2 [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 Peskinedd2f95b2018-08-11 01:22:42 +02008#include "mbedtls/asn1.h"
Gilles Peskine0b352bc2018-06-28 00:16:11 +02009#include "mbedtls/asn1write.h"
Gilles Peskinedd2f95b2018-08-11 01:22:42 +020010#include "mbedtls/oid.h"
11
Gilles Peskinee59236f2018-01-27 23:32:46 +010012#include "psa/crypto.h"
itayzafrir3e02b3b2018-06-12 17:06:52 +030013
Jaeden Amerof24c7f82018-06-27 17:20:43 +010014/** An invalid export length that will never be set by psa_export_key(). */
15static const size_t INVALID_EXPORT_LENGTH = ~0U;
16
Gilles Peskinea7aa4422018-08-14 15:17:54 +020017/** Test if a buffer contains a constant byte value.
18 *
19 * `mem_is_char(buffer, c, size)` is true after `memset(buffer, c, size)`.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020020 *
21 * \param buffer Pointer to the beginning of the buffer.
Gilles Peskinea7aa4422018-08-14 15:17:54 +020022 * \param c Expected value of every byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020023 * \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 Peskinea7aa4422018-08-14 15:17:54 +020028static int mem_is_char( void *buffer, unsigned char c, size_t size )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020029{
30 size_t i;
31 for( i = 0; i < size; i++ )
32 {
Gilles Peskinea7aa4422018-08-14 15:17:54 +020033 if( ( (unsigned char *) buffer )[i] != c )
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 Peskine0b352bc2018-06-28 00:16:11 +020039/* Write the ASN.1 INTEGER with the value 2^(bits-1)+x backwards from *p. */
40static int asn1_write_10x( unsigned char **p,
41 unsigned char *start,
42 size_t bits,
43 unsigned char x )
44{
45 int ret;
46 int len = bits / 8 + 1;
Gilles Peskine480416a2018-06-28 19:04:07 +020047 if( bits == 0 )
48 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
49 if( bits <= 8 && x >= 1 << ( bits - 1 ) )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020050 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
Moran Pekercb088e72018-07-17 17:36:59 +030051 if( *p < start || *p - start < (ptrdiff_t) len )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020052 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
53 *p -= len;
54 ( *p )[len-1] = x;
55 if( bits % 8 == 0 )
56 ( *p )[1] |= 1;
57 else
58 ( *p )[0] |= 1 << ( bits % 8 );
59 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
60 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
61 MBEDTLS_ASN1_INTEGER ) );
62 return( len );
63}
64
65static int construct_fake_rsa_key( unsigned char *buffer,
66 size_t buffer_size,
67 unsigned char **p,
68 size_t bits,
69 int keypair )
70{
71 size_t half_bits = ( bits + 1 ) / 2;
72 int ret;
73 int len = 0;
74 /* Construct something that looks like a DER encoding of
75 * as defined by PKCS#1 v2.2 (RFC 8017) section A.1.2:
76 * RSAPrivateKey ::= SEQUENCE {
77 * version Version,
78 * modulus INTEGER, -- n
79 * publicExponent INTEGER, -- e
80 * privateExponent INTEGER, -- d
81 * prime1 INTEGER, -- p
82 * prime2 INTEGER, -- q
83 * exponent1 INTEGER, -- d mod (p-1)
84 * exponent2 INTEGER, -- d mod (q-1)
85 * coefficient INTEGER, -- (inverse of q) mod p
86 * otherPrimeInfos OtherPrimeInfos OPTIONAL
87 * }
88 * Or, for a public key, the same structure with only
89 * version, modulus and publicExponent.
90 */
91 *p = buffer + buffer_size;
92 if( keypair )
93 {
94 MBEDTLS_ASN1_CHK_ADD( len, /* pq */
95 asn1_write_10x( p, buffer, half_bits, 1 ) );
96 MBEDTLS_ASN1_CHK_ADD( len, /* dq */
97 asn1_write_10x( p, buffer, half_bits, 1 ) );
98 MBEDTLS_ASN1_CHK_ADD( len, /* dp */
99 asn1_write_10x( p, buffer, half_bits, 1 ) );
100 MBEDTLS_ASN1_CHK_ADD( len, /* q */
101 asn1_write_10x( p, buffer, half_bits, 1 ) );
102 MBEDTLS_ASN1_CHK_ADD( len, /* p != q to pass mbedtls sanity checks */
103 asn1_write_10x( p, buffer, half_bits, 3 ) );
104 MBEDTLS_ASN1_CHK_ADD( len, /* d */
105 asn1_write_10x( p, buffer, bits, 1 ) );
106 }
107 MBEDTLS_ASN1_CHK_ADD( len, /* e = 65537 */
108 asn1_write_10x( p, buffer, 17, 1 ) );
109 MBEDTLS_ASN1_CHK_ADD( len, /* n */
110 asn1_write_10x( p, buffer, bits, 1 ) );
111 if( keypair )
112 MBEDTLS_ASN1_CHK_ADD( len, /* version = 0 */
113 mbedtls_asn1_write_int( p, buffer, 0 ) );
114 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, buffer, len ) );
115 {
116 const unsigned char tag =
117 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE;
118 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, buffer, tag ) );
119 }
120 return( len );
121}
122
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100123static int exercise_mac_key( psa_key_handle_t handle,
Gilles Peskine818ca122018-06-20 18:16:48 +0200124 psa_key_usage_t usage,
125 psa_algorithm_t alg )
126{
Jaeden Amero769ce272019-01-04 11:48:03 +0000127 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskine818ca122018-06-20 18:16:48 +0200128 const unsigned char input[] = "foo";
Gilles Peskine69c12672018-06-28 00:07:19 +0200129 unsigned char mac[PSA_MAC_MAX_SIZE] = {0};
Gilles Peskine818ca122018-06-20 18:16:48 +0200130 size_t mac_length = sizeof( mac );
131
132 if( usage & PSA_KEY_USAGE_SIGN )
133 {
Gilles Peskine8817f612018-12-18 00:18:46 +0100134 PSA_ASSERT( psa_mac_sign_setup( &operation,
135 handle, alg ) );
136 PSA_ASSERT( psa_mac_update( &operation,
137 input, sizeof( input ) ) );
138 PSA_ASSERT( psa_mac_sign_finish( &operation,
139 mac, sizeof( mac ),
140 &mac_length ) );
Gilles Peskine818ca122018-06-20 18:16:48 +0200141 }
142
143 if( usage & PSA_KEY_USAGE_VERIFY )
144 {
145 psa_status_t verify_status =
146 ( usage & PSA_KEY_USAGE_SIGN ?
147 PSA_SUCCESS :
148 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine8817f612018-12-18 00:18:46 +0100149 PSA_ASSERT( psa_mac_verify_setup( &operation,
150 handle, alg ) );
151 PSA_ASSERT( psa_mac_update( &operation,
152 input, sizeof( input ) ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +0100153 TEST_EQUAL( psa_mac_verify_finish( &operation, mac, mac_length ),
154 verify_status );
Gilles Peskine818ca122018-06-20 18:16:48 +0200155 }
156
157 return( 1 );
158
159exit:
160 psa_mac_abort( &operation );
161 return( 0 );
162}
163
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100164static int exercise_cipher_key( psa_key_handle_t handle,
Gilles Peskine818ca122018-06-20 18:16:48 +0200165 psa_key_usage_t usage,
166 psa_algorithm_t alg )
167{
Jaeden Amero5bae2272019-01-04 11:48:27 +0000168 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine818ca122018-06-20 18:16:48 +0200169 unsigned char iv[16] = {0};
170 size_t iv_length = sizeof( iv );
171 const unsigned char plaintext[16] = "Hello, world...";
172 unsigned char ciphertext[32] = "(wabblewebblewibblewobblewubble)";
173 size_t ciphertext_length = sizeof( ciphertext );
174 unsigned char decrypted[sizeof( ciphertext )];
175 size_t part_length;
176
177 if( usage & PSA_KEY_USAGE_ENCRYPT )
178 {
Gilles Peskine8817f612018-12-18 00:18:46 +0100179 PSA_ASSERT( psa_cipher_encrypt_setup( &operation,
180 handle, alg ) );
181 PSA_ASSERT( psa_cipher_generate_iv( &operation,
182 iv, sizeof( iv ),
183 &iv_length ) );
184 PSA_ASSERT( psa_cipher_update( &operation,
185 plaintext, sizeof( plaintext ),
186 ciphertext, sizeof( ciphertext ),
187 &ciphertext_length ) );
188 PSA_ASSERT( psa_cipher_finish( &operation,
189 ciphertext + ciphertext_length,
190 sizeof( ciphertext ) - ciphertext_length,
191 &part_length ) );
Gilles Peskine818ca122018-06-20 18:16:48 +0200192 ciphertext_length += part_length;
193 }
194
195 if( usage & PSA_KEY_USAGE_DECRYPT )
196 {
197 psa_status_t status;
Mohammad AboMokhadb9b232018-06-28 01:52:54 -0700198 psa_key_type_t type = PSA_KEY_TYPE_NONE;
Gilles Peskine818ca122018-06-20 18:16:48 +0200199 if( ! ( usage & PSA_KEY_USAGE_ENCRYPT ) )
200 {
Gilles Peskine818ca122018-06-20 18:16:48 +0200201 size_t bits;
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100202 TEST_ASSERT( psa_get_key_information( handle, &type, &bits ) );
Gilles Peskine818ca122018-06-20 18:16:48 +0200203 iv_length = PSA_BLOCK_CIPHER_BLOCK_SIZE( type );
204 }
Gilles Peskine8817f612018-12-18 00:18:46 +0100205 PSA_ASSERT( psa_cipher_decrypt_setup( &operation,
206 handle, alg ) );
207 PSA_ASSERT( psa_cipher_set_iv( &operation,
208 iv, iv_length ) );
209 PSA_ASSERT( psa_cipher_update( &operation,
210 ciphertext, ciphertext_length,
211 decrypted, sizeof( decrypted ),
212 &part_length ) );
Gilles Peskine818ca122018-06-20 18:16:48 +0200213 status = psa_cipher_finish( &operation,
214 decrypted + part_length,
215 sizeof( decrypted ) - part_length,
216 &part_length );
217 /* For a stream cipher, all inputs are valid. For a block cipher,
218 * if the input is some aribtrary data rather than an actual
219 ciphertext, a padding error is likely. */
Mohammad AboMokh65fa0b82018-06-28 02:14:00 -0700220 if( ( usage & PSA_KEY_USAGE_ENCRYPT ) ||
Mohammad AboMokhadb9b232018-06-28 01:52:54 -0700221 PSA_BLOCK_CIPHER_BLOCK_SIZE( type ) == 1 )
Gilles Peskine8817f612018-12-18 00:18:46 +0100222 PSA_ASSERT( status );
Gilles Peskine818ca122018-06-20 18:16:48 +0200223 else
224 TEST_ASSERT( status == PSA_SUCCESS ||
225 status == PSA_ERROR_INVALID_PADDING );
226 }
227
228 return( 1 );
229
230exit:
231 psa_cipher_abort( &operation );
232 return( 0 );
233}
234
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100235static int exercise_aead_key( psa_key_handle_t handle,
Gilles Peskine818ca122018-06-20 18:16:48 +0200236 psa_key_usage_t usage,
237 psa_algorithm_t alg )
238{
239 unsigned char nonce[16] = {0};
240 size_t nonce_length = sizeof( nonce );
241 unsigned char plaintext[16] = "Hello, world...";
242 unsigned char ciphertext[48] = "(wabblewebblewibblewobblewubble)";
243 size_t ciphertext_length = sizeof( ciphertext );
244 size_t plaintext_length = sizeof( ciphertext );
245
246 if( usage & PSA_KEY_USAGE_ENCRYPT )
247 {
Gilles Peskine8817f612018-12-18 00:18:46 +0100248 PSA_ASSERT( psa_aead_encrypt( handle, alg,
249 nonce, nonce_length,
250 NULL, 0,
251 plaintext, sizeof( plaintext ),
252 ciphertext, sizeof( ciphertext ),
253 &ciphertext_length ) );
Gilles Peskine818ca122018-06-20 18:16:48 +0200254 }
255
256 if( usage & PSA_KEY_USAGE_DECRYPT )
257 {
258 psa_status_t verify_status =
259 ( usage & PSA_KEY_USAGE_ENCRYPT ?
260 PSA_SUCCESS :
261 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100262 TEST_EQUAL( psa_aead_decrypt( handle, alg,
263 nonce, nonce_length,
264 NULL, 0,
265 ciphertext, ciphertext_length,
266 plaintext, sizeof( plaintext ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +0100267 &plaintext_length ),
268 verify_status );
Gilles Peskine818ca122018-06-20 18:16:48 +0200269 }
270
271 return( 1 );
272
273exit:
274 return( 0 );
275}
276
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100277static int exercise_signature_key( psa_key_handle_t handle,
Gilles Peskine818ca122018-06-20 18:16:48 +0200278 psa_key_usage_t usage,
279 psa_algorithm_t alg )
280{
Gilles Peskinef969b3a2018-06-30 00:20:25 +0200281 unsigned char payload[PSA_HASH_MAX_SIZE] = {1};
282 size_t payload_length = 16;
Gilles Peskine69c12672018-06-28 00:07:19 +0200283 unsigned char signature[PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE] = {0};
Gilles Peskine818ca122018-06-20 18:16:48 +0200284 size_t signature_length = sizeof( signature );
Gilles Peskine57ab7212019-01-28 13:03:09 +0100285 psa_algorithm_t hash_alg = PSA_ALG_SIGN_GET_HASH( alg );
286
287 /* If the policy allows signing with any hash, just pick one. */
288 if( PSA_ALG_IS_HASH_AND_SIGN( alg ) && hash_alg == PSA_ALG_ANY_HASH )
289 {
290#if defined(MBEDTLS_MD2_C)
291 hash_alg = PSA_ALG_MD2;
292#elif defined(MBEDTLS_MD4_C)
293 hash_alg = PSA_ALG_MD4;
294#elif defined(MBEDTLS_MD5_C)
295 hash_alg = PSA_ALG_MD5;
Gilles Peskine6b156df2019-01-28 15:43:19 +0100296 /* MBEDTLS_RIPEMD160_C omitted because Mbed TLS doesn't
297 * support it in RSA PKCS#1v1.5 signatures. */
Gilles Peskine57ab7212019-01-28 13:03:09 +0100298#elif defined(MBEDTLS_SHA1_C)
299 hash_alg = PSA_ALG_SHA_1;
300#elif defined(MBEDTLS_SHA256_C)
301 hash_alg = PSA_ALG_SHA_256;
302#elif defined(MBEDTLS_SHA512_C)
303 hash_alg = PSA_ALG_SHA_384;
304#elif defined(MBEDTLS_SHA3_C)
305 hash_alg = PSA_ALG_SHA3_256;
306#else
307 test_fail( "No hash algorithm for hash-and-sign testing", __LINE__, __FILE__ );
308#endif
309 alg ^= PSA_ALG_ANY_HASH ^ hash_alg;
310 }
Gilles Peskine818ca122018-06-20 18:16:48 +0200311
312 if( usage & PSA_KEY_USAGE_SIGN )
313 {
Gilles Peskinef969b3a2018-06-30 00:20:25 +0200314 /* Some algorithms require the payload to have the size of
315 * the hash encoded in the algorithm. Use this input size
316 * even for algorithms that allow other input sizes. */
Gilles Peskinef969b3a2018-06-30 00:20:25 +0200317 if( hash_alg != 0 )
318 payload_length = PSA_HASH_SIZE( hash_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +0100319 PSA_ASSERT( psa_asymmetric_sign( handle, alg,
320 payload, payload_length,
321 signature, sizeof( signature ),
322 &signature_length ) );
Gilles Peskine818ca122018-06-20 18:16:48 +0200323 }
324
325 if( usage & PSA_KEY_USAGE_VERIFY )
326 {
327 psa_status_t verify_status =
328 ( usage & PSA_KEY_USAGE_SIGN ?
329 PSA_SUCCESS :
330 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100331 TEST_EQUAL( psa_asymmetric_verify( handle, alg,
332 payload, payload_length,
333 signature, signature_length ),
334 verify_status );
Gilles Peskine818ca122018-06-20 18:16:48 +0200335 }
336
337 return( 1 );
338
339exit:
340 return( 0 );
341}
342
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100343static int exercise_asymmetric_encryption_key( psa_key_handle_t handle,
Gilles Peskine818ca122018-06-20 18:16:48 +0200344 psa_key_usage_t usage,
345 psa_algorithm_t alg )
346{
347 unsigned char plaintext[256] = "Hello, world...";
348 unsigned char ciphertext[256] = "(wabblewebblewibblewobblewubble)";
349 size_t ciphertext_length = sizeof( ciphertext );
350 size_t plaintext_length = 16;
351
352 if( usage & PSA_KEY_USAGE_ENCRYPT )
353 {
Gilles Peskinef812dcf2018-12-18 00:33:25 +0100354 PSA_ASSERT( psa_asymmetric_encrypt( handle, alg,
355 plaintext, plaintext_length,
356 NULL, 0,
357 ciphertext, sizeof( ciphertext ),
358 &ciphertext_length ) );
Gilles Peskine818ca122018-06-20 18:16:48 +0200359 }
360
361 if( usage & PSA_KEY_USAGE_DECRYPT )
362 {
363 psa_status_t status =
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100364 psa_asymmetric_decrypt( handle, alg,
Gilles Peskine818ca122018-06-20 18:16:48 +0200365 ciphertext, ciphertext_length,
366 NULL, 0,
367 plaintext, sizeof( plaintext ),
368 &plaintext_length );
369 TEST_ASSERT( status == PSA_SUCCESS ||
370 ( ( usage & PSA_KEY_USAGE_ENCRYPT ) == 0 &&
371 ( status == PSA_ERROR_INVALID_ARGUMENT ||
372 status == PSA_ERROR_INVALID_PADDING ) ) );
373 }
374
375 return( 1 );
376
377exit:
378 return( 0 );
379}
Gilles Peskine02b75072018-07-01 22:31:34 +0200380
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100381static int exercise_key_derivation_key( psa_key_handle_t handle,
Gilles Peskineea0fb492018-07-12 17:17:20 +0200382 psa_key_usage_t usage,
383 psa_algorithm_t alg )
384{
385 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
386 unsigned char label[16] = "This is a label.";
387 size_t label_length = sizeof( label );
388 unsigned char seed[16] = "abcdefghijklmnop";
389 size_t seed_length = sizeof( seed );
390 unsigned char output[1];
391
392 if( usage & PSA_KEY_USAGE_DERIVE )
393 {
Gilles Peskine8817f612018-12-18 00:18:46 +0100394 PSA_ASSERT( psa_key_derivation( &generator,
395 handle, alg,
396 label, label_length,
397 seed, seed_length,
398 sizeof( output ) ) );
399 PSA_ASSERT( psa_generator_read( &generator,
400 output,
401 sizeof( output ) ) );
402 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +0200403 }
404
405 return( 1 );
406
407exit:
408 return( 0 );
409}
410
Gilles Peskinec7998b72018-11-07 18:45:02 +0100411/* We need two keys to exercise key agreement. Exercise the
412 * private key against its own public key. */
413static psa_status_t key_agreement_with_self( psa_crypto_generator_t *generator,
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100414 psa_key_handle_t handle,
Gilles Peskinec7998b72018-11-07 18:45:02 +0100415 psa_algorithm_t alg )
416{
417 psa_key_type_t private_key_type;
418 psa_key_type_t public_key_type;
419 size_t key_bits;
420 uint8_t *public_key = NULL;
421 size_t public_key_length;
422 /* Return UNKNOWN_ERROR if something other than the final call to
423 * psa_key_agreement fails. This isn't fully satisfactory, but it's
424 * good enough: callers will report it as a failed test anyway. */
425 psa_status_t status = PSA_ERROR_UNKNOWN_ERROR;
426
Gilles Peskine8817f612018-12-18 00:18:46 +0100427 PSA_ASSERT( psa_get_key_information( handle,
428 &private_key_type,
429 &key_bits ) );
Gilles Peskinec7998b72018-11-07 18:45:02 +0100430 public_key_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEYPAIR( private_key_type );
431 public_key_length = PSA_KEY_EXPORT_MAX_SIZE( public_key_type, key_bits );
432 ASSERT_ALLOC( public_key, public_key_length );
Gilles Peskine8817f612018-12-18 00:18:46 +0100433 PSA_ASSERT( psa_export_public_key( handle,
434 public_key, public_key_length,
435 &public_key_length ) );
Gilles Peskinec7998b72018-11-07 18:45:02 +0100436
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100437 status = psa_key_agreement( generator, handle,
Gilles Peskinec7998b72018-11-07 18:45:02 +0100438 public_key, public_key_length,
439 alg );
440exit:
441 mbedtls_free( public_key );
442 return( status );
443}
444
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100445static int exercise_key_agreement_key( psa_key_handle_t handle,
Gilles Peskine01d718c2018-09-18 12:01:02 +0200446 psa_key_usage_t usage,
447 psa_algorithm_t alg )
448{
449 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +0200450 unsigned char output[1];
451 int ok = 0;
452
453 if( usage & PSA_KEY_USAGE_DERIVE )
454 {
455 /* We need two keys to exercise key agreement. Exercise the
456 * private key against its own public key. */
Gilles Peskine8817f612018-12-18 00:18:46 +0100457 PSA_ASSERT( key_agreement_with_self( &generator, handle, alg ) );
458 PSA_ASSERT( psa_generator_read( &generator,
459 output,
460 sizeof( output ) ) );
461 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +0200462 }
463 ok = 1;
464
465exit:
Gilles Peskine01d718c2018-09-18 12:01:02 +0200466 return( ok );
467}
468
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200469static int is_oid_of_key_type( psa_key_type_t type,
470 const uint8_t *oid, size_t oid_length )
471{
Gilles Peskineae3d2a22018-08-13 14:14:22 +0200472 const uint8_t *expected_oid = NULL;
473 size_t expected_oid_length = 0;
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200474#if defined(MBEDTLS_RSA_C)
Gilles Peskineae3d2a22018-08-13 14:14:22 +0200475 if( PSA_KEY_TYPE_IS_RSA( type ) )
476 {
477 expected_oid = (uint8_t *) MBEDTLS_OID_PKCS1_RSA;
478 expected_oid_length = sizeof( MBEDTLS_OID_PKCS1_RSA ) - 1;
479 }
480 else
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200481#endif /* MBEDTLS_RSA_C */
482#if defined(MBEDTLS_ECP_C)
Gilles Peskineae3d2a22018-08-13 14:14:22 +0200483 if( PSA_KEY_TYPE_IS_ECC( type ) )
484 {
485 expected_oid = (uint8_t *) MBEDTLS_OID_EC_ALG_UNRESTRICTED;
486 expected_oid_length = sizeof( MBEDTLS_OID_EC_ALG_UNRESTRICTED ) - 1;
487 }
488 else
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200489#endif /* MBEDTLS_ECP_C */
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200490 {
491 char message[40];
492 mbedtls_snprintf( message, sizeof( message ),
493 "OID not known for key type=0x%08lx",
494 (unsigned long) type );
495 test_fail( message, __LINE__, __FILE__ );
496 return( 0 );
497 }
498
Gilles Peskinebd7dea92018-09-27 13:57:19 +0200499 ASSERT_COMPARE( expected_oid, expected_oid_length, oid, oid_length );
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200500 return( 1 );
501
502exit:
503 return( 0 );
504}
505
506static int asn1_skip_integer( unsigned char **p, const unsigned char *end,
507 size_t min_bits, size_t max_bits,
508 int must_be_odd )
509{
510 size_t len;
511 size_t actual_bits;
512 unsigned char msb;
Gilles Peskinefe11b722018-12-18 00:24:04 +0100513 TEST_EQUAL( mbedtls_asn1_get_tag( p, end, &len,
Gilles Peskinef812dcf2018-12-18 00:33:25 +0100514 MBEDTLS_ASN1_INTEGER ),
515 0 );
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200516 /* Tolerate a slight departure from DER encoding:
517 * - 0 may be represented by an empty string or a 1-byte string.
518 * - The sign bit may be used as a value bit. */
519 if( ( len == 1 && ( *p )[0] == 0 ) ||
520 ( len > 1 && ( *p )[0] == 0 && ( ( *p )[1] & 0x80 ) != 0 ) )
521 {
522 ++( *p );
523 --len;
524 }
525 if( min_bits == 0 && len == 0 )
526 return( 1 );
527 msb = ( *p )[0];
528 TEST_ASSERT( msb != 0 );
529 actual_bits = 8 * ( len - 1 );
530 while( msb != 0 )
531 {
532 msb >>= 1;
533 ++actual_bits;
534 }
535 TEST_ASSERT( actual_bits >= min_bits );
536 TEST_ASSERT( actual_bits <= max_bits );
537 if( must_be_odd )
538 TEST_ASSERT( ( ( *p )[len-1] & 1 ) != 0 );
539 *p += len;
540 return( 1 );
541exit:
542 return( 0 );
543}
544
545static int asn1_get_implicit_tag( unsigned char **p, const unsigned char *end,
546 size_t *len,
547 unsigned char n, unsigned char tag )
548{
549 int ret;
550 ret = mbedtls_asn1_get_tag( p, end, len,
551 MBEDTLS_ASN1_CONTEXT_SPECIFIC |
552 MBEDTLS_ASN1_CONSTRUCTED | ( n ) );
553 if( ret != 0 )
554 return( ret );
555 end = *p + *len;
556 ret = mbedtls_asn1_get_tag( p, end, len, tag );
557 if( ret != 0 )
558 return( ret );
559 if( *p + *len != end )
560 return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
561 return( 0 );
562}
563
564static int exported_key_sanity_check( psa_key_type_t type, size_t bits,
565 uint8_t *exported, size_t exported_length )
566{
567 if( PSA_KEY_TYPE_IS_UNSTRUCTURED( type ) )
Gilles Peskinefe11b722018-12-18 00:24:04 +0100568 TEST_EQUAL( exported_length, ( bits + 7 ) / 8 );
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200569 else
570 TEST_ASSERT( exported_length <= PSA_KEY_EXPORT_MAX_SIZE( type, bits ) );
Gilles Peskined14664a2018-08-10 19:07:32 +0200571
572#if defined(MBEDTLS_DES_C)
573 if( type == PSA_KEY_TYPE_DES )
574 {
575 /* Check the parity bits. */
576 unsigned i;
577 for( i = 0; i < bits / 8; i++ )
578 {
579 unsigned bit_count = 0;
580 unsigned m;
581 for( m = 1; m <= 0x100; m <<= 1 )
582 {
583 if( exported[i] & m )
584 ++bit_count;
585 }
586 TEST_ASSERT( bit_count % 2 != 0 );
587 }
588 }
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200589 else
Gilles Peskined14664a2018-08-10 19:07:32 +0200590#endif
591
592#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_PARSE_C)
593 if( type == PSA_KEY_TYPE_RSA_KEYPAIR )
594 {
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200595 uint8_t *p = exported;
596 uint8_t *end = exported + exported_length;
597 size_t len;
598 /* RSAPrivateKey ::= SEQUENCE {
Gilles Peskinedea46cf2018-08-21 16:12:54 +0200599 * version INTEGER, -- must be 0
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200600 * modulus INTEGER, -- n
601 * publicExponent INTEGER, -- e
602 * privateExponent INTEGER, -- d
603 * prime1 INTEGER, -- p
604 * prime2 INTEGER, -- q
605 * exponent1 INTEGER, -- d mod (p-1)
606 * exponent2 INTEGER, -- d mod (q-1)
607 * coefficient INTEGER, -- (inverse of q) mod p
608 * }
609 */
Gilles Peskinefe11b722018-12-18 00:24:04 +0100610 TEST_EQUAL( mbedtls_asn1_get_tag( &p, end, &len,
611 MBEDTLS_ASN1_SEQUENCE |
612 MBEDTLS_ASN1_CONSTRUCTED ), 0 );
613 TEST_EQUAL( p + len, end );
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200614 if( ! asn1_skip_integer( &p, end, 0, 0, 0 ) )
615 goto exit;
616 if( ! asn1_skip_integer( &p, end, bits, bits, 1 ) )
617 goto exit;
618 if( ! asn1_skip_integer( &p, end, 2, bits, 1 ) )
619 goto exit;
620 /* Require d to be at least half the size of n. */
621 if( ! asn1_skip_integer( &p, end, bits / 2, bits, 1 ) )
622 goto exit;
623 /* Require p and q to be at most half the size of n, rounded up. */
624 if( ! asn1_skip_integer( &p, end, bits / 2, bits / 2 + 1, 1 ) )
625 goto exit;
626 if( ! asn1_skip_integer( &p, end, bits / 2, bits / 2 + 1, 1 ) )
627 goto exit;
628 if( ! asn1_skip_integer( &p, end, 1, bits / 2 + 1, 0 ) )
629 goto exit;
630 if( ! asn1_skip_integer( &p, end, 1, bits / 2 + 1, 0 ) )
631 goto exit;
632 if( ! asn1_skip_integer( &p, end, 1, bits / 2 + 1, 0 ) )
633 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +0100634 TEST_EQUAL( p, end );
Gilles Peskine0f915f12018-12-17 23:35:42 +0100635 }
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200636 else
Gilles Peskined14664a2018-08-10 19:07:32 +0200637#endif /* MBEDTLS_RSA_C */
638
639#if defined(MBEDTLS_ECP_C)
640 if( PSA_KEY_TYPE_IS_ECC_KEYPAIR( type ) )
641 {
Gilles Peskine5b802a32018-10-29 19:21:41 +0100642 /* Just the secret value */
Gilles Peskinefe11b722018-12-18 00:24:04 +0100643 TEST_EQUAL( exported_length, PSA_BITS_TO_BYTES( bits ) );
Gilles Peskine5b802a32018-10-29 19:21:41 +0100644 }
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200645 else
Gilles Peskined14664a2018-08-10 19:07:32 +0200646#endif /* MBEDTLS_ECP_C */
647
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200648 if( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) )
649 {
650 uint8_t *p = exported;
651 uint8_t *end = exported + exported_length;
652 size_t len;
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200653#if defined(MBEDTLS_RSA_C)
654 if( type == PSA_KEY_TYPE_RSA_PUBLIC_KEY )
655 {
656 /* RSAPublicKey ::= SEQUENCE {
657 * modulus INTEGER, -- n
658 * publicExponent INTEGER } -- e
659 */
Gilles Peskinefe11b722018-12-18 00:24:04 +0100660 TEST_EQUAL( mbedtls_asn1_get_tag( &p, end, &len,
661 MBEDTLS_ASN1_SEQUENCE |
Gilles Peskinef812dcf2018-12-18 00:33:25 +0100662 MBEDTLS_ASN1_CONSTRUCTED ),
663 0 );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100664 TEST_EQUAL( p + len, end );
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200665 if( ! asn1_skip_integer( &p, end, bits, bits, 1 ) )
666 goto exit;
667 if( ! asn1_skip_integer( &p, end, 2, bits, 1 ) )
668 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +0100669 TEST_EQUAL( p, end );
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200670 }
671 else
672#endif /* MBEDTLS_RSA_C */
673#if defined(MBEDTLS_ECP_C)
674 if( PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY( type ) )
675 {
Jaeden Ameroccdce902019-01-10 11:42:27 +0000676 /* The representation of an ECC public key is:
677 * - The byte 0x04;
678 * - `x_P` as a `ceiling(m/8)`-byte string, big-endian;
679 * - `y_P` as a `ceiling(m/8)`-byte string, big-endian;
680 * - where m is the bit size associated with the curve.
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200681 */
Gilles Peskinefe11b722018-12-18 00:24:04 +0100682 TEST_EQUAL( p + 1 + 2 * PSA_BITS_TO_BYTES( bits ), end );
683 TEST_EQUAL( p[0], 4 );
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200684 }
685 else
686#endif /* MBEDTLS_ECP_C */
687 {
Jaeden Amero594a3302018-10-26 17:07:22 +0100688 char message[47];
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200689 mbedtls_snprintf( message, sizeof( message ),
690 "No sanity check for public key type=0x%08lx",
691 (unsigned long) type );
692 test_fail( message, __LINE__, __FILE__ );
693 return( 0 );
694 }
695 }
696 else
697
698 {
699 /* No sanity checks for other types */
700 }
701
702 return( 1 );
Gilles Peskined14664a2018-08-10 19:07:32 +0200703
704exit:
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200705 return( 0 );
Gilles Peskined14664a2018-08-10 19:07:32 +0200706}
707
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100708static int exercise_export_key( psa_key_handle_t handle,
Gilles Peskined14664a2018-08-10 19:07:32 +0200709 psa_key_usage_t usage )
710{
711 psa_key_type_t type;
712 size_t bits;
713 uint8_t *exported = NULL;
714 size_t exported_size = 0;
715 size_t exported_length = 0;
716 int ok = 0;
717
Gilles Peskine8817f612018-12-18 00:18:46 +0100718 PSA_ASSERT( psa_get_key_information( handle, &type, &bits ) );
Gilles Peskineacec7b6f2018-09-13 20:34:11 +0200719
720 if( ( usage & PSA_KEY_USAGE_EXPORT ) == 0 &&
721 ! PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) )
Gilles Peskined14664a2018-08-10 19:07:32 +0200722 {
Gilles Peskinefe11b722018-12-18 00:24:04 +0100723 TEST_EQUAL( psa_export_key( handle, NULL, 0, &exported_length ),
724 PSA_ERROR_NOT_PERMITTED );
Gilles Peskined14664a2018-08-10 19:07:32 +0200725 return( 1 );
726 }
727
Gilles Peskined14664a2018-08-10 19:07:32 +0200728 exported_size = PSA_KEY_EXPORT_MAX_SIZE( type, bits );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200729 ASSERT_ALLOC( exported, exported_size );
Gilles Peskined14664a2018-08-10 19:07:32 +0200730
Gilles Peskine8817f612018-12-18 00:18:46 +0100731 PSA_ASSERT( psa_export_key( handle,
732 exported, exported_size,
733 &exported_length ) );
Gilles Peskined14664a2018-08-10 19:07:32 +0200734 ok = exported_key_sanity_check( type, bits, exported, exported_length );
735
736exit:
737 mbedtls_free( exported );
738 return( ok );
739}
740
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100741static int exercise_export_public_key( psa_key_handle_t handle )
Gilles Peskined14664a2018-08-10 19:07:32 +0200742{
743 psa_key_type_t type;
744 psa_key_type_t public_type;
745 size_t bits;
746 uint8_t *exported = NULL;
747 size_t exported_size = 0;
748 size_t exported_length = 0;
749 int ok = 0;
750
Gilles Peskine8817f612018-12-18 00:18:46 +0100751 PSA_ASSERT( psa_get_key_information( handle, &type, &bits ) );
Gilles Peskined14664a2018-08-10 19:07:32 +0200752 if( ! PSA_KEY_TYPE_IS_ASYMMETRIC( type ) )
753 {
Gilles Peskinef812dcf2018-12-18 00:33:25 +0100754 TEST_EQUAL( psa_export_public_key( handle, NULL, 0, &exported_length ),
Gilles Peskinefe11b722018-12-18 00:24:04 +0100755 PSA_ERROR_INVALID_ARGUMENT );
Gilles Peskined14664a2018-08-10 19:07:32 +0200756 return( 1 );
757 }
758
759 public_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEYPAIR( type );
760 exported_size = PSA_KEY_EXPORT_MAX_SIZE( public_type, bits );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200761 ASSERT_ALLOC( exported, exported_size );
Gilles Peskined14664a2018-08-10 19:07:32 +0200762
Gilles Peskine8817f612018-12-18 00:18:46 +0100763 PSA_ASSERT( psa_export_public_key( handle,
764 exported, exported_size,
765 &exported_length ) );
Gilles Peskined14664a2018-08-10 19:07:32 +0200766 ok = exported_key_sanity_check( public_type, bits,
767 exported, exported_length );
768
769exit:
770 mbedtls_free( exported );
771 return( ok );
772}
773
Gilles Peskinec9516fb2019-02-05 20:32:06 +0100774/** Do smoke tests on a key.
775 *
776 * Perform one of each operation indicated by \p alg (decrypt/encrypt,
777 * sign/verify, or derivation) that is permitted according to \p usage.
778 * \p usage and \p alg should correspond to the expected policy on the
779 * key.
780 *
781 * Export the key if permitted by \p usage, and check that the output
782 * looks sensible. If \p usage forbids export, check that
783 * \p psa_export_key correctly rejects the attempt. If the key is
784 * asymmetric, also check \p psa_export_public_key.
785 *
786 * If the key fails the tests, this function calls the test framework's
787 * `test_fail` function and returns false. Otherwise this function returns
788 * true. Therefore it should be used as follows:
789 * ```
790 * if( ! exercise_key( ... ) ) goto exit;
791 * ```
792 *
793 * \param handle The key to exercise. It should be capable of performing
794 * \p alg.
795 * \param usage The usage flags to assume.
796 * \param alg The algorithm to exercise.
797 *
798 * \retval 0 The key failed the smoke tests.
799 * \retval 1 The key passed the smoke tests.
800 */
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100801static int exercise_key( psa_key_handle_t handle,
Gilles Peskine02b75072018-07-01 22:31:34 +0200802 psa_key_usage_t usage,
803 psa_algorithm_t alg )
804{
805 int ok;
806 if( alg == 0 )
807 ok = 1; /* If no algorihm, do nothing (used for raw data "keys"). */
808 else if( PSA_ALG_IS_MAC( alg ) )
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100809 ok = exercise_mac_key( handle, usage, alg );
Gilles Peskine02b75072018-07-01 22:31:34 +0200810 else if( PSA_ALG_IS_CIPHER( alg ) )
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100811 ok = exercise_cipher_key( handle, usage, alg );
Gilles Peskine02b75072018-07-01 22:31:34 +0200812 else if( PSA_ALG_IS_AEAD( alg ) )
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100813 ok = exercise_aead_key( handle, usage, alg );
Gilles Peskine02b75072018-07-01 22:31:34 +0200814 else if( PSA_ALG_IS_SIGN( alg ) )
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100815 ok = exercise_signature_key( handle, usage, alg );
Gilles Peskine02b75072018-07-01 22:31:34 +0200816 else if( PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) )
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100817 ok = exercise_asymmetric_encryption_key( handle, usage, alg );
Gilles Peskineea0fb492018-07-12 17:17:20 +0200818 else if( PSA_ALG_IS_KEY_DERIVATION( alg ) )
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100819 ok = exercise_key_derivation_key( handle, usage, alg );
Gilles Peskine01d718c2018-09-18 12:01:02 +0200820 else if( PSA_ALG_IS_KEY_AGREEMENT( alg ) )
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100821 ok = exercise_key_agreement_key( handle, usage, alg );
Gilles Peskine02b75072018-07-01 22:31:34 +0200822 else
823 {
824 char message[40];
825 mbedtls_snprintf( message, sizeof( message ),
826 "No code to exercise alg=0x%08lx",
827 (unsigned long) alg );
828 test_fail( message, __LINE__, __FILE__ );
829 ok = 0;
830 }
Gilles Peskined14664a2018-08-10 19:07:32 +0200831
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100832 ok = ok && exercise_export_key( handle, usage );
833 ok = ok && exercise_export_public_key( handle );
Gilles Peskined14664a2018-08-10 19:07:32 +0200834
Gilles Peskine02b75072018-07-01 22:31:34 +0200835 return( ok );
836}
837
Gilles Peskine10df3412018-10-25 22:35:43 +0200838static psa_key_usage_t usage_to_exercise( psa_key_type_t type,
839 psa_algorithm_t alg )
840{
841 if( PSA_ALG_IS_MAC( alg ) || PSA_ALG_IS_SIGN( alg ) )
842 {
843 return( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ?
844 PSA_KEY_USAGE_VERIFY :
845 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY );
846 }
847 else if( PSA_ALG_IS_CIPHER( alg ) || PSA_ALG_IS_AEAD( alg ) ||
848 PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) )
849 {
850 return( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ?
851 PSA_KEY_USAGE_ENCRYPT :
852 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
853 }
854 else if( PSA_ALG_IS_KEY_DERIVATION( alg ) ||
855 PSA_ALG_IS_KEY_AGREEMENT( alg ) )
856 {
857 return( PSA_KEY_USAGE_DERIVE );
858 }
859 else
860 {
861 return( 0 );
862 }
863
864}
Darryl Green0c6575a2018-11-07 16:05:30 +0000865
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100866/* An overapproximation of the amount of storage needed for a key of the
867 * given type and with the given content. The API doesn't make it easy
868 * to find a good value for the size. The current implementation doesn't
869 * care about the value anyway. */
870#define KEY_BITS_FROM_DATA( type, data ) \
871 ( data )->len
872
Darryl Green0c6575a2018-11-07 16:05:30 +0000873typedef enum {
874 IMPORT_KEY = 0,
875 GENERATE_KEY = 1,
876 DERIVE_KEY = 2
877} generate_method;
878
Gilles Peskinee59236f2018-01-27 23:32:46 +0100879/* END_HEADER */
880
881/* BEGIN_DEPENDENCIES
882 * depends_on:MBEDTLS_PSA_CRYPTO_C
883 * END_DEPENDENCIES
884 */
885
886/* BEGIN_CASE */
Gilles Peskinee1f2d7d2018-08-21 14:54:54 +0200887void static_checks( )
888{
889 size_t max_truncated_mac_size =
890 PSA_ALG_MAC_TRUNCATION_MASK >> PSA_MAC_TRUNCATION_OFFSET;
891
892 /* Check that the length for a truncated MAC always fits in the algorithm
893 * encoding. The shifted mask is the maximum truncated value. The
894 * untruncated algorithm may be one byte larger. */
895 TEST_ASSERT( PSA_MAC_MAX_SIZE <= 1 + max_truncated_mac_size );
896}
897/* END_CASE */
898
899/* BEGIN_CASE */
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200900void import( data_t *data, int type, int expected_status_arg )
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100901{
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100902 psa_key_handle_t handle = 0;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200903 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100904 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100905
Gilles Peskine8817f612018-12-18 00:18:46 +0100906 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100907
Gilles Peskined40c1fb2019-01-19 12:20:52 +0100908 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100909 status = psa_import_key( handle, type, data->x, data->len );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100910 TEST_EQUAL( status, expected_status );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100911 if( status == PSA_SUCCESS )
Gilles Peskine8817f612018-12-18 00:18:46 +0100912 PSA_ASSERT( psa_destroy_key( handle ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100913
914exit:
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100915 mbedtls_psa_crypto_free( );
916}
917/* END_CASE */
918
919/* BEGIN_CASE */
Gilles Peskinea4261682018-12-03 11:34:01 +0100920void import_twice( int alg_arg, int usage_arg,
921 int type1_arg, data_t *data1,
922 int expected_import1_status_arg,
923 int type2_arg, data_t *data2,
924 int expected_import2_status_arg )
925{
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100926 psa_key_handle_t handle = 0;
Gilles Peskinea4261682018-12-03 11:34:01 +0100927 psa_algorithm_t alg = alg_arg;
928 psa_key_usage_t usage = usage_arg;
929 psa_key_type_t type1 = type1_arg;
930 psa_status_t expected_import1_status = expected_import1_status_arg;
931 psa_key_type_t type2 = type2_arg;
932 psa_status_t expected_import2_status = expected_import2_status_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +0000933 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea4261682018-12-03 11:34:01 +0100934 psa_status_t status;
935
Gilles Peskine8817f612018-12-18 00:18:46 +0100936 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea4261682018-12-03 11:34:01 +0100937
Gilles Peskined40c1fb2019-01-19 12:20:52 +0100938 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea4261682018-12-03 11:34:01 +0100939 psa_key_policy_set_usage( &policy, usage, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +0100940 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea4261682018-12-03 11:34:01 +0100941
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100942 status = psa_import_key( handle, type1, data1->x, data1->len );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100943 TEST_EQUAL( status, expected_import1_status );
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100944 status = psa_import_key( handle, type2, data2->x, data2->len );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100945 TEST_EQUAL( status, expected_import2_status );
Gilles Peskinea4261682018-12-03 11:34:01 +0100946
947 if( expected_import1_status == PSA_SUCCESS ||
948 expected_import2_status == PSA_SUCCESS )
949 {
Gilles Peskinec9516fb2019-02-05 20:32:06 +0100950 if( ! exercise_key( handle, usage, alg ) )
951 goto exit;
Gilles Peskinea4261682018-12-03 11:34:01 +0100952 }
953
954exit:
955 mbedtls_psa_crypto_free( );
956}
957/* END_CASE */
958
959/* BEGIN_CASE */
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200960void import_rsa_made_up( int bits_arg, int keypair, int expected_status_arg )
961{
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100962 psa_key_handle_t handle = 0;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200963 size_t bits = bits_arg;
964 psa_status_t expected_status = expected_status_arg;
965 psa_status_t status;
966 psa_key_type_t type =
967 keypair ? PSA_KEY_TYPE_RSA_KEYPAIR : PSA_KEY_TYPE_RSA_PUBLIC_KEY;
968 size_t buffer_size = /* Slight overapproximations */
969 keypair ? bits * 9 / 16 + 80 : bits / 8 + 20;
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200970 unsigned char *buffer = NULL;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200971 unsigned char *p;
972 int ret;
973 size_t length;
974
Gilles Peskine8817f612018-12-18 00:18:46 +0100975 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200976 ASSERT_ALLOC( buffer, buffer_size );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200977
978 TEST_ASSERT( ( ret = construct_fake_rsa_key( buffer, buffer_size, &p,
979 bits, keypair ) ) >= 0 );
980 length = ret;
981
982 /* Try importing the key */
Gilles Peskined40c1fb2019-01-19 12:20:52 +0100983 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100984 status = psa_import_key( handle, type, p, length );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100985 TEST_EQUAL( status, expected_status );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200986 if( status == PSA_SUCCESS )
Gilles Peskine8817f612018-12-18 00:18:46 +0100987 PSA_ASSERT( psa_destroy_key( handle ) );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200988
989exit:
990 mbedtls_free( buffer );
991 mbedtls_psa_crypto_free( );
992}
993/* END_CASE */
994
995/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300996void import_export( data_t *data,
Moran Pekera964a8f2018-06-04 18:42:36 +0300997 int type_arg,
998 int alg_arg,
999 int usage_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001000 int expected_bits,
1001 int export_size_delta,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001002 int expected_export_status_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001003 int canonical_input )
1004{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001005 psa_key_handle_t handle = 0;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001006 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001007 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001008 psa_status_t expected_export_status = expected_export_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001009 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001010 unsigned char *exported = NULL;
1011 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001012 size_t export_size;
Jaeden Amerof24c7f82018-06-27 17:20:43 +01001013 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001014 size_t reexported_length;
1015 psa_key_type_t got_type;
1016 size_t got_bits;
Jaeden Amero70261c52019-01-04 11:47:20 +00001017 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001018
Moran Pekercb088e72018-07-17 17:36:59 +03001019 export_size = (ptrdiff_t) data->len + export_size_delta;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02001020 ASSERT_ALLOC( exported, export_size );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001021 if( ! canonical_input )
Gilles Peskine8cebbba2018-09-27 13:54:18 +02001022 ASSERT_ALLOC( reexported, export_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01001023 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001024
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001025 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001026 psa_key_policy_set_usage( &policy, usage_arg, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001027 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001028
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001029 TEST_EQUAL( psa_get_key_information( handle, NULL, NULL ),
1030 PSA_ERROR_EMPTY_SLOT );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001031
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001032 /* Import the key */
Gilles Peskine8817f612018-12-18 00:18:46 +01001033 PSA_ASSERT( psa_import_key( handle, type,
1034 data->x, data->len ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001035
1036 /* Test the key information */
Gilles Peskine8817f612018-12-18 00:18:46 +01001037 PSA_ASSERT( psa_get_key_information( handle,
1038 &got_type,
1039 &got_bits ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001040 TEST_EQUAL( got_type, type );
1041 TEST_EQUAL( got_bits, (size_t) expected_bits );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001042
1043 /* Export the key */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001044 status = psa_export_key( handle,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001045 exported, export_size,
1046 &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001047 TEST_EQUAL( status, expected_export_status );
Jaeden Amerof24c7f82018-06-27 17:20:43 +01001048
1049 /* The exported length must be set by psa_export_key() to a value between 0
1050 * and export_size. On errors, the exported length must be 0. */
1051 TEST_ASSERT( exported_length != INVALID_EXPORT_LENGTH );
1052 TEST_ASSERT( status == PSA_SUCCESS || exported_length == 0 );
1053 TEST_ASSERT( exported_length <= export_size );
1054
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001055 TEST_ASSERT( mem_is_char( exported + exported_length, 0,
Gilles Peskine3f669c32018-06-21 09:21:51 +02001056 export_size - exported_length ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001057 if( status != PSA_SUCCESS )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +02001058 {
Gilles Peskinefe11b722018-12-18 00:24:04 +01001059 TEST_EQUAL( exported_length, 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001060 goto destroy;
Gilles Peskinee66ca3b2018-06-20 00:11:45 +02001061 }
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001062
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001063 if( ! exercise_export_key( handle, usage_arg ) )
Gilles Peskine8f609232018-08-11 01:24:55 +02001064 goto exit;
1065
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001066 if( canonical_input )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02001067 ASSERT_COMPARE( data->x, data->len, exported, exported_length );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001068 else
1069 {
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001070 psa_key_handle_t handle2;
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001071 PSA_ASSERT( psa_allocate_key( &handle2 ) );
Gilles Peskine8817f612018-12-18 00:18:46 +01001072 PSA_ASSERT( psa_set_key_policy( handle2, &policy ) );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001073
Gilles Peskine8817f612018-12-18 00:18:46 +01001074 PSA_ASSERT( psa_import_key( handle2, type,
1075 exported,
1076 exported_length ) );
1077 PSA_ASSERT( psa_export_key( handle2,
1078 reexported,
1079 export_size,
1080 &reexported_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02001081 ASSERT_COMPARE( exported, exported_length,
1082 reexported, reexported_length );
Gilles Peskine8817f612018-12-18 00:18:46 +01001083 PSA_ASSERT( psa_close_key( handle2 ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001084 }
Gilles Peskined8b7d4f2018-10-29 15:18:41 +01001085 TEST_ASSERT( exported_length <= PSA_KEY_EXPORT_MAX_SIZE( type, got_bits ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001086
1087destroy:
1088 /* Destroy the key */
Gilles Peskine8817f612018-12-18 00:18:46 +01001089 PSA_ASSERT( psa_destroy_key( handle ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001090 TEST_EQUAL( psa_get_key_information( handle, NULL, NULL ),
1091 PSA_ERROR_INVALID_HANDLE );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001092
1093exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001094 mbedtls_free( exported );
1095 mbedtls_free( reexported );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001096 mbedtls_psa_crypto_free( );
1097}
1098/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +01001099
Moran Pekerf709f4a2018-06-06 17:26:04 +03001100/* BEGIN_CASE */
Moran Peker28a38e62018-11-07 16:18:24 +02001101void import_key_nonempty_slot( )
1102{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001103 psa_key_handle_t handle = 0;
Moran Peker28a38e62018-11-07 16:18:24 +02001104 psa_key_type_t type = PSA_KEY_TYPE_RAW_DATA;
1105 psa_status_t status;
1106 const uint8_t data[] = { 0x1, 0x2, 0x3, 0x4, 0x5 };
Gilles Peskine8817f612018-12-18 00:18:46 +01001107 PSA_ASSERT( psa_crypto_init( ) );
Moran Peker28a38e62018-11-07 16:18:24 +02001108
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001109 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001110
Moran Peker28a38e62018-11-07 16:18:24 +02001111 /* Import the key */
Gilles Peskine8817f612018-12-18 00:18:46 +01001112 PSA_ASSERT( psa_import_key( handle, type,
1113 data, sizeof( data ) ) );
Moran Peker28a38e62018-11-07 16:18:24 +02001114
1115 /* Import the key again */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001116 status = psa_import_key( handle, type, data, sizeof( data ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001117 TEST_EQUAL( status, PSA_ERROR_OCCUPIED_SLOT );
Moran Peker28a38e62018-11-07 16:18:24 +02001118
1119exit:
1120 mbedtls_psa_crypto_free( );
1121}
1122/* END_CASE */
1123
1124/* BEGIN_CASE */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001125void export_invalid_handle( int handle, int expected_export_status_arg )
Moran Peker28a38e62018-11-07 16:18:24 +02001126{
1127 psa_status_t status;
1128 unsigned char *exported = NULL;
1129 size_t export_size = 0;
1130 size_t exported_length = INVALID_EXPORT_LENGTH;
1131 psa_status_t expected_export_status = expected_export_status_arg;
1132
Gilles Peskine8817f612018-12-18 00:18:46 +01001133 PSA_ASSERT( psa_crypto_init( ) );
Moran Peker28a38e62018-11-07 16:18:24 +02001134
1135 /* Export the key */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001136 status = psa_export_key( (psa_key_handle_t) handle,
Moran Peker28a38e62018-11-07 16:18:24 +02001137 exported, export_size,
1138 &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001139 TEST_EQUAL( status, expected_export_status );
Moran Peker28a38e62018-11-07 16:18:24 +02001140
1141exit:
1142 mbedtls_psa_crypto_free( );
1143}
1144/* END_CASE */
1145
1146/* BEGIN_CASE */
Moran Peker34550092018-11-07 16:19:34 +02001147void export_with_no_key_activity( )
1148{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001149 psa_key_handle_t handle = 0;
Moran Peker34550092018-11-07 16:19:34 +02001150 psa_algorithm_t alg = PSA_ALG_CTR;
1151 psa_status_t status;
Jaeden Amero70261c52019-01-04 11:47:20 +00001152 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Moran Peker34550092018-11-07 16:19:34 +02001153 unsigned char *exported = NULL;
1154 size_t export_size = 0;
1155 size_t exported_length = INVALID_EXPORT_LENGTH;
1156
Gilles Peskine8817f612018-12-18 00:18:46 +01001157 PSA_ASSERT( psa_crypto_init( ) );
Moran Peker34550092018-11-07 16:19:34 +02001158
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001159 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Peker34550092018-11-07 16:19:34 +02001160 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001161 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Peker34550092018-11-07 16:19:34 +02001162
1163 /* Export the key */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001164 status = psa_export_key( handle,
Moran Peker34550092018-11-07 16:19:34 +02001165 exported, export_size,
1166 &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001167 TEST_EQUAL( status, PSA_ERROR_EMPTY_SLOT );
Moran Peker34550092018-11-07 16:19:34 +02001168
1169exit:
1170 mbedtls_psa_crypto_free( );
1171}
1172/* END_CASE */
1173
1174/* BEGIN_CASE */
Moran Pekerce500072018-11-07 16:20:07 +02001175void cipher_with_no_key_activity( )
1176{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001177 psa_key_handle_t handle = 0;
Moran Pekerce500072018-11-07 16:20:07 +02001178 psa_status_t status;
Jaeden Amero70261c52019-01-04 11:47:20 +00001179 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Jaeden Amero5bae2272019-01-04 11:48:27 +00001180 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Moran Pekerce500072018-11-07 16:20:07 +02001181 int exercise_alg = PSA_ALG_CTR;
1182
Gilles Peskine8817f612018-12-18 00:18:46 +01001183 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerce500072018-11-07 16:20:07 +02001184
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001185 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekerce500072018-11-07 16:20:07 +02001186 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, exercise_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001187 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekerce500072018-11-07 16:20:07 +02001188
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001189 status = psa_cipher_encrypt_setup( &operation, handle, exercise_alg );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001190 TEST_EQUAL( status, PSA_ERROR_EMPTY_SLOT );
Moran Pekerce500072018-11-07 16:20:07 +02001191
1192exit:
1193 psa_cipher_abort( &operation );
1194 mbedtls_psa_crypto_free( );
1195}
1196/* END_CASE */
1197
1198/* BEGIN_CASE */
Moran Peker34550092018-11-07 16:19:34 +02001199void export_after_import_failure( data_t *data, int type_arg,
1200 int expected_import_status_arg )
1201{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001202 psa_key_handle_t handle = 0;
Moran Peker34550092018-11-07 16:19:34 +02001203 psa_key_type_t type = type_arg;
1204 psa_status_t status;
1205 unsigned char *exported = NULL;
1206 size_t export_size = 0;
1207 psa_status_t expected_import_status = expected_import_status_arg;
1208 size_t exported_length = INVALID_EXPORT_LENGTH;
1209
Gilles Peskine8817f612018-12-18 00:18:46 +01001210 PSA_ASSERT( psa_crypto_init( ) );
Moran Peker34550092018-11-07 16:19:34 +02001211
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001212 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001213
Moran Peker34550092018-11-07 16:19:34 +02001214 /* Import the key - expect failure */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001215 status = psa_import_key( handle, type,
Gilles Peskine0f915f12018-12-17 23:35:42 +01001216 data->x, data->len );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001217 TEST_EQUAL( status, expected_import_status );
Moran Peker34550092018-11-07 16:19:34 +02001218
1219 /* Export the key */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001220 status = psa_export_key( handle,
Moran Peker34550092018-11-07 16:19:34 +02001221 exported, export_size,
1222 &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001223 TEST_EQUAL( status, PSA_ERROR_EMPTY_SLOT );
Moran Peker34550092018-11-07 16:19:34 +02001224
1225exit:
1226 mbedtls_psa_crypto_free( );
1227}
1228/* END_CASE */
1229
1230/* BEGIN_CASE */
Moran Pekerce500072018-11-07 16:20:07 +02001231void cipher_after_import_failure( data_t *data, int type_arg,
1232 int expected_import_status_arg )
1233{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001234 psa_key_handle_t handle = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00001235 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Moran Pekerce500072018-11-07 16:20:07 +02001236 psa_key_type_t type = type_arg;
1237 psa_status_t status;
1238 psa_status_t expected_import_status = expected_import_status_arg;
1239 int exercise_alg = PSA_ALG_CTR;
1240
Gilles Peskine8817f612018-12-18 00:18:46 +01001241 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerce500072018-11-07 16:20:07 +02001242
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001243 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001244
Moran Pekerce500072018-11-07 16:20:07 +02001245 /* Import the key - expect failure */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001246 status = psa_import_key( handle, type,
Gilles Peskine0f915f12018-12-17 23:35:42 +01001247 data->x, data->len );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001248 TEST_EQUAL( status, expected_import_status );
Moran Pekerce500072018-11-07 16:20:07 +02001249
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001250 status = psa_cipher_encrypt_setup( &operation, handle, exercise_alg );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001251 TEST_EQUAL( status, PSA_ERROR_EMPTY_SLOT );
Moran Pekerce500072018-11-07 16:20:07 +02001252
1253exit:
1254 psa_cipher_abort( &operation );
1255 mbedtls_psa_crypto_free( );
1256}
1257/* END_CASE */
1258
1259/* BEGIN_CASE */
Moran Peker34550092018-11-07 16:19:34 +02001260void export_after_destroy_key( data_t *data, int type_arg )
1261{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001262 psa_key_handle_t handle = 0;
Moran Peker34550092018-11-07 16:19:34 +02001263 psa_key_type_t type = type_arg;
1264 psa_status_t status;
Jaeden Amero70261c52019-01-04 11:47:20 +00001265 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Moran Peker34550092018-11-07 16:19:34 +02001266 psa_algorithm_t alg = PSA_ALG_CTR;
1267 unsigned char *exported = NULL;
1268 size_t export_size = 0;
1269 size_t exported_length = INVALID_EXPORT_LENGTH;
1270
Gilles Peskine8817f612018-12-18 00:18:46 +01001271 PSA_ASSERT( psa_crypto_init( ) );
Moran Peker34550092018-11-07 16:19:34 +02001272
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001273 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Peker34550092018-11-07 16:19:34 +02001274 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001275 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Peker34550092018-11-07 16:19:34 +02001276 export_size = (ptrdiff_t) data->len;
1277 ASSERT_ALLOC( exported, export_size );
1278
1279 /* Import the key */
Gilles Peskine8817f612018-12-18 00:18:46 +01001280 PSA_ASSERT( psa_import_key( handle, type,
1281 data->x, data->len ) );
Moran Peker34550092018-11-07 16:19:34 +02001282
Gilles Peskine8817f612018-12-18 00:18:46 +01001283 PSA_ASSERT( psa_export_key( handle, exported, export_size,
1284 &exported_length ) );
Moran Peker34550092018-11-07 16:19:34 +02001285
1286 /* Destroy the key */
Gilles Peskine8817f612018-12-18 00:18:46 +01001287 PSA_ASSERT( psa_destroy_key( handle ) );
Moran Peker34550092018-11-07 16:19:34 +02001288
1289 /* Export the key */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001290 status = psa_export_key( handle, exported, export_size,
Moran Peker34550092018-11-07 16:19:34 +02001291 &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001292 TEST_EQUAL( status, PSA_ERROR_INVALID_HANDLE );
Moran Peker34550092018-11-07 16:19:34 +02001293
1294exit:
1295 mbedtls_free( exported );
1296 mbedtls_psa_crypto_free( );
1297}
1298/* END_CASE */
1299
1300/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001301void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001302 int type_arg,
1303 int alg_arg,
Gilles Peskine49c25912018-10-29 15:15:31 +01001304 int export_size_delta,
1305 int expected_export_status_arg,
1306 data_t *expected_public_key )
Moran Pekerf709f4a2018-06-06 17:26:04 +03001307{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001308 psa_key_handle_t handle = 0;
Moran Pekerf709f4a2018-06-06 17:26:04 +03001309 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001310 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001311 psa_status_t expected_export_status = expected_export_status_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +03001312 psa_status_t status;
Moran Pekerf709f4a2018-06-06 17:26:04 +03001313 unsigned char *exported = NULL;
Gilles Peskine49c25912018-10-29 15:15:31 +01001314 size_t export_size = expected_public_key->len + export_size_delta;
Jaeden Amero2a671e92018-06-27 17:47:40 +01001315 size_t exported_length = INVALID_EXPORT_LENGTH;
Jaeden Amero70261c52019-01-04 11:47:20 +00001316 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Moran Pekerf709f4a2018-06-06 17:26:04 +03001317
Gilles Peskine8817f612018-12-18 00:18:46 +01001318 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +03001319
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001320 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001321 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001322 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +03001323
1324 /* Import the key */
Gilles Peskine8817f612018-12-18 00:18:46 +01001325 PSA_ASSERT( psa_import_key( handle, type,
1326 data->x, data->len ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +03001327
Gilles Peskine49c25912018-10-29 15:15:31 +01001328 /* Export the public key */
1329 ASSERT_ALLOC( exported, export_size );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001330 status = psa_export_public_key( handle,
Gilles Peskine2d277862018-06-18 15:41:12 +02001331 exported, export_size,
1332 &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001333 TEST_EQUAL( status, expected_export_status );
Gilles Peskine49c25912018-10-29 15:15:31 +01001334 if( status == PSA_SUCCESS )
Gilles Peskined8b7d4f2018-10-29 15:18:41 +01001335 {
1336 psa_key_type_t public_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEYPAIR( type );
1337 size_t bits;
Gilles Peskine8817f612018-12-18 00:18:46 +01001338 PSA_ASSERT( psa_get_key_information( handle, NULL, &bits ) );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +01001339 TEST_ASSERT( expected_public_key->len <=
1340 PSA_KEY_EXPORT_MAX_SIZE( public_type, bits ) );
Gilles Peskine49c25912018-10-29 15:15:31 +01001341 ASSERT_COMPARE( expected_public_key->x, expected_public_key->len,
1342 exported, exported_length );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +01001343 }
Moran Pekerf709f4a2018-06-06 17:26:04 +03001344
1345exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001346 mbedtls_free( exported );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001347 psa_destroy_key( handle );
Moran Pekerf709f4a2018-06-06 17:26:04 +03001348 mbedtls_psa_crypto_free( );
1349}
1350/* END_CASE */
1351
Gilles Peskine20035e32018-02-03 22:44:14 +01001352/* BEGIN_CASE */
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001353void import_and_exercise_key( data_t *data,
1354 int type_arg,
1355 int bits_arg,
1356 int alg_arg )
1357{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001358 psa_key_handle_t handle = 0;
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001359 psa_key_type_t type = type_arg;
1360 size_t bits = bits_arg;
1361 psa_algorithm_t alg = alg_arg;
Gilles Peskine10df3412018-10-25 22:35:43 +02001362 psa_key_usage_t usage = usage_to_exercise( type, alg );
Jaeden Amero70261c52019-01-04 11:47:20 +00001363 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001364 psa_key_type_t got_type;
1365 size_t got_bits;
1366 psa_status_t status;
1367
Gilles Peskine8817f612018-12-18 00:18:46 +01001368 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001369
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001370 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001371 psa_key_policy_set_usage( &policy, usage, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001372 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001373
1374 /* Import the key */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001375 status = psa_import_key( handle, type, data->x, data->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01001376 PSA_ASSERT( status );
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001377
1378 /* Test the key information */
Gilles Peskine8817f612018-12-18 00:18:46 +01001379 PSA_ASSERT( psa_get_key_information( handle,
1380 &got_type,
1381 &got_bits ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001382 TEST_EQUAL( got_type, type );
1383 TEST_EQUAL( got_bits, bits );
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001384
1385 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001386 if( ! exercise_key( handle, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +02001387 goto exit;
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001388
1389exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001390 psa_destroy_key( handle );
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001391 mbedtls_psa_crypto_free( );
1392}
1393/* END_CASE */
1394
1395/* BEGIN_CASE */
Gilles Peskined5b33222018-06-18 22:20:03 +02001396void key_policy( int usage_arg, int alg_arg )
1397{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001398 psa_key_handle_t handle = 0;
Gilles Peskined5b33222018-06-18 22:20:03 +02001399 psa_algorithm_t alg = alg_arg;
1400 psa_key_usage_t usage = usage_arg;
1401 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
1402 unsigned char key[32] = {0};
Jaeden Amero70261c52019-01-04 11:47:20 +00001403 psa_key_policy_t policy_set = PSA_KEY_POLICY_INIT;
1404 psa_key_policy_t policy_get = PSA_KEY_POLICY_INIT;
Gilles Peskined5b33222018-06-18 22:20:03 +02001405
1406 memset( key, 0x2a, sizeof( key ) );
1407
Gilles Peskine8817f612018-12-18 00:18:46 +01001408 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001409
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001410 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001411 psa_key_policy_set_usage( &policy_set, usage, alg );
1412
Gilles Peskinefe11b722018-12-18 00:24:04 +01001413 TEST_EQUAL( psa_key_policy_get_usage( &policy_set ), usage );
1414 TEST_EQUAL( psa_key_policy_get_algorithm( &policy_set ), alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001415 PSA_ASSERT( psa_set_key_policy( handle, &policy_set ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001416
Gilles Peskine8817f612018-12-18 00:18:46 +01001417 PSA_ASSERT( psa_import_key( handle, key_type,
1418 key, sizeof( key ) ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001419
Gilles Peskine8817f612018-12-18 00:18:46 +01001420 PSA_ASSERT( psa_get_key_policy( handle, &policy_get ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001421
Gilles Peskinefe11b722018-12-18 00:24:04 +01001422 TEST_EQUAL( policy_get.usage, policy_set.usage );
1423 TEST_EQUAL( policy_get.alg, policy_set.alg );
Gilles Peskined5b33222018-06-18 22:20:03 +02001424
1425exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001426 psa_destroy_key( handle );
Gilles Peskined5b33222018-06-18 22:20:03 +02001427 mbedtls_psa_crypto_free( );
1428}
1429/* END_CASE */
1430
1431/* BEGIN_CASE */
Jaeden Amero70261c52019-01-04 11:47:20 +00001432void key_policy_init( )
1433{
1434 /* Test each valid way of initializing the object, except for `= {0}`, as
1435 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
1436 * though it's OK by the C standard. We could test for this, but we'd need
1437 * to supress the Clang warning for the test. */
1438 psa_key_policy_t func = psa_key_policy_init( );
1439 psa_key_policy_t init = PSA_KEY_POLICY_INIT;
1440 psa_key_policy_t zero;
1441
1442 memset( &zero, 0, sizeof( zero ) );
1443
Jaeden Amero5229bbb2019-02-07 16:33:37 +00001444 /* A default key policy should not permit any usage. */
1445 TEST_EQUAL( psa_key_policy_get_usage( &func ), 0 );
1446 TEST_EQUAL( psa_key_policy_get_usage( &init ), 0 );
1447 TEST_EQUAL( psa_key_policy_get_usage( &zero ), 0 );
1448
1449 /* A default key policy should not permit any algorithm. */
1450 TEST_EQUAL( psa_key_policy_get_algorithm( &func ), 0 );
1451 TEST_EQUAL( psa_key_policy_get_algorithm( &init ), 0 );
1452 TEST_EQUAL( psa_key_policy_get_algorithm( &zero ), 0 );
Jaeden Amero70261c52019-01-04 11:47:20 +00001453}
1454/* END_CASE */
1455
1456/* BEGIN_CASE */
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001457void mac_key_policy( int policy_usage,
1458 int policy_alg,
1459 int key_type,
1460 data_t *key_data,
1461 int exercise_alg )
Gilles Peskined5b33222018-06-18 22:20:03 +02001462{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001463 psa_key_handle_t handle = 0;
Jaeden Amero70261c52019-01-04 11:47:20 +00001464 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Jaeden Amero769ce272019-01-04 11:48:03 +00001465 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001466 psa_status_t status;
1467 unsigned char mac[PSA_MAC_MAX_SIZE];
Gilles Peskined5b33222018-06-18 22:20:03 +02001468
Gilles Peskine8817f612018-12-18 00:18:46 +01001469 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001470
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001471 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001472 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001473 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001474
Gilles Peskine8817f612018-12-18 00:18:46 +01001475 PSA_ASSERT( psa_import_key( handle, key_type,
1476 key_data->x, key_data->len ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001477
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001478 status = psa_mac_sign_setup( &operation, handle, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001479 if( policy_alg == exercise_alg &&
1480 ( policy_usage & PSA_KEY_USAGE_SIGN ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001481 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001482 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001483 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001484 psa_mac_abort( &operation );
Gilles Peskined5b33222018-06-18 22:20:03 +02001485
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001486 memset( mac, 0, sizeof( mac ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001487 status = psa_mac_verify_setup( &operation, handle, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001488 if( policy_alg == exercise_alg &&
1489 ( policy_usage & PSA_KEY_USAGE_VERIFY ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001490 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001491 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001492 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001493
1494exit:
1495 psa_mac_abort( &operation );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001496 psa_destroy_key( handle );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001497 mbedtls_psa_crypto_free( );
1498}
1499/* END_CASE */
1500
1501/* BEGIN_CASE */
1502void cipher_key_policy( int policy_usage,
1503 int policy_alg,
1504 int key_type,
1505 data_t *key_data,
1506 int exercise_alg )
1507{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001508 psa_key_handle_t handle = 0;
Jaeden Amero70261c52019-01-04 11:47:20 +00001509 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Jaeden Amero5bae2272019-01-04 11:48:27 +00001510 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001511 psa_status_t status;
1512
Gilles Peskine8817f612018-12-18 00:18:46 +01001513 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001514
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001515 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001516 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001517 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001518
Gilles Peskine8817f612018-12-18 00:18:46 +01001519 PSA_ASSERT( psa_import_key( handle, key_type,
1520 key_data->x, key_data->len ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001521
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001522 status = psa_cipher_encrypt_setup( &operation, handle, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001523 if( policy_alg == exercise_alg &&
1524 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001525 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001526 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001527 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001528 psa_cipher_abort( &operation );
1529
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001530 status = psa_cipher_decrypt_setup( &operation, handle, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001531 if( policy_alg == exercise_alg &&
1532 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001533 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001534 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001535 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001536
1537exit:
1538 psa_cipher_abort( &operation );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001539 psa_destroy_key( handle );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001540 mbedtls_psa_crypto_free( );
1541}
1542/* END_CASE */
1543
1544/* BEGIN_CASE */
1545void aead_key_policy( int policy_usage,
1546 int policy_alg,
1547 int key_type,
1548 data_t *key_data,
1549 int nonce_length_arg,
1550 int tag_length_arg,
1551 int exercise_alg )
1552{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001553 psa_key_handle_t handle = 0;
Jaeden Amero70261c52019-01-04 11:47:20 +00001554 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001555 psa_status_t status;
1556 unsigned char nonce[16] = {0};
1557 size_t nonce_length = nonce_length_arg;
1558 unsigned char tag[16];
1559 size_t tag_length = tag_length_arg;
1560 size_t output_length;
1561
1562 TEST_ASSERT( nonce_length <= sizeof( nonce ) );
1563 TEST_ASSERT( tag_length <= sizeof( tag ) );
1564
Gilles Peskine8817f612018-12-18 00:18:46 +01001565 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001566
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001567 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001568 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001569 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001570
Gilles Peskine8817f612018-12-18 00:18:46 +01001571 PSA_ASSERT( psa_import_key( handle, key_type,
1572 key_data->x, key_data->len ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001573
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001574 status = psa_aead_encrypt( handle, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001575 nonce, nonce_length,
1576 NULL, 0,
1577 NULL, 0,
1578 tag, tag_length,
1579 &output_length );
1580 if( policy_alg == exercise_alg &&
1581 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001582 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001583 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001584 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001585
1586 memset( tag, 0, sizeof( tag ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001587 status = psa_aead_decrypt( handle, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001588 nonce, nonce_length,
1589 NULL, 0,
1590 tag, tag_length,
1591 NULL, 0,
1592 &output_length );
1593 if( policy_alg == exercise_alg &&
1594 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +01001595 TEST_EQUAL( status, PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001596 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001597 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001598
1599exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001600 psa_destroy_key( handle );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001601 mbedtls_psa_crypto_free( );
1602}
1603/* END_CASE */
1604
1605/* BEGIN_CASE */
1606void asymmetric_encryption_key_policy( int policy_usage,
1607 int policy_alg,
1608 int key_type,
1609 data_t *key_data,
1610 int exercise_alg )
1611{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001612 psa_key_handle_t handle = 0;
Jaeden Amero70261c52019-01-04 11:47:20 +00001613 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001614 psa_status_t status;
1615 size_t key_bits;
1616 size_t buffer_length;
1617 unsigned char *buffer = NULL;
1618 size_t output_length;
1619
Gilles Peskine8817f612018-12-18 00:18:46 +01001620 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001621
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001622 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001623 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001624 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001625
Gilles Peskine8817f612018-12-18 00:18:46 +01001626 PSA_ASSERT( psa_import_key( handle, key_type,
1627 key_data->x, key_data->len ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001628
Gilles Peskine8817f612018-12-18 00:18:46 +01001629 PSA_ASSERT( psa_get_key_information( handle,
1630 NULL,
1631 &key_bits ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001632 buffer_length = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits,
1633 exercise_alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02001634 ASSERT_ALLOC( buffer, buffer_length );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001635
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001636 status = psa_asymmetric_encrypt( handle, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001637 NULL, 0,
1638 NULL, 0,
1639 buffer, buffer_length,
1640 &output_length );
1641 if( policy_alg == exercise_alg &&
1642 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001643 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001644 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001645 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001646
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02001647 if( buffer_length != 0 )
1648 memset( buffer, 0, buffer_length );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001649 status = psa_asymmetric_decrypt( handle, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001650 buffer, buffer_length,
1651 NULL, 0,
1652 buffer, buffer_length,
1653 &output_length );
1654 if( policy_alg == exercise_alg &&
1655 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +01001656 TEST_EQUAL( status, PSA_ERROR_INVALID_PADDING );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001657 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001658 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001659
1660exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001661 psa_destroy_key( handle );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001662 mbedtls_psa_crypto_free( );
1663 mbedtls_free( buffer );
1664}
1665/* END_CASE */
1666
1667/* BEGIN_CASE */
1668void asymmetric_signature_key_policy( int policy_usage,
1669 int policy_alg,
1670 int key_type,
1671 data_t *key_data,
Gilles Peskine30f77cd2019-01-14 16:06:39 +01001672 int exercise_alg,
1673 int payload_length_arg )
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001674{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001675 psa_key_handle_t handle = 0;
Jaeden Amero70261c52019-01-04 11:47:20 +00001676 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001677 psa_status_t status;
Gilles Peskine30f77cd2019-01-14 16:06:39 +01001678 unsigned char payload[PSA_HASH_MAX_SIZE] = {1};
1679 /* If `payload_length_arg > 0`, `exercise_alg` is supposed to be
1680 * compatible with the policy and `payload_length_arg` is supposed to be
1681 * a valid input length to sign. If `payload_length_arg <= 0`,
1682 * `exercise_alg` is supposed to be forbidden by the policy. */
1683 int compatible_alg = payload_length_arg > 0;
1684 size_t payload_length = compatible_alg ? payload_length_arg : 0;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001685 unsigned char signature[PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE] = {0};
1686 size_t signature_length;
1687
Gilles Peskine8817f612018-12-18 00:18:46 +01001688 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001689
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001690 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001691 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001692 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001693
Gilles Peskine8817f612018-12-18 00:18:46 +01001694 PSA_ASSERT( psa_import_key( handle, key_type,
1695 key_data->x, key_data->len ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001696
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001697 status = psa_asymmetric_sign( handle, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001698 payload, payload_length,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001699 signature, sizeof( signature ),
1700 &signature_length );
Gilles Peskine30f77cd2019-01-14 16:06:39 +01001701 if( compatible_alg && ( policy_usage & PSA_KEY_USAGE_SIGN ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001702 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001703 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001704 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001705
1706 memset( signature, 0, sizeof( signature ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001707 status = psa_asymmetric_verify( handle, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001708 payload, payload_length,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001709 signature, sizeof( signature ) );
Gilles Peskine30f77cd2019-01-14 16:06:39 +01001710 if( compatible_alg && ( policy_usage & PSA_KEY_USAGE_VERIFY ) != 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +01001711 TEST_EQUAL( status, PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001712 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001713 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskined5b33222018-06-18 22:20:03 +02001714
1715exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001716 psa_destroy_key( handle );
Gilles Peskined5b33222018-06-18 22:20:03 +02001717 mbedtls_psa_crypto_free( );
1718}
1719/* END_CASE */
1720
1721/* BEGIN_CASE */
Gilles Peskineea0fb492018-07-12 17:17:20 +02001722void derive_key_policy( int policy_usage,
1723 int policy_alg,
1724 int key_type,
1725 data_t *key_data,
1726 int exercise_alg )
1727{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001728 psa_key_handle_t handle = 0;
Jaeden Amero70261c52019-01-04 11:47:20 +00001729 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02001730 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
1731 psa_status_t status;
1732
Gilles Peskine8817f612018-12-18 00:18:46 +01001733 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001734
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001735 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001736 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001737 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001738
Gilles Peskine8817f612018-12-18 00:18:46 +01001739 PSA_ASSERT( psa_import_key( handle, key_type,
1740 key_data->x, key_data->len ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001741
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001742 status = psa_key_derivation( &generator, handle,
Gilles Peskineea0fb492018-07-12 17:17:20 +02001743 exercise_alg,
1744 NULL, 0,
1745 NULL, 0,
1746 1 );
1747 if( policy_alg == exercise_alg &&
1748 ( policy_usage & PSA_KEY_USAGE_DERIVE ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001749 PSA_ASSERT( status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001750 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001751 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001752
1753exit:
1754 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001755 psa_destroy_key( handle );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001756 mbedtls_psa_crypto_free( );
1757}
1758/* END_CASE */
1759
1760/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02001761void agreement_key_policy( int policy_usage,
1762 int policy_alg,
1763 int key_type_arg,
1764 data_t *key_data,
1765 int exercise_alg )
1766{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001767 psa_key_handle_t handle = 0;
Jaeden Amero70261c52019-01-04 11:47:20 +00001768 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001769 psa_key_type_t key_type = key_type_arg;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001770 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
1771 psa_status_t status;
1772
Gilles Peskine8817f612018-12-18 00:18:46 +01001773 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001774
Gilles Peskined40c1fb2019-01-19 12:20:52 +01001775 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001776 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01001777 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001778
Gilles Peskine8817f612018-12-18 00:18:46 +01001779 PSA_ASSERT( psa_import_key( handle, key_type,
1780 key_data->x, key_data->len ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001781
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001782 status = key_agreement_with_self( &generator, handle, exercise_alg );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001783
Gilles Peskine01d718c2018-09-18 12:01:02 +02001784 if( policy_alg == exercise_alg &&
1785 ( policy_usage & PSA_KEY_USAGE_DERIVE ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001786 PSA_ASSERT( status );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001787 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001788 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001789
1790exit:
1791 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01001792 psa_destroy_key( handle );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001793 mbedtls_psa_crypto_free( );
1794}
1795/* END_CASE */
1796
1797/* BEGIN_CASE */
Gilles Peskine57ab7212019-01-28 13:03:09 +01001798void copy_key_policy( int source_usage_arg, int source_alg_arg,
1799 int type_arg, data_t *material,
1800 int target_usage_arg, int target_alg_arg,
1801 int constraint_usage_arg, int constraint_alg_arg,
1802 int expected_usage_arg, int expected_alg_arg )
1803{
1804 psa_key_usage_t source_usage = source_usage_arg;
1805 psa_algorithm_t source_alg = source_alg_arg;
1806 psa_key_handle_t source_handle = 0;
1807 psa_key_policy_t source_policy = PSA_KEY_POLICY_INIT;
1808 psa_key_type_t source_type = type_arg;
1809 size_t source_bits;
1810 psa_key_usage_t target_usage = target_usage_arg;
1811 psa_algorithm_t target_alg = target_alg_arg;
1812 psa_key_handle_t target_handle = 0;
1813 psa_key_policy_t target_policy = PSA_KEY_POLICY_INIT;
1814 psa_key_type_t target_type;
1815 size_t target_bits;
1816 psa_key_usage_t constraint_usage = constraint_usage_arg;
1817 psa_algorithm_t constraint_alg = constraint_alg_arg;
1818 psa_key_policy_t constraint = PSA_KEY_POLICY_INIT;
1819 psa_key_policy_t *p_constraint = NULL;
1820 psa_key_usage_t expected_usage = expected_usage_arg;
1821 psa_algorithm_t expected_alg = expected_alg_arg;
1822 uint8_t *export_buffer = NULL;
1823
1824 if( constraint_usage_arg != -1 )
1825 {
1826 p_constraint = &constraint;
1827 psa_key_policy_set_usage( p_constraint,
1828 constraint_usage, constraint_alg );
1829 }
1830
1831 PSA_ASSERT( psa_crypto_init( ) );
1832
1833 /* Populate the source slot. */
1834 PSA_ASSERT( psa_allocate_key( &source_handle ) );
1835 psa_key_policy_set_usage( &source_policy, source_usage, source_alg );
1836 PSA_ASSERT( psa_set_key_policy( source_handle, &source_policy ) );
1837 PSA_ASSERT( psa_import_key( source_handle, source_type,
1838 material->x, material->len ) );
1839 PSA_ASSERT( psa_get_key_information( source_handle, NULL, &source_bits ) );
1840
1841 /* Prepare the target slot. */
1842 PSA_ASSERT( psa_allocate_key( &target_handle ) );
1843 psa_key_policy_set_usage( &target_policy, target_usage, target_alg );
1844 PSA_ASSERT( psa_set_key_policy( target_handle, &target_policy ) );
1845 target_policy = psa_key_policy_init();
1846
1847 /* Copy the key. */
1848 PSA_ASSERT( psa_copy_key( source_handle, target_handle, p_constraint ) );
1849
1850 /* Destroy the source to ensure that this doesn't affect the target. */
1851 PSA_ASSERT( psa_destroy_key( source_handle ) );
1852
1853 /* Test that the target slot has the expected content and policy. */
1854 PSA_ASSERT( psa_get_key_information( target_handle,
1855 &target_type, &target_bits ) );
1856 TEST_EQUAL( source_type, target_type );
1857 TEST_EQUAL( source_bits, target_bits );
1858 PSA_ASSERT( psa_get_key_policy( target_handle, &target_policy ) );
1859 TEST_EQUAL( expected_usage, psa_key_policy_get_usage( &target_policy ) );
1860 TEST_EQUAL( expected_alg, psa_key_policy_get_algorithm( &target_policy ) );
1861 if( expected_usage & PSA_KEY_USAGE_EXPORT )
1862 {
1863 size_t length;
1864 ASSERT_ALLOC( export_buffer, material->len );
1865 PSA_ASSERT( psa_export_key( target_handle, export_buffer,
1866 material->len, &length ) );
1867 ASSERT_COMPARE( material->x, material->len,
1868 export_buffer, length );
1869 }
1870 if( ! exercise_key( target_handle, expected_usage, expected_alg ) )
1871 goto exit;
1872
1873 PSA_ASSERT( psa_close_key( target_handle ) );
1874
1875exit:
1876 mbedtls_psa_crypto_free( );
1877 mbedtls_free( export_buffer );
1878}
1879/* END_CASE */
1880
1881/* BEGIN_CASE */
1882void copy_fail( int source_usage_arg, int source_alg_arg,
1883 int type_arg, data_t *material,
1884 int target_usage_arg, int target_alg_arg,
1885 int constraint_usage_arg, int constraint_alg_arg,
1886 int expected_status_arg )
1887{
1888 /* Test copy failure into an empty slot. There is a test for copy failure
1889 * into an occupied slot in
1890 * test_suite_psa_crypto_slot_management.function. */
1891
1892 psa_key_usage_t source_usage = source_usage_arg;
1893 psa_algorithm_t source_alg = source_alg_arg;
1894 psa_key_handle_t source_handle = 0;
1895 psa_key_policy_t source_policy = PSA_KEY_POLICY_INIT;
1896 psa_key_type_t source_type = type_arg;
1897 size_t source_bits;
1898 psa_key_usage_t target_usage = target_usage_arg;
1899 psa_algorithm_t target_alg = target_alg_arg;
1900 psa_key_handle_t target_handle = 0;
1901 psa_key_policy_t target_policy = PSA_KEY_POLICY_INIT;
1902 psa_key_type_t target_type;
1903 size_t target_bits;
1904 psa_key_usage_t constraint_usage = constraint_usage_arg;
1905 psa_algorithm_t constraint_alg = constraint_alg_arg;
1906 psa_key_policy_t constraint = PSA_KEY_POLICY_INIT;
1907 psa_key_policy_t *p_constraint = NULL;
1908 psa_status_t expected_status = expected_status_arg;
1909
1910 if( constraint_usage_arg != -1 )
1911 {
1912 p_constraint = &constraint;
1913 psa_key_policy_set_usage( p_constraint,
1914 constraint_usage, constraint_alg );
1915 }
1916
1917 PSA_ASSERT( psa_crypto_init( ) );
1918
1919 /* Populate the source slot. */
1920 PSA_ASSERT( psa_allocate_key( &source_handle ) );
1921 psa_key_policy_set_usage( &source_policy, source_usage, source_alg );
1922 PSA_ASSERT( psa_set_key_policy( source_handle, &source_policy ) );
1923 PSA_ASSERT( psa_import_key( source_handle, source_type,
1924 material->x, material->len ) );
1925 PSA_ASSERT( psa_get_key_information( source_handle, NULL, &source_bits ) );
1926
1927 /* Prepare the target slot. */
1928 PSA_ASSERT( psa_allocate_key( &target_handle ) );
1929 psa_key_policy_set_usage( &target_policy, target_usage, target_alg );
1930 PSA_ASSERT( psa_set_key_policy( target_handle, &target_policy ) );
1931 target_policy = psa_key_policy_init();
1932
1933 /* Copy the key. */
1934 TEST_EQUAL( psa_copy_key( source_handle, target_handle, p_constraint ),
1935 expected_status );
1936
1937 /* Test that the target slot is unaffected. */
1938 TEST_EQUAL( psa_get_key_information( target_handle,
1939 &target_type, &target_bits ),
1940 PSA_ERROR_EMPTY_SLOT );
1941 PSA_ASSERT( psa_get_key_policy( target_handle, &target_policy ) );
1942 TEST_EQUAL( target_usage, psa_key_policy_get_usage( &target_policy ) );
1943 TEST_EQUAL( target_alg, psa_key_policy_get_algorithm( &target_policy ) );
1944
1945exit:
1946 mbedtls_psa_crypto_free( );
1947}
1948/* END_CASE */
1949
1950/* BEGIN_CASE */
Jaeden Amero6a25b412019-01-04 11:47:44 +00001951void hash_operation_init( )
1952{
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001953 const uint8_t input[1] = { 0 };
Jaeden Amero6a25b412019-01-04 11:47:44 +00001954 /* Test each valid way of initializing the object, except for `= {0}`, as
1955 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
1956 * though it's OK by the C standard. We could test for this, but we'd need
1957 * to supress the Clang warning for the test. */
1958 psa_hash_operation_t func = psa_hash_operation_init( );
1959 psa_hash_operation_t init = PSA_HASH_OPERATION_INIT;
1960 psa_hash_operation_t zero;
1961
1962 memset( &zero, 0, sizeof( zero ) );
1963
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001964 /* A freshly-initialized hash operation should not be usable. */
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001965 TEST_EQUAL( psa_hash_update( &func, input, sizeof( input ) ),
1966 PSA_ERROR_BAD_STATE );
1967 TEST_EQUAL( psa_hash_update( &init, input, sizeof( input ) ),
1968 PSA_ERROR_BAD_STATE );
1969 TEST_EQUAL( psa_hash_update( &zero, input, sizeof( input ) ),
1970 PSA_ERROR_BAD_STATE );
1971
Jaeden Amero5229bbb2019-02-07 16:33:37 +00001972 /* A default hash operation should be abortable without error. */
1973 PSA_ASSERT( psa_hash_abort( &func ) );
1974 PSA_ASSERT( psa_hash_abort( &init ) );
1975 PSA_ASSERT( psa_hash_abort( &zero ) );
Jaeden Amero6a25b412019-01-04 11:47:44 +00001976}
1977/* END_CASE */
1978
1979/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001980void hash_setup( int alg_arg,
1981 int expected_status_arg )
1982{
1983 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001984 psa_status_t expected_status = expected_status_arg;
Jaeden Amero6a25b412019-01-04 11:47:44 +00001985 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001986 psa_status_t status;
1987
Gilles Peskine8817f612018-12-18 00:18:46 +01001988 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001989
Gilles Peskineda8191d1c2018-07-08 19:46:38 +02001990 status = psa_hash_setup( &operation, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001991 psa_hash_abort( &operation );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001992 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001993
1994exit:
1995 mbedtls_psa_crypto_free( );
1996}
1997/* END_CASE */
1998
1999/* BEGIN_CASE */
itayzafrirf86548d2018-11-01 10:44:32 +02002000void hash_bad_order( )
2001{
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002002 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrirf86548d2018-11-01 10:44:32 +02002003 unsigned char input[] = "";
2004 /* SHA-256 hash of an empty string */
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002005 const unsigned char valid_hash[] = {
itayzafrirf86548d2018-11-01 10:44:32 +02002006 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
2007 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
2008 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55 };
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002009 unsigned char hash[sizeof(valid_hash)] = { 0 };
itayzafrirf86548d2018-11-01 10:44:32 +02002010 size_t hash_len;
Jaeden Amero6a25b412019-01-04 11:47:44 +00002011 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirf86548d2018-11-01 10:44:32 +02002012
Gilles Peskine8817f612018-12-18 00:18:46 +01002013 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirf86548d2018-11-01 10:44:32 +02002014
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002015 /* Call update without calling setup beforehand. */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002016 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00002017 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002018 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02002019
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002020 /* Call update after finish. */
2021 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
2022 PSA_ASSERT( psa_hash_finish( &operation,
2023 hash, sizeof( hash ), &hash_len ) );
2024 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00002025 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002026 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02002027
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002028 /* Call verify without calling setup beforehand. */
2029 TEST_EQUAL( psa_hash_verify( &operation,
2030 valid_hash, sizeof( valid_hash ) ),
2031 PSA_ERROR_BAD_STATE );
2032 PSA_ASSERT( psa_hash_abort( &operation ) );
2033
2034 /* Call verify after finish. */
2035 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
2036 PSA_ASSERT( psa_hash_finish( &operation,
2037 hash, sizeof( hash ), &hash_len ) );
2038 TEST_EQUAL( psa_hash_verify( &operation,
2039 valid_hash, sizeof( valid_hash ) ),
2040 PSA_ERROR_BAD_STATE );
2041 PSA_ASSERT( psa_hash_abort( &operation ) );
2042
2043 /* Call verify twice in a row. */
2044 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
2045 PSA_ASSERT( psa_hash_verify( &operation,
2046 valid_hash, sizeof( valid_hash ) ) );
2047 TEST_EQUAL( psa_hash_verify( &operation,
2048 valid_hash, sizeof( valid_hash ) ),
2049 PSA_ERROR_BAD_STATE );
2050 PSA_ASSERT( psa_hash_abort( &operation ) );
2051
2052 /* Call finish without calling setup beforehand. */
Gilles Peskinefe11b722018-12-18 00:24:04 +01002053 TEST_EQUAL( psa_hash_finish( &operation,
2054 hash, sizeof( hash ), &hash_len ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00002055 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002056 PSA_ASSERT( psa_hash_abort( &operation ) );
2057
2058 /* Call finish twice in a row. */
2059 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
2060 PSA_ASSERT( psa_hash_finish( &operation,
2061 hash, sizeof( hash ), &hash_len ) );
2062 TEST_EQUAL( psa_hash_finish( &operation,
2063 hash, sizeof( hash ), &hash_len ),
2064 PSA_ERROR_BAD_STATE );
2065 PSA_ASSERT( psa_hash_abort( &operation ) );
2066
2067 /* Call finish after calling verify. */
2068 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
2069 PSA_ASSERT( psa_hash_verify( &operation,
2070 valid_hash, sizeof( valid_hash ) ) );
2071 TEST_EQUAL( psa_hash_finish( &operation,
2072 hash, sizeof( hash ), &hash_len ),
2073 PSA_ERROR_BAD_STATE );
2074 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02002075
2076exit:
2077 mbedtls_psa_crypto_free( );
2078}
2079/* END_CASE */
2080
itayzafrir27e69452018-11-01 14:26:34 +02002081/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2082void hash_verify_bad_args( )
itayzafrirec93d302018-10-18 18:01:10 +03002083{
2084 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrir27e69452018-11-01 14:26:34 +02002085 /* SHA-256 hash of an empty string with 2 extra bytes (0xaa and 0xbb)
2086 * appended to it */
2087 unsigned char hash[] = {
2088 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
2089 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
2090 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55, 0xaa, 0xbb };
itayzafrirec93d302018-10-18 18:01:10 +03002091 size_t expected_size = PSA_HASH_SIZE( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00002092 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirec93d302018-10-18 18:01:10 +03002093
Gilles Peskine8817f612018-12-18 00:18:46 +01002094 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirec93d302018-10-18 18:01:10 +03002095
itayzafrir27e69452018-11-01 14:26:34 +02002096 /* psa_hash_verify with a smaller hash than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002097 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002098 TEST_EQUAL( psa_hash_verify( &operation, hash, expected_size - 1 ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002099 PSA_ERROR_INVALID_SIGNATURE );
itayzafrirec93d302018-10-18 18:01:10 +03002100
itayzafrir27e69452018-11-01 14:26:34 +02002101 /* psa_hash_verify with a non-matching hash */
Gilles Peskine8817f612018-12-18 00:18:46 +01002102 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002103 TEST_EQUAL( psa_hash_verify( &operation, hash + 1, expected_size ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002104 PSA_ERROR_INVALID_SIGNATURE );
itayzafrirec93d302018-10-18 18:01:10 +03002105
itayzafrir27e69452018-11-01 14:26:34 +02002106 /* psa_hash_verify with a hash longer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002107 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002108 TEST_EQUAL( psa_hash_verify( &operation, hash, sizeof( hash ) ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002109 PSA_ERROR_INVALID_SIGNATURE );
itayzafrir4271df92018-10-24 18:16:19 +03002110
itayzafrirec93d302018-10-18 18:01:10 +03002111exit:
2112 mbedtls_psa_crypto_free( );
2113}
2114/* END_CASE */
2115
itayzafrirb2dd5ed2018-11-01 11:58:59 +02002116/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2117void hash_finish_bad_args( )
itayzafrir58028322018-10-25 10:22:01 +03002118{
2119 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrirb2dd5ed2018-11-01 11:58:59 +02002120 unsigned char hash[PSA_HASH_MAX_SIZE];
itayzafrir58028322018-10-25 10:22:01 +03002121 size_t expected_size = PSA_HASH_SIZE( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00002122 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrir58028322018-10-25 10:22:01 +03002123 size_t hash_len;
2124
Gilles Peskine8817f612018-12-18 00:18:46 +01002125 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir58028322018-10-25 10:22:01 +03002126
itayzafrir58028322018-10-25 10:22:01 +03002127 /* psa_hash_finish with a smaller hash buffer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002128 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002129 TEST_EQUAL( psa_hash_finish( &operation,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002130 hash, expected_size - 1, &hash_len ),
2131 PSA_ERROR_BUFFER_TOO_SMALL );
itayzafrir58028322018-10-25 10:22:01 +03002132
2133exit:
2134 mbedtls_psa_crypto_free( );
2135}
2136/* END_CASE */
2137
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01002138/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2139void hash_clone_source_state( )
2140{
2141 psa_algorithm_t alg = PSA_ALG_SHA_256;
2142 unsigned char hash[PSA_HASH_MAX_SIZE];
2143 psa_hash_operation_t op_source = PSA_HASH_OPERATION_INIT;
2144 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
2145 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
2146 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
2147 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
2148 size_t hash_len;
2149
2150 PSA_ASSERT( psa_crypto_init( ) );
2151 PSA_ASSERT( psa_hash_setup( &op_source, alg ) );
2152
2153 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
2154 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
2155 PSA_ASSERT( psa_hash_finish( &op_finished,
2156 hash, sizeof( hash ), &hash_len ) );
2157 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
2158 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
2159
2160 TEST_EQUAL( psa_hash_clone( &op_source, &op_setup ),
2161 PSA_ERROR_BAD_STATE );
2162
2163 PSA_ASSERT( psa_hash_clone( &op_source, &op_init ) );
2164 PSA_ASSERT( psa_hash_finish( &op_init,
2165 hash, sizeof( hash ), &hash_len ) );
2166 PSA_ASSERT( psa_hash_clone( &op_source, &op_finished ) );
2167 PSA_ASSERT( psa_hash_finish( &op_finished,
2168 hash, sizeof( hash ), &hash_len ) );
2169 PSA_ASSERT( psa_hash_clone( &op_source, &op_aborted ) );
2170 PSA_ASSERT( psa_hash_finish( &op_aborted,
2171 hash, sizeof( hash ), &hash_len ) );
2172
2173exit:
2174 psa_hash_abort( &op_source );
2175 psa_hash_abort( &op_init );
2176 psa_hash_abort( &op_setup );
2177 psa_hash_abort( &op_finished );
2178 psa_hash_abort( &op_aborted );
2179 mbedtls_psa_crypto_free( );
2180}
2181/* END_CASE */
2182
2183/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2184void hash_clone_target_state( )
2185{
2186 psa_algorithm_t alg = PSA_ALG_SHA_256;
2187 unsigned char hash[PSA_HASH_MAX_SIZE];
2188 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
2189 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
2190 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
2191 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
2192 psa_hash_operation_t op_target = PSA_HASH_OPERATION_INIT;
2193 size_t hash_len;
2194
2195 PSA_ASSERT( psa_crypto_init( ) );
2196
2197 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
2198 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
2199 PSA_ASSERT( psa_hash_finish( &op_finished,
2200 hash, sizeof( hash ), &hash_len ) );
2201 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
2202 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
2203
2204 PSA_ASSERT( psa_hash_clone( &op_setup, &op_target ) );
2205 PSA_ASSERT( psa_hash_finish( &op_target,
2206 hash, sizeof( hash ), &hash_len ) );
2207
2208 TEST_EQUAL( psa_hash_clone( &op_init, &op_target ), PSA_ERROR_BAD_STATE );
2209 TEST_EQUAL( psa_hash_clone( &op_finished, &op_target ),
2210 PSA_ERROR_BAD_STATE );
2211 TEST_EQUAL( psa_hash_clone( &op_aborted, &op_target ),
2212 PSA_ERROR_BAD_STATE );
2213
2214exit:
2215 psa_hash_abort( &op_target );
2216 psa_hash_abort( &op_init );
2217 psa_hash_abort( &op_setup );
2218 psa_hash_abort( &op_finished );
2219 psa_hash_abort( &op_aborted );
2220 mbedtls_psa_crypto_free( );
2221}
2222/* END_CASE */
2223
itayzafrir58028322018-10-25 10:22:01 +03002224/* BEGIN_CASE */
Jaeden Amero769ce272019-01-04 11:48:03 +00002225void mac_operation_init( )
2226{
Jaeden Amero252ef282019-02-15 14:05:35 +00002227 const uint8_t input[1] = { 0 };
2228
Jaeden Amero769ce272019-01-04 11:48:03 +00002229 /* Test each valid way of initializing the object, except for `= {0}`, as
2230 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
2231 * though it's OK by the C standard. We could test for this, but we'd need
2232 * to supress the Clang warning for the test. */
2233 psa_mac_operation_t func = psa_mac_operation_init( );
2234 psa_mac_operation_t init = PSA_MAC_OPERATION_INIT;
2235 psa_mac_operation_t zero;
2236
2237 memset( &zero, 0, sizeof( zero ) );
2238
Jaeden Amero252ef282019-02-15 14:05:35 +00002239 /* A freshly-initialized MAC operation should not be usable. */
2240 TEST_EQUAL( psa_mac_update( &func,
2241 input, sizeof( input ) ),
2242 PSA_ERROR_BAD_STATE );
2243 TEST_EQUAL( psa_mac_update( &init,
2244 input, sizeof( input ) ),
2245 PSA_ERROR_BAD_STATE );
2246 TEST_EQUAL( psa_mac_update( &zero,
2247 input, sizeof( input ) ),
2248 PSA_ERROR_BAD_STATE );
2249
Jaeden Amero5229bbb2019-02-07 16:33:37 +00002250 /* A default MAC operation should be abortable without error. */
2251 PSA_ASSERT( psa_mac_abort( &func ) );
2252 PSA_ASSERT( psa_mac_abort( &init ) );
2253 PSA_ASSERT( psa_mac_abort( &zero ) );
Jaeden Amero769ce272019-01-04 11:48:03 +00002254}
2255/* END_CASE */
2256
2257/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002258void mac_setup( int key_type_arg,
2259 data_t *key,
2260 int alg_arg,
2261 int expected_status_arg )
2262{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002263 psa_key_handle_t handle = 0;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002264 psa_key_type_t key_type = key_type_arg;
2265 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002266 psa_status_t expected_status = expected_status_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002267 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002268 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002269 psa_status_t status;
2270
Gilles Peskine8817f612018-12-18 00:18:46 +01002271 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002272
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002273 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002274 psa_key_policy_set_usage( &policy,
2275 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
2276 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002277 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002278
Gilles Peskine8817f612018-12-18 00:18:46 +01002279 PSA_ASSERT( psa_import_key( handle, key_type,
2280 key->x, key->len ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002281
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002282 status = psa_mac_sign_setup( &operation, handle, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002283 psa_mac_abort( &operation );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002284 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002285
2286exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002287 psa_destroy_key( handle );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002288 mbedtls_psa_crypto_free( );
2289}
2290/* END_CASE */
2291
2292/* BEGIN_CASE */
Jaeden Amero252ef282019-02-15 14:05:35 +00002293void mac_bad_order( )
2294{
2295 psa_key_handle_t handle = 0;
2296 psa_key_type_t key_type = PSA_KEY_TYPE_HMAC;
2297 psa_algorithm_t alg = PSA_ALG_HMAC(PSA_ALG_SHA_256);
2298 const uint8_t key[] = {
2299 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2300 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2301 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
2302 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
2303 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
2304 uint8_t sign_mac[PSA_MAC_MAX_SIZE + 10] = { 0 };
2305 size_t sign_mac_length = 0;
2306 const uint8_t input[] = { 0xbb, 0xbb, 0xbb, 0xbb };
2307 const uint8_t verify_mac[] = {
2308 0x74, 0x65, 0x93, 0x8c, 0xeb, 0x1d, 0xb3, 0x76, 0x5a, 0x38, 0xe7, 0xdd,
2309 0x85, 0xc5, 0xad, 0x4f, 0x07, 0xe7, 0xd5, 0xb2, 0x64, 0xf0, 0x1a, 0x1a,
2310 0x2c, 0xf9, 0x18, 0xca, 0x59, 0x7e, 0x5d, 0xf6 };
2311
2312 PSA_ASSERT( psa_crypto_init( ) );
2313 PSA_ASSERT( psa_allocate_key( &handle ) );
2314 psa_key_policy_set_usage( &policy,
2315 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
2316 alg );
2317 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
2318
2319 PSA_ASSERT( psa_import_key( handle, key_type,
2320 key, sizeof(key) ) );
2321
2322 /* Call update without calling setup beforehand. */
2323 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2324 PSA_ERROR_BAD_STATE );
2325 PSA_ASSERT( psa_mac_abort( &operation ) );
2326
2327 /* Call sign finish without calling setup beforehand. */
2328 TEST_EQUAL( psa_mac_sign_finish( &operation, sign_mac, sizeof( sign_mac ),
2329 &sign_mac_length),
2330 PSA_ERROR_BAD_STATE );
2331 PSA_ASSERT( psa_mac_abort( &operation ) );
2332
2333 /* Call verify finish without calling setup beforehand. */
2334 TEST_EQUAL( psa_mac_verify_finish( &operation,
2335 verify_mac, sizeof( verify_mac ) ),
2336 PSA_ERROR_BAD_STATE );
2337 PSA_ASSERT( psa_mac_abort( &operation ) );
2338
2339 /* Call update after sign finish. */
2340 PSA_ASSERT( psa_mac_sign_setup( &operation,
2341 handle, alg ) );
2342 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2343 PSA_ASSERT( psa_mac_sign_finish( &operation,
2344 sign_mac, sizeof( sign_mac ),
2345 &sign_mac_length ) );
2346 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2347 PSA_ERROR_BAD_STATE );
2348 PSA_ASSERT( psa_mac_abort( &operation ) );
2349
2350 /* Call update after verify finish. */
2351 PSA_ASSERT( psa_mac_verify_setup( &operation,
2352 handle, alg ) );
2353 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2354 PSA_ASSERT( psa_mac_verify_finish( &operation,
2355 verify_mac, sizeof( verify_mac ) ) );
2356 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2357 PSA_ERROR_BAD_STATE );
2358 PSA_ASSERT( psa_mac_abort( &operation ) );
2359
2360 /* Call sign finish twice in a row. */
2361 PSA_ASSERT( psa_mac_sign_setup( &operation,
2362 handle, alg ) );
2363 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2364 PSA_ASSERT( psa_mac_sign_finish( &operation,
2365 sign_mac, sizeof( sign_mac ),
2366 &sign_mac_length ) );
2367 TEST_EQUAL( psa_mac_sign_finish( &operation,
2368 sign_mac, sizeof( sign_mac ),
2369 &sign_mac_length ),
2370 PSA_ERROR_BAD_STATE );
2371 PSA_ASSERT( psa_mac_abort( &operation ) );
2372
2373 /* Call verify finish twice in a row. */
2374 PSA_ASSERT( psa_mac_verify_setup( &operation,
2375 handle, alg ) );
2376 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2377 PSA_ASSERT( psa_mac_verify_finish( &operation,
2378 verify_mac, sizeof( verify_mac ) ) );
2379 TEST_EQUAL( psa_mac_verify_finish( &operation,
2380 verify_mac, sizeof( verify_mac ) ),
2381 PSA_ERROR_BAD_STATE );
2382 PSA_ASSERT( psa_mac_abort( &operation ) );
2383
2384 /* Setup sign but try verify. */
2385 PSA_ASSERT( psa_mac_sign_setup( &operation,
2386 handle, alg ) );
2387 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2388 TEST_EQUAL( psa_mac_verify_finish( &operation,
2389 verify_mac, sizeof( verify_mac ) ),
2390 PSA_ERROR_BAD_STATE );
2391 PSA_ASSERT( psa_mac_abort( &operation ) );
2392
2393 /* Setup verify but try sign. */
2394 PSA_ASSERT( psa_mac_verify_setup( &operation,
2395 handle, alg ) );
2396 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2397 TEST_EQUAL( psa_mac_sign_finish( &operation,
2398 sign_mac, sizeof( sign_mac ),
2399 &sign_mac_length ),
2400 PSA_ERROR_BAD_STATE );
2401 PSA_ASSERT( psa_mac_abort( &operation ) );
2402
2403exit:
2404 mbedtls_psa_crypto_free( );
2405}
2406/* END_CASE */
2407
2408/* BEGIN_CASE */
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002409void mac_sign( int key_type_arg,
2410 data_t *key,
2411 int alg_arg,
2412 data_t *input,
2413 data_t *expected_mac )
2414{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002415 psa_key_handle_t handle = 0;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002416 psa_key_type_t key_type = key_type_arg;
2417 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002418 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002419 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002420 /* Leave a little extra room in the output buffer. At the end of the
2421 * test, we'll check that the implementation didn't overwrite onto
2422 * this extra room. */
2423 uint8_t actual_mac[PSA_MAC_MAX_SIZE + 10];
2424 size_t mac_buffer_size =
2425 PSA_MAC_FINAL_SIZE( key_type, PSA_BYTES_TO_BITS( key->len ), alg );
2426 size_t mac_length = 0;
2427
2428 memset( actual_mac, '+', sizeof( actual_mac ) );
2429 TEST_ASSERT( mac_buffer_size <= PSA_MAC_MAX_SIZE );
2430 TEST_ASSERT( expected_mac->len <= mac_buffer_size );
2431
Gilles Peskine8817f612018-12-18 00:18:46 +01002432 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002433
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002434 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002435 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002436 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002437
Gilles Peskine8817f612018-12-18 00:18:46 +01002438 PSA_ASSERT( psa_import_key( handle, key_type,
2439 key->x, key->len ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002440
2441 /* Calculate the MAC. */
Gilles Peskine8817f612018-12-18 00:18:46 +01002442 PSA_ASSERT( psa_mac_sign_setup( &operation,
2443 handle, alg ) );
2444 PSA_ASSERT( psa_mac_update( &operation,
2445 input->x, input->len ) );
2446 PSA_ASSERT( psa_mac_sign_finish( &operation,
2447 actual_mac, mac_buffer_size,
2448 &mac_length ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002449
2450 /* Compare with the expected value. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01002451 ASSERT_COMPARE( expected_mac->x, expected_mac->len,
2452 actual_mac, mac_length );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002453
2454 /* Verify that the end of the buffer is untouched. */
2455 TEST_ASSERT( mem_is_char( actual_mac + mac_length, '+',
2456 sizeof( actual_mac ) - mac_length ) );
2457
2458exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002459 psa_destroy_key( handle );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002460 mbedtls_psa_crypto_free( );
2461}
2462/* END_CASE */
2463
2464/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002465void mac_verify( int key_type_arg,
2466 data_t *key,
2467 int alg_arg,
2468 data_t *input,
2469 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +01002470{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002471 psa_key_handle_t handle = 0;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002472 psa_key_type_t key_type = key_type_arg;
2473 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002474 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002475 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002476
Gilles Peskine69c12672018-06-28 00:07:19 +02002477 TEST_ASSERT( expected_mac->len <= PSA_MAC_MAX_SIZE );
2478
Gilles Peskine8817f612018-12-18 00:18:46 +01002479 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002480
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002481 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002482 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002483 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
mohammad16036df908f2018-04-02 08:34:15 -07002484
Gilles Peskine8817f612018-12-18 00:18:46 +01002485 PSA_ASSERT( psa_import_key( handle, key_type,
2486 key->x, key->len ) );
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002487
Gilles Peskine8817f612018-12-18 00:18:46 +01002488 PSA_ASSERT( psa_mac_verify_setup( &operation,
2489 handle, alg ) );
2490 PSA_ASSERT( psa_destroy_key( handle ) );
2491 PSA_ASSERT( psa_mac_update( &operation,
2492 input->x, input->len ) );
2493 PSA_ASSERT( psa_mac_verify_finish( &operation,
2494 expected_mac->x,
2495 expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002496
2497exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002498 psa_destroy_key( handle );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002499 mbedtls_psa_crypto_free( );
2500}
2501/* END_CASE */
2502
2503/* BEGIN_CASE */
Jaeden Amero5bae2272019-01-04 11:48:27 +00002504void cipher_operation_init( )
2505{
Jaeden Ameroab439972019-02-15 14:12:05 +00002506 const uint8_t input[1] = { 0 };
2507 unsigned char output[1] = { 0 };
2508 size_t output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002509 /* Test each valid way of initializing the object, except for `= {0}`, as
2510 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
2511 * though it's OK by the C standard. We could test for this, but we'd need
2512 * to supress the Clang warning for the test. */
2513 psa_cipher_operation_t func = psa_cipher_operation_init( );
2514 psa_cipher_operation_t init = PSA_CIPHER_OPERATION_INIT;
2515 psa_cipher_operation_t zero;
2516
2517 memset( &zero, 0, sizeof( zero ) );
2518
Jaeden Ameroab439972019-02-15 14:12:05 +00002519 /* A freshly-initialized cipher operation should not be usable. */
2520 TEST_EQUAL( psa_cipher_update( &func,
2521 input, sizeof( input ),
2522 output, sizeof( output ),
2523 &output_length ),
2524 PSA_ERROR_BAD_STATE );
2525 TEST_EQUAL( psa_cipher_update( &init,
2526 input, sizeof( input ),
2527 output, sizeof( output ),
2528 &output_length ),
2529 PSA_ERROR_BAD_STATE );
2530 TEST_EQUAL( psa_cipher_update( &zero,
2531 input, sizeof( input ),
2532 output, sizeof( output ),
2533 &output_length ),
2534 PSA_ERROR_BAD_STATE );
2535
Jaeden Amero5229bbb2019-02-07 16:33:37 +00002536 /* A default cipher operation should be abortable without error. */
2537 PSA_ASSERT( psa_cipher_abort( &func ) );
2538 PSA_ASSERT( psa_cipher_abort( &init ) );
2539 PSA_ASSERT( psa_cipher_abort( &zero ) );
Jaeden Amero5bae2272019-01-04 11:48:27 +00002540}
2541/* END_CASE */
2542
2543/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002544void cipher_setup( int key_type_arg,
2545 data_t *key,
2546 int alg_arg,
2547 int expected_status_arg )
2548{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002549 psa_key_handle_t handle = 0;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002550 psa_key_type_t key_type = key_type_arg;
2551 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002552 psa_status_t expected_status = expected_status_arg;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002553 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002554 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002555 psa_status_t status;
2556
Gilles Peskine8817f612018-12-18 00:18:46 +01002557 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002558
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002559 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002560 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002561 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002562
Gilles Peskine8817f612018-12-18 00:18:46 +01002563 PSA_ASSERT( psa_import_key( handle, key_type,
2564 key->x, key->len ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002565
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002566 status = psa_cipher_encrypt_setup( &operation, handle, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002567 psa_cipher_abort( &operation );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002568 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002569
2570exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002571 psa_destroy_key( handle );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002572 mbedtls_psa_crypto_free( );
2573}
2574/* END_CASE */
2575
2576/* BEGIN_CASE */
Jaeden Ameroab439972019-02-15 14:12:05 +00002577void cipher_bad_order( )
2578{
2579 psa_key_handle_t handle = 0;
2580 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
2581 psa_algorithm_t alg = PSA_ALG_CBC_PKCS7;
2582 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
2583 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
2584 unsigned char iv[PSA_BLOCK_CIPHER_BLOCK_SIZE(PSA_KEY_TYPE_AES)] = { 0 };
2585 const uint8_t key[] = {
2586 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2587 0xaa, 0xaa, 0xaa, 0xaa };
2588 const uint8_t text[] = {
2589 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2590 0xbb, 0xbb, 0xbb, 0xbb };
2591 uint8_t buffer[PSA_BLOCK_CIPHER_BLOCK_SIZE(PSA_KEY_TYPE_AES)] = { 0 };
2592 size_t length = 0;
2593
2594 PSA_ASSERT( psa_crypto_init( ) );
2595 PSA_ASSERT( psa_allocate_key( &handle ) );
2596 psa_key_policy_set_usage( &policy,
2597 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
2598 alg );
2599 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
2600 PSA_ASSERT( psa_import_key( handle, key_type,
2601 key, sizeof(key) ) );
2602
2603
2604 /* Generate an IV without calling setup beforehand. */
2605 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2606 buffer, sizeof( buffer ),
2607 &length ),
2608 PSA_ERROR_BAD_STATE );
2609 PSA_ASSERT( psa_cipher_abort( &operation ) );
2610
2611 /* Generate an IV twice in a row. */
2612 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2613 PSA_ASSERT( psa_cipher_generate_iv( &operation,
2614 buffer, sizeof( buffer ),
2615 &length ) );
2616 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2617 buffer, sizeof( buffer ),
2618 &length ),
2619 PSA_ERROR_BAD_STATE );
2620 PSA_ASSERT( psa_cipher_abort( &operation ) );
2621
2622 /* Generate an IV after it's already set. */
2623 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2624 PSA_ASSERT( psa_cipher_set_iv( &operation,
2625 iv, sizeof( iv ) ) );
2626 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2627 buffer, sizeof( buffer ),
2628 &length ),
2629 PSA_ERROR_BAD_STATE );
2630 PSA_ASSERT( psa_cipher_abort( &operation ) );
2631
2632 /* Set an IV without calling setup beforehand. */
2633 TEST_EQUAL( psa_cipher_set_iv( &operation,
2634 iv, sizeof( iv ) ),
2635 PSA_ERROR_BAD_STATE );
2636 PSA_ASSERT( psa_cipher_abort( &operation ) );
2637
2638 /* Set an IV after it's already set. */
2639 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2640 PSA_ASSERT( psa_cipher_set_iv( &operation,
2641 iv, sizeof( iv ) ) );
2642 TEST_EQUAL( psa_cipher_set_iv( &operation,
2643 iv, sizeof( iv ) ),
2644 PSA_ERROR_BAD_STATE );
2645 PSA_ASSERT( psa_cipher_abort( &operation ) );
2646
2647 /* Set an IV after it's already generated. */
2648 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2649 PSA_ASSERT( psa_cipher_generate_iv( &operation,
2650 buffer, sizeof( buffer ),
2651 &length ) );
2652 TEST_EQUAL( psa_cipher_set_iv( &operation,
2653 iv, sizeof( iv ) ),
2654 PSA_ERROR_BAD_STATE );
2655 PSA_ASSERT( psa_cipher_abort( &operation ) );
2656
2657 /* Call update without calling setup beforehand. */
2658 TEST_EQUAL( psa_cipher_update( &operation,
2659 text, sizeof( text ),
2660 buffer, sizeof( buffer ),
2661 &length ),
2662 PSA_ERROR_BAD_STATE );
2663 PSA_ASSERT( psa_cipher_abort( &operation ) );
2664
2665 /* Call update without an IV where an IV is required. */
2666 TEST_EQUAL( psa_cipher_update( &operation,
2667 text, sizeof( text ),
2668 buffer, sizeof( buffer ),
2669 &length ),
2670 PSA_ERROR_BAD_STATE );
2671 PSA_ASSERT( psa_cipher_abort( &operation ) );
2672
2673 /* Call update after finish. */
2674 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2675 PSA_ASSERT( psa_cipher_set_iv( &operation,
2676 iv, sizeof( iv ) ) );
2677 PSA_ASSERT( psa_cipher_finish( &operation,
2678 buffer, sizeof( buffer ), &length ) );
2679 TEST_EQUAL( psa_cipher_update( &operation,
2680 text, sizeof( text ),
2681 buffer, sizeof( buffer ),
2682 &length ),
2683 PSA_ERROR_BAD_STATE );
2684 PSA_ASSERT( psa_cipher_abort( &operation ) );
2685
2686 /* Call finish without calling setup beforehand. */
2687 TEST_EQUAL( psa_cipher_finish( &operation,
2688 buffer, sizeof( buffer ), &length ),
2689 PSA_ERROR_BAD_STATE );
2690 PSA_ASSERT( psa_cipher_abort( &operation ) );
2691
2692 /* Call finish without an IV where an IV is required. */
2693 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2694 /* Not calling update means we are encrypting an empty buffer, which is OK
2695 * for cipher modes with padding. */
2696 TEST_EQUAL( psa_cipher_finish( &operation,
2697 buffer, sizeof( buffer ), &length ),
2698 PSA_ERROR_BAD_STATE );
2699 PSA_ASSERT( psa_cipher_abort( &operation ) );
2700
2701 /* Call finish twice in a row. */
2702 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2703 PSA_ASSERT( psa_cipher_set_iv( &operation,
2704 iv, sizeof( iv ) ) );
2705 PSA_ASSERT( psa_cipher_finish( &operation,
2706 buffer, sizeof( buffer ), &length ) );
2707 TEST_EQUAL( psa_cipher_finish( &operation,
2708 buffer, sizeof( buffer ), &length ),
2709 PSA_ERROR_BAD_STATE );
2710 PSA_ASSERT( psa_cipher_abort( &operation ) );
2711
2712exit:
2713 mbedtls_psa_crypto_free( );
2714}
2715/* END_CASE */
2716
2717/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002718void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002719 data_t *key,
2720 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002721 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002722{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002723 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002724 psa_status_t status;
2725 psa_key_type_t key_type = key_type_arg;
2726 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002727 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002728 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002729 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002730 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002731 size_t output_buffer_size = 0;
2732 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002733 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002734 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002735 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002736
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002737 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2738 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002739
Gilles Peskine8817f612018-12-18 00:18:46 +01002740 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002741
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002742 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002743 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002744 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002745
Gilles Peskine8817f612018-12-18 00:18:46 +01002746 PSA_ASSERT( psa_import_key( handle, key_type,
2747 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002748
Gilles Peskine8817f612018-12-18 00:18:46 +01002749 PSA_ASSERT( psa_cipher_encrypt_setup( &operation,
2750 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002751
Gilles Peskine8817f612018-12-18 00:18:46 +01002752 PSA_ASSERT( psa_cipher_set_iv( &operation,
2753 iv, iv_size ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002754 output_buffer_size = ( (size_t) input->len +
2755 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002756 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002757
Gilles Peskine8817f612018-12-18 00:18:46 +01002758 PSA_ASSERT( psa_cipher_update( &operation,
2759 input->x, input->len,
2760 output, output_buffer_size,
2761 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002762 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002763 status = psa_cipher_finish( &operation,
2764 output + function_output_length,
2765 output_buffer_size,
2766 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002767 total_output_length += function_output_length;
2768
Gilles Peskinefe11b722018-12-18 00:24:04 +01002769 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002770 if( expected_status == PSA_SUCCESS )
2771 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002772 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002773 ASSERT_COMPARE( expected_output->x, expected_output->len,
2774 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002775 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002776
Gilles Peskine50e586b2018-06-08 14:28:46 +02002777exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002778 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002779 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002780 mbedtls_psa_crypto_free( );
2781}
2782/* END_CASE */
2783
2784/* BEGIN_CASE */
2785void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002786 data_t *key,
2787 data_t *input,
2788 int first_part_size,
2789 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002790{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002791 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002792 psa_key_type_t key_type = key_type_arg;
2793 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002794 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002795 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002796 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002797 size_t output_buffer_size = 0;
2798 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002799 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002800 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002801 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002802
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002803 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2804 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002805
Gilles Peskine8817f612018-12-18 00:18:46 +01002806 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002807
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002808 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002809 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002810 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002811
Gilles Peskine8817f612018-12-18 00:18:46 +01002812 PSA_ASSERT( psa_import_key( handle, key_type,
2813 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002814
Gilles Peskine8817f612018-12-18 00:18:46 +01002815 PSA_ASSERT( psa_cipher_encrypt_setup( &operation,
2816 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002817
Gilles Peskine8817f612018-12-18 00:18:46 +01002818 PSA_ASSERT( psa_cipher_set_iv( &operation,
2819 iv, sizeof( iv ) ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002820 output_buffer_size = ( (size_t) input->len +
2821 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002822 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002823
Gilles Peskine4abf7412018-06-18 16:35:34 +02002824 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002825 PSA_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
2826 output, output_buffer_size,
2827 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002828 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002829 PSA_ASSERT( psa_cipher_update( &operation,
2830 input->x + first_part_size,
2831 input->len - first_part_size,
2832 output, output_buffer_size,
2833 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002834 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002835 PSA_ASSERT( psa_cipher_finish( &operation,
2836 output + function_output_length,
2837 output_buffer_size,
2838 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002839 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002840 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002841
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002842 ASSERT_COMPARE( expected_output->x, expected_output->len,
2843 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002844
2845exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002846 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002847 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002848 mbedtls_psa_crypto_free( );
2849}
2850/* END_CASE */
2851
2852/* BEGIN_CASE */
2853void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002854 data_t *key,
2855 data_t *input,
2856 int first_part_size,
2857 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002858{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002859 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002860
2861 psa_key_type_t key_type = key_type_arg;
2862 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002863 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002864 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002865 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002866 size_t output_buffer_size = 0;
2867 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002868 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002869 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002870 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002871
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002872 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2873 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002874
Gilles Peskine8817f612018-12-18 00:18:46 +01002875 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002876
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002877 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002878 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002879 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002880
Gilles Peskine8817f612018-12-18 00:18:46 +01002881 PSA_ASSERT( psa_import_key( handle, key_type,
2882 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002883
Gilles Peskine8817f612018-12-18 00:18:46 +01002884 PSA_ASSERT( psa_cipher_decrypt_setup( &operation,
2885 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002886
Gilles Peskine8817f612018-12-18 00:18:46 +01002887 PSA_ASSERT( psa_cipher_set_iv( &operation,
2888 iv, sizeof( iv ) ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002889
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002890 output_buffer_size = ( (size_t) input->len +
2891 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002892 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002893
Gilles Peskine4abf7412018-06-18 16:35:34 +02002894 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002895 PSA_ASSERT( psa_cipher_update( &operation,
2896 input->x, first_part_size,
2897 output, output_buffer_size,
2898 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002899 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002900 PSA_ASSERT( psa_cipher_update( &operation,
2901 input->x + first_part_size,
2902 input->len - first_part_size,
2903 output, output_buffer_size,
2904 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002905 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002906 PSA_ASSERT( psa_cipher_finish( &operation,
2907 output + function_output_length,
2908 output_buffer_size,
2909 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002910 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002911 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002912
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002913 ASSERT_COMPARE( expected_output->x, expected_output->len,
2914 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002915
2916exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002917 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002918 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002919 mbedtls_psa_crypto_free( );
2920}
2921/* END_CASE */
2922
Gilles Peskine50e586b2018-06-08 14:28:46 +02002923/* BEGIN_CASE */
2924void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002925 data_t *key,
2926 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002927 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002928{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002929 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002930 psa_status_t status;
2931 psa_key_type_t key_type = key_type_arg;
2932 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002933 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002934 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002935 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002936 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002937 size_t output_buffer_size = 0;
2938 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002939 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002940 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002941 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002942
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002943 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2944 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002945
Gilles Peskine8817f612018-12-18 00:18:46 +01002946 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002947
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002948 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002949 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002950 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002951
Gilles Peskine8817f612018-12-18 00:18:46 +01002952 PSA_ASSERT( psa_import_key( handle, key_type,
2953 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002954
Gilles Peskine8817f612018-12-18 00:18:46 +01002955 PSA_ASSERT( psa_cipher_decrypt_setup( &operation,
2956 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002957
Gilles Peskine8817f612018-12-18 00:18:46 +01002958 PSA_ASSERT( psa_cipher_set_iv( &operation,
2959 iv, iv_size ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002960
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002961 output_buffer_size = ( (size_t) input->len +
2962 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002963 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002964
Gilles Peskine8817f612018-12-18 00:18:46 +01002965 PSA_ASSERT( psa_cipher_update( &operation,
2966 input->x, input->len,
2967 output, output_buffer_size,
2968 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002969 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002970 status = psa_cipher_finish( &operation,
2971 output + function_output_length,
2972 output_buffer_size,
2973 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002974 total_output_length += function_output_length;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002975 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002976
2977 if( expected_status == PSA_SUCCESS )
2978 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002979 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002980 ASSERT_COMPARE( expected_output->x, expected_output->len,
2981 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002982 }
2983
Gilles Peskine50e586b2018-06-08 14:28:46 +02002984exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002985 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002986 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002987 mbedtls_psa_crypto_free( );
2988}
2989/* END_CASE */
2990
Gilles Peskine50e586b2018-06-08 14:28:46 +02002991/* BEGIN_CASE */
2992void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002993 data_t *key,
2994 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02002995{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002996 psa_key_handle_t handle = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002997 psa_key_type_t key_type = key_type_arg;
2998 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -07002999 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +02003000 size_t iv_size = 16;
3001 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003002 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003003 size_t output1_size = 0;
3004 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003005 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003006 size_t output2_size = 0;
3007 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003008 size_t function_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00003009 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
3010 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00003011 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003012
Gilles Peskine8817f612018-12-18 00:18:46 +01003013 PSA_ASSERT( psa_crypto_init( ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003014
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003015 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03003016 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003017 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03003018
Gilles Peskine8817f612018-12-18 00:18:46 +01003019 PSA_ASSERT( psa_import_key( handle, key_type,
3020 key->x, key->len ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003021
Gilles Peskine8817f612018-12-18 00:18:46 +01003022 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1,
3023 handle, alg ) );
3024 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2,
3025 handle, alg ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003026
Gilles Peskine8817f612018-12-18 00:18:46 +01003027 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
3028 iv, iv_size,
3029 &iv_length ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01003030 output1_size = ( (size_t) input->len +
3031 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003032 ASSERT_ALLOC( output1, output1_size );
Moran Pekerded84402018-06-06 16:36:50 +03003033
Gilles Peskine8817f612018-12-18 00:18:46 +01003034 PSA_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
3035 output1, output1_size,
3036 &output1_length ) );
3037 PSA_ASSERT( psa_cipher_finish( &operation1,
3038 output1 + output1_length, output1_size,
3039 &function_output_length ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003040
Gilles Peskine048b7f02018-06-08 14:20:49 +02003041 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003042
Gilles Peskine8817f612018-12-18 00:18:46 +01003043 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
Moran Pekerded84402018-06-06 16:36:50 +03003044
3045 output2_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003046 ASSERT_ALLOC( output2, output2_size );
Moran Pekerded84402018-06-06 16:36:50 +03003047
Gilles Peskine8817f612018-12-18 00:18:46 +01003048 PSA_ASSERT( psa_cipher_set_iv( &operation2,
3049 iv, iv_length ) );
3050 PSA_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
3051 output2, output2_size,
3052 &output2_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003053 function_output_length = 0;
Gilles Peskine8817f612018-12-18 00:18:46 +01003054 PSA_ASSERT( psa_cipher_finish( &operation2,
3055 output2 + output2_length,
3056 output2_size,
3057 &function_output_length ) );
Moran Pekerded84402018-06-06 16:36:50 +03003058
Gilles Peskine048b7f02018-06-08 14:20:49 +02003059 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003060
Gilles Peskine8817f612018-12-18 00:18:46 +01003061 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
Moran Pekerded84402018-06-06 16:36:50 +03003062
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003063 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
Moran Pekerded84402018-06-06 16:36:50 +03003064
3065exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03003066 mbedtls_free( output1 );
3067 mbedtls_free( output2 );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003068 psa_destroy_key( handle );
Moran Pekerded84402018-06-06 16:36:50 +03003069 mbedtls_psa_crypto_free( );
3070}
3071/* END_CASE */
3072
3073/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02003074void cipher_verify_output_multipart( int alg_arg,
3075 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03003076 data_t *key,
3077 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +02003078 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +03003079{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003080 psa_key_handle_t handle = 0;
Moran Pekerded84402018-06-06 16:36:50 +03003081 psa_key_type_t key_type = key_type_arg;
3082 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +03003083 unsigned char iv[16] = {0};
3084 size_t iv_size = 16;
3085 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003086 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003087 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03003088 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003089 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003090 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03003091 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003092 size_t function_output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00003093 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
3094 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00003095 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03003096
Gilles Peskine8817f612018-12-18 00:18:46 +01003097 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerded84402018-06-06 16:36:50 +03003098
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003099 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03003100 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003101 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03003102
Gilles Peskine8817f612018-12-18 00:18:46 +01003103 PSA_ASSERT( psa_import_key( handle, key_type,
3104 key->x, key->len ) );
Moran Pekerded84402018-06-06 16:36:50 +03003105
Gilles Peskine8817f612018-12-18 00:18:46 +01003106 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1,
3107 handle, alg ) );
3108 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2,
3109 handle, alg ) );
Moran Pekerded84402018-06-06 16:36:50 +03003110
Gilles Peskine8817f612018-12-18 00:18:46 +01003111 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
3112 iv, iv_size,
3113 &iv_length ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01003114 output1_buffer_size = ( (size_t) input->len +
3115 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003116 ASSERT_ALLOC( output1, output1_buffer_size );
Moran Pekerded84402018-06-06 16:36:50 +03003117
Gilles Peskine4abf7412018-06-18 16:35:34 +02003118 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003119
Gilles Peskine8817f612018-12-18 00:18:46 +01003120 PSA_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
3121 output1, output1_buffer_size,
3122 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003123 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003124
Gilles Peskine8817f612018-12-18 00:18:46 +01003125 PSA_ASSERT( psa_cipher_update( &operation1,
3126 input->x + first_part_size,
3127 input->len - first_part_size,
3128 output1, output1_buffer_size,
3129 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003130 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003131
Gilles Peskine8817f612018-12-18 00:18:46 +01003132 PSA_ASSERT( psa_cipher_finish( &operation1,
3133 output1 + output1_length,
3134 output1_buffer_size - output1_length,
3135 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003136 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003137
Gilles Peskine8817f612018-12-18 00:18:46 +01003138 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003139
Gilles Peskine048b7f02018-06-08 14:20:49 +02003140 output2_buffer_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003141 ASSERT_ALLOC( output2, output2_buffer_size );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003142
Gilles Peskine8817f612018-12-18 00:18:46 +01003143 PSA_ASSERT( psa_cipher_set_iv( &operation2,
3144 iv, iv_length ) );
Moran Pekerded84402018-06-06 16:36:50 +03003145
Gilles Peskine8817f612018-12-18 00:18:46 +01003146 PSA_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
3147 output2, output2_buffer_size,
3148 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003149 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003150
Gilles Peskine8817f612018-12-18 00:18:46 +01003151 PSA_ASSERT( psa_cipher_update( &operation2,
3152 output1 + first_part_size,
3153 output1_length - first_part_size,
3154 output2, output2_buffer_size,
3155 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003156 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003157
Gilles Peskine8817f612018-12-18 00:18:46 +01003158 PSA_ASSERT( psa_cipher_finish( &operation2,
3159 output2 + output2_length,
3160 output2_buffer_size - output2_length,
3161 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003162 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003163
Gilles Peskine8817f612018-12-18 00:18:46 +01003164 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003165
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003166 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003167
3168exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03003169 mbedtls_free( output1 );
3170 mbedtls_free( output2 );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003171 psa_destroy_key( handle );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003172 mbedtls_psa_crypto_free( );
3173}
3174/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02003175
Gilles Peskine20035e32018-02-03 22:44:14 +01003176/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003177void aead_encrypt_decrypt( int key_type_arg, data_t *key_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003178 int alg_arg,
Gilles Peskine7da96b02018-08-17 18:45:42 +02003179 data_t *nonce,
3180 data_t *additional_data,
3181 data_t *input_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003182 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003183{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003184 psa_key_handle_t handle = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003185 psa_key_type_t key_type = key_type_arg;
3186 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003187 unsigned char *output_data = NULL;
3188 size_t output_size = 0;
3189 size_t output_length = 0;
3190 unsigned char *output_data2 = NULL;
3191 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003192 size_t tag_length = 16;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003193 psa_status_t expected_result = expected_result_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003194 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003195
Gilles Peskine4abf7412018-06-18 16:35:34 +02003196 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003197 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003198
Gilles Peskine8817f612018-12-18 00:18:46 +01003199 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003200
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003201 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003202 psa_key_policy_set_usage( &policy,
3203 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
3204 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003205 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003206
Gilles Peskine8817f612018-12-18 00:18:46 +01003207 PSA_ASSERT( psa_import_key( handle, key_type,
3208 key_data->x, key_data->len ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003209
Gilles Peskinefe11b722018-12-18 00:24:04 +01003210 TEST_EQUAL( psa_aead_encrypt( handle, alg,
3211 nonce->x, nonce->len,
3212 additional_data->x,
3213 additional_data->len,
3214 input_data->x, input_data->len,
3215 output_data, output_size,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003216 &output_length ),
3217 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003218
3219 if( PSA_SUCCESS == expected_result )
3220 {
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003221 ASSERT_ALLOC( output_data2, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003222
Gilles Peskinefe11b722018-12-18 00:24:04 +01003223 TEST_EQUAL( psa_aead_decrypt( handle, alg,
3224 nonce->x, nonce->len,
3225 additional_data->x,
3226 additional_data->len,
3227 output_data, output_length,
3228 output_data2, output_length,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003229 &output_length2 ),
3230 expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02003231
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003232 ASSERT_COMPARE( input_data->x, input_data->len,
3233 output_data2, output_length2 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003234 }
Gilles Peskine2d277862018-06-18 15:41:12 +02003235
Gilles Peskinea1cac842018-06-11 19:33:02 +02003236exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003237 psa_destroy_key( handle );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003238 mbedtls_free( output_data );
3239 mbedtls_free( output_data2 );
3240 mbedtls_psa_crypto_free( );
3241}
3242/* END_CASE */
3243
3244/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003245void aead_encrypt( int key_type_arg, data_t *key_data,
3246 int alg_arg,
3247 data_t *nonce,
3248 data_t *additional_data,
3249 data_t *input_data,
3250 data_t *expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003251{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003252 psa_key_handle_t handle = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003253 psa_key_type_t key_type = key_type_arg;
3254 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003255 unsigned char *output_data = NULL;
3256 size_t output_size = 0;
3257 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003258 size_t tag_length = 16;
Jaeden Amero70261c52019-01-04 11:47:20 +00003259 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003260
Gilles Peskine4abf7412018-06-18 16:35:34 +02003261 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003262 ASSERT_ALLOC( output_data, output_size );
Gilles Peskine2d277862018-06-18 15:41:12 +02003263
Gilles Peskine8817f612018-12-18 00:18:46 +01003264 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003265
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003266 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003267 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003268 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003269
Gilles Peskine8817f612018-12-18 00:18:46 +01003270 PSA_ASSERT( psa_import_key( handle, key_type,
3271 key_data->x,
3272 key_data->len ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003273
Gilles Peskine8817f612018-12-18 00:18:46 +01003274 PSA_ASSERT( psa_aead_encrypt( handle, alg,
3275 nonce->x, nonce->len,
3276 additional_data->x, additional_data->len,
3277 input_data->x, input_data->len,
3278 output_data, output_size,
3279 &output_length ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003280
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003281 ASSERT_COMPARE( expected_result->x, expected_result->len,
3282 output_data, output_length );
Gilles Peskine2d277862018-06-18 15:41:12 +02003283
Gilles Peskinea1cac842018-06-11 19:33:02 +02003284exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003285 psa_destroy_key( handle );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003286 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003287 mbedtls_psa_crypto_free( );
3288}
3289/* END_CASE */
3290
3291/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003292void aead_decrypt( int key_type_arg, data_t *key_data,
3293 int alg_arg,
3294 data_t *nonce,
3295 data_t *additional_data,
3296 data_t *input_data,
3297 data_t *expected_data,
3298 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003299{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003300 psa_key_handle_t handle = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003301 psa_key_type_t key_type = key_type_arg;
3302 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003303 unsigned char *output_data = NULL;
3304 size_t output_size = 0;
3305 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003306 size_t tag_length = 16;
Jaeden Amero70261c52019-01-04 11:47:20 +00003307 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003308 psa_status_t expected_result = expected_result_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003309
Gilles Peskine4abf7412018-06-18 16:35:34 +02003310 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003311 ASSERT_ALLOC( output_data, output_size );
Gilles Peskine2d277862018-06-18 15:41:12 +02003312
Gilles Peskine8817f612018-12-18 00:18:46 +01003313 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003314
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003315 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003316 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003317 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003318
Gilles Peskine8817f612018-12-18 00:18:46 +01003319 PSA_ASSERT( psa_import_key( handle, key_type,
3320 key_data->x,
3321 key_data->len ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003322
Gilles Peskinefe11b722018-12-18 00:24:04 +01003323 TEST_EQUAL( psa_aead_decrypt( handle, alg,
3324 nonce->x, nonce->len,
3325 additional_data->x,
3326 additional_data->len,
3327 input_data->x, input_data->len,
3328 output_data, output_size,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003329 &output_length ),
3330 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003331
Gilles Peskine2d277862018-06-18 15:41:12 +02003332 if( expected_result == PSA_SUCCESS )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003333 ASSERT_COMPARE( expected_data->x, expected_data->len,
3334 output_data, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003335
Gilles Peskinea1cac842018-06-11 19:33:02 +02003336exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003337 psa_destroy_key( handle );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003338 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003339 mbedtls_psa_crypto_free( );
3340}
3341/* END_CASE */
3342
3343/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003344void signature_size( int type_arg,
3345 int bits,
3346 int alg_arg,
3347 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003348{
3349 psa_key_type_t type = type_arg;
3350 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +02003351 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003352 TEST_EQUAL( actual_size, (size_t) expected_size_arg );
Gilles Peskinee59236f2018-01-27 23:32:46 +01003353exit:
3354 ;
3355}
3356/* END_CASE */
3357
3358/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003359void sign_deterministic( int key_type_arg, data_t *key_data,
3360 int alg_arg, data_t *input_data,
3361 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003362{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003363 psa_key_handle_t handle = 0;
Gilles Peskinee59236f2018-01-27 23:32:46 +01003364 psa_key_type_t key_type = key_type_arg;
3365 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003366 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01003367 unsigned char *signature = NULL;
3368 size_t signature_size;
3369 size_t signature_length = 0xdeadbeef;
Jaeden Amero70261c52019-01-04 11:47:20 +00003370 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003371
Gilles Peskine8817f612018-12-18 00:18:46 +01003372 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003373
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003374 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003375 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003376 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003377
Gilles Peskine8817f612018-12-18 00:18:46 +01003378 PSA_ASSERT( psa_import_key( handle, key_type,
3379 key_data->x,
3380 key_data->len ) );
3381 PSA_ASSERT( psa_get_key_information( handle,
3382 NULL,
3383 &key_bits ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003384
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003385 /* Allocate a buffer which has the size advertized by the
3386 * library. */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003387 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
3388 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01003389 TEST_ASSERT( signature_size != 0 );
Gilles Peskine69c12672018-06-28 00:07:19 +02003390 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003391 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003392
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003393 /* Perform the signature. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003394 PSA_ASSERT( psa_asymmetric_sign( handle, alg,
3395 input_data->x, input_data->len,
3396 signature, signature_size,
3397 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003398 /* Verify that the signature is what is expected. */
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003399 ASSERT_COMPARE( output_data->x, output_data->len,
3400 signature, signature_length );
Gilles Peskine20035e32018-02-03 22:44:14 +01003401
3402exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003403 psa_destroy_key( handle );
Gilles Peskine0189e752018-02-03 23:57:22 +01003404 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01003405 mbedtls_psa_crypto_free( );
3406}
3407/* END_CASE */
3408
3409/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003410void sign_fail( int key_type_arg, data_t *key_data,
3411 int alg_arg, data_t *input_data,
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003412 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01003413{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003414 psa_key_handle_t handle = 0;
Gilles Peskine20035e32018-02-03 22:44:14 +01003415 psa_key_type_t key_type = key_type_arg;
3416 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003417 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003418 psa_status_t actual_status;
3419 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01003420 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01003421 size_t signature_length = 0xdeadbeef;
Jaeden Amero70261c52019-01-04 11:47:20 +00003422 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003423
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003424 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003425
Gilles Peskine8817f612018-12-18 00:18:46 +01003426 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003427
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003428 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003429 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003430 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003431
Gilles Peskine8817f612018-12-18 00:18:46 +01003432 PSA_ASSERT( psa_import_key( handle, key_type,
3433 key_data->x,
3434 key_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003435
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003436 actual_status = psa_asymmetric_sign( handle, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003437 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01003438 signature, signature_size,
3439 &signature_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003440 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003441 /* The value of *signature_length is unspecified on error, but
3442 * whatever it is, it should be less than signature_size, so that
3443 * if the caller tries to read *signature_length bytes without
3444 * checking the error code then they don't overflow a buffer. */
3445 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003446
3447exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003448 psa_destroy_key( handle );
Gilles Peskine20035e32018-02-03 22:44:14 +01003449 mbedtls_free( signature );
3450 mbedtls_psa_crypto_free( );
3451}
3452/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03003453
3454/* BEGIN_CASE */
Gilles Peskine9911b022018-06-29 17:30:48 +02003455void sign_verify( int key_type_arg, data_t *key_data,
3456 int alg_arg, data_t *input_data )
3457{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003458 psa_key_handle_t handle = 0;
Gilles Peskine9911b022018-06-29 17:30:48 +02003459 psa_key_type_t key_type = key_type_arg;
3460 psa_algorithm_t alg = alg_arg;
3461 size_t key_bits;
3462 unsigned char *signature = NULL;
3463 size_t signature_size;
3464 size_t signature_length = 0xdeadbeef;
Jaeden Amero70261c52019-01-04 11:47:20 +00003465 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003466
Gilles Peskine8817f612018-12-18 00:18:46 +01003467 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003468
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003469 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003470 psa_key_policy_set_usage( &policy,
3471 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
3472 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003473 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003474
Gilles Peskine8817f612018-12-18 00:18:46 +01003475 PSA_ASSERT( psa_import_key( handle, key_type,
3476 key_data->x,
3477 key_data->len ) );
3478 PSA_ASSERT( psa_get_key_information( handle,
3479 NULL,
3480 &key_bits ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003481
3482 /* Allocate a buffer which has the size advertized by the
3483 * library. */
3484 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
3485 key_bits, alg );
3486 TEST_ASSERT( signature_size != 0 );
3487 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003488 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine9911b022018-06-29 17:30:48 +02003489
3490 /* Perform the signature. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003491 PSA_ASSERT( psa_asymmetric_sign( handle, alg,
3492 input_data->x, input_data->len,
3493 signature, signature_size,
3494 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003495 /* Check that the signature length looks sensible. */
3496 TEST_ASSERT( signature_length <= signature_size );
3497 TEST_ASSERT( signature_length > 0 );
3498
3499 /* Use the library to verify that the signature is correct. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003500 PSA_ASSERT( psa_asymmetric_verify(
3501 handle, alg,
3502 input_data->x, input_data->len,
3503 signature, signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003504
3505 if( input_data->len != 0 )
3506 {
3507 /* Flip a bit in the input and verify that the signature is now
3508 * detected as invalid. Flip a bit at the beginning, not at the end,
3509 * because ECDSA may ignore the last few bits of the input. */
3510 input_data->x[0] ^= 1;
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003511 TEST_EQUAL( psa_asymmetric_verify( handle, alg,
3512 input_data->x, input_data->len,
3513 signature, signature_length ),
3514 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine9911b022018-06-29 17:30:48 +02003515 }
3516
3517exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003518 psa_destroy_key( handle );
Gilles Peskine9911b022018-06-29 17:30:48 +02003519 mbedtls_free( signature );
3520 mbedtls_psa_crypto_free( );
3521}
3522/* END_CASE */
3523
3524/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003525void asymmetric_verify( int key_type_arg, data_t *key_data,
3526 int alg_arg, data_t *hash_data,
3527 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03003528{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003529 psa_key_handle_t handle = 0;
itayzafrir5c753392018-05-08 11:18:38 +03003530 psa_key_type_t key_type = key_type_arg;
3531 psa_algorithm_t alg = alg_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003532 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003533
Gilles Peskine69c12672018-06-28 00:07:19 +02003534 TEST_ASSERT( signature_data->len <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
3535
Gilles Peskine8817f612018-12-18 00:18:46 +01003536 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir5c753392018-05-08 11:18:38 +03003537
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003538 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003539 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003540 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
itayzafrir5c753392018-05-08 11:18:38 +03003541
Gilles Peskine8817f612018-12-18 00:18:46 +01003542 PSA_ASSERT( psa_import_key( handle, key_type,
3543 key_data->x,
3544 key_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03003545
Gilles Peskine8817f612018-12-18 00:18:46 +01003546 PSA_ASSERT( psa_asymmetric_verify( handle, alg,
3547 hash_data->x, hash_data->len,
3548 signature_data->x,
3549 signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03003550exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003551 psa_destroy_key( handle );
itayzafrir5c753392018-05-08 11:18:38 +03003552 mbedtls_psa_crypto_free( );
3553}
3554/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003555
3556/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003557void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
3558 int alg_arg, data_t *hash_data,
3559 data_t *signature_data,
3560 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003561{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003562 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003563 psa_key_type_t key_type = key_type_arg;
3564 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003565 psa_status_t actual_status;
3566 psa_status_t expected_status = expected_status_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003567 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003568
Gilles Peskine8817f612018-12-18 00:18:46 +01003569 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003570
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003571 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003572 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003573 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003574
Gilles Peskine8817f612018-12-18 00:18:46 +01003575 PSA_ASSERT( psa_import_key( handle, key_type,
3576 key_data->x,
3577 key_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003578
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003579 actual_status = psa_asymmetric_verify( handle, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003580 hash_data->x, hash_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02003581 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003582 signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003583
Gilles Peskinefe11b722018-12-18 00:24:04 +01003584 TEST_EQUAL( actual_status, expected_status );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003585
3586exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003587 psa_destroy_key( handle );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003588 mbedtls_psa_crypto_free( );
3589}
3590/* END_CASE */
3591
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003592/* BEGIN_CASE */
Gilles Peskine656896e2018-06-29 19:12:28 +02003593void asymmetric_encrypt( int key_type_arg,
3594 data_t *key_data,
3595 int alg_arg,
3596 data_t *input_data,
Gilles Peskine68428122018-06-30 18:42:41 +02003597 data_t *label,
Gilles Peskine656896e2018-06-29 19:12:28 +02003598 int expected_output_length_arg,
3599 int expected_status_arg )
3600{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003601 psa_key_handle_t handle = 0;
Gilles Peskine656896e2018-06-29 19:12:28 +02003602 psa_key_type_t key_type = key_type_arg;
3603 psa_algorithm_t alg = alg_arg;
3604 size_t expected_output_length = expected_output_length_arg;
3605 size_t key_bits;
3606 unsigned char *output = NULL;
3607 size_t output_size;
3608 size_t output_length = ~0;
3609 psa_status_t actual_status;
3610 psa_status_t expected_status = expected_status_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003611 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003612
Gilles Peskine8817f612018-12-18 00:18:46 +01003613 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003614
Gilles Peskine656896e2018-06-29 19:12:28 +02003615 /* Import the key */
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003616 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003617 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003618 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
3619 PSA_ASSERT( psa_import_key( handle, key_type,
3620 key_data->x,
3621 key_data->len ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003622
3623 /* Determine the maximum output length */
Gilles Peskine8817f612018-12-18 00:18:46 +01003624 PSA_ASSERT( psa_get_key_information( handle,
3625 NULL,
3626 &key_bits ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003627 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003628 ASSERT_ALLOC( output, output_size );
Gilles Peskine656896e2018-06-29 19:12:28 +02003629
3630 /* Encrypt the input */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003631 actual_status = psa_asymmetric_encrypt( handle, alg,
Gilles Peskine656896e2018-06-29 19:12:28 +02003632 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003633 label->x, label->len,
Gilles Peskine656896e2018-06-29 19:12:28 +02003634 output, output_size,
3635 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003636 TEST_EQUAL( actual_status, expected_status );
3637 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine656896e2018-06-29 19:12:28 +02003638
Gilles Peskine68428122018-06-30 18:42:41 +02003639 /* If the label is empty, the test framework puts a non-null pointer
3640 * in label->x. Test that a null pointer works as well. */
3641 if( label->len == 0 )
3642 {
3643 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003644 if( output_size != 0 )
3645 memset( output, 0, output_size );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003646 actual_status = psa_asymmetric_encrypt( handle, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02003647 input_data->x, input_data->len,
3648 NULL, label->len,
3649 output, output_size,
3650 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003651 TEST_EQUAL( actual_status, expected_status );
3652 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003653 }
3654
Gilles Peskine656896e2018-06-29 19:12:28 +02003655exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003656 psa_destroy_key( handle );
Gilles Peskine656896e2018-06-29 19:12:28 +02003657 mbedtls_free( output );
3658 mbedtls_psa_crypto_free( );
3659}
3660/* END_CASE */
3661
3662/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003663void asymmetric_encrypt_decrypt( int key_type_arg,
3664 data_t *key_data,
3665 int alg_arg,
3666 data_t *input_data,
3667 data_t *label )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003668{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003669 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003670 psa_key_type_t key_type = key_type_arg;
3671 psa_algorithm_t alg = alg_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003672 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003673 unsigned char *output = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003674 size_t output_size;
3675 size_t output_length = ~0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003676 unsigned char *output2 = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003677 size_t output2_size;
3678 size_t output2_length = ~0;
Jaeden Amero70261c52019-01-04 11:47:20 +00003679 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003680
Gilles Peskine8817f612018-12-18 00:18:46 +01003681 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003682
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003683 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003684 psa_key_policy_set_usage( &policy,
3685 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003686 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003687 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003688
Gilles Peskine8817f612018-12-18 00:18:46 +01003689 PSA_ASSERT( psa_import_key( handle, key_type,
3690 key_data->x,
3691 key_data->len ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003692
3693 /* Determine the maximum ciphertext length */
Gilles Peskine8817f612018-12-18 00:18:46 +01003694 PSA_ASSERT( psa_get_key_information( handle,
3695 NULL,
3696 &key_bits ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003697 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003698 ASSERT_ALLOC( output, output_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003699 output2_size = input_data->len;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003700 ASSERT_ALLOC( output2, output2_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003701
Gilles Peskineeebd7382018-06-08 18:11:54 +02003702 /* We test encryption by checking that encrypt-then-decrypt gives back
3703 * the original plaintext because of the non-optional random
3704 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003705 PSA_ASSERT( psa_asymmetric_encrypt( handle, alg,
3706 input_data->x, input_data->len,
3707 label->x, label->len,
3708 output, output_size,
3709 &output_length ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003710 /* We don't know what ciphertext length to expect, but check that
3711 * it looks sensible. */
3712 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003713
Gilles Peskine8817f612018-12-18 00:18:46 +01003714 PSA_ASSERT( psa_asymmetric_decrypt( handle, alg,
3715 output, output_length,
3716 label->x, label->len,
3717 output2, output2_size,
3718 &output2_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003719 ASSERT_COMPARE( input_data->x, input_data->len,
3720 output2, output2_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003721
3722exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003723 psa_destroy_key( handle );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003724 mbedtls_free( output );
3725 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003726 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003727}
3728/* END_CASE */
3729
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003730/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003731void asymmetric_decrypt( int key_type_arg,
3732 data_t *key_data,
3733 int alg_arg,
3734 data_t *input_data,
3735 data_t *label,
Gilles Peskine66763a02018-06-29 21:54:10 +02003736 data_t *expected_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003737{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003738 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003739 psa_key_type_t key_type = key_type_arg;
3740 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003741 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03003742 size_t output_size = 0;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003743 size_t output_length = ~0;
Jaeden Amero70261c52019-01-04 11:47:20 +00003744 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003745
Jaeden Amero412654a2019-02-06 12:57:46 +00003746 output_size = expected_data->len;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003747 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003748
Gilles Peskine8817f612018-12-18 00:18:46 +01003749 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003750
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003751 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003752 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003753 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003754
Gilles Peskine8817f612018-12-18 00:18:46 +01003755 PSA_ASSERT( psa_import_key( handle, key_type,
3756 key_data->x,
3757 key_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003758
Gilles Peskine8817f612018-12-18 00:18:46 +01003759 PSA_ASSERT( psa_asymmetric_decrypt( handle, alg,
3760 input_data->x, input_data->len,
3761 label->x, label->len,
3762 output,
3763 output_size,
3764 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003765 ASSERT_COMPARE( expected_data->x, expected_data->len,
3766 output, output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003767
Gilles Peskine68428122018-06-30 18:42:41 +02003768 /* If the label is empty, the test framework puts a non-null pointer
3769 * in label->x. Test that a null pointer works as well. */
3770 if( label->len == 0 )
3771 {
3772 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003773 if( output_size != 0 )
3774 memset( output, 0, output_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01003775 PSA_ASSERT( psa_asymmetric_decrypt( handle, alg,
3776 input_data->x, input_data->len,
3777 NULL, label->len,
3778 output,
3779 output_size,
3780 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003781 ASSERT_COMPARE( expected_data->x, expected_data->len,
3782 output, output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003783 }
3784
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003785exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003786 psa_destroy_key( handle );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003787 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003788 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003789}
3790/* END_CASE */
3791
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003792/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003793void asymmetric_decrypt_fail( int key_type_arg,
3794 data_t *key_data,
3795 int alg_arg,
3796 data_t *input_data,
3797 data_t *label,
Jaeden Amerof8daab72019-02-06 12:57:46 +00003798 int output_size_arg,
Gilles Peskine2d277862018-06-18 15:41:12 +02003799 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003800{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003801 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003802 psa_key_type_t key_type = key_type_arg;
3803 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003804 unsigned char *output = NULL;
Jaeden Amerof8daab72019-02-06 12:57:46 +00003805 size_t output_size = output_size_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003806 size_t output_length = ~0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003807 psa_status_t actual_status;
3808 psa_status_t expected_status = expected_status_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003809 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003810
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003811 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003812
Gilles Peskine8817f612018-12-18 00:18:46 +01003813 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003814
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003815 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003816 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003817 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003818
Gilles Peskine8817f612018-12-18 00:18:46 +01003819 PSA_ASSERT( psa_import_key( handle, key_type,
3820 key_data->x,
3821 key_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003822
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003823 actual_status = psa_asymmetric_decrypt( handle, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003824 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003825 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003826 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02003827 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003828 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003829 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003830
Gilles Peskine68428122018-06-30 18:42:41 +02003831 /* If the label is empty, the test framework puts a non-null pointer
3832 * in label->x. Test that a null pointer works as well. */
3833 if( label->len == 0 )
3834 {
3835 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003836 if( output_size != 0 )
3837 memset( output, 0, output_size );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003838 actual_status = psa_asymmetric_decrypt( handle, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02003839 input_data->x, input_data->len,
3840 NULL, label->len,
3841 output, output_size,
3842 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003843 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003844 TEST_ASSERT( output_length <= output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02003845 }
3846
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003847exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003848 psa_destroy_key( handle );
Gilles Peskine2d277862018-06-18 15:41:12 +02003849 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003850 mbedtls_psa_crypto_free( );
3851}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003852/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02003853
3854/* BEGIN_CASE */
Jaeden Amerod94d6712019-01-04 14:11:48 +00003855void crypto_generator_init( )
3856{
3857 /* Test each valid way of initializing the object, except for `= {0}`, as
3858 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
3859 * though it's OK by the C standard. We could test for this, but we'd need
3860 * to supress the Clang warning for the test. */
Jaeden Amero5229bbb2019-02-07 16:33:37 +00003861 size_t capacity;
Jaeden Amerod94d6712019-01-04 14:11:48 +00003862 psa_crypto_generator_t func = psa_crypto_generator_init( );
3863 psa_crypto_generator_t init = PSA_CRYPTO_GENERATOR_INIT;
3864 psa_crypto_generator_t zero;
3865
3866 memset( &zero, 0, sizeof( zero ) );
3867
Jaeden Amero5229bbb2019-02-07 16:33:37 +00003868 /* A default generator should have no capacity. */
3869 PSA_ASSERT( psa_get_generator_capacity( &func, &capacity ) );
3870 TEST_EQUAL( capacity, 0 );
3871 PSA_ASSERT( psa_get_generator_capacity( &init, &capacity ) );
3872 TEST_EQUAL( capacity, 0 );
3873 PSA_ASSERT( psa_get_generator_capacity( &zero, &capacity ) );
3874 TEST_EQUAL( capacity, 0 );
3875
3876 /* A default generator should be abortable without error. */
3877 PSA_ASSERT( psa_generator_abort(&func) );
3878 PSA_ASSERT( psa_generator_abort(&init) );
3879 PSA_ASSERT( psa_generator_abort(&zero) );
Jaeden Amerod94d6712019-01-04 14:11:48 +00003880}
3881/* END_CASE */
3882
3883/* BEGIN_CASE */
Gilles Peskineea0fb492018-07-12 17:17:20 +02003884void derive_setup( int key_type_arg,
3885 data_t *key_data,
3886 int alg_arg,
3887 data_t *salt,
3888 data_t *label,
3889 int requested_capacity_arg,
3890 int expected_status_arg )
3891{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003892 psa_key_handle_t handle = 0;
Gilles Peskineea0fb492018-07-12 17:17:20 +02003893 size_t key_type = key_type_arg;
3894 psa_algorithm_t alg = alg_arg;
3895 size_t requested_capacity = requested_capacity_arg;
3896 psa_status_t expected_status = expected_status_arg;
3897 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00003898 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02003899
Gilles Peskine8817f612018-12-18 00:18:46 +01003900 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003901
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003902 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003903 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003904 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003905
Gilles Peskine8817f612018-12-18 00:18:46 +01003906 PSA_ASSERT( psa_import_key( handle, key_type,
3907 key_data->x,
3908 key_data->len ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003909
Gilles Peskinefe11b722018-12-18 00:24:04 +01003910 TEST_EQUAL( psa_key_derivation( &generator, handle, alg,
3911 salt->x, salt->len,
3912 label->x, label->len,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003913 requested_capacity ),
3914 expected_status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003915
3916exit:
3917 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003918 psa_destroy_key( handle );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003919 mbedtls_psa_crypto_free( );
3920}
3921/* END_CASE */
3922
3923/* BEGIN_CASE */
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02003924void test_derive_invalid_generator_state( )
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03003925{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003926 psa_key_handle_t handle = 0;
Nir Sonnenschein4eda37b2018-10-31 12:15:58 +02003927 size_t key_type = PSA_KEY_TYPE_DERIVE;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003928 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003929 psa_algorithm_t alg = PSA_ALG_HKDF( PSA_ALG_SHA_256 );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003930 uint8_t buffer[42];
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003931 size_t capacity = sizeof( buffer );
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02003932 const uint8_t key_data[22] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
3933 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
3934 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
Jaeden Amero70261c52019-01-04 11:47:20 +00003935 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03003936
Gilles Peskine8817f612018-12-18 00:18:46 +01003937 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003938
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003939 PSA_ASSERT( psa_allocate_key( &handle ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003940 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003941 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003942
Gilles Peskine8817f612018-12-18 00:18:46 +01003943 PSA_ASSERT( psa_import_key( handle, key_type,
3944 key_data,
3945 sizeof( key_data ) ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003946
3947 /* valid key derivation */
Gilles Peskine8817f612018-12-18 00:18:46 +01003948 PSA_ASSERT( psa_key_derivation( &generator, handle, alg,
3949 NULL, 0,
3950 NULL, 0,
3951 capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003952
3953 /* state of generator shouldn't allow additional generation */
Gilles Peskinefe11b722018-12-18 00:24:04 +01003954 TEST_EQUAL( psa_key_derivation( &generator, handle, alg,
3955 NULL, 0,
3956 NULL, 0,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003957 capacity ),
3958 PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003959
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003960 PSA_ASSERT( psa_generator_read( &generator, buffer, capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003961
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003962 TEST_EQUAL( psa_generator_read( &generator, buffer, capacity ),
3963 PSA_ERROR_INSUFFICIENT_CAPACITY );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003964
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003965exit:
3966 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003967 psa_destroy_key( handle );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003968 mbedtls_psa_crypto_free( );
3969}
3970/* END_CASE */
3971
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003972/* BEGIN_CASE */
3973void test_derive_invalid_generator_tests( )
3974{
3975 uint8_t output_buffer[16];
3976 size_t buffer_size = 16;
3977 size_t capacity = 0;
3978 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3979
Nir Sonnenschein50789302018-10-31 12:16:38 +02003980 TEST_ASSERT( psa_generator_read( &generator, output_buffer, buffer_size )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003981 == PSA_ERROR_INSUFFICIENT_CAPACITY ); // should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003982
3983 TEST_ASSERT( psa_get_generator_capacity( &generator, &capacity )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003984 == PSA_SUCCESS ); // should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003985
Gilles Peskine8817f612018-12-18 00:18:46 +01003986 PSA_ASSERT( psa_generator_abort( &generator ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003987
Nir Sonnenschein50789302018-10-31 12:16:38 +02003988 TEST_ASSERT( psa_generator_read( &generator, output_buffer, buffer_size )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003989 == PSA_ERROR_INSUFFICIENT_CAPACITY ); // should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003990
Nir Sonnenschein50789302018-10-31 12:16:38 +02003991 TEST_ASSERT( psa_get_generator_capacity( &generator, &capacity )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003992 == PSA_SUCCESS );// should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003993
3994exit:
3995 psa_generator_abort( &generator );
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03003996}
3997/* END_CASE */
3998
3999/* BEGIN_CASE */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004000void derive_output( int alg_arg,
4001 data_t *key_data,
4002 data_t *salt,
4003 data_t *label,
4004 int requested_capacity_arg,
4005 data_t *expected_output1,
4006 data_t *expected_output2 )
4007{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004008 psa_key_handle_t handle = 0;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004009 psa_algorithm_t alg = alg_arg;
4010 size_t requested_capacity = requested_capacity_arg;
4011 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
4012 uint8_t *expected_outputs[2] =
4013 {expected_output1->x, expected_output2->x};
4014 size_t output_sizes[2] =
4015 {expected_output1->len, expected_output2->len};
4016 size_t output_buffer_size = 0;
4017 uint8_t *output_buffer = NULL;
4018 size_t expected_capacity;
4019 size_t current_capacity;
Jaeden Amero70261c52019-01-04 11:47:20 +00004020 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004021 psa_status_t status;
4022 unsigned i;
4023
4024 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4025 {
4026 if( output_sizes[i] > output_buffer_size )
4027 output_buffer_size = output_sizes[i];
4028 if( output_sizes[i] == 0 )
4029 expected_outputs[i] = NULL;
4030 }
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004031 ASSERT_ALLOC( output_buffer, output_buffer_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01004032 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004033
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004034 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004035 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004036 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004037
Gilles Peskine8817f612018-12-18 00:18:46 +01004038 PSA_ASSERT( psa_import_key( handle, PSA_KEY_TYPE_DERIVE,
4039 key_data->x,
4040 key_data->len ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004041
4042 /* Extraction phase. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004043 PSA_ASSERT( psa_key_derivation( &generator, handle, alg,
4044 salt->x, salt->len,
4045 label->x, label->len,
4046 requested_capacity ) );
4047 PSA_ASSERT( psa_get_generator_capacity( &generator,
4048 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004049 TEST_EQUAL( current_capacity, requested_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004050 expected_capacity = requested_capacity;
4051
4052 /* Expansion phase. */
4053 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4054 {
4055 /* Read some bytes. */
4056 status = psa_generator_read( &generator,
4057 output_buffer, output_sizes[i] );
4058 if( expected_capacity == 0 && output_sizes[i] == 0 )
4059 {
4060 /* Reading 0 bytes when 0 bytes are available can go either way. */
4061 TEST_ASSERT( status == PSA_SUCCESS ||
4062 status == PSA_ERROR_INSUFFICIENT_CAPACITY );
4063 continue;
4064 }
4065 else if( expected_capacity == 0 ||
4066 output_sizes[i] > expected_capacity )
4067 {
4068 /* Capacity exceeded. */
Gilles Peskinefe11b722018-12-18 00:24:04 +01004069 TEST_EQUAL( status, PSA_ERROR_INSUFFICIENT_CAPACITY );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004070 expected_capacity = 0;
4071 continue;
4072 }
4073 /* Success. Check the read data. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004074 PSA_ASSERT( status );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004075 if( output_sizes[i] != 0 )
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004076 ASSERT_COMPARE( output_buffer, output_sizes[i],
4077 expected_outputs[i], output_sizes[i] );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004078 /* Check the generator status. */
4079 expected_capacity -= output_sizes[i];
Gilles Peskine8817f612018-12-18 00:18:46 +01004080 PSA_ASSERT( psa_get_generator_capacity( &generator,
4081 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004082 TEST_EQUAL( expected_capacity, current_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004083 }
Gilles Peskine8817f612018-12-18 00:18:46 +01004084 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004085
4086exit:
4087 mbedtls_free( output_buffer );
4088 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004089 psa_destroy_key( handle );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004090 mbedtls_psa_crypto_free( );
4091}
4092/* END_CASE */
4093
4094/* BEGIN_CASE */
Gilles Peskined54931c2018-07-17 21:06:59 +02004095void derive_full( int alg_arg,
4096 data_t *key_data,
4097 data_t *salt,
4098 data_t *label,
4099 int requested_capacity_arg )
4100{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004101 psa_key_handle_t handle = 0;
Gilles Peskined54931c2018-07-17 21:06:59 +02004102 psa_algorithm_t alg = alg_arg;
4103 size_t requested_capacity = requested_capacity_arg;
4104 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
4105 unsigned char output_buffer[16];
4106 size_t expected_capacity = requested_capacity;
4107 size_t current_capacity;
Jaeden Amero70261c52019-01-04 11:47:20 +00004108 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004109
Gilles Peskine8817f612018-12-18 00:18:46 +01004110 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004111
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004112 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004113 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004114 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004115
Gilles Peskine8817f612018-12-18 00:18:46 +01004116 PSA_ASSERT( psa_import_key( handle, PSA_KEY_TYPE_DERIVE,
4117 key_data->x,
4118 key_data->len ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004119
4120 /* Extraction phase. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004121 PSA_ASSERT( psa_key_derivation( &generator, handle, alg,
4122 salt->x, salt->len,
4123 label->x, label->len,
4124 requested_capacity ) );
4125 PSA_ASSERT( psa_get_generator_capacity( &generator,
4126 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004127 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004128
4129 /* Expansion phase. */
4130 while( current_capacity > 0 )
4131 {
4132 size_t read_size = sizeof( output_buffer );
4133 if( read_size > current_capacity )
4134 read_size = current_capacity;
Gilles Peskine8817f612018-12-18 00:18:46 +01004135 PSA_ASSERT( psa_generator_read( &generator,
4136 output_buffer,
4137 read_size ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004138 expected_capacity -= read_size;
Gilles Peskine8817f612018-12-18 00:18:46 +01004139 PSA_ASSERT( psa_get_generator_capacity( &generator,
4140 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004141 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004142 }
4143
4144 /* Check that the generator refuses to go over capacity. */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004145 TEST_EQUAL( psa_generator_read( &generator, output_buffer, 1 ),
4146 PSA_ERROR_INSUFFICIENT_CAPACITY );
Gilles Peskined54931c2018-07-17 21:06:59 +02004147
Gilles Peskine8817f612018-12-18 00:18:46 +01004148 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004149
4150exit:
4151 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004152 psa_destroy_key( handle );
Gilles Peskined54931c2018-07-17 21:06:59 +02004153 mbedtls_psa_crypto_free( );
4154}
4155/* END_CASE */
4156
4157/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02004158void derive_key_exercise( int alg_arg,
4159 data_t *key_data,
4160 data_t *salt,
4161 data_t *label,
4162 int derived_type_arg,
4163 int derived_bits_arg,
4164 int derived_usage_arg,
4165 int derived_alg_arg )
4166{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004167 psa_key_handle_t base_handle = 0;
4168 psa_key_handle_t derived_handle = 0;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004169 psa_algorithm_t alg = alg_arg;
4170 psa_key_type_t derived_type = derived_type_arg;
4171 size_t derived_bits = derived_bits_arg;
4172 psa_key_usage_t derived_usage = derived_usage_arg;
4173 psa_algorithm_t derived_alg = derived_alg_arg;
4174 size_t capacity = PSA_BITS_TO_BYTES( derived_bits );
4175 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004176 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004177 psa_key_type_t got_type;
4178 size_t got_bits;
4179
Gilles Peskine8817f612018-12-18 00:18:46 +01004180 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004181
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004182 PSA_ASSERT( psa_allocate_key( &base_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004183 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004184 PSA_ASSERT( psa_set_key_policy( base_handle, &policy ) );
4185 PSA_ASSERT( psa_import_key( base_handle, PSA_KEY_TYPE_DERIVE,
4186 key_data->x,
4187 key_data->len ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004188
4189 /* Derive a key. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004190 PSA_ASSERT( psa_key_derivation( &generator, base_handle, alg,
4191 salt->x, salt->len,
4192 label->x, label->len,
4193 capacity ) );
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004194 PSA_ASSERT( psa_allocate_key( &derived_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004195 psa_key_policy_set_usage( &policy, derived_usage, derived_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004196 PSA_ASSERT( psa_set_key_policy( derived_handle, &policy ) );
4197 PSA_ASSERT( psa_generator_import_key( derived_handle,
4198 derived_type,
4199 derived_bits,
4200 &generator ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004201
4202 /* Test the key information */
Gilles Peskine8817f612018-12-18 00:18:46 +01004203 PSA_ASSERT( psa_get_key_information( derived_handle,
4204 &got_type,
4205 &got_bits ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004206 TEST_EQUAL( got_type, derived_type );
4207 TEST_EQUAL( got_bits, derived_bits );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004208
4209 /* Exercise the derived key. */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004210 if( ! exercise_key( derived_handle, derived_usage, derived_alg ) )
Gilles Peskine0386fba2018-07-12 17:29:22 +02004211 goto exit;
4212
4213exit:
4214 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004215 psa_destroy_key( base_handle );
4216 psa_destroy_key( derived_handle );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004217 mbedtls_psa_crypto_free( );
4218}
4219/* END_CASE */
4220
4221/* BEGIN_CASE */
4222void derive_key_export( int alg_arg,
4223 data_t *key_data,
4224 data_t *salt,
4225 data_t *label,
4226 int bytes1_arg,
4227 int bytes2_arg )
4228{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004229 psa_key_handle_t base_handle = 0;
4230 psa_key_handle_t derived_handle = 0;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004231 psa_algorithm_t alg = alg_arg;
4232 size_t bytes1 = bytes1_arg;
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004233 size_t derived_bits = PSA_BYTES_TO_BITS( bytes1 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004234 size_t bytes2 = bytes2_arg;
4235 size_t capacity = bytes1 + bytes2;
4236 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004237 uint8_t *output_buffer = NULL;
4238 uint8_t *export_buffer = NULL;
Jaeden Amero70261c52019-01-04 11:47:20 +00004239 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004240 size_t length;
4241
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004242 ASSERT_ALLOC( output_buffer, capacity );
4243 ASSERT_ALLOC( export_buffer, capacity );
Gilles Peskine8817f612018-12-18 00:18:46 +01004244 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004245
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004246 PSA_ASSERT( psa_allocate_key( &base_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004247 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004248 PSA_ASSERT( psa_set_key_policy( base_handle, &policy ) );
4249 PSA_ASSERT( psa_import_key( base_handle, PSA_KEY_TYPE_DERIVE,
4250 key_data->x,
4251 key_data->len ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004252
4253 /* Derive some material and output it. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004254 PSA_ASSERT( psa_key_derivation( &generator, base_handle, alg,
4255 salt->x, salt->len,
4256 label->x, label->len,
4257 capacity ) );
4258 PSA_ASSERT( psa_generator_read( &generator,
4259 output_buffer,
4260 capacity ) );
4261 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004262
4263 /* Derive the same output again, but this time store it in key objects. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004264 PSA_ASSERT( psa_key_derivation( &generator, base_handle, alg,
4265 salt->x, salt->len,
4266 label->x, label->len,
4267 capacity ) );
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004268 PSA_ASSERT( psa_allocate_key( &derived_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004269 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, 0 );
Gilles Peskine8817f612018-12-18 00:18:46 +01004270 PSA_ASSERT( psa_set_key_policy( derived_handle, &policy ) );
4271 PSA_ASSERT( psa_generator_import_key( derived_handle,
4272 PSA_KEY_TYPE_RAW_DATA,
4273 derived_bits,
4274 &generator ) );
4275 PSA_ASSERT( psa_export_key( derived_handle,
4276 export_buffer, bytes1,
4277 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004278 TEST_EQUAL( length, bytes1 );
Gilles Peskine8817f612018-12-18 00:18:46 +01004279 PSA_ASSERT( psa_destroy_key( derived_handle ) );
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004280 PSA_ASSERT( psa_allocate_key( &derived_handle ) );
Gilles Peskine8817f612018-12-18 00:18:46 +01004281 PSA_ASSERT( psa_set_key_policy( derived_handle, &policy ) );
4282 PSA_ASSERT( psa_generator_import_key( derived_handle,
4283 PSA_KEY_TYPE_RAW_DATA,
4284 PSA_BYTES_TO_BITS( bytes2 ),
4285 &generator ) );
4286 PSA_ASSERT( psa_export_key( derived_handle,
4287 export_buffer + bytes1, bytes2,
4288 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004289 TEST_EQUAL( length, bytes2 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004290
4291 /* Compare the outputs from the two runs. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004292 ASSERT_COMPARE( output_buffer, bytes1 + bytes2,
4293 export_buffer, capacity );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004294
4295exit:
4296 mbedtls_free( output_buffer );
4297 mbedtls_free( export_buffer );
4298 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004299 psa_destroy_key( base_handle );
4300 psa_destroy_key( derived_handle );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004301 mbedtls_psa_crypto_free( );
4302}
4303/* END_CASE */
4304
4305/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02004306void key_agreement_setup( int alg_arg,
4307 int our_key_type_arg, data_t *our_key_data,
4308 data_t *peer_key_data,
4309 int expected_status_arg )
4310{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004311 psa_key_handle_t our_key = 0;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004312 psa_algorithm_t alg = alg_arg;
4313 psa_key_type_t our_key_type = our_key_type_arg;
4314 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004315 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004316
Gilles Peskine8817f612018-12-18 00:18:46 +01004317 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004318
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004319 PSA_ASSERT( psa_allocate_key( &our_key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004320 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004321 PSA_ASSERT( psa_set_key_policy( our_key, &policy ) );
4322 PSA_ASSERT( psa_import_key( our_key, our_key_type,
4323 our_key_data->x,
4324 our_key_data->len ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004325
Gilles Peskinefe11b722018-12-18 00:24:04 +01004326 TEST_EQUAL( psa_key_agreement( &generator,
4327 our_key,
4328 peer_key_data->x, peer_key_data->len,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004329 alg ),
4330 expected_status_arg );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004331
4332exit:
4333 psa_generator_abort( &generator );
4334 psa_destroy_key( our_key );
4335 mbedtls_psa_crypto_free( );
4336}
4337/* END_CASE */
4338
4339/* BEGIN_CASE */
Gilles Peskine59685592018-09-18 12:11:34 +02004340void key_agreement_capacity( int alg_arg,
4341 int our_key_type_arg, data_t *our_key_data,
4342 data_t *peer_key_data,
4343 int expected_capacity_arg )
4344{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004345 psa_key_handle_t our_key = 0;
Gilles Peskine59685592018-09-18 12:11:34 +02004346 psa_algorithm_t alg = alg_arg;
4347 psa_key_type_t our_key_type = our_key_type_arg;
4348 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004349 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004350 size_t actual_capacity;
Gilles Peskinebf491972018-10-25 22:36:12 +02004351 unsigned char output[16];
Gilles Peskine59685592018-09-18 12:11:34 +02004352
Gilles Peskine8817f612018-12-18 00:18:46 +01004353 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004354
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004355 PSA_ASSERT( psa_allocate_key( &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004356 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004357 PSA_ASSERT( psa_set_key_policy( our_key, &policy ) );
4358 PSA_ASSERT( psa_import_key( our_key, our_key_type,
4359 our_key_data->x,
4360 our_key_data->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004361
Gilles Peskine8817f612018-12-18 00:18:46 +01004362 PSA_ASSERT( psa_key_agreement( &generator,
4363 our_key,
4364 peer_key_data->x, peer_key_data->len,
4365 alg ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004366
Gilles Peskinebf491972018-10-25 22:36:12 +02004367 /* Test the advertized capacity. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004368 PSA_ASSERT( psa_get_generator_capacity(
4369 &generator, &actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004370 TEST_EQUAL( actual_capacity, (size_t) expected_capacity_arg );
Gilles Peskine59685592018-09-18 12:11:34 +02004371
Gilles Peskinebf491972018-10-25 22:36:12 +02004372 /* Test the actual capacity by reading the output. */
4373 while( actual_capacity > sizeof( output ) )
4374 {
Gilles Peskine8817f612018-12-18 00:18:46 +01004375 PSA_ASSERT( psa_generator_read( &generator,
4376 output, sizeof( output ) ) );
Gilles Peskinebf491972018-10-25 22:36:12 +02004377 actual_capacity -= sizeof( output );
4378 }
Gilles Peskine8817f612018-12-18 00:18:46 +01004379 PSA_ASSERT( psa_generator_read( &generator,
4380 output, actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004381 TEST_EQUAL( psa_generator_read( &generator, output, 1 ),
4382 PSA_ERROR_INSUFFICIENT_CAPACITY );
Gilles Peskinebf491972018-10-25 22:36:12 +02004383
Gilles Peskine59685592018-09-18 12:11:34 +02004384exit:
4385 psa_generator_abort( &generator );
4386 psa_destroy_key( our_key );
4387 mbedtls_psa_crypto_free( );
4388}
4389/* END_CASE */
4390
4391/* BEGIN_CASE */
4392void key_agreement_output( int alg_arg,
4393 int our_key_type_arg, data_t *our_key_data,
4394 data_t *peer_key_data,
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004395 data_t *expected_output1, data_t *expected_output2 )
Gilles Peskine59685592018-09-18 12:11:34 +02004396{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004397 psa_key_handle_t our_key = 0;
Gilles Peskine59685592018-09-18 12:11:34 +02004398 psa_algorithm_t alg = alg_arg;
4399 psa_key_type_t our_key_type = our_key_type_arg;
4400 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004401 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004402 uint8_t *actual_output = NULL;
Gilles Peskine59685592018-09-18 12:11:34 +02004403
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004404 ASSERT_ALLOC( actual_output, MAX( expected_output1->len,
4405 expected_output2->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004406
Gilles Peskine8817f612018-12-18 00:18:46 +01004407 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004408
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004409 PSA_ASSERT( psa_allocate_key( &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004410 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004411 PSA_ASSERT( psa_set_key_policy( our_key, &policy ) );
4412 PSA_ASSERT( psa_import_key( our_key, our_key_type,
4413 our_key_data->x,
4414 our_key_data->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004415
Gilles Peskine8817f612018-12-18 00:18:46 +01004416 PSA_ASSERT( psa_key_agreement( &generator,
4417 our_key,
4418 peer_key_data->x, peer_key_data->len,
4419 alg ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004420
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004421 PSA_ASSERT( psa_generator_read( &generator,
4422 actual_output,
4423 expected_output1->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004424 ASSERT_COMPARE( actual_output, expected_output1->len,
4425 expected_output1->x, expected_output1->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004426 if( expected_output2->len != 0 )
4427 {
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004428 PSA_ASSERT( psa_generator_read( &generator,
4429 actual_output,
4430 expected_output2->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004431 ASSERT_COMPARE( actual_output, expected_output2->len,
4432 expected_output2->x, expected_output2->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004433 }
Gilles Peskine59685592018-09-18 12:11:34 +02004434
4435exit:
4436 psa_generator_abort( &generator );
4437 psa_destroy_key( our_key );
4438 mbedtls_psa_crypto_free( );
4439 mbedtls_free( actual_output );
4440}
4441/* END_CASE */
4442
4443/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02004444void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02004445{
Gilles Peskinea50d7392018-06-21 10:22:13 +02004446 size_t bytes = bytes_arg;
4447 const unsigned char trail[] = "don't overwrite me";
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004448 unsigned char *output = NULL;
4449 unsigned char *changed = NULL;
Gilles Peskinea50d7392018-06-21 10:22:13 +02004450 size_t i;
4451 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02004452
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004453 ASSERT_ALLOC( output, bytes + sizeof( trail ) );
4454 ASSERT_ALLOC( changed, bytes );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004455 memcpy( output + bytes, trail, sizeof( trail ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02004456
Gilles Peskine8817f612018-12-18 00:18:46 +01004457 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02004458
Gilles Peskinea50d7392018-06-21 10:22:13 +02004459 /* Run several times, to ensure that every output byte will be
4460 * nonzero at least once with overwhelming probability
4461 * (2^(-8*number_of_runs)). */
4462 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02004463 {
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004464 if( bytes != 0 )
4465 memset( output, 0, bytes );
Gilles Peskine8817f612018-12-18 00:18:46 +01004466 PSA_ASSERT( psa_generate_random( output, bytes ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004467
4468 /* Check that no more than bytes have been overwritten */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004469 ASSERT_COMPARE( output + bytes, sizeof( trail ),
4470 trail, sizeof( trail ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004471
4472 for( i = 0; i < bytes; i++ )
4473 {
4474 if( output[i] != 0 )
4475 ++changed[i];
4476 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004477 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02004478
4479 /* Check that every byte was changed to nonzero at least once. This
4480 * validates that psa_generate_random is overwriting every byte of
4481 * the output buffer. */
4482 for( i = 0; i < bytes; i++ )
4483 {
4484 TEST_ASSERT( changed[i] != 0 );
4485 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004486
4487exit:
4488 mbedtls_psa_crypto_free( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004489 mbedtls_free( output );
4490 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02004491}
4492/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02004493
4494/* BEGIN_CASE */
4495void generate_key( int type_arg,
4496 int bits_arg,
4497 int usage_arg,
4498 int alg_arg,
4499 int expected_status_arg )
4500{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004501 psa_key_handle_t handle = 0;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004502 psa_key_type_t type = type_arg;
4503 psa_key_usage_t usage = usage_arg;
4504 size_t bits = bits_arg;
4505 psa_algorithm_t alg = alg_arg;
4506 psa_status_t expected_status = expected_status_arg;
4507 psa_key_type_t got_type;
4508 size_t got_bits;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004509 psa_status_t expected_info_status =
4510 expected_status == PSA_SUCCESS ? PSA_SUCCESS : PSA_ERROR_EMPTY_SLOT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004511 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004512
Gilles Peskine8817f612018-12-18 00:18:46 +01004513 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004514
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004515 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004516 psa_key_policy_set_usage( &policy, usage, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004517 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004518
4519 /* Generate a key */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004520 TEST_EQUAL( psa_generate_key( handle, type, bits, NULL, 0 ),
4521 expected_status );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004522
4523 /* Test the key information */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004524 TEST_EQUAL( psa_get_key_information( handle, &got_type, &got_bits ),
4525 expected_info_status );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004526 if( expected_info_status != PSA_SUCCESS )
4527 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +01004528 TEST_EQUAL( got_type, type );
4529 TEST_EQUAL( got_bits, bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004530
Gilles Peskine818ca122018-06-20 18:16:48 +02004531 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004532 if( ! exercise_key( handle, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +02004533 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004534
4535exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004536 psa_destroy_key( handle );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004537 mbedtls_psa_crypto_free( );
4538}
4539/* END_CASE */
itayzafrir0adf0fc2018-09-06 16:24:41 +03004540
Darryl Greend49a4992018-06-18 17:27:26 +01004541/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C */
4542void persistent_key_load_key_from_storage( data_t *data, int type_arg,
4543 int bits, int usage_arg,
Darryl Green0c6575a2018-11-07 16:05:30 +00004544 int alg_arg, int generation_method,
4545 int export_status )
Darryl Greend49a4992018-06-18 17:27:26 +01004546{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004547 psa_key_handle_t handle = 0;
4548 psa_key_handle_t base_key;
Darryl Greend49a4992018-06-18 17:27:26 +01004549 psa_key_type_t type = (psa_key_type_t) type_arg;
4550 psa_key_type_t type_get;
4551 size_t bits_get;
Jaeden Amero70261c52019-01-04 11:47:20 +00004552 psa_key_policy_t policy_set = PSA_KEY_POLICY_INIT;
4553 psa_key_policy_t policy_get = PSA_KEY_POLICY_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01004554 psa_key_usage_t policy_usage = (psa_key_usage_t) usage_arg;
4555 psa_algorithm_t policy_alg = (psa_algorithm_t) alg_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00004556 psa_key_policy_t base_policy_set = PSA_KEY_POLICY_INIT;
Darryl Green0c6575a2018-11-07 16:05:30 +00004557 psa_algorithm_t base_policy_alg = PSA_ALG_HKDF(PSA_ALG_SHA_256);
4558 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01004559 unsigned char *first_export = NULL;
4560 unsigned char *second_export = NULL;
4561 size_t export_size = PSA_KEY_EXPORT_MAX_SIZE( type, bits );
4562 size_t first_exported_length;
4563 size_t second_exported_length;
4564
4565 ASSERT_ALLOC( first_export, export_size );
4566 ASSERT_ALLOC( second_export, export_size );
4567
Gilles Peskine8817f612018-12-18 00:18:46 +01004568 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01004569
Gilles Peskine8817f612018-12-18 00:18:46 +01004570 PSA_ASSERT( psa_create_key( PSA_KEY_LIFETIME_PERSISTENT, 1,
Gilles Peskine8817f612018-12-18 00:18:46 +01004571 &handle ) );
Darryl Greend49a4992018-06-18 17:27:26 +01004572 psa_key_policy_set_usage( &policy_set, policy_usage,
4573 policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004574 PSA_ASSERT( psa_set_key_policy( handle, &policy_set ) );
Darryl Greend49a4992018-06-18 17:27:26 +01004575
Darryl Green0c6575a2018-11-07 16:05:30 +00004576 switch( generation_method )
4577 {
4578 case IMPORT_KEY:
4579 /* Import the key */
Gilles Peskine8817f612018-12-18 00:18:46 +01004580 PSA_ASSERT( psa_import_key( handle, type,
4581 data->x, data->len ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004582 break;
Darryl Greend49a4992018-06-18 17:27:26 +01004583
Darryl Green0c6575a2018-11-07 16:05:30 +00004584 case GENERATE_KEY:
4585 /* Generate a key */
Gilles Peskine8817f612018-12-18 00:18:46 +01004586 PSA_ASSERT( psa_generate_key( handle, type, bits,
4587 NULL, 0 ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004588 break;
4589
4590 case DERIVE_KEY:
4591 /* Create base key */
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004592 PSA_ASSERT( psa_allocate_key( &base_key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004593 psa_key_policy_set_usage( &base_policy_set, PSA_KEY_USAGE_DERIVE,
4594 base_policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004595 PSA_ASSERT( psa_set_key_policy(
4596 base_key, &base_policy_set ) );
4597 PSA_ASSERT( psa_import_key( base_key, PSA_KEY_TYPE_DERIVE,
4598 data->x, data->len ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004599 /* Derive a key. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004600 PSA_ASSERT( psa_key_derivation( &generator, base_key,
4601 base_policy_alg,
4602 NULL, 0, NULL, 0,
4603 export_size ) );
4604 PSA_ASSERT( psa_generator_import_key(
4605 handle, PSA_KEY_TYPE_RAW_DATA,
4606 bits, &generator ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004607 break;
4608 }
Darryl Greend49a4992018-06-18 17:27:26 +01004609
4610 /* Export the key */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004611 TEST_EQUAL( psa_export_key( handle,
4612 first_export, export_size,
4613 &first_exported_length ),
4614 export_status );
Darryl Greend49a4992018-06-18 17:27:26 +01004615
4616 /* Shutdown and restart */
4617 mbedtls_psa_crypto_free();
Gilles Peskine8817f612018-12-18 00:18:46 +01004618 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01004619
Darryl Greend49a4992018-06-18 17:27:26 +01004620 /* Check key slot still contains key data */
Gilles Peskine8817f612018-12-18 00:18:46 +01004621 PSA_ASSERT( psa_open_key( PSA_KEY_LIFETIME_PERSISTENT, 1,
4622 &handle ) );
4623 PSA_ASSERT( psa_get_key_information(
4624 handle, &type_get, &bits_get ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004625 TEST_EQUAL( type_get, type );
4626 TEST_EQUAL( bits_get, (size_t) bits );
Darryl Greend49a4992018-06-18 17:27:26 +01004627
Gilles Peskine8817f612018-12-18 00:18:46 +01004628 PSA_ASSERT( psa_get_key_policy( handle, &policy_get ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004629 TEST_EQUAL( psa_key_policy_get_usage( &policy_get ), policy_usage );
4630 TEST_EQUAL( psa_key_policy_get_algorithm( &policy_get ), policy_alg );
Darryl Greend49a4992018-06-18 17:27:26 +01004631
4632 /* Export the key again */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004633 TEST_EQUAL( psa_export_key( handle,
4634 second_export, export_size,
4635 &second_exported_length ),
4636 export_status );
Darryl Greend49a4992018-06-18 17:27:26 +01004637
Darryl Green0c6575a2018-11-07 16:05:30 +00004638 if( export_status == PSA_SUCCESS )
4639 {
4640 ASSERT_COMPARE( first_export, first_exported_length,
4641 second_export, second_exported_length );
Darryl Greend49a4992018-06-18 17:27:26 +01004642
Darryl Green0c6575a2018-11-07 16:05:30 +00004643 switch( generation_method )
4644 {
4645 case IMPORT_KEY:
4646 ASSERT_COMPARE( data->x, data->len,
4647 first_export, first_exported_length );
4648 break;
4649 default:
4650 break;
4651 }
4652 }
4653
4654 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004655 if( ! exercise_key( handle, policy_usage, policy_alg ) )
Darryl Green0c6575a2018-11-07 16:05:30 +00004656 goto exit;
Darryl Greend49a4992018-06-18 17:27:26 +01004657
4658exit:
4659 mbedtls_free( first_export );
4660 mbedtls_free( second_export );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004661 psa_destroy_key( handle );
Darryl Greend49a4992018-06-18 17:27:26 +01004662 mbedtls_psa_crypto_free();
4663}
4664/* END_CASE */