blob: 6eb9b0abb61e1663ec205765010d482ceb7ce3bc [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 Ameroa0f625a2019-02-15 13:52:25 +00001964 /* A default hash operation should not be usable. */
1965 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{
2002 unsigned char input[] = "";
2003 /* SHA-256 hash of an empty string */
2004 unsigned char hash[] = {
2005 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
2006 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
2007 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55 };
2008 size_t hash_len;
Jaeden Amero6a25b412019-01-04 11:47:44 +00002009 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirf86548d2018-11-01 10:44:32 +02002010
Gilles Peskine8817f612018-12-18 00:18:46 +01002011 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirf86548d2018-11-01 10:44:32 +02002012
2013 /* psa_hash_update without calling psa_hash_setup beforehand */
2014 memset( &operation, 0, sizeof( operation ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002015 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00002016 PSA_ERROR_BAD_STATE );
itayzafrirf86548d2018-11-01 10:44:32 +02002017
2018 /* psa_hash_verify without calling psa_hash_setup beforehand */
2019 memset( &operation, 0, sizeof( operation ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002020 TEST_EQUAL( psa_hash_verify( &operation, hash, sizeof( hash ) ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00002021 PSA_ERROR_BAD_STATE );
itayzafrirf86548d2018-11-01 10:44:32 +02002022
2023 /* psa_hash_finish without calling psa_hash_setup beforehand */
2024 memset( &operation, 0, sizeof( operation ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002025 TEST_EQUAL( psa_hash_finish( &operation,
2026 hash, sizeof( hash ), &hash_len ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00002027 PSA_ERROR_BAD_STATE );
itayzafrirf86548d2018-11-01 10:44:32 +02002028
2029exit:
2030 mbedtls_psa_crypto_free( );
2031}
2032/* END_CASE */
2033
itayzafrir27e69452018-11-01 14:26:34 +02002034/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2035void hash_verify_bad_args( )
itayzafrirec93d302018-10-18 18:01:10 +03002036{
2037 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrir27e69452018-11-01 14:26:34 +02002038 /* SHA-256 hash of an empty string with 2 extra bytes (0xaa and 0xbb)
2039 * appended to it */
2040 unsigned char hash[] = {
2041 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
2042 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
2043 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55, 0xaa, 0xbb };
itayzafrirec93d302018-10-18 18:01:10 +03002044 size_t expected_size = PSA_HASH_SIZE( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00002045 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirec93d302018-10-18 18:01:10 +03002046
Gilles Peskine8817f612018-12-18 00:18:46 +01002047 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirec93d302018-10-18 18:01:10 +03002048
itayzafrir27e69452018-11-01 14:26:34 +02002049 /* psa_hash_verify with a smaller hash than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002050 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002051 TEST_EQUAL( psa_hash_verify( &operation, hash, expected_size - 1 ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002052 PSA_ERROR_INVALID_SIGNATURE );
itayzafrirec93d302018-10-18 18:01:10 +03002053
itayzafrir27e69452018-11-01 14:26:34 +02002054 /* psa_hash_verify with a non-matching hash */
Gilles Peskine8817f612018-12-18 00:18:46 +01002055 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002056 TEST_EQUAL( psa_hash_verify( &operation, hash + 1, expected_size ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002057 PSA_ERROR_INVALID_SIGNATURE );
itayzafrirec93d302018-10-18 18:01:10 +03002058
itayzafrir27e69452018-11-01 14:26:34 +02002059 /* psa_hash_verify with a hash longer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002060 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002061 TEST_EQUAL( psa_hash_verify( &operation, hash, sizeof( hash ) ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002062 PSA_ERROR_INVALID_SIGNATURE );
itayzafrir4271df92018-10-24 18:16:19 +03002063
itayzafrirec93d302018-10-18 18:01:10 +03002064exit:
2065 mbedtls_psa_crypto_free( );
2066}
2067/* END_CASE */
2068
itayzafrirb2dd5ed2018-11-01 11:58:59 +02002069/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2070void hash_finish_bad_args( )
itayzafrir58028322018-10-25 10:22:01 +03002071{
2072 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrirb2dd5ed2018-11-01 11:58:59 +02002073 unsigned char hash[PSA_HASH_MAX_SIZE];
itayzafrir58028322018-10-25 10:22:01 +03002074 size_t expected_size = PSA_HASH_SIZE( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00002075 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrir58028322018-10-25 10:22:01 +03002076 size_t hash_len;
2077
Gilles Peskine8817f612018-12-18 00:18:46 +01002078 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir58028322018-10-25 10:22:01 +03002079
itayzafrir58028322018-10-25 10:22:01 +03002080 /* psa_hash_finish with a smaller hash buffer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002081 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002082 TEST_EQUAL( psa_hash_finish( &operation,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002083 hash, expected_size - 1, &hash_len ),
2084 PSA_ERROR_BUFFER_TOO_SMALL );
itayzafrir58028322018-10-25 10:22:01 +03002085
2086exit:
2087 mbedtls_psa_crypto_free( );
2088}
2089/* END_CASE */
2090
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01002091/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2092void hash_clone_source_state( )
2093{
2094 psa_algorithm_t alg = PSA_ALG_SHA_256;
2095 unsigned char hash[PSA_HASH_MAX_SIZE];
2096 psa_hash_operation_t op_source = PSA_HASH_OPERATION_INIT;
2097 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
2098 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
2099 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
2100 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
2101 size_t hash_len;
2102
2103 PSA_ASSERT( psa_crypto_init( ) );
2104 PSA_ASSERT( psa_hash_setup( &op_source, alg ) );
2105
2106 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
2107 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
2108 PSA_ASSERT( psa_hash_finish( &op_finished,
2109 hash, sizeof( hash ), &hash_len ) );
2110 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
2111 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
2112
2113 TEST_EQUAL( psa_hash_clone( &op_source, &op_setup ),
2114 PSA_ERROR_BAD_STATE );
2115
2116 PSA_ASSERT( psa_hash_clone( &op_source, &op_init ) );
2117 PSA_ASSERT( psa_hash_finish( &op_init,
2118 hash, sizeof( hash ), &hash_len ) );
2119 PSA_ASSERT( psa_hash_clone( &op_source, &op_finished ) );
2120 PSA_ASSERT( psa_hash_finish( &op_finished,
2121 hash, sizeof( hash ), &hash_len ) );
2122 PSA_ASSERT( psa_hash_clone( &op_source, &op_aborted ) );
2123 PSA_ASSERT( psa_hash_finish( &op_aborted,
2124 hash, sizeof( hash ), &hash_len ) );
2125
2126exit:
2127 psa_hash_abort( &op_source );
2128 psa_hash_abort( &op_init );
2129 psa_hash_abort( &op_setup );
2130 psa_hash_abort( &op_finished );
2131 psa_hash_abort( &op_aborted );
2132 mbedtls_psa_crypto_free( );
2133}
2134/* END_CASE */
2135
2136/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2137void hash_clone_target_state( )
2138{
2139 psa_algorithm_t alg = PSA_ALG_SHA_256;
2140 unsigned char hash[PSA_HASH_MAX_SIZE];
2141 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
2142 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
2143 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
2144 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
2145 psa_hash_operation_t op_target = PSA_HASH_OPERATION_INIT;
2146 size_t hash_len;
2147
2148 PSA_ASSERT( psa_crypto_init( ) );
2149
2150 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
2151 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
2152 PSA_ASSERT( psa_hash_finish( &op_finished,
2153 hash, sizeof( hash ), &hash_len ) );
2154 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
2155 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
2156
2157 PSA_ASSERT( psa_hash_clone( &op_setup, &op_target ) );
2158 PSA_ASSERT( psa_hash_finish( &op_target,
2159 hash, sizeof( hash ), &hash_len ) );
2160
2161 TEST_EQUAL( psa_hash_clone( &op_init, &op_target ), PSA_ERROR_BAD_STATE );
2162 TEST_EQUAL( psa_hash_clone( &op_finished, &op_target ),
2163 PSA_ERROR_BAD_STATE );
2164 TEST_EQUAL( psa_hash_clone( &op_aborted, &op_target ),
2165 PSA_ERROR_BAD_STATE );
2166
2167exit:
2168 psa_hash_abort( &op_target );
2169 psa_hash_abort( &op_init );
2170 psa_hash_abort( &op_setup );
2171 psa_hash_abort( &op_finished );
2172 psa_hash_abort( &op_aborted );
2173 mbedtls_psa_crypto_free( );
2174}
2175/* END_CASE */
2176
itayzafrir58028322018-10-25 10:22:01 +03002177/* BEGIN_CASE */
Jaeden Amero769ce272019-01-04 11:48:03 +00002178void mac_operation_init( )
2179{
Jaeden Amero252ef282019-02-15 14:05:35 +00002180 const uint8_t input[1] = { 0 };
2181
Jaeden Amero769ce272019-01-04 11:48:03 +00002182 /* Test each valid way of initializing the object, except for `= {0}`, as
2183 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
2184 * though it's OK by the C standard. We could test for this, but we'd need
2185 * to supress the Clang warning for the test. */
2186 psa_mac_operation_t func = psa_mac_operation_init( );
2187 psa_mac_operation_t init = PSA_MAC_OPERATION_INIT;
2188 psa_mac_operation_t zero;
2189
2190 memset( &zero, 0, sizeof( zero ) );
2191
Jaeden Amero252ef282019-02-15 14:05:35 +00002192 /* A freshly-initialized MAC operation should not be usable. */
2193 TEST_EQUAL( psa_mac_update( &func,
2194 input, sizeof( input ) ),
2195 PSA_ERROR_BAD_STATE );
2196 TEST_EQUAL( psa_mac_update( &init,
2197 input, sizeof( input ) ),
2198 PSA_ERROR_BAD_STATE );
2199 TEST_EQUAL( psa_mac_update( &zero,
2200 input, sizeof( input ) ),
2201 PSA_ERROR_BAD_STATE );
2202
Jaeden Amero5229bbb2019-02-07 16:33:37 +00002203 /* A default MAC operation should be abortable without error. */
2204 PSA_ASSERT( psa_mac_abort( &func ) );
2205 PSA_ASSERT( psa_mac_abort( &init ) );
2206 PSA_ASSERT( psa_mac_abort( &zero ) );
Jaeden Amero769ce272019-01-04 11:48:03 +00002207}
2208/* END_CASE */
2209
2210/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002211void mac_setup( int key_type_arg,
2212 data_t *key,
2213 int alg_arg,
2214 int expected_status_arg )
2215{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002216 psa_key_handle_t handle = 0;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002217 psa_key_type_t key_type = key_type_arg;
2218 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002219 psa_status_t expected_status = expected_status_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002220 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002221 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002222 psa_status_t status;
2223
Gilles Peskine8817f612018-12-18 00:18:46 +01002224 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002225
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002226 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002227 psa_key_policy_set_usage( &policy,
2228 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
2229 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002230 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002231
Gilles Peskine8817f612018-12-18 00:18:46 +01002232 PSA_ASSERT( psa_import_key( handle, key_type,
2233 key->x, key->len ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002234
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002235 status = psa_mac_sign_setup( &operation, handle, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002236 psa_mac_abort( &operation );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002237 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002238
2239exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002240 psa_destroy_key( handle );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002241 mbedtls_psa_crypto_free( );
2242}
2243/* END_CASE */
2244
2245/* BEGIN_CASE */
Jaeden Amero252ef282019-02-15 14:05:35 +00002246void mac_bad_order( )
2247{
2248 psa_key_handle_t handle = 0;
2249 psa_key_type_t key_type = PSA_KEY_TYPE_HMAC;
2250 psa_algorithm_t alg = PSA_ALG_HMAC(PSA_ALG_SHA_256);
2251 const uint8_t key[] = {
2252 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2253 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2254 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
2255 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
2256 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
2257 uint8_t sign_mac[PSA_MAC_MAX_SIZE + 10] = { 0 };
2258 size_t sign_mac_length = 0;
2259 const uint8_t input[] = { 0xbb, 0xbb, 0xbb, 0xbb };
2260 const uint8_t verify_mac[] = {
2261 0x74, 0x65, 0x93, 0x8c, 0xeb, 0x1d, 0xb3, 0x76, 0x5a, 0x38, 0xe7, 0xdd,
2262 0x85, 0xc5, 0xad, 0x4f, 0x07, 0xe7, 0xd5, 0xb2, 0x64, 0xf0, 0x1a, 0x1a,
2263 0x2c, 0xf9, 0x18, 0xca, 0x59, 0x7e, 0x5d, 0xf6 };
2264
2265 PSA_ASSERT( psa_crypto_init( ) );
2266 PSA_ASSERT( psa_allocate_key( &handle ) );
2267 psa_key_policy_set_usage( &policy,
2268 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
2269 alg );
2270 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
2271
2272 PSA_ASSERT( psa_import_key( handle, key_type,
2273 key, sizeof(key) ) );
2274
2275 /* Call update without calling setup beforehand. */
2276 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2277 PSA_ERROR_BAD_STATE );
2278 PSA_ASSERT( psa_mac_abort( &operation ) );
2279
2280 /* Call sign finish without calling setup beforehand. */
2281 TEST_EQUAL( psa_mac_sign_finish( &operation, sign_mac, sizeof( sign_mac ),
2282 &sign_mac_length),
2283 PSA_ERROR_BAD_STATE );
2284 PSA_ASSERT( psa_mac_abort( &operation ) );
2285
2286 /* Call verify finish without calling setup beforehand. */
2287 TEST_EQUAL( psa_mac_verify_finish( &operation,
2288 verify_mac, sizeof( verify_mac ) ),
2289 PSA_ERROR_BAD_STATE );
2290 PSA_ASSERT( psa_mac_abort( &operation ) );
2291
2292 /* Call update after sign finish. */
2293 PSA_ASSERT( psa_mac_sign_setup( &operation,
2294 handle, alg ) );
2295 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2296 PSA_ASSERT( psa_mac_sign_finish( &operation,
2297 sign_mac, sizeof( sign_mac ),
2298 &sign_mac_length ) );
2299 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2300 PSA_ERROR_BAD_STATE );
2301 PSA_ASSERT( psa_mac_abort( &operation ) );
2302
2303 /* Call update after verify finish. */
2304 PSA_ASSERT( psa_mac_verify_setup( &operation,
2305 handle, alg ) );
2306 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2307 PSA_ASSERT( psa_mac_verify_finish( &operation,
2308 verify_mac, sizeof( verify_mac ) ) );
2309 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2310 PSA_ERROR_BAD_STATE );
2311 PSA_ASSERT( psa_mac_abort( &operation ) );
2312
2313 /* Call sign finish twice in a row. */
2314 PSA_ASSERT( psa_mac_sign_setup( &operation,
2315 handle, alg ) );
2316 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2317 PSA_ASSERT( psa_mac_sign_finish( &operation,
2318 sign_mac, sizeof( sign_mac ),
2319 &sign_mac_length ) );
2320 TEST_EQUAL( psa_mac_sign_finish( &operation,
2321 sign_mac, sizeof( sign_mac ),
2322 &sign_mac_length ),
2323 PSA_ERROR_BAD_STATE );
2324 PSA_ASSERT( psa_mac_abort( &operation ) );
2325
2326 /* Call verify finish twice in a row. */
2327 PSA_ASSERT( psa_mac_verify_setup( &operation,
2328 handle, alg ) );
2329 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2330 PSA_ASSERT( psa_mac_verify_finish( &operation,
2331 verify_mac, sizeof( verify_mac ) ) );
2332 TEST_EQUAL( psa_mac_verify_finish( &operation,
2333 verify_mac, sizeof( verify_mac ) ),
2334 PSA_ERROR_BAD_STATE );
2335 PSA_ASSERT( psa_mac_abort( &operation ) );
2336
2337 /* Setup sign but try verify. */
2338 PSA_ASSERT( psa_mac_sign_setup( &operation,
2339 handle, alg ) );
2340 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2341 TEST_EQUAL( psa_mac_verify_finish( &operation,
2342 verify_mac, sizeof( verify_mac ) ),
2343 PSA_ERROR_BAD_STATE );
2344 PSA_ASSERT( psa_mac_abort( &operation ) );
2345
2346 /* Setup verify but try sign. */
2347 PSA_ASSERT( psa_mac_verify_setup( &operation,
2348 handle, alg ) );
2349 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2350 TEST_EQUAL( psa_mac_sign_finish( &operation,
2351 sign_mac, sizeof( sign_mac ),
2352 &sign_mac_length ),
2353 PSA_ERROR_BAD_STATE );
2354 PSA_ASSERT( psa_mac_abort( &operation ) );
2355
2356exit:
2357 mbedtls_psa_crypto_free( );
2358}
2359/* END_CASE */
2360
2361/* BEGIN_CASE */
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002362void mac_sign( int key_type_arg,
2363 data_t *key,
2364 int alg_arg,
2365 data_t *input,
2366 data_t *expected_mac )
2367{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002368 psa_key_handle_t handle = 0;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002369 psa_key_type_t key_type = key_type_arg;
2370 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002371 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002372 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002373 /* Leave a little extra room in the output buffer. At the end of the
2374 * test, we'll check that the implementation didn't overwrite onto
2375 * this extra room. */
2376 uint8_t actual_mac[PSA_MAC_MAX_SIZE + 10];
2377 size_t mac_buffer_size =
2378 PSA_MAC_FINAL_SIZE( key_type, PSA_BYTES_TO_BITS( key->len ), alg );
2379 size_t mac_length = 0;
2380
2381 memset( actual_mac, '+', sizeof( actual_mac ) );
2382 TEST_ASSERT( mac_buffer_size <= PSA_MAC_MAX_SIZE );
2383 TEST_ASSERT( expected_mac->len <= mac_buffer_size );
2384
Gilles Peskine8817f612018-12-18 00:18:46 +01002385 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002386
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002387 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002388 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002389 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002390
Gilles Peskine8817f612018-12-18 00:18:46 +01002391 PSA_ASSERT( psa_import_key( handle, key_type,
2392 key->x, key->len ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002393
2394 /* Calculate the MAC. */
Gilles Peskine8817f612018-12-18 00:18:46 +01002395 PSA_ASSERT( psa_mac_sign_setup( &operation,
2396 handle, alg ) );
2397 PSA_ASSERT( psa_mac_update( &operation,
2398 input->x, input->len ) );
2399 PSA_ASSERT( psa_mac_sign_finish( &operation,
2400 actual_mac, mac_buffer_size,
2401 &mac_length ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002402
2403 /* Compare with the expected value. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01002404 ASSERT_COMPARE( expected_mac->x, expected_mac->len,
2405 actual_mac, mac_length );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002406
2407 /* Verify that the end of the buffer is untouched. */
2408 TEST_ASSERT( mem_is_char( actual_mac + mac_length, '+',
2409 sizeof( actual_mac ) - mac_length ) );
2410
2411exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002412 psa_destroy_key( handle );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002413 mbedtls_psa_crypto_free( );
2414}
2415/* END_CASE */
2416
2417/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002418void mac_verify( int key_type_arg,
2419 data_t *key,
2420 int alg_arg,
2421 data_t *input,
2422 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +01002423{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002424 psa_key_handle_t handle = 0;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002425 psa_key_type_t key_type = key_type_arg;
2426 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002427 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002428 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002429
Gilles Peskine69c12672018-06-28 00:07:19 +02002430 TEST_ASSERT( expected_mac->len <= PSA_MAC_MAX_SIZE );
2431
Gilles Peskine8817f612018-12-18 00:18:46 +01002432 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002433
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002434 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002435 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002436 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
mohammad16036df908f2018-04-02 08:34:15 -07002437
Gilles Peskine8817f612018-12-18 00:18:46 +01002438 PSA_ASSERT( psa_import_key( handle, key_type,
2439 key->x, key->len ) );
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002440
Gilles Peskine8817f612018-12-18 00:18:46 +01002441 PSA_ASSERT( psa_mac_verify_setup( &operation,
2442 handle, alg ) );
2443 PSA_ASSERT( psa_destroy_key( handle ) );
2444 PSA_ASSERT( psa_mac_update( &operation,
2445 input->x, input->len ) );
2446 PSA_ASSERT( psa_mac_verify_finish( &operation,
2447 expected_mac->x,
2448 expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002449
2450exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002451 psa_destroy_key( handle );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002452 mbedtls_psa_crypto_free( );
2453}
2454/* END_CASE */
2455
2456/* BEGIN_CASE */
Jaeden Amero5bae2272019-01-04 11:48:27 +00002457void cipher_operation_init( )
2458{
Jaeden Ameroab439972019-02-15 14:12:05 +00002459 const uint8_t input[1] = { 0 };
2460 unsigned char output[1] = { 0 };
2461 size_t output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002462 /* Test each valid way of initializing the object, except for `= {0}`, as
2463 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
2464 * though it's OK by the C standard. We could test for this, but we'd need
2465 * to supress the Clang warning for the test. */
2466 psa_cipher_operation_t func = psa_cipher_operation_init( );
2467 psa_cipher_operation_t init = PSA_CIPHER_OPERATION_INIT;
2468 psa_cipher_operation_t zero;
2469
2470 memset( &zero, 0, sizeof( zero ) );
2471
Jaeden Ameroab439972019-02-15 14:12:05 +00002472 /* A freshly-initialized cipher operation should not be usable. */
2473 TEST_EQUAL( psa_cipher_update( &func,
2474 input, sizeof( input ),
2475 output, sizeof( output ),
2476 &output_length ),
2477 PSA_ERROR_BAD_STATE );
2478 TEST_EQUAL( psa_cipher_update( &init,
2479 input, sizeof( input ),
2480 output, sizeof( output ),
2481 &output_length ),
2482 PSA_ERROR_BAD_STATE );
2483 TEST_EQUAL( psa_cipher_update( &zero,
2484 input, sizeof( input ),
2485 output, sizeof( output ),
2486 &output_length ),
2487 PSA_ERROR_BAD_STATE );
2488
Jaeden Amero5229bbb2019-02-07 16:33:37 +00002489 /* A default cipher operation should be abortable without error. */
2490 PSA_ASSERT( psa_cipher_abort( &func ) );
2491 PSA_ASSERT( psa_cipher_abort( &init ) );
2492 PSA_ASSERT( psa_cipher_abort( &zero ) );
Jaeden Amero5bae2272019-01-04 11:48:27 +00002493}
2494/* END_CASE */
2495
2496/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002497void cipher_setup( int key_type_arg,
2498 data_t *key,
2499 int alg_arg,
2500 int expected_status_arg )
2501{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002502 psa_key_handle_t handle = 0;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002503 psa_key_type_t key_type = key_type_arg;
2504 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002505 psa_status_t expected_status = expected_status_arg;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002506 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002507 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002508 psa_status_t status;
2509
Gilles Peskine8817f612018-12-18 00:18:46 +01002510 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002511
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002512 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002513 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002514 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002515
Gilles Peskine8817f612018-12-18 00:18:46 +01002516 PSA_ASSERT( psa_import_key( handle, key_type,
2517 key->x, key->len ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002518
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002519 status = psa_cipher_encrypt_setup( &operation, handle, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002520 psa_cipher_abort( &operation );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002521 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002522
2523exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002524 psa_destroy_key( handle );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002525 mbedtls_psa_crypto_free( );
2526}
2527/* END_CASE */
2528
2529/* BEGIN_CASE */
Jaeden Ameroab439972019-02-15 14:12:05 +00002530void cipher_bad_order( )
2531{
2532 psa_key_handle_t handle = 0;
2533 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
2534 psa_algorithm_t alg = PSA_ALG_CBC_PKCS7;
2535 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
2536 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
2537 unsigned char iv[PSA_BLOCK_CIPHER_BLOCK_SIZE(PSA_KEY_TYPE_AES)] = { 0 };
2538 const uint8_t key[] = {
2539 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2540 0xaa, 0xaa, 0xaa, 0xaa };
2541 const uint8_t text[] = {
2542 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2543 0xbb, 0xbb, 0xbb, 0xbb };
2544 uint8_t buffer[PSA_BLOCK_CIPHER_BLOCK_SIZE(PSA_KEY_TYPE_AES)] = { 0 };
2545 size_t length = 0;
2546
2547 PSA_ASSERT( psa_crypto_init( ) );
2548 PSA_ASSERT( psa_allocate_key( &handle ) );
2549 psa_key_policy_set_usage( &policy,
2550 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
2551 alg );
2552 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
2553 PSA_ASSERT( psa_import_key( handle, key_type,
2554 key, sizeof(key) ) );
2555
2556
2557 /* Generate an IV without calling setup beforehand. */
2558 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2559 buffer, sizeof( buffer ),
2560 &length ),
2561 PSA_ERROR_BAD_STATE );
2562 PSA_ASSERT( psa_cipher_abort( &operation ) );
2563
2564 /* Generate an IV twice in a row. */
2565 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2566 PSA_ASSERT( psa_cipher_generate_iv( &operation,
2567 buffer, sizeof( buffer ),
2568 &length ) );
2569 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2570 buffer, sizeof( buffer ),
2571 &length ),
2572 PSA_ERROR_BAD_STATE );
2573 PSA_ASSERT( psa_cipher_abort( &operation ) );
2574
2575 /* Generate an IV after it's already set. */
2576 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2577 PSA_ASSERT( psa_cipher_set_iv( &operation,
2578 iv, sizeof( iv ) ) );
2579 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2580 buffer, sizeof( buffer ),
2581 &length ),
2582 PSA_ERROR_BAD_STATE );
2583 PSA_ASSERT( psa_cipher_abort( &operation ) );
2584
2585 /* Set an IV without calling setup beforehand. */
2586 TEST_EQUAL( psa_cipher_set_iv( &operation,
2587 iv, sizeof( iv ) ),
2588 PSA_ERROR_BAD_STATE );
2589 PSA_ASSERT( psa_cipher_abort( &operation ) );
2590
2591 /* Set an IV after it's already set. */
2592 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2593 PSA_ASSERT( psa_cipher_set_iv( &operation,
2594 iv, sizeof( iv ) ) );
2595 TEST_EQUAL( psa_cipher_set_iv( &operation,
2596 iv, sizeof( iv ) ),
2597 PSA_ERROR_BAD_STATE );
2598 PSA_ASSERT( psa_cipher_abort( &operation ) );
2599
2600 /* Set an IV after it's already generated. */
2601 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2602 PSA_ASSERT( psa_cipher_generate_iv( &operation,
2603 buffer, sizeof( buffer ),
2604 &length ) );
2605 TEST_EQUAL( psa_cipher_set_iv( &operation,
2606 iv, sizeof( iv ) ),
2607 PSA_ERROR_BAD_STATE );
2608 PSA_ASSERT( psa_cipher_abort( &operation ) );
2609
2610 /* Call update without calling setup beforehand. */
2611 TEST_EQUAL( psa_cipher_update( &operation,
2612 text, sizeof( text ),
2613 buffer, sizeof( buffer ),
2614 &length ),
2615 PSA_ERROR_BAD_STATE );
2616 PSA_ASSERT( psa_cipher_abort( &operation ) );
2617
2618 /* Call update without an IV where an IV is required. */
2619 TEST_EQUAL( psa_cipher_update( &operation,
2620 text, sizeof( text ),
2621 buffer, sizeof( buffer ),
2622 &length ),
2623 PSA_ERROR_BAD_STATE );
2624 PSA_ASSERT( psa_cipher_abort( &operation ) );
2625
2626 /* Call update after finish. */
2627 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2628 PSA_ASSERT( psa_cipher_set_iv( &operation,
2629 iv, sizeof( iv ) ) );
2630 PSA_ASSERT( psa_cipher_finish( &operation,
2631 buffer, sizeof( buffer ), &length ) );
2632 TEST_EQUAL( psa_cipher_update( &operation,
2633 text, sizeof( text ),
2634 buffer, sizeof( buffer ),
2635 &length ),
2636 PSA_ERROR_BAD_STATE );
2637 PSA_ASSERT( psa_cipher_abort( &operation ) );
2638
2639 /* Call finish without calling setup beforehand. */
2640 TEST_EQUAL( psa_cipher_finish( &operation,
2641 buffer, sizeof( buffer ), &length ),
2642 PSA_ERROR_BAD_STATE );
2643 PSA_ASSERT( psa_cipher_abort( &operation ) );
2644
2645 /* Call finish without an IV where an IV is required. */
2646 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2647 /* Not calling update means we are encrypting an empty buffer, which is OK
2648 * for cipher modes with padding. */
2649 TEST_EQUAL( psa_cipher_finish( &operation,
2650 buffer, sizeof( buffer ), &length ),
2651 PSA_ERROR_BAD_STATE );
2652 PSA_ASSERT( psa_cipher_abort( &operation ) );
2653
2654 /* Call finish twice in a row. */
2655 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, handle, alg ) );
2656 PSA_ASSERT( psa_cipher_set_iv( &operation,
2657 iv, sizeof( iv ) ) );
2658 PSA_ASSERT( psa_cipher_finish( &operation,
2659 buffer, sizeof( buffer ), &length ) );
2660 TEST_EQUAL( psa_cipher_finish( &operation,
2661 buffer, sizeof( buffer ), &length ),
2662 PSA_ERROR_BAD_STATE );
2663 PSA_ASSERT( psa_cipher_abort( &operation ) );
2664
2665exit:
2666 mbedtls_psa_crypto_free( );
2667}
2668/* END_CASE */
2669
2670/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002671void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002672 data_t *key,
2673 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002674 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002675{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002676 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002677 psa_status_t status;
2678 psa_key_type_t key_type = key_type_arg;
2679 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002680 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002681 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002682 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002683 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002684 size_t output_buffer_size = 0;
2685 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002686 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002687 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002688 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002689
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002690 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2691 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002692
Gilles Peskine8817f612018-12-18 00:18:46 +01002693 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002694
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002695 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002696 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002697 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002698
Gilles Peskine8817f612018-12-18 00:18:46 +01002699 PSA_ASSERT( psa_import_key( handle, key_type,
2700 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002701
Gilles Peskine8817f612018-12-18 00:18:46 +01002702 PSA_ASSERT( psa_cipher_encrypt_setup( &operation,
2703 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002704
Gilles Peskine8817f612018-12-18 00:18:46 +01002705 PSA_ASSERT( psa_cipher_set_iv( &operation,
2706 iv, iv_size ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002707 output_buffer_size = ( (size_t) input->len +
2708 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002709 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002710
Gilles Peskine8817f612018-12-18 00:18:46 +01002711 PSA_ASSERT( psa_cipher_update( &operation,
2712 input->x, input->len,
2713 output, output_buffer_size,
2714 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002715 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002716 status = psa_cipher_finish( &operation,
2717 output + function_output_length,
2718 output_buffer_size,
2719 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002720 total_output_length += function_output_length;
2721
Gilles Peskinefe11b722018-12-18 00:24:04 +01002722 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002723 if( expected_status == PSA_SUCCESS )
2724 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002725 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002726 ASSERT_COMPARE( expected_output->x, expected_output->len,
2727 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002728 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002729
Gilles Peskine50e586b2018-06-08 14:28:46 +02002730exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002731 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002732 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002733 mbedtls_psa_crypto_free( );
2734}
2735/* END_CASE */
2736
2737/* BEGIN_CASE */
2738void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002739 data_t *key,
2740 data_t *input,
2741 int first_part_size,
2742 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002743{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002744 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002745 psa_key_type_t key_type = key_type_arg;
2746 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002747 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002748 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002749 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002750 size_t output_buffer_size = 0;
2751 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002752 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002753 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002754 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002755
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002756 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2757 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002758
Gilles Peskine8817f612018-12-18 00:18:46 +01002759 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002760
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002761 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002762 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002763 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002764
Gilles Peskine8817f612018-12-18 00:18:46 +01002765 PSA_ASSERT( psa_import_key( handle, key_type,
2766 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002767
Gilles Peskine8817f612018-12-18 00:18:46 +01002768 PSA_ASSERT( psa_cipher_encrypt_setup( &operation,
2769 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002770
Gilles Peskine8817f612018-12-18 00:18:46 +01002771 PSA_ASSERT( psa_cipher_set_iv( &operation,
2772 iv, sizeof( iv ) ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002773 output_buffer_size = ( (size_t) input->len +
2774 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002775 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002776
Gilles Peskine4abf7412018-06-18 16:35:34 +02002777 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002778 PSA_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
2779 output, output_buffer_size,
2780 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002781 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002782 PSA_ASSERT( psa_cipher_update( &operation,
2783 input->x + first_part_size,
2784 input->len - first_part_size,
2785 output, output_buffer_size,
2786 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002787 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002788 PSA_ASSERT( psa_cipher_finish( &operation,
2789 output + function_output_length,
2790 output_buffer_size,
2791 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002792 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002793 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002794
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002795 ASSERT_COMPARE( expected_output->x, expected_output->len,
2796 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002797
2798exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002799 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002800 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002801 mbedtls_psa_crypto_free( );
2802}
2803/* END_CASE */
2804
2805/* BEGIN_CASE */
2806void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002807 data_t *key,
2808 data_t *input,
2809 int first_part_size,
2810 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002811{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002812 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002813
2814 psa_key_type_t key_type = key_type_arg;
2815 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002816 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002817 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002818 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002819 size_t output_buffer_size = 0;
2820 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002821 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002822 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002823 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002824
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002825 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2826 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002827
Gilles Peskine8817f612018-12-18 00:18:46 +01002828 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002829
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002830 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002831 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002832 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002833
Gilles Peskine8817f612018-12-18 00:18:46 +01002834 PSA_ASSERT( psa_import_key( handle, key_type,
2835 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002836
Gilles Peskine8817f612018-12-18 00:18:46 +01002837 PSA_ASSERT( psa_cipher_decrypt_setup( &operation,
2838 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002839
Gilles Peskine8817f612018-12-18 00:18:46 +01002840 PSA_ASSERT( psa_cipher_set_iv( &operation,
2841 iv, sizeof( iv ) ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002842
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002843 output_buffer_size = ( (size_t) input->len +
2844 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002845 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002846
Gilles Peskine4abf7412018-06-18 16:35:34 +02002847 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002848 PSA_ASSERT( psa_cipher_update( &operation,
2849 input->x, first_part_size,
2850 output, output_buffer_size,
2851 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002852 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002853 PSA_ASSERT( psa_cipher_update( &operation,
2854 input->x + first_part_size,
2855 input->len - first_part_size,
2856 output, output_buffer_size,
2857 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002858 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002859 PSA_ASSERT( psa_cipher_finish( &operation,
2860 output + function_output_length,
2861 output_buffer_size,
2862 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002863 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002864 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002865
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002866 ASSERT_COMPARE( expected_output->x, expected_output->len,
2867 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002868
2869exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002870 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002871 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002872 mbedtls_psa_crypto_free( );
2873}
2874/* END_CASE */
2875
Gilles Peskine50e586b2018-06-08 14:28:46 +02002876/* BEGIN_CASE */
2877void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002878 data_t *key,
2879 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002880 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002881{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002882 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002883 psa_status_t status;
2884 psa_key_type_t key_type = key_type_arg;
2885 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002886 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002887 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002888 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002889 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002890 size_t output_buffer_size = 0;
2891 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002892 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002893 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002894 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002895
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002896 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2897 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002898
Gilles Peskine8817f612018-12-18 00:18:46 +01002899 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002900
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002901 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002902 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002903 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002904
Gilles Peskine8817f612018-12-18 00:18:46 +01002905 PSA_ASSERT( psa_import_key( handle, key_type,
2906 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002907
Gilles Peskine8817f612018-12-18 00:18:46 +01002908 PSA_ASSERT( psa_cipher_decrypt_setup( &operation,
2909 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002910
Gilles Peskine8817f612018-12-18 00:18:46 +01002911 PSA_ASSERT( psa_cipher_set_iv( &operation,
2912 iv, iv_size ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002913
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002914 output_buffer_size = ( (size_t) input->len +
2915 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002916 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002917
Gilles Peskine8817f612018-12-18 00:18:46 +01002918 PSA_ASSERT( psa_cipher_update( &operation,
2919 input->x, input->len,
2920 output, output_buffer_size,
2921 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002922 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002923 status = psa_cipher_finish( &operation,
2924 output + function_output_length,
2925 output_buffer_size,
2926 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002927 total_output_length += function_output_length;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002928 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002929
2930 if( expected_status == PSA_SUCCESS )
2931 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002932 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002933 ASSERT_COMPARE( expected_output->x, expected_output->len,
2934 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002935 }
2936
Gilles Peskine50e586b2018-06-08 14:28:46 +02002937exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002938 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002939 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002940 mbedtls_psa_crypto_free( );
2941}
2942/* END_CASE */
2943
Gilles Peskine50e586b2018-06-08 14:28:46 +02002944/* BEGIN_CASE */
2945void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002946 data_t *key,
2947 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02002948{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002949 psa_key_handle_t handle = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002950 psa_key_type_t key_type = key_type_arg;
2951 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -07002952 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +02002953 size_t iv_size = 16;
2954 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002955 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002956 size_t output1_size = 0;
2957 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002958 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002959 size_t output2_size = 0;
2960 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002961 size_t function_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002962 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
2963 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002964 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002965
Gilles Peskine8817f612018-12-18 00:18:46 +01002966 PSA_ASSERT( psa_crypto_init( ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002967
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002968 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002969 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002970 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002971
Gilles Peskine8817f612018-12-18 00:18:46 +01002972 PSA_ASSERT( psa_import_key( handle, key_type,
2973 key->x, key->len ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002974
Gilles Peskine8817f612018-12-18 00:18:46 +01002975 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1,
2976 handle, alg ) );
2977 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2,
2978 handle, alg ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002979
Gilles Peskine8817f612018-12-18 00:18:46 +01002980 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
2981 iv, iv_size,
2982 &iv_length ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002983 output1_size = ( (size_t) input->len +
2984 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002985 ASSERT_ALLOC( output1, output1_size );
Moran Pekerded84402018-06-06 16:36:50 +03002986
Gilles Peskine8817f612018-12-18 00:18:46 +01002987 PSA_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
2988 output1, output1_size,
2989 &output1_length ) );
2990 PSA_ASSERT( psa_cipher_finish( &operation1,
2991 output1 + output1_length, output1_size,
2992 &function_output_length ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002993
Gilles Peskine048b7f02018-06-08 14:20:49 +02002994 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002995
Gilles Peskine8817f612018-12-18 00:18:46 +01002996 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
Moran Pekerded84402018-06-06 16:36:50 +03002997
2998 output2_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002999 ASSERT_ALLOC( output2, output2_size );
Moran Pekerded84402018-06-06 16:36:50 +03003000
Gilles Peskine8817f612018-12-18 00:18:46 +01003001 PSA_ASSERT( psa_cipher_set_iv( &operation2,
3002 iv, iv_length ) );
3003 PSA_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
3004 output2, output2_size,
3005 &output2_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003006 function_output_length = 0;
Gilles Peskine8817f612018-12-18 00:18:46 +01003007 PSA_ASSERT( psa_cipher_finish( &operation2,
3008 output2 + output2_length,
3009 output2_size,
3010 &function_output_length ) );
Moran Pekerded84402018-06-06 16:36:50 +03003011
Gilles Peskine048b7f02018-06-08 14:20:49 +02003012 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003013
Gilles Peskine8817f612018-12-18 00:18:46 +01003014 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
Moran Pekerded84402018-06-06 16:36:50 +03003015
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003016 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
Moran Pekerded84402018-06-06 16:36:50 +03003017
3018exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03003019 mbedtls_free( output1 );
3020 mbedtls_free( output2 );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003021 psa_destroy_key( handle );
Moran Pekerded84402018-06-06 16:36:50 +03003022 mbedtls_psa_crypto_free( );
3023}
3024/* END_CASE */
3025
3026/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02003027void cipher_verify_output_multipart( int alg_arg,
3028 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03003029 data_t *key,
3030 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +02003031 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +03003032{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003033 psa_key_handle_t handle = 0;
Moran Pekerded84402018-06-06 16:36:50 +03003034 psa_key_type_t key_type = key_type_arg;
3035 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +03003036 unsigned char iv[16] = {0};
3037 size_t iv_size = 16;
3038 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003039 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003040 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03003041 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003042 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003043 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03003044 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003045 size_t function_output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00003046 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
3047 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00003048 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03003049
Gilles Peskine8817f612018-12-18 00:18:46 +01003050 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerded84402018-06-06 16:36:50 +03003051
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003052 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03003053 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003054 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03003055
Gilles Peskine8817f612018-12-18 00:18:46 +01003056 PSA_ASSERT( psa_import_key( handle, key_type,
3057 key->x, key->len ) );
Moran Pekerded84402018-06-06 16:36:50 +03003058
Gilles Peskine8817f612018-12-18 00:18:46 +01003059 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1,
3060 handle, alg ) );
3061 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2,
3062 handle, alg ) );
Moran Pekerded84402018-06-06 16:36:50 +03003063
Gilles Peskine8817f612018-12-18 00:18:46 +01003064 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
3065 iv, iv_size,
3066 &iv_length ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01003067 output1_buffer_size = ( (size_t) input->len +
3068 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003069 ASSERT_ALLOC( output1, output1_buffer_size );
Moran Pekerded84402018-06-06 16:36:50 +03003070
Gilles Peskine4abf7412018-06-18 16:35:34 +02003071 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003072
Gilles Peskine8817f612018-12-18 00:18:46 +01003073 PSA_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
3074 output1, output1_buffer_size,
3075 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003076 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003077
Gilles Peskine8817f612018-12-18 00:18:46 +01003078 PSA_ASSERT( psa_cipher_update( &operation1,
3079 input->x + first_part_size,
3080 input->len - first_part_size,
3081 output1, output1_buffer_size,
3082 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003083 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003084
Gilles Peskine8817f612018-12-18 00:18:46 +01003085 PSA_ASSERT( psa_cipher_finish( &operation1,
3086 output1 + output1_length,
3087 output1_buffer_size - output1_length,
3088 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003089 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003090
Gilles Peskine8817f612018-12-18 00:18:46 +01003091 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003092
Gilles Peskine048b7f02018-06-08 14:20:49 +02003093 output2_buffer_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003094 ASSERT_ALLOC( output2, output2_buffer_size );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003095
Gilles Peskine8817f612018-12-18 00:18:46 +01003096 PSA_ASSERT( psa_cipher_set_iv( &operation2,
3097 iv, iv_length ) );
Moran Pekerded84402018-06-06 16:36:50 +03003098
Gilles Peskine8817f612018-12-18 00:18:46 +01003099 PSA_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
3100 output2, output2_buffer_size,
3101 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003102 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003103
Gilles Peskine8817f612018-12-18 00:18:46 +01003104 PSA_ASSERT( psa_cipher_update( &operation2,
3105 output1 + first_part_size,
3106 output1_length - first_part_size,
3107 output2, output2_buffer_size,
3108 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003109 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003110
Gilles Peskine8817f612018-12-18 00:18:46 +01003111 PSA_ASSERT( psa_cipher_finish( &operation2,
3112 output2 + output2_length,
3113 output2_buffer_size - output2_length,
3114 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003115 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003116
Gilles Peskine8817f612018-12-18 00:18:46 +01003117 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003118
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003119 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003120
3121exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03003122 mbedtls_free( output1 );
3123 mbedtls_free( output2 );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003124 psa_destroy_key( handle );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003125 mbedtls_psa_crypto_free( );
3126}
3127/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02003128
Gilles Peskine20035e32018-02-03 22:44:14 +01003129/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003130void aead_encrypt_decrypt( int key_type_arg, data_t *key_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003131 int alg_arg,
Gilles Peskine7da96b02018-08-17 18:45:42 +02003132 data_t *nonce,
3133 data_t *additional_data,
3134 data_t *input_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003135 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003136{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003137 psa_key_handle_t handle = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003138 psa_key_type_t key_type = key_type_arg;
3139 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003140 unsigned char *output_data = NULL;
3141 size_t output_size = 0;
3142 size_t output_length = 0;
3143 unsigned char *output_data2 = NULL;
3144 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003145 size_t tag_length = 16;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003146 psa_status_t expected_result = expected_result_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003147 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003148
Gilles Peskine4abf7412018-06-18 16:35:34 +02003149 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003150 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003151
Gilles Peskine8817f612018-12-18 00:18:46 +01003152 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003153
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003154 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003155 psa_key_policy_set_usage( &policy,
3156 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
3157 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003158 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003159
Gilles Peskine8817f612018-12-18 00:18:46 +01003160 PSA_ASSERT( psa_import_key( handle, key_type,
3161 key_data->x, key_data->len ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003162
Gilles Peskinefe11b722018-12-18 00:24:04 +01003163 TEST_EQUAL( psa_aead_encrypt( handle, alg,
3164 nonce->x, nonce->len,
3165 additional_data->x,
3166 additional_data->len,
3167 input_data->x, input_data->len,
3168 output_data, output_size,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003169 &output_length ),
3170 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003171
3172 if( PSA_SUCCESS == expected_result )
3173 {
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003174 ASSERT_ALLOC( output_data2, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003175
Gilles Peskinefe11b722018-12-18 00:24:04 +01003176 TEST_EQUAL( psa_aead_decrypt( handle, alg,
3177 nonce->x, nonce->len,
3178 additional_data->x,
3179 additional_data->len,
3180 output_data, output_length,
3181 output_data2, output_length,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003182 &output_length2 ),
3183 expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02003184
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003185 ASSERT_COMPARE( input_data->x, input_data->len,
3186 output_data2, output_length2 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003187 }
Gilles Peskine2d277862018-06-18 15:41:12 +02003188
Gilles Peskinea1cac842018-06-11 19:33:02 +02003189exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003190 psa_destroy_key( handle );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003191 mbedtls_free( output_data );
3192 mbedtls_free( output_data2 );
3193 mbedtls_psa_crypto_free( );
3194}
3195/* END_CASE */
3196
3197/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003198void aead_encrypt( int key_type_arg, data_t *key_data,
3199 int alg_arg,
3200 data_t *nonce,
3201 data_t *additional_data,
3202 data_t *input_data,
3203 data_t *expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003204{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003205 psa_key_handle_t handle = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003206 psa_key_type_t key_type = key_type_arg;
3207 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003208 unsigned char *output_data = NULL;
3209 size_t output_size = 0;
3210 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003211 size_t tag_length = 16;
Jaeden Amero70261c52019-01-04 11:47:20 +00003212 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003213
Gilles Peskine4abf7412018-06-18 16:35:34 +02003214 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003215 ASSERT_ALLOC( output_data, output_size );
Gilles Peskine2d277862018-06-18 15:41:12 +02003216
Gilles Peskine8817f612018-12-18 00:18:46 +01003217 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003218
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003219 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003220 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003221 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003222
Gilles Peskine8817f612018-12-18 00:18:46 +01003223 PSA_ASSERT( psa_import_key( handle, key_type,
3224 key_data->x,
3225 key_data->len ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003226
Gilles Peskine8817f612018-12-18 00:18:46 +01003227 PSA_ASSERT( psa_aead_encrypt( handle, alg,
3228 nonce->x, nonce->len,
3229 additional_data->x, additional_data->len,
3230 input_data->x, input_data->len,
3231 output_data, output_size,
3232 &output_length ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003233
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003234 ASSERT_COMPARE( expected_result->x, expected_result->len,
3235 output_data, output_length );
Gilles Peskine2d277862018-06-18 15:41:12 +02003236
Gilles Peskinea1cac842018-06-11 19:33:02 +02003237exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003238 psa_destroy_key( handle );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003239 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003240 mbedtls_psa_crypto_free( );
3241}
3242/* END_CASE */
3243
3244/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003245void aead_decrypt( 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_data,
3251 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003252{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003253 psa_key_handle_t handle = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003254 psa_key_type_t key_type = key_type_arg;
3255 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003256 unsigned char *output_data = NULL;
3257 size_t output_size = 0;
3258 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003259 size_t tag_length = 16;
Jaeden Amero70261c52019-01-04 11:47:20 +00003260 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003261 psa_status_t expected_result = expected_result_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003262
Gilles Peskine4abf7412018-06-18 16:35:34 +02003263 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003264 ASSERT_ALLOC( output_data, output_size );
Gilles Peskine2d277862018-06-18 15:41:12 +02003265
Gilles Peskine8817f612018-12-18 00:18:46 +01003266 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003267
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003268 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003269 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003270 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003271
Gilles Peskine8817f612018-12-18 00:18:46 +01003272 PSA_ASSERT( psa_import_key( handle, key_type,
3273 key_data->x,
3274 key_data->len ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003275
Gilles Peskinefe11b722018-12-18 00:24:04 +01003276 TEST_EQUAL( psa_aead_decrypt( handle, alg,
3277 nonce->x, nonce->len,
3278 additional_data->x,
3279 additional_data->len,
3280 input_data->x, input_data->len,
3281 output_data, output_size,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003282 &output_length ),
3283 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003284
Gilles Peskine2d277862018-06-18 15:41:12 +02003285 if( expected_result == PSA_SUCCESS )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003286 ASSERT_COMPARE( expected_data->x, expected_data->len,
3287 output_data, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003288
Gilles Peskinea1cac842018-06-11 19:33:02 +02003289exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003290 psa_destroy_key( handle );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003291 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003292 mbedtls_psa_crypto_free( );
3293}
3294/* END_CASE */
3295
3296/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003297void signature_size( int type_arg,
3298 int bits,
3299 int alg_arg,
3300 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003301{
3302 psa_key_type_t type = type_arg;
3303 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +02003304 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003305 TEST_EQUAL( actual_size, (size_t) expected_size_arg );
Gilles Peskinee59236f2018-01-27 23:32:46 +01003306exit:
3307 ;
3308}
3309/* END_CASE */
3310
3311/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003312void sign_deterministic( int key_type_arg, data_t *key_data,
3313 int alg_arg, data_t *input_data,
3314 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003315{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003316 psa_key_handle_t handle = 0;
Gilles Peskinee59236f2018-01-27 23:32:46 +01003317 psa_key_type_t key_type = key_type_arg;
3318 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003319 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01003320 unsigned char *signature = NULL;
3321 size_t signature_size;
3322 size_t signature_length = 0xdeadbeef;
Jaeden Amero70261c52019-01-04 11:47:20 +00003323 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003324
Gilles Peskine8817f612018-12-18 00:18:46 +01003325 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003326
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003327 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003328 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003329 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003330
Gilles Peskine8817f612018-12-18 00:18:46 +01003331 PSA_ASSERT( psa_import_key( handle, key_type,
3332 key_data->x,
3333 key_data->len ) );
3334 PSA_ASSERT( psa_get_key_information( handle,
3335 NULL,
3336 &key_bits ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003337
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003338 /* Allocate a buffer which has the size advertized by the
3339 * library. */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003340 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
3341 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01003342 TEST_ASSERT( signature_size != 0 );
Gilles Peskine69c12672018-06-28 00:07:19 +02003343 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003344 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003345
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003346 /* Perform the signature. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003347 PSA_ASSERT( psa_asymmetric_sign( handle, alg,
3348 input_data->x, input_data->len,
3349 signature, signature_size,
3350 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003351 /* Verify that the signature is what is expected. */
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003352 ASSERT_COMPARE( output_data->x, output_data->len,
3353 signature, signature_length );
Gilles Peskine20035e32018-02-03 22:44:14 +01003354
3355exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003356 psa_destroy_key( handle );
Gilles Peskine0189e752018-02-03 23:57:22 +01003357 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01003358 mbedtls_psa_crypto_free( );
3359}
3360/* END_CASE */
3361
3362/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003363void sign_fail( int key_type_arg, data_t *key_data,
3364 int alg_arg, data_t *input_data,
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003365 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01003366{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003367 psa_key_handle_t handle = 0;
Gilles Peskine20035e32018-02-03 22:44:14 +01003368 psa_key_type_t key_type = key_type_arg;
3369 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003370 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003371 psa_status_t actual_status;
3372 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01003373 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01003374 size_t signature_length = 0xdeadbeef;
Jaeden Amero70261c52019-01-04 11:47:20 +00003375 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003376
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003377 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003378
Gilles Peskine8817f612018-12-18 00:18:46 +01003379 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003380
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003381 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003382 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003383 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003384
Gilles Peskine8817f612018-12-18 00:18:46 +01003385 PSA_ASSERT( psa_import_key( handle, key_type,
3386 key_data->x,
3387 key_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003388
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003389 actual_status = psa_asymmetric_sign( handle, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003390 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01003391 signature, signature_size,
3392 &signature_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003393 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003394 /* The value of *signature_length is unspecified on error, but
3395 * whatever it is, it should be less than signature_size, so that
3396 * if the caller tries to read *signature_length bytes without
3397 * checking the error code then they don't overflow a buffer. */
3398 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003399
3400exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003401 psa_destroy_key( handle );
Gilles Peskine20035e32018-02-03 22:44:14 +01003402 mbedtls_free( signature );
3403 mbedtls_psa_crypto_free( );
3404}
3405/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03003406
3407/* BEGIN_CASE */
Gilles Peskine9911b022018-06-29 17:30:48 +02003408void sign_verify( int key_type_arg, data_t *key_data,
3409 int alg_arg, data_t *input_data )
3410{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003411 psa_key_handle_t handle = 0;
Gilles Peskine9911b022018-06-29 17:30:48 +02003412 psa_key_type_t key_type = key_type_arg;
3413 psa_algorithm_t alg = alg_arg;
3414 size_t key_bits;
3415 unsigned char *signature = NULL;
3416 size_t signature_size;
3417 size_t signature_length = 0xdeadbeef;
Jaeden Amero70261c52019-01-04 11:47:20 +00003418 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003419
Gilles Peskine8817f612018-12-18 00:18:46 +01003420 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003421
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003422 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003423 psa_key_policy_set_usage( &policy,
3424 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
3425 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003426 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003427
Gilles Peskine8817f612018-12-18 00:18:46 +01003428 PSA_ASSERT( psa_import_key( handle, key_type,
3429 key_data->x,
3430 key_data->len ) );
3431 PSA_ASSERT( psa_get_key_information( handle,
3432 NULL,
3433 &key_bits ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003434
3435 /* Allocate a buffer which has the size advertized by the
3436 * library. */
3437 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
3438 key_bits, alg );
3439 TEST_ASSERT( signature_size != 0 );
3440 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003441 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine9911b022018-06-29 17:30:48 +02003442
3443 /* Perform the signature. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003444 PSA_ASSERT( psa_asymmetric_sign( handle, alg,
3445 input_data->x, input_data->len,
3446 signature, signature_size,
3447 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003448 /* Check that the signature length looks sensible. */
3449 TEST_ASSERT( signature_length <= signature_size );
3450 TEST_ASSERT( signature_length > 0 );
3451
3452 /* Use the library to verify that the signature is correct. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003453 PSA_ASSERT( psa_asymmetric_verify(
3454 handle, alg,
3455 input_data->x, input_data->len,
3456 signature, signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003457
3458 if( input_data->len != 0 )
3459 {
3460 /* Flip a bit in the input and verify that the signature is now
3461 * detected as invalid. Flip a bit at the beginning, not at the end,
3462 * because ECDSA may ignore the last few bits of the input. */
3463 input_data->x[0] ^= 1;
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003464 TEST_EQUAL( psa_asymmetric_verify( handle, alg,
3465 input_data->x, input_data->len,
3466 signature, signature_length ),
3467 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine9911b022018-06-29 17:30:48 +02003468 }
3469
3470exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003471 psa_destroy_key( handle );
Gilles Peskine9911b022018-06-29 17:30:48 +02003472 mbedtls_free( signature );
3473 mbedtls_psa_crypto_free( );
3474}
3475/* END_CASE */
3476
3477/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003478void asymmetric_verify( int key_type_arg, data_t *key_data,
3479 int alg_arg, data_t *hash_data,
3480 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03003481{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003482 psa_key_handle_t handle = 0;
itayzafrir5c753392018-05-08 11:18:38 +03003483 psa_key_type_t key_type = key_type_arg;
3484 psa_algorithm_t alg = alg_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003485 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003486
Gilles Peskine69c12672018-06-28 00:07:19 +02003487 TEST_ASSERT( signature_data->len <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
3488
Gilles Peskine8817f612018-12-18 00:18:46 +01003489 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir5c753392018-05-08 11:18:38 +03003490
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003491 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003492 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003493 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
itayzafrir5c753392018-05-08 11:18:38 +03003494
Gilles Peskine8817f612018-12-18 00:18:46 +01003495 PSA_ASSERT( psa_import_key( handle, key_type,
3496 key_data->x,
3497 key_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03003498
Gilles Peskine8817f612018-12-18 00:18:46 +01003499 PSA_ASSERT( psa_asymmetric_verify( handle, alg,
3500 hash_data->x, hash_data->len,
3501 signature_data->x,
3502 signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03003503exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003504 psa_destroy_key( handle );
itayzafrir5c753392018-05-08 11:18:38 +03003505 mbedtls_psa_crypto_free( );
3506}
3507/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003508
3509/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003510void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
3511 int alg_arg, data_t *hash_data,
3512 data_t *signature_data,
3513 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003514{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003515 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003516 psa_key_type_t key_type = key_type_arg;
3517 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003518 psa_status_t actual_status;
3519 psa_status_t expected_status = expected_status_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003520 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003521
Gilles Peskine8817f612018-12-18 00:18:46 +01003522 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003523
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003524 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003525 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003526 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003527
Gilles Peskine8817f612018-12-18 00:18:46 +01003528 PSA_ASSERT( psa_import_key( handle, key_type,
3529 key_data->x,
3530 key_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003531
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003532 actual_status = psa_asymmetric_verify( handle, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003533 hash_data->x, hash_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02003534 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003535 signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003536
Gilles Peskinefe11b722018-12-18 00:24:04 +01003537 TEST_EQUAL( actual_status, expected_status );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003538
3539exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003540 psa_destroy_key( handle );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003541 mbedtls_psa_crypto_free( );
3542}
3543/* END_CASE */
3544
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003545/* BEGIN_CASE */
Gilles Peskine656896e2018-06-29 19:12:28 +02003546void asymmetric_encrypt( int key_type_arg,
3547 data_t *key_data,
3548 int alg_arg,
3549 data_t *input_data,
Gilles Peskine68428122018-06-30 18:42:41 +02003550 data_t *label,
Gilles Peskine656896e2018-06-29 19:12:28 +02003551 int expected_output_length_arg,
3552 int expected_status_arg )
3553{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003554 psa_key_handle_t handle = 0;
Gilles Peskine656896e2018-06-29 19:12:28 +02003555 psa_key_type_t key_type = key_type_arg;
3556 psa_algorithm_t alg = alg_arg;
3557 size_t expected_output_length = expected_output_length_arg;
3558 size_t key_bits;
3559 unsigned char *output = NULL;
3560 size_t output_size;
3561 size_t output_length = ~0;
3562 psa_status_t actual_status;
3563 psa_status_t expected_status = expected_status_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003564 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003565
Gilles Peskine8817f612018-12-18 00:18:46 +01003566 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003567
Gilles Peskine656896e2018-06-29 19:12:28 +02003568 /* Import the key */
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003569 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003570 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003571 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
3572 PSA_ASSERT( psa_import_key( handle, key_type,
3573 key_data->x,
3574 key_data->len ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003575
3576 /* Determine the maximum output length */
Gilles Peskine8817f612018-12-18 00:18:46 +01003577 PSA_ASSERT( psa_get_key_information( handle,
3578 NULL,
3579 &key_bits ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003580 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003581 ASSERT_ALLOC( output, output_size );
Gilles Peskine656896e2018-06-29 19:12:28 +02003582
3583 /* Encrypt the input */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003584 actual_status = psa_asymmetric_encrypt( handle, alg,
Gilles Peskine656896e2018-06-29 19:12:28 +02003585 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003586 label->x, label->len,
Gilles Peskine656896e2018-06-29 19:12:28 +02003587 output, output_size,
3588 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003589 TEST_EQUAL( actual_status, expected_status );
3590 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine656896e2018-06-29 19:12:28 +02003591
Gilles Peskine68428122018-06-30 18:42:41 +02003592 /* If the label is empty, the test framework puts a non-null pointer
3593 * in label->x. Test that a null pointer works as well. */
3594 if( label->len == 0 )
3595 {
3596 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003597 if( output_size != 0 )
3598 memset( output, 0, output_size );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003599 actual_status = psa_asymmetric_encrypt( handle, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02003600 input_data->x, input_data->len,
3601 NULL, label->len,
3602 output, output_size,
3603 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003604 TEST_EQUAL( actual_status, expected_status );
3605 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003606 }
3607
Gilles Peskine656896e2018-06-29 19:12:28 +02003608exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003609 psa_destroy_key( handle );
Gilles Peskine656896e2018-06-29 19:12:28 +02003610 mbedtls_free( output );
3611 mbedtls_psa_crypto_free( );
3612}
3613/* END_CASE */
3614
3615/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003616void asymmetric_encrypt_decrypt( int key_type_arg,
3617 data_t *key_data,
3618 int alg_arg,
3619 data_t *input_data,
3620 data_t *label )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003621{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003622 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003623 psa_key_type_t key_type = key_type_arg;
3624 psa_algorithm_t alg = alg_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003625 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003626 unsigned char *output = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003627 size_t output_size;
3628 size_t output_length = ~0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003629 unsigned char *output2 = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003630 size_t output2_size;
3631 size_t output2_length = ~0;
Jaeden Amero70261c52019-01-04 11:47:20 +00003632 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003633
Gilles Peskine8817f612018-12-18 00:18:46 +01003634 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003635
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003636 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003637 psa_key_policy_set_usage( &policy,
3638 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003639 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003640 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003641
Gilles Peskine8817f612018-12-18 00:18:46 +01003642 PSA_ASSERT( psa_import_key( handle, key_type,
3643 key_data->x,
3644 key_data->len ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003645
3646 /* Determine the maximum ciphertext length */
Gilles Peskine8817f612018-12-18 00:18:46 +01003647 PSA_ASSERT( psa_get_key_information( handle,
3648 NULL,
3649 &key_bits ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003650 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003651 ASSERT_ALLOC( output, output_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003652 output2_size = input_data->len;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003653 ASSERT_ALLOC( output2, output2_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003654
Gilles Peskineeebd7382018-06-08 18:11:54 +02003655 /* We test encryption by checking that encrypt-then-decrypt gives back
3656 * the original plaintext because of the non-optional random
3657 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003658 PSA_ASSERT( psa_asymmetric_encrypt( handle, alg,
3659 input_data->x, input_data->len,
3660 label->x, label->len,
3661 output, output_size,
3662 &output_length ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003663 /* We don't know what ciphertext length to expect, but check that
3664 * it looks sensible. */
3665 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003666
Gilles Peskine8817f612018-12-18 00:18:46 +01003667 PSA_ASSERT( psa_asymmetric_decrypt( handle, alg,
3668 output, output_length,
3669 label->x, label->len,
3670 output2, output2_size,
3671 &output2_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003672 ASSERT_COMPARE( input_data->x, input_data->len,
3673 output2, output2_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003674
3675exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003676 psa_destroy_key( handle );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003677 mbedtls_free( output );
3678 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003679 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003680}
3681/* END_CASE */
3682
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003683/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003684void asymmetric_decrypt( int key_type_arg,
3685 data_t *key_data,
3686 int alg_arg,
3687 data_t *input_data,
3688 data_t *label,
Gilles Peskine66763a02018-06-29 21:54:10 +02003689 data_t *expected_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003690{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003691 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003692 psa_key_type_t key_type = key_type_arg;
3693 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003694 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03003695 size_t output_size = 0;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003696 size_t output_length = ~0;
Jaeden Amero70261c52019-01-04 11:47:20 +00003697 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003698
Jaeden Amero412654a2019-02-06 12:57:46 +00003699 output_size = expected_data->len;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003700 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003701
Gilles Peskine8817f612018-12-18 00:18:46 +01003702 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003703
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003704 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003705 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003706 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003707
Gilles Peskine8817f612018-12-18 00:18:46 +01003708 PSA_ASSERT( psa_import_key( handle, key_type,
3709 key_data->x,
3710 key_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003711
Gilles Peskine8817f612018-12-18 00:18:46 +01003712 PSA_ASSERT( psa_asymmetric_decrypt( handle, alg,
3713 input_data->x, input_data->len,
3714 label->x, label->len,
3715 output,
3716 output_size,
3717 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003718 ASSERT_COMPARE( expected_data->x, expected_data->len,
3719 output, output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003720
Gilles Peskine68428122018-06-30 18:42:41 +02003721 /* If the label is empty, the test framework puts a non-null pointer
3722 * in label->x. Test that a null pointer works as well. */
3723 if( label->len == 0 )
3724 {
3725 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003726 if( output_size != 0 )
3727 memset( output, 0, output_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01003728 PSA_ASSERT( psa_asymmetric_decrypt( handle, alg,
3729 input_data->x, input_data->len,
3730 NULL, label->len,
3731 output,
3732 output_size,
3733 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003734 ASSERT_COMPARE( expected_data->x, expected_data->len,
3735 output, output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003736 }
3737
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003738exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003739 psa_destroy_key( handle );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003740 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003741 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003742}
3743/* END_CASE */
3744
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003745/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003746void asymmetric_decrypt_fail( int key_type_arg,
3747 data_t *key_data,
3748 int alg_arg,
3749 data_t *input_data,
3750 data_t *label,
Jaeden Amerof8daab72019-02-06 12:57:46 +00003751 int output_size_arg,
Gilles Peskine2d277862018-06-18 15:41:12 +02003752 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003753{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003754 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003755 psa_key_type_t key_type = key_type_arg;
3756 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003757 unsigned char *output = NULL;
Jaeden Amerof8daab72019-02-06 12:57:46 +00003758 size_t output_size = output_size_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003759 size_t output_length = ~0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003760 psa_status_t actual_status;
3761 psa_status_t expected_status = expected_status_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003762 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003763
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003764 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003765
Gilles Peskine8817f612018-12-18 00:18:46 +01003766 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003767
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003768 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003769 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003770 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003771
Gilles Peskine8817f612018-12-18 00:18:46 +01003772 PSA_ASSERT( psa_import_key( handle, key_type,
3773 key_data->x,
3774 key_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003775
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003776 actual_status = psa_asymmetric_decrypt( handle, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003777 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003778 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003779 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02003780 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003781 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003782 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003783
Gilles Peskine68428122018-06-30 18:42:41 +02003784 /* If the label is empty, the test framework puts a non-null pointer
3785 * in label->x. Test that a null pointer works as well. */
3786 if( label->len == 0 )
3787 {
3788 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003789 if( output_size != 0 )
3790 memset( output, 0, output_size );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003791 actual_status = psa_asymmetric_decrypt( handle, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02003792 input_data->x, input_data->len,
3793 NULL, label->len,
3794 output, output_size,
3795 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003796 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003797 TEST_ASSERT( output_length <= output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02003798 }
3799
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003800exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003801 psa_destroy_key( handle );
Gilles Peskine2d277862018-06-18 15:41:12 +02003802 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003803 mbedtls_psa_crypto_free( );
3804}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003805/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02003806
3807/* BEGIN_CASE */
Jaeden Amerod94d6712019-01-04 14:11:48 +00003808void crypto_generator_init( )
3809{
3810 /* Test each valid way of initializing the object, except for `= {0}`, as
3811 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
3812 * though it's OK by the C standard. We could test for this, but we'd need
3813 * to supress the Clang warning for the test. */
Jaeden Amero5229bbb2019-02-07 16:33:37 +00003814 size_t capacity;
Jaeden Amerod94d6712019-01-04 14:11:48 +00003815 psa_crypto_generator_t func = psa_crypto_generator_init( );
3816 psa_crypto_generator_t init = PSA_CRYPTO_GENERATOR_INIT;
3817 psa_crypto_generator_t zero;
3818
3819 memset( &zero, 0, sizeof( zero ) );
3820
Jaeden Amero5229bbb2019-02-07 16:33:37 +00003821 /* A default generator should have no capacity. */
3822 PSA_ASSERT( psa_get_generator_capacity( &func, &capacity ) );
3823 TEST_EQUAL( capacity, 0 );
3824 PSA_ASSERT( psa_get_generator_capacity( &init, &capacity ) );
3825 TEST_EQUAL( capacity, 0 );
3826 PSA_ASSERT( psa_get_generator_capacity( &zero, &capacity ) );
3827 TEST_EQUAL( capacity, 0 );
3828
3829 /* A default generator should be abortable without error. */
3830 PSA_ASSERT( psa_generator_abort(&func) );
3831 PSA_ASSERT( psa_generator_abort(&init) );
3832 PSA_ASSERT( psa_generator_abort(&zero) );
Jaeden Amerod94d6712019-01-04 14:11:48 +00003833}
3834/* END_CASE */
3835
3836/* BEGIN_CASE */
Gilles Peskineea0fb492018-07-12 17:17:20 +02003837void derive_setup( int key_type_arg,
3838 data_t *key_data,
3839 int alg_arg,
3840 data_t *salt,
3841 data_t *label,
3842 int requested_capacity_arg,
3843 int expected_status_arg )
3844{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003845 psa_key_handle_t handle = 0;
Gilles Peskineea0fb492018-07-12 17:17:20 +02003846 size_t key_type = key_type_arg;
3847 psa_algorithm_t alg = alg_arg;
3848 size_t requested_capacity = requested_capacity_arg;
3849 psa_status_t expected_status = expected_status_arg;
3850 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00003851 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02003852
Gilles Peskine8817f612018-12-18 00:18:46 +01003853 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003854
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003855 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003856 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003857 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003858
Gilles Peskine8817f612018-12-18 00:18:46 +01003859 PSA_ASSERT( psa_import_key( handle, key_type,
3860 key_data->x,
3861 key_data->len ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003862
Gilles Peskinefe11b722018-12-18 00:24:04 +01003863 TEST_EQUAL( psa_key_derivation( &generator, handle, alg,
3864 salt->x, salt->len,
3865 label->x, label->len,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003866 requested_capacity ),
3867 expected_status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003868
3869exit:
3870 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003871 psa_destroy_key( handle );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003872 mbedtls_psa_crypto_free( );
3873}
3874/* END_CASE */
3875
3876/* BEGIN_CASE */
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02003877void test_derive_invalid_generator_state( )
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03003878{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003879 psa_key_handle_t handle = 0;
Nir Sonnenschein4eda37b2018-10-31 12:15:58 +02003880 size_t key_type = PSA_KEY_TYPE_DERIVE;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003881 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003882 psa_algorithm_t alg = PSA_ALG_HKDF( PSA_ALG_SHA_256 );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003883 uint8_t buffer[42];
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003884 size_t capacity = sizeof( buffer );
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02003885 const uint8_t key_data[22] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
3886 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
3887 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
Jaeden Amero70261c52019-01-04 11:47:20 +00003888 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03003889
Gilles Peskine8817f612018-12-18 00:18:46 +01003890 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003891
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003892 PSA_ASSERT( psa_allocate_key( &handle ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003893 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003894 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003895
Gilles Peskine8817f612018-12-18 00:18:46 +01003896 PSA_ASSERT( psa_import_key( handle, key_type,
3897 key_data,
3898 sizeof( key_data ) ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003899
3900 /* valid key derivation */
Gilles Peskine8817f612018-12-18 00:18:46 +01003901 PSA_ASSERT( psa_key_derivation( &generator, handle, alg,
3902 NULL, 0,
3903 NULL, 0,
3904 capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003905
3906 /* state of generator shouldn't allow additional generation */
Gilles Peskinefe11b722018-12-18 00:24:04 +01003907 TEST_EQUAL( psa_key_derivation( &generator, handle, alg,
3908 NULL, 0,
3909 NULL, 0,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003910 capacity ),
3911 PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003912
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003913 PSA_ASSERT( psa_generator_read( &generator, buffer, capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003914
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003915 TEST_EQUAL( psa_generator_read( &generator, buffer, capacity ),
3916 PSA_ERROR_INSUFFICIENT_CAPACITY );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003917
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003918exit:
3919 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003920 psa_destroy_key( handle );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003921 mbedtls_psa_crypto_free( );
3922}
3923/* END_CASE */
3924
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003925/* BEGIN_CASE */
3926void test_derive_invalid_generator_tests( )
3927{
3928 uint8_t output_buffer[16];
3929 size_t buffer_size = 16;
3930 size_t capacity = 0;
3931 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3932
Nir Sonnenschein50789302018-10-31 12:16:38 +02003933 TEST_ASSERT( psa_generator_read( &generator, output_buffer, buffer_size )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003934 == PSA_ERROR_INSUFFICIENT_CAPACITY ); // should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003935
3936 TEST_ASSERT( psa_get_generator_capacity( &generator, &capacity )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003937 == PSA_SUCCESS ); // should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003938
Gilles Peskine8817f612018-12-18 00:18:46 +01003939 PSA_ASSERT( psa_generator_abort( &generator ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003940
Nir Sonnenschein50789302018-10-31 12:16:38 +02003941 TEST_ASSERT( psa_generator_read( &generator, output_buffer, buffer_size )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003942 == PSA_ERROR_INSUFFICIENT_CAPACITY ); // should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003943
Nir Sonnenschein50789302018-10-31 12:16:38 +02003944 TEST_ASSERT( psa_get_generator_capacity( &generator, &capacity )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003945 == PSA_SUCCESS );// should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003946
3947exit:
3948 psa_generator_abort( &generator );
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03003949}
3950/* END_CASE */
3951
3952/* BEGIN_CASE */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003953void derive_output( int alg_arg,
3954 data_t *key_data,
3955 data_t *salt,
3956 data_t *label,
3957 int requested_capacity_arg,
3958 data_t *expected_output1,
3959 data_t *expected_output2 )
3960{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003961 psa_key_handle_t handle = 0;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003962 psa_algorithm_t alg = alg_arg;
3963 size_t requested_capacity = requested_capacity_arg;
3964 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3965 uint8_t *expected_outputs[2] =
3966 {expected_output1->x, expected_output2->x};
3967 size_t output_sizes[2] =
3968 {expected_output1->len, expected_output2->len};
3969 size_t output_buffer_size = 0;
3970 uint8_t *output_buffer = NULL;
3971 size_t expected_capacity;
3972 size_t current_capacity;
Jaeden Amero70261c52019-01-04 11:47:20 +00003973 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003974 psa_status_t status;
3975 unsigned i;
3976
3977 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
3978 {
3979 if( output_sizes[i] > output_buffer_size )
3980 output_buffer_size = output_sizes[i];
3981 if( output_sizes[i] == 0 )
3982 expected_outputs[i] = NULL;
3983 }
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003984 ASSERT_ALLOC( output_buffer, output_buffer_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01003985 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003986
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003987 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003988 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003989 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003990
Gilles Peskine8817f612018-12-18 00:18:46 +01003991 PSA_ASSERT( psa_import_key( handle, PSA_KEY_TYPE_DERIVE,
3992 key_data->x,
3993 key_data->len ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003994
3995 /* Extraction phase. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003996 PSA_ASSERT( psa_key_derivation( &generator, handle, alg,
3997 salt->x, salt->len,
3998 label->x, label->len,
3999 requested_capacity ) );
4000 PSA_ASSERT( psa_get_generator_capacity( &generator,
4001 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004002 TEST_EQUAL( current_capacity, requested_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004003 expected_capacity = requested_capacity;
4004
4005 /* Expansion phase. */
4006 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4007 {
4008 /* Read some bytes. */
4009 status = psa_generator_read( &generator,
4010 output_buffer, output_sizes[i] );
4011 if( expected_capacity == 0 && output_sizes[i] == 0 )
4012 {
4013 /* Reading 0 bytes when 0 bytes are available can go either way. */
4014 TEST_ASSERT( status == PSA_SUCCESS ||
4015 status == PSA_ERROR_INSUFFICIENT_CAPACITY );
4016 continue;
4017 }
4018 else if( expected_capacity == 0 ||
4019 output_sizes[i] > expected_capacity )
4020 {
4021 /* Capacity exceeded. */
Gilles Peskinefe11b722018-12-18 00:24:04 +01004022 TEST_EQUAL( status, PSA_ERROR_INSUFFICIENT_CAPACITY );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004023 expected_capacity = 0;
4024 continue;
4025 }
4026 /* Success. Check the read data. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004027 PSA_ASSERT( status );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004028 if( output_sizes[i] != 0 )
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004029 ASSERT_COMPARE( output_buffer, output_sizes[i],
4030 expected_outputs[i], output_sizes[i] );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004031 /* Check the generator status. */
4032 expected_capacity -= output_sizes[i];
Gilles Peskine8817f612018-12-18 00:18:46 +01004033 PSA_ASSERT( psa_get_generator_capacity( &generator,
4034 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004035 TEST_EQUAL( expected_capacity, current_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004036 }
Gilles Peskine8817f612018-12-18 00:18:46 +01004037 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004038
4039exit:
4040 mbedtls_free( output_buffer );
4041 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004042 psa_destroy_key( handle );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004043 mbedtls_psa_crypto_free( );
4044}
4045/* END_CASE */
4046
4047/* BEGIN_CASE */
Gilles Peskined54931c2018-07-17 21:06:59 +02004048void derive_full( int alg_arg,
4049 data_t *key_data,
4050 data_t *salt,
4051 data_t *label,
4052 int requested_capacity_arg )
4053{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004054 psa_key_handle_t handle = 0;
Gilles Peskined54931c2018-07-17 21:06:59 +02004055 psa_algorithm_t alg = alg_arg;
4056 size_t requested_capacity = requested_capacity_arg;
4057 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
4058 unsigned char output_buffer[16];
4059 size_t expected_capacity = requested_capacity;
4060 size_t current_capacity;
Jaeden Amero70261c52019-01-04 11:47:20 +00004061 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004062
Gilles Peskine8817f612018-12-18 00:18:46 +01004063 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004064
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004065 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004066 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004067 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004068
Gilles Peskine8817f612018-12-18 00:18:46 +01004069 PSA_ASSERT( psa_import_key( handle, PSA_KEY_TYPE_DERIVE,
4070 key_data->x,
4071 key_data->len ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004072
4073 /* Extraction phase. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004074 PSA_ASSERT( psa_key_derivation( &generator, handle, alg,
4075 salt->x, salt->len,
4076 label->x, label->len,
4077 requested_capacity ) );
4078 PSA_ASSERT( psa_get_generator_capacity( &generator,
4079 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004080 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004081
4082 /* Expansion phase. */
4083 while( current_capacity > 0 )
4084 {
4085 size_t read_size = sizeof( output_buffer );
4086 if( read_size > current_capacity )
4087 read_size = current_capacity;
Gilles Peskine8817f612018-12-18 00:18:46 +01004088 PSA_ASSERT( psa_generator_read( &generator,
4089 output_buffer,
4090 read_size ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004091 expected_capacity -= read_size;
Gilles Peskine8817f612018-12-18 00:18:46 +01004092 PSA_ASSERT( psa_get_generator_capacity( &generator,
4093 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004094 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004095 }
4096
4097 /* Check that the generator refuses to go over capacity. */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004098 TEST_EQUAL( psa_generator_read( &generator, output_buffer, 1 ),
4099 PSA_ERROR_INSUFFICIENT_CAPACITY );
Gilles Peskined54931c2018-07-17 21:06:59 +02004100
Gilles Peskine8817f612018-12-18 00:18:46 +01004101 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004102
4103exit:
4104 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004105 psa_destroy_key( handle );
Gilles Peskined54931c2018-07-17 21:06:59 +02004106 mbedtls_psa_crypto_free( );
4107}
4108/* END_CASE */
4109
4110/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02004111void derive_key_exercise( int alg_arg,
4112 data_t *key_data,
4113 data_t *salt,
4114 data_t *label,
4115 int derived_type_arg,
4116 int derived_bits_arg,
4117 int derived_usage_arg,
4118 int derived_alg_arg )
4119{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004120 psa_key_handle_t base_handle = 0;
4121 psa_key_handle_t derived_handle = 0;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004122 psa_algorithm_t alg = alg_arg;
4123 psa_key_type_t derived_type = derived_type_arg;
4124 size_t derived_bits = derived_bits_arg;
4125 psa_key_usage_t derived_usage = derived_usage_arg;
4126 psa_algorithm_t derived_alg = derived_alg_arg;
4127 size_t capacity = PSA_BITS_TO_BYTES( derived_bits );
4128 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004129 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004130 psa_key_type_t got_type;
4131 size_t got_bits;
4132
Gilles Peskine8817f612018-12-18 00:18:46 +01004133 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004134
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004135 PSA_ASSERT( psa_allocate_key( &base_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004136 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004137 PSA_ASSERT( psa_set_key_policy( base_handle, &policy ) );
4138 PSA_ASSERT( psa_import_key( base_handle, PSA_KEY_TYPE_DERIVE,
4139 key_data->x,
4140 key_data->len ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004141
4142 /* Derive a key. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004143 PSA_ASSERT( psa_key_derivation( &generator, base_handle, alg,
4144 salt->x, salt->len,
4145 label->x, label->len,
4146 capacity ) );
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004147 PSA_ASSERT( psa_allocate_key( &derived_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004148 psa_key_policy_set_usage( &policy, derived_usage, derived_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004149 PSA_ASSERT( psa_set_key_policy( derived_handle, &policy ) );
4150 PSA_ASSERT( psa_generator_import_key( derived_handle,
4151 derived_type,
4152 derived_bits,
4153 &generator ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004154
4155 /* Test the key information */
Gilles Peskine8817f612018-12-18 00:18:46 +01004156 PSA_ASSERT( psa_get_key_information( derived_handle,
4157 &got_type,
4158 &got_bits ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004159 TEST_EQUAL( got_type, derived_type );
4160 TEST_EQUAL( got_bits, derived_bits );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004161
4162 /* Exercise the derived key. */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004163 if( ! exercise_key( derived_handle, derived_usage, derived_alg ) )
Gilles Peskine0386fba2018-07-12 17:29:22 +02004164 goto exit;
4165
4166exit:
4167 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004168 psa_destroy_key( base_handle );
4169 psa_destroy_key( derived_handle );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004170 mbedtls_psa_crypto_free( );
4171}
4172/* END_CASE */
4173
4174/* BEGIN_CASE */
4175void derive_key_export( int alg_arg,
4176 data_t *key_data,
4177 data_t *salt,
4178 data_t *label,
4179 int bytes1_arg,
4180 int bytes2_arg )
4181{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004182 psa_key_handle_t base_handle = 0;
4183 psa_key_handle_t derived_handle = 0;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004184 psa_algorithm_t alg = alg_arg;
4185 size_t bytes1 = bytes1_arg;
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004186 size_t derived_bits = PSA_BYTES_TO_BITS( bytes1 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004187 size_t bytes2 = bytes2_arg;
4188 size_t capacity = bytes1 + bytes2;
4189 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004190 uint8_t *output_buffer = NULL;
4191 uint8_t *export_buffer = NULL;
Jaeden Amero70261c52019-01-04 11:47:20 +00004192 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004193 size_t length;
4194
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004195 ASSERT_ALLOC( output_buffer, capacity );
4196 ASSERT_ALLOC( export_buffer, capacity );
Gilles Peskine8817f612018-12-18 00:18:46 +01004197 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004198
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004199 PSA_ASSERT( psa_allocate_key( &base_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004200 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004201 PSA_ASSERT( psa_set_key_policy( base_handle, &policy ) );
4202 PSA_ASSERT( psa_import_key( base_handle, PSA_KEY_TYPE_DERIVE,
4203 key_data->x,
4204 key_data->len ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004205
4206 /* Derive some material and output it. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004207 PSA_ASSERT( psa_key_derivation( &generator, base_handle, alg,
4208 salt->x, salt->len,
4209 label->x, label->len,
4210 capacity ) );
4211 PSA_ASSERT( psa_generator_read( &generator,
4212 output_buffer,
4213 capacity ) );
4214 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004215
4216 /* Derive the same output again, but this time store it in key objects. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004217 PSA_ASSERT( psa_key_derivation( &generator, base_handle, alg,
4218 salt->x, salt->len,
4219 label->x, label->len,
4220 capacity ) );
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004221 PSA_ASSERT( psa_allocate_key( &derived_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004222 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, 0 );
Gilles Peskine8817f612018-12-18 00:18:46 +01004223 PSA_ASSERT( psa_set_key_policy( derived_handle, &policy ) );
4224 PSA_ASSERT( psa_generator_import_key( derived_handle,
4225 PSA_KEY_TYPE_RAW_DATA,
4226 derived_bits,
4227 &generator ) );
4228 PSA_ASSERT( psa_export_key( derived_handle,
4229 export_buffer, bytes1,
4230 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004231 TEST_EQUAL( length, bytes1 );
Gilles Peskine8817f612018-12-18 00:18:46 +01004232 PSA_ASSERT( psa_destroy_key( derived_handle ) );
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004233 PSA_ASSERT( psa_allocate_key( &derived_handle ) );
Gilles Peskine8817f612018-12-18 00:18:46 +01004234 PSA_ASSERT( psa_set_key_policy( derived_handle, &policy ) );
4235 PSA_ASSERT( psa_generator_import_key( derived_handle,
4236 PSA_KEY_TYPE_RAW_DATA,
4237 PSA_BYTES_TO_BITS( bytes2 ),
4238 &generator ) );
4239 PSA_ASSERT( psa_export_key( derived_handle,
4240 export_buffer + bytes1, bytes2,
4241 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004242 TEST_EQUAL( length, bytes2 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004243
4244 /* Compare the outputs from the two runs. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004245 ASSERT_COMPARE( output_buffer, bytes1 + bytes2,
4246 export_buffer, capacity );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004247
4248exit:
4249 mbedtls_free( output_buffer );
4250 mbedtls_free( export_buffer );
4251 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004252 psa_destroy_key( base_handle );
4253 psa_destroy_key( derived_handle );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004254 mbedtls_psa_crypto_free( );
4255}
4256/* END_CASE */
4257
4258/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02004259void key_agreement_setup( int alg_arg,
4260 int our_key_type_arg, data_t *our_key_data,
4261 data_t *peer_key_data,
4262 int expected_status_arg )
4263{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004264 psa_key_handle_t our_key = 0;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004265 psa_algorithm_t alg = alg_arg;
4266 psa_key_type_t our_key_type = our_key_type_arg;
4267 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004268 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004269
Gilles Peskine8817f612018-12-18 00:18:46 +01004270 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004271
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004272 PSA_ASSERT( psa_allocate_key( &our_key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004273 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004274 PSA_ASSERT( psa_set_key_policy( our_key, &policy ) );
4275 PSA_ASSERT( psa_import_key( our_key, our_key_type,
4276 our_key_data->x,
4277 our_key_data->len ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004278
Gilles Peskinefe11b722018-12-18 00:24:04 +01004279 TEST_EQUAL( psa_key_agreement( &generator,
4280 our_key,
4281 peer_key_data->x, peer_key_data->len,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004282 alg ),
4283 expected_status_arg );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004284
4285exit:
4286 psa_generator_abort( &generator );
4287 psa_destroy_key( our_key );
4288 mbedtls_psa_crypto_free( );
4289}
4290/* END_CASE */
4291
4292/* BEGIN_CASE */
Gilles Peskine59685592018-09-18 12:11:34 +02004293void key_agreement_capacity( int alg_arg,
4294 int our_key_type_arg, data_t *our_key_data,
4295 data_t *peer_key_data,
4296 int expected_capacity_arg )
4297{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004298 psa_key_handle_t our_key = 0;
Gilles Peskine59685592018-09-18 12:11:34 +02004299 psa_algorithm_t alg = alg_arg;
4300 psa_key_type_t our_key_type = our_key_type_arg;
4301 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004302 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004303 size_t actual_capacity;
Gilles Peskinebf491972018-10-25 22:36:12 +02004304 unsigned char output[16];
Gilles Peskine59685592018-09-18 12:11:34 +02004305
Gilles Peskine8817f612018-12-18 00:18:46 +01004306 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004307
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004308 PSA_ASSERT( psa_allocate_key( &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004309 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004310 PSA_ASSERT( psa_set_key_policy( our_key, &policy ) );
4311 PSA_ASSERT( psa_import_key( our_key, our_key_type,
4312 our_key_data->x,
4313 our_key_data->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004314
Gilles Peskine8817f612018-12-18 00:18:46 +01004315 PSA_ASSERT( psa_key_agreement( &generator,
4316 our_key,
4317 peer_key_data->x, peer_key_data->len,
4318 alg ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004319
Gilles Peskinebf491972018-10-25 22:36:12 +02004320 /* Test the advertized capacity. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004321 PSA_ASSERT( psa_get_generator_capacity(
4322 &generator, &actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004323 TEST_EQUAL( actual_capacity, (size_t) expected_capacity_arg );
Gilles Peskine59685592018-09-18 12:11:34 +02004324
Gilles Peskinebf491972018-10-25 22:36:12 +02004325 /* Test the actual capacity by reading the output. */
4326 while( actual_capacity > sizeof( output ) )
4327 {
Gilles Peskine8817f612018-12-18 00:18:46 +01004328 PSA_ASSERT( psa_generator_read( &generator,
4329 output, sizeof( output ) ) );
Gilles Peskinebf491972018-10-25 22:36:12 +02004330 actual_capacity -= sizeof( output );
4331 }
Gilles Peskine8817f612018-12-18 00:18:46 +01004332 PSA_ASSERT( psa_generator_read( &generator,
4333 output, actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004334 TEST_EQUAL( psa_generator_read( &generator, output, 1 ),
4335 PSA_ERROR_INSUFFICIENT_CAPACITY );
Gilles Peskinebf491972018-10-25 22:36:12 +02004336
Gilles Peskine59685592018-09-18 12:11:34 +02004337exit:
4338 psa_generator_abort( &generator );
4339 psa_destroy_key( our_key );
4340 mbedtls_psa_crypto_free( );
4341}
4342/* END_CASE */
4343
4344/* BEGIN_CASE */
4345void key_agreement_output( int alg_arg,
4346 int our_key_type_arg, data_t *our_key_data,
4347 data_t *peer_key_data,
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004348 data_t *expected_output1, data_t *expected_output2 )
Gilles Peskine59685592018-09-18 12:11:34 +02004349{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004350 psa_key_handle_t our_key = 0;
Gilles Peskine59685592018-09-18 12:11:34 +02004351 psa_algorithm_t alg = alg_arg;
4352 psa_key_type_t our_key_type = our_key_type_arg;
4353 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004354 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004355 uint8_t *actual_output = NULL;
Gilles Peskine59685592018-09-18 12:11:34 +02004356
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004357 ASSERT_ALLOC( actual_output, MAX( expected_output1->len,
4358 expected_output2->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004359
Gilles Peskine8817f612018-12-18 00:18:46 +01004360 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004361
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004362 PSA_ASSERT( psa_allocate_key( &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004363 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004364 PSA_ASSERT( psa_set_key_policy( our_key, &policy ) );
4365 PSA_ASSERT( psa_import_key( our_key, our_key_type,
4366 our_key_data->x,
4367 our_key_data->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004368
Gilles Peskine8817f612018-12-18 00:18:46 +01004369 PSA_ASSERT( psa_key_agreement( &generator,
4370 our_key,
4371 peer_key_data->x, peer_key_data->len,
4372 alg ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004373
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004374 PSA_ASSERT( psa_generator_read( &generator,
4375 actual_output,
4376 expected_output1->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004377 ASSERT_COMPARE( actual_output, expected_output1->len,
4378 expected_output1->x, expected_output1->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004379 if( expected_output2->len != 0 )
4380 {
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004381 PSA_ASSERT( psa_generator_read( &generator,
4382 actual_output,
4383 expected_output2->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004384 ASSERT_COMPARE( actual_output, expected_output2->len,
4385 expected_output2->x, expected_output2->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004386 }
Gilles Peskine59685592018-09-18 12:11:34 +02004387
4388exit:
4389 psa_generator_abort( &generator );
4390 psa_destroy_key( our_key );
4391 mbedtls_psa_crypto_free( );
4392 mbedtls_free( actual_output );
4393}
4394/* END_CASE */
4395
4396/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02004397void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02004398{
Gilles Peskinea50d7392018-06-21 10:22:13 +02004399 size_t bytes = bytes_arg;
4400 const unsigned char trail[] = "don't overwrite me";
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004401 unsigned char *output = NULL;
4402 unsigned char *changed = NULL;
Gilles Peskinea50d7392018-06-21 10:22:13 +02004403 size_t i;
4404 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02004405
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004406 ASSERT_ALLOC( output, bytes + sizeof( trail ) );
4407 ASSERT_ALLOC( changed, bytes );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004408 memcpy( output + bytes, trail, sizeof( trail ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02004409
Gilles Peskine8817f612018-12-18 00:18:46 +01004410 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02004411
Gilles Peskinea50d7392018-06-21 10:22:13 +02004412 /* Run several times, to ensure that every output byte will be
4413 * nonzero at least once with overwhelming probability
4414 * (2^(-8*number_of_runs)). */
4415 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02004416 {
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004417 if( bytes != 0 )
4418 memset( output, 0, bytes );
Gilles Peskine8817f612018-12-18 00:18:46 +01004419 PSA_ASSERT( psa_generate_random( output, bytes ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004420
4421 /* Check that no more than bytes have been overwritten */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004422 ASSERT_COMPARE( output + bytes, sizeof( trail ),
4423 trail, sizeof( trail ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004424
4425 for( i = 0; i < bytes; i++ )
4426 {
4427 if( output[i] != 0 )
4428 ++changed[i];
4429 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004430 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02004431
4432 /* Check that every byte was changed to nonzero at least once. This
4433 * validates that psa_generate_random is overwriting every byte of
4434 * the output buffer. */
4435 for( i = 0; i < bytes; i++ )
4436 {
4437 TEST_ASSERT( changed[i] != 0 );
4438 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004439
4440exit:
4441 mbedtls_psa_crypto_free( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004442 mbedtls_free( output );
4443 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02004444}
4445/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02004446
4447/* BEGIN_CASE */
4448void generate_key( int type_arg,
4449 int bits_arg,
4450 int usage_arg,
4451 int alg_arg,
4452 int expected_status_arg )
4453{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004454 psa_key_handle_t handle = 0;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004455 psa_key_type_t type = type_arg;
4456 psa_key_usage_t usage = usage_arg;
4457 size_t bits = bits_arg;
4458 psa_algorithm_t alg = alg_arg;
4459 psa_status_t expected_status = expected_status_arg;
4460 psa_key_type_t got_type;
4461 size_t got_bits;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004462 psa_status_t expected_info_status =
4463 expected_status == PSA_SUCCESS ? PSA_SUCCESS : PSA_ERROR_EMPTY_SLOT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004464 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004465
Gilles Peskine8817f612018-12-18 00:18:46 +01004466 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004467
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004468 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004469 psa_key_policy_set_usage( &policy, usage, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004470 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004471
4472 /* Generate a key */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004473 TEST_EQUAL( psa_generate_key( handle, type, bits, NULL, 0 ),
4474 expected_status );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004475
4476 /* Test the key information */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004477 TEST_EQUAL( psa_get_key_information( handle, &got_type, &got_bits ),
4478 expected_info_status );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004479 if( expected_info_status != PSA_SUCCESS )
4480 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +01004481 TEST_EQUAL( got_type, type );
4482 TEST_EQUAL( got_bits, bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004483
Gilles Peskine818ca122018-06-20 18:16:48 +02004484 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004485 if( ! exercise_key( handle, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +02004486 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004487
4488exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004489 psa_destroy_key( handle );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004490 mbedtls_psa_crypto_free( );
4491}
4492/* END_CASE */
itayzafrir0adf0fc2018-09-06 16:24:41 +03004493
Darryl Greend49a4992018-06-18 17:27:26 +01004494/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C */
4495void persistent_key_load_key_from_storage( data_t *data, int type_arg,
4496 int bits, int usage_arg,
Darryl Green0c6575a2018-11-07 16:05:30 +00004497 int alg_arg, int generation_method,
4498 int export_status )
Darryl Greend49a4992018-06-18 17:27:26 +01004499{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004500 psa_key_handle_t handle = 0;
4501 psa_key_handle_t base_key;
Darryl Greend49a4992018-06-18 17:27:26 +01004502 psa_key_type_t type = (psa_key_type_t) type_arg;
4503 psa_key_type_t type_get;
4504 size_t bits_get;
Jaeden Amero70261c52019-01-04 11:47:20 +00004505 psa_key_policy_t policy_set = PSA_KEY_POLICY_INIT;
4506 psa_key_policy_t policy_get = PSA_KEY_POLICY_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01004507 psa_key_usage_t policy_usage = (psa_key_usage_t) usage_arg;
4508 psa_algorithm_t policy_alg = (psa_algorithm_t) alg_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00004509 psa_key_policy_t base_policy_set = PSA_KEY_POLICY_INIT;
Darryl Green0c6575a2018-11-07 16:05:30 +00004510 psa_algorithm_t base_policy_alg = PSA_ALG_HKDF(PSA_ALG_SHA_256);
4511 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01004512 unsigned char *first_export = NULL;
4513 unsigned char *second_export = NULL;
4514 size_t export_size = PSA_KEY_EXPORT_MAX_SIZE( type, bits );
4515 size_t first_exported_length;
4516 size_t second_exported_length;
4517
4518 ASSERT_ALLOC( first_export, export_size );
4519 ASSERT_ALLOC( second_export, export_size );
4520
Gilles Peskine8817f612018-12-18 00:18:46 +01004521 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01004522
Gilles Peskine8817f612018-12-18 00:18:46 +01004523 PSA_ASSERT( psa_create_key( PSA_KEY_LIFETIME_PERSISTENT, 1,
Gilles Peskine8817f612018-12-18 00:18:46 +01004524 &handle ) );
Darryl Greend49a4992018-06-18 17:27:26 +01004525 psa_key_policy_set_usage( &policy_set, policy_usage,
4526 policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004527 PSA_ASSERT( psa_set_key_policy( handle, &policy_set ) );
Darryl Greend49a4992018-06-18 17:27:26 +01004528
Darryl Green0c6575a2018-11-07 16:05:30 +00004529 switch( generation_method )
4530 {
4531 case IMPORT_KEY:
4532 /* Import the key */
Gilles Peskine8817f612018-12-18 00:18:46 +01004533 PSA_ASSERT( psa_import_key( handle, type,
4534 data->x, data->len ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004535 break;
Darryl Greend49a4992018-06-18 17:27:26 +01004536
Darryl Green0c6575a2018-11-07 16:05:30 +00004537 case GENERATE_KEY:
4538 /* Generate a key */
Gilles Peskine8817f612018-12-18 00:18:46 +01004539 PSA_ASSERT( psa_generate_key( handle, type, bits,
4540 NULL, 0 ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004541 break;
4542
4543 case DERIVE_KEY:
4544 /* Create base key */
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004545 PSA_ASSERT( psa_allocate_key( &base_key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004546 psa_key_policy_set_usage( &base_policy_set, PSA_KEY_USAGE_DERIVE,
4547 base_policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004548 PSA_ASSERT( psa_set_key_policy(
4549 base_key, &base_policy_set ) );
4550 PSA_ASSERT( psa_import_key( base_key, PSA_KEY_TYPE_DERIVE,
4551 data->x, data->len ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004552 /* Derive a key. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004553 PSA_ASSERT( psa_key_derivation( &generator, base_key,
4554 base_policy_alg,
4555 NULL, 0, NULL, 0,
4556 export_size ) );
4557 PSA_ASSERT( psa_generator_import_key(
4558 handle, PSA_KEY_TYPE_RAW_DATA,
4559 bits, &generator ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004560 break;
4561 }
Darryl Greend49a4992018-06-18 17:27:26 +01004562
4563 /* Export the key */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004564 TEST_EQUAL( psa_export_key( handle,
4565 first_export, export_size,
4566 &first_exported_length ),
4567 export_status );
Darryl Greend49a4992018-06-18 17:27:26 +01004568
4569 /* Shutdown and restart */
4570 mbedtls_psa_crypto_free();
Gilles Peskine8817f612018-12-18 00:18:46 +01004571 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01004572
Darryl Greend49a4992018-06-18 17:27:26 +01004573 /* Check key slot still contains key data */
Gilles Peskine8817f612018-12-18 00:18:46 +01004574 PSA_ASSERT( psa_open_key( PSA_KEY_LIFETIME_PERSISTENT, 1,
4575 &handle ) );
4576 PSA_ASSERT( psa_get_key_information(
4577 handle, &type_get, &bits_get ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004578 TEST_EQUAL( type_get, type );
4579 TEST_EQUAL( bits_get, (size_t) bits );
Darryl Greend49a4992018-06-18 17:27:26 +01004580
Gilles Peskine8817f612018-12-18 00:18:46 +01004581 PSA_ASSERT( psa_get_key_policy( handle, &policy_get ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004582 TEST_EQUAL( psa_key_policy_get_usage( &policy_get ), policy_usage );
4583 TEST_EQUAL( psa_key_policy_get_algorithm( &policy_get ), policy_alg );
Darryl Greend49a4992018-06-18 17:27:26 +01004584
4585 /* Export the key again */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004586 TEST_EQUAL( psa_export_key( handle,
4587 second_export, export_size,
4588 &second_exported_length ),
4589 export_status );
Darryl Greend49a4992018-06-18 17:27:26 +01004590
Darryl Green0c6575a2018-11-07 16:05:30 +00004591 if( export_status == PSA_SUCCESS )
4592 {
4593 ASSERT_COMPARE( first_export, first_exported_length,
4594 second_export, second_exported_length );
Darryl Greend49a4992018-06-18 17:27:26 +01004595
Darryl Green0c6575a2018-11-07 16:05:30 +00004596 switch( generation_method )
4597 {
4598 case IMPORT_KEY:
4599 ASSERT_COMPARE( data->x, data->len,
4600 first_export, first_exported_length );
4601 break;
4602 default:
4603 break;
4604 }
4605 }
4606
4607 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004608 if( ! exercise_key( handle, policy_usage, policy_alg ) )
Darryl Green0c6575a2018-11-07 16:05:30 +00004609 goto exit;
Darryl Greend49a4992018-06-18 17:27:26 +01004610
4611exit:
4612 mbedtls_free( first_export );
4613 mbedtls_free( second_export );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004614 psa_destroy_key( handle );
Darryl Greend49a4992018-06-18 17:27:26 +01004615 mbedtls_psa_crypto_free();
4616}
4617/* END_CASE */