blob: 37b4d8d699a144505c1ff2e062d6e9ff3e3b7556 [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{
1953 /* Test each valid way of initializing the object, except for `= {0}`, as
1954 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
1955 * though it's OK by the C standard. We could test for this, but we'd need
1956 * to supress the Clang warning for the test. */
1957 psa_hash_operation_t func = psa_hash_operation_init( );
1958 psa_hash_operation_t init = PSA_HASH_OPERATION_INIT;
1959 psa_hash_operation_t zero;
1960
1961 memset( &zero, 0, sizeof( zero ) );
1962
Jaeden Amero5229bbb2019-02-07 16:33:37 +00001963 /* A default hash operation should be abortable without error. */
1964 PSA_ASSERT( psa_hash_abort( &func ) );
1965 PSA_ASSERT( psa_hash_abort( &init ) );
1966 PSA_ASSERT( psa_hash_abort( &zero ) );
Jaeden Amero6a25b412019-01-04 11:47:44 +00001967}
1968/* END_CASE */
1969
1970/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001971void hash_setup( int alg_arg,
1972 int expected_status_arg )
1973{
1974 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001975 psa_status_t expected_status = expected_status_arg;
Jaeden Amero6a25b412019-01-04 11:47:44 +00001976 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001977 psa_status_t status;
1978
Gilles Peskine8817f612018-12-18 00:18:46 +01001979 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001980
Gilles Peskineda8191d1c2018-07-08 19:46:38 +02001981 status = psa_hash_setup( &operation, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001982 psa_hash_abort( &operation );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001983 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001984
1985exit:
1986 mbedtls_psa_crypto_free( );
1987}
1988/* END_CASE */
1989
1990/* BEGIN_CASE */
itayzafrirf86548d2018-11-01 10:44:32 +02001991void hash_bad_order( )
1992{
1993 unsigned char input[] = "";
1994 /* SHA-256 hash of an empty string */
1995 unsigned char hash[] = {
1996 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
1997 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
1998 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55 };
1999 size_t hash_len;
Jaeden Amero6a25b412019-01-04 11:47:44 +00002000 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirf86548d2018-11-01 10:44:32 +02002001
Gilles Peskine8817f612018-12-18 00:18:46 +01002002 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirf86548d2018-11-01 10:44:32 +02002003
2004 /* psa_hash_update without calling psa_hash_setup beforehand */
2005 memset( &operation, 0, sizeof( operation ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002006 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002007 PSA_ERROR_INVALID_ARGUMENT );
itayzafrirf86548d2018-11-01 10:44:32 +02002008
2009 /* psa_hash_verify without calling psa_hash_setup beforehand */
2010 memset( &operation, 0, sizeof( operation ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002011 TEST_EQUAL( psa_hash_verify( &operation, hash, sizeof( hash ) ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002012 PSA_ERROR_INVALID_ARGUMENT );
itayzafrirf86548d2018-11-01 10:44:32 +02002013
2014 /* psa_hash_finish without calling psa_hash_setup beforehand */
2015 memset( &operation, 0, sizeof( operation ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002016 TEST_EQUAL( psa_hash_finish( &operation,
2017 hash, sizeof( hash ), &hash_len ),
2018 PSA_ERROR_INVALID_ARGUMENT );
itayzafrirf86548d2018-11-01 10:44:32 +02002019
2020exit:
2021 mbedtls_psa_crypto_free( );
2022}
2023/* END_CASE */
2024
itayzafrir27e69452018-11-01 14:26:34 +02002025/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2026void hash_verify_bad_args( )
itayzafrirec93d302018-10-18 18:01:10 +03002027{
2028 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrir27e69452018-11-01 14:26:34 +02002029 /* SHA-256 hash of an empty string with 2 extra bytes (0xaa and 0xbb)
2030 * appended to it */
2031 unsigned char hash[] = {
2032 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
2033 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
2034 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55, 0xaa, 0xbb };
itayzafrirec93d302018-10-18 18:01:10 +03002035 size_t expected_size = PSA_HASH_SIZE( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00002036 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirec93d302018-10-18 18:01:10 +03002037
Gilles Peskine8817f612018-12-18 00:18:46 +01002038 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirec93d302018-10-18 18:01:10 +03002039
itayzafrir27e69452018-11-01 14:26:34 +02002040 /* psa_hash_verify with a smaller hash than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002041 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002042 TEST_EQUAL( psa_hash_verify( &operation, hash, expected_size - 1 ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002043 PSA_ERROR_INVALID_SIGNATURE );
itayzafrirec93d302018-10-18 18:01:10 +03002044
itayzafrir27e69452018-11-01 14:26:34 +02002045 /* psa_hash_verify with a non-matching hash */
Gilles Peskine8817f612018-12-18 00:18:46 +01002046 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002047 TEST_EQUAL( psa_hash_verify( &operation, hash + 1, expected_size ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002048 PSA_ERROR_INVALID_SIGNATURE );
itayzafrirec93d302018-10-18 18:01:10 +03002049
itayzafrir27e69452018-11-01 14:26:34 +02002050 /* psa_hash_verify with a hash longer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002051 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002052 TEST_EQUAL( psa_hash_verify( &operation, hash, sizeof( hash ) ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002053 PSA_ERROR_INVALID_SIGNATURE );
itayzafrir4271df92018-10-24 18:16:19 +03002054
itayzafrirec93d302018-10-18 18:01:10 +03002055exit:
2056 mbedtls_psa_crypto_free( );
2057}
2058/* END_CASE */
2059
itayzafrirb2dd5ed2018-11-01 11:58:59 +02002060/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2061void hash_finish_bad_args( )
itayzafrir58028322018-10-25 10:22:01 +03002062{
2063 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrirb2dd5ed2018-11-01 11:58:59 +02002064 unsigned char hash[PSA_HASH_MAX_SIZE];
itayzafrir58028322018-10-25 10:22:01 +03002065 size_t expected_size = PSA_HASH_SIZE( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00002066 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrir58028322018-10-25 10:22:01 +03002067 size_t hash_len;
2068
Gilles Peskine8817f612018-12-18 00:18:46 +01002069 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir58028322018-10-25 10:22:01 +03002070
itayzafrir58028322018-10-25 10:22:01 +03002071 /* psa_hash_finish with a smaller hash buffer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002072 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002073 TEST_EQUAL( psa_hash_finish( &operation,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002074 hash, expected_size - 1, &hash_len ),
2075 PSA_ERROR_BUFFER_TOO_SMALL );
itayzafrir58028322018-10-25 10:22:01 +03002076
2077exit:
2078 mbedtls_psa_crypto_free( );
2079}
2080/* END_CASE */
2081
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01002082/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2083void hash_clone_source_state( )
2084{
2085 psa_algorithm_t alg = PSA_ALG_SHA_256;
2086 unsigned char hash[PSA_HASH_MAX_SIZE];
2087 psa_hash_operation_t op_source = PSA_HASH_OPERATION_INIT;
2088 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
2089 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
2090 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
2091 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
2092 size_t hash_len;
2093
2094 PSA_ASSERT( psa_crypto_init( ) );
2095 PSA_ASSERT( psa_hash_setup( &op_source, alg ) );
2096
2097 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
2098 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
2099 PSA_ASSERT( psa_hash_finish( &op_finished,
2100 hash, sizeof( hash ), &hash_len ) );
2101 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
2102 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
2103
2104 TEST_EQUAL( psa_hash_clone( &op_source, &op_setup ),
2105 PSA_ERROR_BAD_STATE );
2106
2107 PSA_ASSERT( psa_hash_clone( &op_source, &op_init ) );
2108 PSA_ASSERT( psa_hash_finish( &op_init,
2109 hash, sizeof( hash ), &hash_len ) );
2110 PSA_ASSERT( psa_hash_clone( &op_source, &op_finished ) );
2111 PSA_ASSERT( psa_hash_finish( &op_finished,
2112 hash, sizeof( hash ), &hash_len ) );
2113 PSA_ASSERT( psa_hash_clone( &op_source, &op_aborted ) );
2114 PSA_ASSERT( psa_hash_finish( &op_aborted,
2115 hash, sizeof( hash ), &hash_len ) );
2116
2117exit:
2118 psa_hash_abort( &op_source );
2119 psa_hash_abort( &op_init );
2120 psa_hash_abort( &op_setup );
2121 psa_hash_abort( &op_finished );
2122 psa_hash_abort( &op_aborted );
2123 mbedtls_psa_crypto_free( );
2124}
2125/* END_CASE */
2126
2127/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
2128void hash_clone_target_state( )
2129{
2130 psa_algorithm_t alg = PSA_ALG_SHA_256;
2131 unsigned char hash[PSA_HASH_MAX_SIZE];
2132 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
2133 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
2134 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
2135 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
2136 psa_hash_operation_t op_target = PSA_HASH_OPERATION_INIT;
2137 size_t hash_len;
2138
2139 PSA_ASSERT( psa_crypto_init( ) );
2140
2141 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
2142 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
2143 PSA_ASSERT( psa_hash_finish( &op_finished,
2144 hash, sizeof( hash ), &hash_len ) );
2145 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
2146 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
2147
2148 PSA_ASSERT( psa_hash_clone( &op_setup, &op_target ) );
2149 PSA_ASSERT( psa_hash_finish( &op_target,
2150 hash, sizeof( hash ), &hash_len ) );
2151
2152 TEST_EQUAL( psa_hash_clone( &op_init, &op_target ), PSA_ERROR_BAD_STATE );
2153 TEST_EQUAL( psa_hash_clone( &op_finished, &op_target ),
2154 PSA_ERROR_BAD_STATE );
2155 TEST_EQUAL( psa_hash_clone( &op_aborted, &op_target ),
2156 PSA_ERROR_BAD_STATE );
2157
2158exit:
2159 psa_hash_abort( &op_target );
2160 psa_hash_abort( &op_init );
2161 psa_hash_abort( &op_setup );
2162 psa_hash_abort( &op_finished );
2163 psa_hash_abort( &op_aborted );
2164 mbedtls_psa_crypto_free( );
2165}
2166/* END_CASE */
2167
itayzafrir58028322018-10-25 10:22:01 +03002168/* BEGIN_CASE */
Jaeden Amero769ce272019-01-04 11:48:03 +00002169void mac_operation_init( )
2170{
Jaeden Amero252ef282019-02-15 14:05:35 +00002171 const uint8_t input[1] = { 0 };
2172
Jaeden Amero769ce272019-01-04 11:48:03 +00002173 /* Test each valid way of initializing the object, except for `= {0}`, as
2174 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
2175 * though it's OK by the C standard. We could test for this, but we'd need
2176 * to supress the Clang warning for the test. */
2177 psa_mac_operation_t func = psa_mac_operation_init( );
2178 psa_mac_operation_t init = PSA_MAC_OPERATION_INIT;
2179 psa_mac_operation_t zero;
2180
2181 memset( &zero, 0, sizeof( zero ) );
2182
Jaeden Amero252ef282019-02-15 14:05:35 +00002183 /* A freshly-initialized MAC operation should not be usable. */
2184 TEST_EQUAL( psa_mac_update( &func,
2185 input, sizeof( input ) ),
2186 PSA_ERROR_BAD_STATE );
2187 TEST_EQUAL( psa_mac_update( &init,
2188 input, sizeof( input ) ),
2189 PSA_ERROR_BAD_STATE );
2190 TEST_EQUAL( psa_mac_update( &zero,
2191 input, sizeof( input ) ),
2192 PSA_ERROR_BAD_STATE );
2193
Jaeden Amero5229bbb2019-02-07 16:33:37 +00002194 /* A default MAC operation should be abortable without error. */
2195 PSA_ASSERT( psa_mac_abort( &func ) );
2196 PSA_ASSERT( psa_mac_abort( &init ) );
2197 PSA_ASSERT( psa_mac_abort( &zero ) );
Jaeden Amero769ce272019-01-04 11:48:03 +00002198}
2199/* END_CASE */
2200
2201/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002202void mac_setup( int key_type_arg,
2203 data_t *key,
2204 int alg_arg,
2205 int expected_status_arg )
2206{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002207 psa_key_handle_t handle = 0;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002208 psa_key_type_t key_type = key_type_arg;
2209 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002210 psa_status_t expected_status = expected_status_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002211 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002212 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002213 psa_status_t status;
2214
Gilles Peskine8817f612018-12-18 00:18:46 +01002215 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002216
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002217 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002218 psa_key_policy_set_usage( &policy,
2219 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
2220 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002221 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002222
Gilles Peskine8817f612018-12-18 00:18:46 +01002223 PSA_ASSERT( psa_import_key( handle, key_type,
2224 key->x, key->len ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002225
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002226 status = psa_mac_sign_setup( &operation, handle, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002227 psa_mac_abort( &operation );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002228 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002229
2230exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002231 psa_destroy_key( handle );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002232 mbedtls_psa_crypto_free( );
2233}
2234/* END_CASE */
2235
2236/* BEGIN_CASE */
Jaeden Amero252ef282019-02-15 14:05:35 +00002237void mac_bad_order( )
2238{
2239 psa_key_handle_t handle = 0;
2240 psa_key_type_t key_type = PSA_KEY_TYPE_HMAC;
2241 psa_algorithm_t alg = PSA_ALG_HMAC(PSA_ALG_SHA_256);
2242 const uint8_t key[] = {
2243 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2244 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2245 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
2246 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
2247 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
2248 uint8_t sign_mac[PSA_MAC_MAX_SIZE + 10] = { 0 };
2249 size_t sign_mac_length = 0;
2250 const uint8_t input[] = { 0xbb, 0xbb, 0xbb, 0xbb };
2251 const uint8_t verify_mac[] = {
2252 0x74, 0x65, 0x93, 0x8c, 0xeb, 0x1d, 0xb3, 0x76, 0x5a, 0x38, 0xe7, 0xdd,
2253 0x85, 0xc5, 0xad, 0x4f, 0x07, 0xe7, 0xd5, 0xb2, 0x64, 0xf0, 0x1a, 0x1a,
2254 0x2c, 0xf9, 0x18, 0xca, 0x59, 0x7e, 0x5d, 0xf6 };
2255
2256 PSA_ASSERT( psa_crypto_init( ) );
2257 PSA_ASSERT( psa_allocate_key( &handle ) );
2258 psa_key_policy_set_usage( &policy,
2259 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
2260 alg );
2261 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
2262
2263 PSA_ASSERT( psa_import_key( handle, key_type,
2264 key, sizeof(key) ) );
2265
2266 /* Call update without calling setup beforehand. */
2267 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2268 PSA_ERROR_BAD_STATE );
2269 PSA_ASSERT( psa_mac_abort( &operation ) );
2270
2271 /* Call sign finish without calling setup beforehand. */
2272 TEST_EQUAL( psa_mac_sign_finish( &operation, sign_mac, sizeof( sign_mac ),
2273 &sign_mac_length),
2274 PSA_ERROR_BAD_STATE );
2275 PSA_ASSERT( psa_mac_abort( &operation ) );
2276
2277 /* Call verify finish without calling setup beforehand. */
2278 TEST_EQUAL( psa_mac_verify_finish( &operation,
2279 verify_mac, sizeof( verify_mac ) ),
2280 PSA_ERROR_BAD_STATE );
2281 PSA_ASSERT( psa_mac_abort( &operation ) );
2282
2283 /* Call update after sign finish. */
2284 PSA_ASSERT( psa_mac_sign_setup( &operation,
2285 handle, alg ) );
2286 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2287 PSA_ASSERT( psa_mac_sign_finish( &operation,
2288 sign_mac, sizeof( sign_mac ),
2289 &sign_mac_length ) );
2290 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2291 PSA_ERROR_BAD_STATE );
2292 PSA_ASSERT( psa_mac_abort( &operation ) );
2293
2294 /* Call update after verify finish. */
2295 PSA_ASSERT( psa_mac_verify_setup( &operation,
2296 handle, alg ) );
2297 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2298 PSA_ASSERT( psa_mac_verify_finish( &operation,
2299 verify_mac, sizeof( verify_mac ) ) );
2300 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2301 PSA_ERROR_BAD_STATE );
2302 PSA_ASSERT( psa_mac_abort( &operation ) );
2303
2304 /* Call sign finish twice in a row. */
2305 PSA_ASSERT( psa_mac_sign_setup( &operation,
2306 handle, alg ) );
2307 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2308 PSA_ASSERT( psa_mac_sign_finish( &operation,
2309 sign_mac, sizeof( sign_mac ),
2310 &sign_mac_length ) );
2311 TEST_EQUAL( psa_mac_sign_finish( &operation,
2312 sign_mac, sizeof( sign_mac ),
2313 &sign_mac_length ),
2314 PSA_ERROR_BAD_STATE );
2315 PSA_ASSERT( psa_mac_abort( &operation ) );
2316
2317 /* Call verify finish twice in a row. */
2318 PSA_ASSERT( psa_mac_verify_setup( &operation,
2319 handle, alg ) );
2320 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2321 PSA_ASSERT( psa_mac_verify_finish( &operation,
2322 verify_mac, sizeof( verify_mac ) ) );
2323 TEST_EQUAL( psa_mac_verify_finish( &operation,
2324 verify_mac, sizeof( verify_mac ) ),
2325 PSA_ERROR_BAD_STATE );
2326 PSA_ASSERT( psa_mac_abort( &operation ) );
2327
2328 /* Setup sign but try verify. */
2329 PSA_ASSERT( psa_mac_sign_setup( &operation,
2330 handle, alg ) );
2331 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
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 verify but try sign. */
2338 PSA_ASSERT( psa_mac_verify_setup( &operation,
2339 handle, alg ) );
2340 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2341 TEST_EQUAL( psa_mac_sign_finish( &operation,
2342 sign_mac, sizeof( sign_mac ),
2343 &sign_mac_length ),
2344 PSA_ERROR_BAD_STATE );
2345 PSA_ASSERT( psa_mac_abort( &operation ) );
2346
2347exit:
2348 mbedtls_psa_crypto_free( );
2349}
2350/* END_CASE */
2351
2352/* BEGIN_CASE */
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002353void mac_sign( int key_type_arg,
2354 data_t *key,
2355 int alg_arg,
2356 data_t *input,
2357 data_t *expected_mac )
2358{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002359 psa_key_handle_t handle = 0;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002360 psa_key_type_t key_type = key_type_arg;
2361 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002362 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002363 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002364 /* Leave a little extra room in the output buffer. At the end of the
2365 * test, we'll check that the implementation didn't overwrite onto
2366 * this extra room. */
2367 uint8_t actual_mac[PSA_MAC_MAX_SIZE + 10];
2368 size_t mac_buffer_size =
2369 PSA_MAC_FINAL_SIZE( key_type, PSA_BYTES_TO_BITS( key->len ), alg );
2370 size_t mac_length = 0;
2371
2372 memset( actual_mac, '+', sizeof( actual_mac ) );
2373 TEST_ASSERT( mac_buffer_size <= PSA_MAC_MAX_SIZE );
2374 TEST_ASSERT( expected_mac->len <= mac_buffer_size );
2375
Gilles Peskine8817f612018-12-18 00:18:46 +01002376 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002377
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002378 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002379 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002380 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002381
Gilles Peskine8817f612018-12-18 00:18:46 +01002382 PSA_ASSERT( psa_import_key( handle, key_type,
2383 key->x, key->len ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002384
2385 /* Calculate the MAC. */
Gilles Peskine8817f612018-12-18 00:18:46 +01002386 PSA_ASSERT( psa_mac_sign_setup( &operation,
2387 handle, alg ) );
2388 PSA_ASSERT( psa_mac_update( &operation,
2389 input->x, input->len ) );
2390 PSA_ASSERT( psa_mac_sign_finish( &operation,
2391 actual_mac, mac_buffer_size,
2392 &mac_length ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002393
2394 /* Compare with the expected value. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01002395 ASSERT_COMPARE( expected_mac->x, expected_mac->len,
2396 actual_mac, mac_length );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002397
2398 /* Verify that the end of the buffer is untouched. */
2399 TEST_ASSERT( mem_is_char( actual_mac + mac_length, '+',
2400 sizeof( actual_mac ) - mac_length ) );
2401
2402exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002403 psa_destroy_key( handle );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002404 mbedtls_psa_crypto_free( );
2405}
2406/* END_CASE */
2407
2408/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002409void mac_verify( int key_type_arg,
2410 data_t *key,
2411 int alg_arg,
2412 data_t *input,
2413 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +01002414{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002415 psa_key_handle_t handle = 0;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002416 psa_key_type_t key_type = key_type_arg;
2417 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002418 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002419 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002420
Gilles Peskine69c12672018-06-28 00:07:19 +02002421 TEST_ASSERT( expected_mac->len <= PSA_MAC_MAX_SIZE );
2422
Gilles Peskine8817f612018-12-18 00:18:46 +01002423 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002424
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002425 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002426 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002427 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
mohammad16036df908f2018-04-02 08:34:15 -07002428
Gilles Peskine8817f612018-12-18 00:18:46 +01002429 PSA_ASSERT( psa_import_key( handle, key_type,
2430 key->x, key->len ) );
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002431
Gilles Peskine8817f612018-12-18 00:18:46 +01002432 PSA_ASSERT( psa_mac_verify_setup( &operation,
2433 handle, alg ) );
2434 PSA_ASSERT( psa_destroy_key( handle ) );
2435 PSA_ASSERT( psa_mac_update( &operation,
2436 input->x, input->len ) );
2437 PSA_ASSERT( psa_mac_verify_finish( &operation,
2438 expected_mac->x,
2439 expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002440
2441exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002442 psa_destroy_key( handle );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002443 mbedtls_psa_crypto_free( );
2444}
2445/* END_CASE */
2446
2447/* BEGIN_CASE */
Jaeden Amero5bae2272019-01-04 11:48:27 +00002448void cipher_operation_init( )
2449{
2450 /* Test each valid way of initializing the object, except for `= {0}`, as
2451 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
2452 * though it's OK by the C standard. We could test for this, but we'd need
2453 * to supress the Clang warning for the test. */
2454 psa_cipher_operation_t func = psa_cipher_operation_init( );
2455 psa_cipher_operation_t init = PSA_CIPHER_OPERATION_INIT;
2456 psa_cipher_operation_t zero;
2457
2458 memset( &zero, 0, sizeof( zero ) );
2459
Jaeden Amero5229bbb2019-02-07 16:33:37 +00002460 /* A default cipher operation should be abortable without error. */
2461 PSA_ASSERT( psa_cipher_abort( &func ) );
2462 PSA_ASSERT( psa_cipher_abort( &init ) );
2463 PSA_ASSERT( psa_cipher_abort( &zero ) );
Jaeden Amero5bae2272019-01-04 11:48:27 +00002464}
2465/* END_CASE */
2466
2467/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002468void cipher_setup( int key_type_arg,
2469 data_t *key,
2470 int alg_arg,
2471 int expected_status_arg )
2472{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002473 psa_key_handle_t handle = 0;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002474 psa_key_type_t key_type = key_type_arg;
2475 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002476 psa_status_t expected_status = expected_status_arg;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002477 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002478 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002479 psa_status_t status;
2480
Gilles Peskine8817f612018-12-18 00:18:46 +01002481 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002482
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002483 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002484 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002485 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002486
Gilles Peskine8817f612018-12-18 00:18:46 +01002487 PSA_ASSERT( psa_import_key( handle, key_type,
2488 key->x, key->len ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002489
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002490 status = psa_cipher_encrypt_setup( &operation, handle, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002491 psa_cipher_abort( &operation );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002492 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002493
2494exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002495 psa_destroy_key( handle );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002496 mbedtls_psa_crypto_free( );
2497}
2498/* END_CASE */
2499
2500/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002501void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002502 data_t *key,
2503 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002504 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002505{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002506 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002507 psa_status_t status;
2508 psa_key_type_t key_type = key_type_arg;
2509 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002510 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002511 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002512 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002513 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002514 size_t output_buffer_size = 0;
2515 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002516 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002517 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002518 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002519
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002520 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2521 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002522
Gilles Peskine8817f612018-12-18 00:18:46 +01002523 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002524
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002525 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002526 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002527 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002528
Gilles Peskine8817f612018-12-18 00:18:46 +01002529 PSA_ASSERT( psa_import_key( handle, key_type,
2530 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002531
Gilles Peskine8817f612018-12-18 00:18:46 +01002532 PSA_ASSERT( psa_cipher_encrypt_setup( &operation,
2533 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002534
Gilles Peskine8817f612018-12-18 00:18:46 +01002535 PSA_ASSERT( psa_cipher_set_iv( &operation,
2536 iv, iv_size ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002537 output_buffer_size = ( (size_t) input->len +
2538 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002539 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002540
Gilles Peskine8817f612018-12-18 00:18:46 +01002541 PSA_ASSERT( psa_cipher_update( &operation,
2542 input->x, input->len,
2543 output, output_buffer_size,
2544 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002545 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002546 status = psa_cipher_finish( &operation,
2547 output + function_output_length,
2548 output_buffer_size,
2549 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002550 total_output_length += function_output_length;
2551
Gilles Peskinefe11b722018-12-18 00:24:04 +01002552 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002553 if( expected_status == PSA_SUCCESS )
2554 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002555 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002556 ASSERT_COMPARE( expected_output->x, expected_output->len,
2557 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002558 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002559
Gilles Peskine50e586b2018-06-08 14:28:46 +02002560exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002561 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002562 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002563 mbedtls_psa_crypto_free( );
2564}
2565/* END_CASE */
2566
2567/* BEGIN_CASE */
2568void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002569 data_t *key,
2570 data_t *input,
2571 int first_part_size,
2572 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002573{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002574 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002575 psa_key_type_t key_type = key_type_arg;
2576 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002577 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002578 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002579 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002580 size_t output_buffer_size = 0;
2581 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002582 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002583 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002584 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002585
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002586 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2587 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002588
Gilles Peskine8817f612018-12-18 00:18:46 +01002589 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002590
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002591 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002592 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002593 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002594
Gilles Peskine8817f612018-12-18 00:18:46 +01002595 PSA_ASSERT( psa_import_key( handle, key_type,
2596 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002597
Gilles Peskine8817f612018-12-18 00:18:46 +01002598 PSA_ASSERT( psa_cipher_encrypt_setup( &operation,
2599 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002600
Gilles Peskine8817f612018-12-18 00:18:46 +01002601 PSA_ASSERT( psa_cipher_set_iv( &operation,
2602 iv, sizeof( iv ) ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002603 output_buffer_size = ( (size_t) input->len +
2604 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002605 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002606
Gilles Peskine4abf7412018-06-18 16:35:34 +02002607 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002608 PSA_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
2609 output, output_buffer_size,
2610 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002611 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002612 PSA_ASSERT( psa_cipher_update( &operation,
2613 input->x + first_part_size,
2614 input->len - first_part_size,
2615 output, output_buffer_size,
2616 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002617 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002618 PSA_ASSERT( psa_cipher_finish( &operation,
2619 output + function_output_length,
2620 output_buffer_size,
2621 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002622 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002623 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002624
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002625 ASSERT_COMPARE( expected_output->x, expected_output->len,
2626 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002627
2628exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002629 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002630 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002631 mbedtls_psa_crypto_free( );
2632}
2633/* END_CASE */
2634
2635/* BEGIN_CASE */
2636void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002637 data_t *key,
2638 data_t *input,
2639 int first_part_size,
2640 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002641{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002642 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002643
2644 psa_key_type_t key_type = key_type_arg;
2645 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002646 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002647 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002648 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002649 size_t output_buffer_size = 0;
2650 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002651 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002652 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002653 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002654
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002655 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2656 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002657
Gilles Peskine8817f612018-12-18 00:18:46 +01002658 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002659
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002660 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002661 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002662 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002663
Gilles Peskine8817f612018-12-18 00:18:46 +01002664 PSA_ASSERT( psa_import_key( handle, key_type,
2665 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002666
Gilles Peskine8817f612018-12-18 00:18:46 +01002667 PSA_ASSERT( psa_cipher_decrypt_setup( &operation,
2668 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002669
Gilles Peskine8817f612018-12-18 00:18:46 +01002670 PSA_ASSERT( psa_cipher_set_iv( &operation,
2671 iv, sizeof( iv ) ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002672
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002673 output_buffer_size = ( (size_t) input->len +
2674 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002675 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002676
Gilles Peskine4abf7412018-06-18 16:35:34 +02002677 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002678 PSA_ASSERT( psa_cipher_update( &operation,
2679 input->x, first_part_size,
2680 output, output_buffer_size,
2681 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002682 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002683 PSA_ASSERT( psa_cipher_update( &operation,
2684 input->x + first_part_size,
2685 input->len - first_part_size,
2686 output, output_buffer_size,
2687 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002688 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002689 PSA_ASSERT( psa_cipher_finish( &operation,
2690 output + function_output_length,
2691 output_buffer_size,
2692 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002693 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002694 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002695
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002696 ASSERT_COMPARE( expected_output->x, expected_output->len,
2697 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002698
2699exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002700 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002701 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002702 mbedtls_psa_crypto_free( );
2703}
2704/* END_CASE */
2705
Gilles Peskine50e586b2018-06-08 14:28:46 +02002706/* BEGIN_CASE */
2707void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002708 data_t *key,
2709 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002710 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002711{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002712 psa_key_handle_t handle = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002713 psa_status_t status;
2714 psa_key_type_t key_type = key_type_arg;
2715 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002716 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002717 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002718 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002719 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002720 size_t output_buffer_size = 0;
2721 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002722 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002723 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002724 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002725
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002726 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2727 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002728
Gilles Peskine8817f612018-12-18 00:18:46 +01002729 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002730
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002731 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002732 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002733 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002734
Gilles Peskine8817f612018-12-18 00:18:46 +01002735 PSA_ASSERT( psa_import_key( handle, key_type,
2736 key->x, key->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002737
Gilles Peskine8817f612018-12-18 00:18:46 +01002738 PSA_ASSERT( psa_cipher_decrypt_setup( &operation,
2739 handle, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002740
Gilles Peskine8817f612018-12-18 00:18:46 +01002741 PSA_ASSERT( psa_cipher_set_iv( &operation,
2742 iv, iv_size ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002743
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002744 output_buffer_size = ( (size_t) input->len +
2745 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002746 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002747
Gilles Peskine8817f612018-12-18 00:18:46 +01002748 PSA_ASSERT( psa_cipher_update( &operation,
2749 input->x, input->len,
2750 output, output_buffer_size,
2751 &function_output_length ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002752 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002753 status = psa_cipher_finish( &operation,
2754 output + function_output_length,
2755 output_buffer_size,
2756 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002757 total_output_length += function_output_length;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002758 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002759
2760 if( expected_status == PSA_SUCCESS )
2761 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002762 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002763 ASSERT_COMPARE( expected_output->x, expected_output->len,
2764 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002765 }
2766
Gilles Peskine50e586b2018-06-08 14:28:46 +02002767exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002768 mbedtls_free( output );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002769 psa_destroy_key( handle );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002770 mbedtls_psa_crypto_free( );
2771}
2772/* END_CASE */
2773
Gilles Peskine50e586b2018-06-08 14:28:46 +02002774/* BEGIN_CASE */
2775void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002776 data_t *key,
2777 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02002778{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002779 psa_key_handle_t handle = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002780 psa_key_type_t key_type = key_type_arg;
2781 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -07002782 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +02002783 size_t iv_size = 16;
2784 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002785 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002786 size_t output1_size = 0;
2787 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002788 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002789 size_t output2_size = 0;
2790 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002791 size_t function_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002792 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
2793 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002794 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002795
Gilles Peskine8817f612018-12-18 00:18:46 +01002796 PSA_ASSERT( psa_crypto_init( ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002797
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002798 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002799 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002800 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002801
Gilles Peskine8817f612018-12-18 00:18:46 +01002802 PSA_ASSERT( psa_import_key( handle, key_type,
2803 key->x, key->len ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002804
Gilles Peskine8817f612018-12-18 00:18:46 +01002805 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1,
2806 handle, alg ) );
2807 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2,
2808 handle, alg ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002809
Gilles Peskine8817f612018-12-18 00:18:46 +01002810 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
2811 iv, iv_size,
2812 &iv_length ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002813 output1_size = ( (size_t) input->len +
2814 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002815 ASSERT_ALLOC( output1, output1_size );
Moran Pekerded84402018-06-06 16:36:50 +03002816
Gilles Peskine8817f612018-12-18 00:18:46 +01002817 PSA_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
2818 output1, output1_size,
2819 &output1_length ) );
2820 PSA_ASSERT( psa_cipher_finish( &operation1,
2821 output1 + output1_length, output1_size,
2822 &function_output_length ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002823
Gilles Peskine048b7f02018-06-08 14:20:49 +02002824 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002825
Gilles Peskine8817f612018-12-18 00:18:46 +01002826 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
Moran Pekerded84402018-06-06 16:36:50 +03002827
2828 output2_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002829 ASSERT_ALLOC( output2, output2_size );
Moran Pekerded84402018-06-06 16:36:50 +03002830
Gilles Peskine8817f612018-12-18 00:18:46 +01002831 PSA_ASSERT( psa_cipher_set_iv( &operation2,
2832 iv, iv_length ) );
2833 PSA_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
2834 output2, output2_size,
2835 &output2_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002836 function_output_length = 0;
Gilles Peskine8817f612018-12-18 00:18:46 +01002837 PSA_ASSERT( psa_cipher_finish( &operation2,
2838 output2 + output2_length,
2839 output2_size,
2840 &function_output_length ) );
Moran Pekerded84402018-06-06 16:36:50 +03002841
Gilles Peskine048b7f02018-06-08 14:20:49 +02002842 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002843
Gilles Peskine8817f612018-12-18 00:18:46 +01002844 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
Moran Pekerded84402018-06-06 16:36:50 +03002845
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002846 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
Moran Pekerded84402018-06-06 16:36:50 +03002847
2848exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002849 mbedtls_free( output1 );
2850 mbedtls_free( output2 );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002851 psa_destroy_key( handle );
Moran Pekerded84402018-06-06 16:36:50 +03002852 mbedtls_psa_crypto_free( );
2853}
2854/* END_CASE */
2855
2856/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002857void cipher_verify_output_multipart( int alg_arg,
2858 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002859 data_t *key,
2860 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002861 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +03002862{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002863 psa_key_handle_t handle = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002864 psa_key_type_t key_type = key_type_arg;
2865 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +03002866 unsigned char iv[16] = {0};
2867 size_t iv_size = 16;
2868 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002869 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002870 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002871 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002872 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002873 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002874 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002875 size_t function_output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002876 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
2877 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00002878 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03002879
Gilles Peskine8817f612018-12-18 00:18:46 +01002880 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerded84402018-06-06 16:36:50 +03002881
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002882 PSA_ASSERT( psa_allocate_key( &handle ) );
Moran Pekered346952018-07-05 15:22:45 +03002883 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002884 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Moran Pekered346952018-07-05 15:22:45 +03002885
Gilles Peskine8817f612018-12-18 00:18:46 +01002886 PSA_ASSERT( psa_import_key( handle, key_type,
2887 key->x, key->len ) );
Moran Pekerded84402018-06-06 16:36:50 +03002888
Gilles Peskine8817f612018-12-18 00:18:46 +01002889 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1,
2890 handle, alg ) );
2891 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2,
2892 handle, alg ) );
Moran Pekerded84402018-06-06 16:36:50 +03002893
Gilles Peskine8817f612018-12-18 00:18:46 +01002894 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
2895 iv, iv_size,
2896 &iv_length ) );
Gilles Peskine9d8eea72018-12-17 23:34:57 +01002897 output1_buffer_size = ( (size_t) input->len +
2898 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002899 ASSERT_ALLOC( output1, output1_buffer_size );
Moran Pekerded84402018-06-06 16:36:50 +03002900
Gilles Peskine4abf7412018-06-18 16:35:34 +02002901 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002902
Gilles Peskine8817f612018-12-18 00:18:46 +01002903 PSA_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
2904 output1, output1_buffer_size,
2905 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002906 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002907
Gilles Peskine8817f612018-12-18 00:18:46 +01002908 PSA_ASSERT( psa_cipher_update( &operation1,
2909 input->x + first_part_size,
2910 input->len - first_part_size,
2911 output1, output1_buffer_size,
2912 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002913 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002914
Gilles Peskine8817f612018-12-18 00:18:46 +01002915 PSA_ASSERT( psa_cipher_finish( &operation1,
2916 output1 + output1_length,
2917 output1_buffer_size - output1_length,
2918 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002919 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002920
Gilles Peskine8817f612018-12-18 00:18:46 +01002921 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002922
Gilles Peskine048b7f02018-06-08 14:20:49 +02002923 output2_buffer_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002924 ASSERT_ALLOC( output2, output2_buffer_size );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002925
Gilles Peskine8817f612018-12-18 00:18:46 +01002926 PSA_ASSERT( psa_cipher_set_iv( &operation2,
2927 iv, iv_length ) );
Moran Pekerded84402018-06-06 16:36:50 +03002928
Gilles Peskine8817f612018-12-18 00:18:46 +01002929 PSA_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
2930 output2, output2_buffer_size,
2931 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002932 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002933
Gilles Peskine8817f612018-12-18 00:18:46 +01002934 PSA_ASSERT( psa_cipher_update( &operation2,
2935 output1 + first_part_size,
2936 output1_length - first_part_size,
2937 output2, output2_buffer_size,
2938 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002939 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002940
Gilles Peskine8817f612018-12-18 00:18:46 +01002941 PSA_ASSERT( psa_cipher_finish( &operation2,
2942 output2 + output2_length,
2943 output2_buffer_size - output2_length,
2944 &function_output_length ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002945 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002946
Gilles Peskine8817f612018-12-18 00:18:46 +01002947 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002948
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002949 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002950
2951exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002952 mbedtls_free( output1 );
2953 mbedtls_free( output2 );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002954 psa_destroy_key( handle );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002955 mbedtls_psa_crypto_free( );
2956}
2957/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02002958
Gilles Peskine20035e32018-02-03 22:44:14 +01002959/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02002960void aead_encrypt_decrypt( int key_type_arg, data_t *key_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002961 int alg_arg,
Gilles Peskine7da96b02018-08-17 18:45:42 +02002962 data_t *nonce,
2963 data_t *additional_data,
2964 data_t *input_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002965 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02002966{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01002967 psa_key_handle_t handle = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002968 psa_key_type_t key_type = key_type_arg;
2969 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002970 unsigned char *output_data = NULL;
2971 size_t output_size = 0;
2972 size_t output_length = 0;
2973 unsigned char *output_data2 = NULL;
2974 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002975 size_t tag_length = 16;
Gilles Peskine4abf7412018-06-18 16:35:34 +02002976 psa_status_t expected_result = expected_result_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00002977 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002978
Gilles Peskine4abf7412018-06-18 16:35:34 +02002979 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002980 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002981
Gilles Peskine8817f612018-12-18 00:18:46 +01002982 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002983
Gilles Peskined40c1fb2019-01-19 12:20:52 +01002984 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002985 psa_key_policy_set_usage( &policy,
2986 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
2987 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01002988 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002989
Gilles Peskine8817f612018-12-18 00:18:46 +01002990 PSA_ASSERT( psa_import_key( handle, key_type,
2991 key_data->x, key_data->len ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002992
Gilles Peskinefe11b722018-12-18 00:24:04 +01002993 TEST_EQUAL( psa_aead_encrypt( handle, alg,
2994 nonce->x, nonce->len,
2995 additional_data->x,
2996 additional_data->len,
2997 input_data->x, input_data->len,
2998 output_data, output_size,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002999 &output_length ),
3000 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003001
3002 if( PSA_SUCCESS == expected_result )
3003 {
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003004 ASSERT_ALLOC( output_data2, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003005
Gilles Peskinefe11b722018-12-18 00:24:04 +01003006 TEST_EQUAL( psa_aead_decrypt( handle, alg,
3007 nonce->x, nonce->len,
3008 additional_data->x,
3009 additional_data->len,
3010 output_data, output_length,
3011 output_data2, output_length,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003012 &output_length2 ),
3013 expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02003014
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003015 ASSERT_COMPARE( input_data->x, input_data->len,
3016 output_data2, output_length2 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003017 }
Gilles Peskine2d277862018-06-18 15:41:12 +02003018
Gilles Peskinea1cac842018-06-11 19:33:02 +02003019exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003020 psa_destroy_key( handle );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003021 mbedtls_free( output_data );
3022 mbedtls_free( output_data2 );
3023 mbedtls_psa_crypto_free( );
3024}
3025/* END_CASE */
3026
3027/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003028void aead_encrypt( int key_type_arg, data_t *key_data,
3029 int alg_arg,
3030 data_t *nonce,
3031 data_t *additional_data,
3032 data_t *input_data,
3033 data_t *expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003034{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003035 psa_key_handle_t handle = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003036 psa_key_type_t key_type = key_type_arg;
3037 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003038 unsigned char *output_data = NULL;
3039 size_t output_size = 0;
3040 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003041 size_t tag_length = 16;
Jaeden Amero70261c52019-01-04 11:47:20 +00003042 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003043
Gilles Peskine4abf7412018-06-18 16:35:34 +02003044 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003045 ASSERT_ALLOC( output_data, output_size );
Gilles Peskine2d277862018-06-18 15:41:12 +02003046
Gilles Peskine8817f612018-12-18 00:18:46 +01003047 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003048
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003049 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003050 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003051 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003052
Gilles Peskine8817f612018-12-18 00:18:46 +01003053 PSA_ASSERT( psa_import_key( handle, key_type,
3054 key_data->x,
3055 key_data->len ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003056
Gilles Peskine8817f612018-12-18 00:18:46 +01003057 PSA_ASSERT( psa_aead_encrypt( handle, alg,
3058 nonce->x, nonce->len,
3059 additional_data->x, additional_data->len,
3060 input_data->x, input_data->len,
3061 output_data, output_size,
3062 &output_length ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003063
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003064 ASSERT_COMPARE( expected_result->x, expected_result->len,
3065 output_data, output_length );
Gilles Peskine2d277862018-06-18 15:41:12 +02003066
Gilles Peskinea1cac842018-06-11 19:33:02 +02003067exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003068 psa_destroy_key( handle );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003069 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003070 mbedtls_psa_crypto_free( );
3071}
3072/* END_CASE */
3073
3074/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003075void aead_decrypt( int key_type_arg, data_t *key_data,
3076 int alg_arg,
3077 data_t *nonce,
3078 data_t *additional_data,
3079 data_t *input_data,
3080 data_t *expected_data,
3081 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003082{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003083 psa_key_handle_t handle = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003084 psa_key_type_t key_type = key_type_arg;
3085 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003086 unsigned char *output_data = NULL;
3087 size_t output_size = 0;
3088 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003089 size_t tag_length = 16;
Jaeden Amero70261c52019-01-04 11:47:20 +00003090 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003091 psa_status_t expected_result = expected_result_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003092
Gilles Peskine4abf7412018-06-18 16:35:34 +02003093 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003094 ASSERT_ALLOC( output_data, output_size );
Gilles Peskine2d277862018-06-18 15:41:12 +02003095
Gilles Peskine8817f612018-12-18 00:18:46 +01003096 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003097
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003098 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003099 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003100 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003101
Gilles Peskine8817f612018-12-18 00:18:46 +01003102 PSA_ASSERT( psa_import_key( handle, key_type,
3103 key_data->x,
3104 key_data->len ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003105
Gilles Peskinefe11b722018-12-18 00:24:04 +01003106 TEST_EQUAL( psa_aead_decrypt( handle, alg,
3107 nonce->x, nonce->len,
3108 additional_data->x,
3109 additional_data->len,
3110 input_data->x, input_data->len,
3111 output_data, output_size,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003112 &output_length ),
3113 expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003114
Gilles Peskine2d277862018-06-18 15:41:12 +02003115 if( expected_result == PSA_SUCCESS )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003116 ASSERT_COMPARE( expected_data->x, expected_data->len,
3117 output_data, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003118
Gilles Peskinea1cac842018-06-11 19:33:02 +02003119exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003120 psa_destroy_key( handle );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003121 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003122 mbedtls_psa_crypto_free( );
3123}
3124/* END_CASE */
3125
3126/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003127void signature_size( int type_arg,
3128 int bits,
3129 int alg_arg,
3130 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003131{
3132 psa_key_type_t type = type_arg;
3133 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +02003134 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003135 TEST_EQUAL( actual_size, (size_t) expected_size_arg );
Gilles Peskinee59236f2018-01-27 23:32:46 +01003136exit:
3137 ;
3138}
3139/* END_CASE */
3140
3141/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003142void sign_deterministic( int key_type_arg, data_t *key_data,
3143 int alg_arg, data_t *input_data,
3144 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003145{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003146 psa_key_handle_t handle = 0;
Gilles Peskinee59236f2018-01-27 23:32:46 +01003147 psa_key_type_t key_type = key_type_arg;
3148 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003149 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01003150 unsigned char *signature = NULL;
3151 size_t signature_size;
3152 size_t signature_length = 0xdeadbeef;
Jaeden Amero70261c52019-01-04 11:47:20 +00003153 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003154
Gilles Peskine8817f612018-12-18 00:18:46 +01003155 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003156
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003157 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003158 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003159 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003160
Gilles Peskine8817f612018-12-18 00:18:46 +01003161 PSA_ASSERT( psa_import_key( handle, key_type,
3162 key_data->x,
3163 key_data->len ) );
3164 PSA_ASSERT( psa_get_key_information( handle,
3165 NULL,
3166 &key_bits ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003167
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003168 /* Allocate a buffer which has the size advertized by the
3169 * library. */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003170 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
3171 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01003172 TEST_ASSERT( signature_size != 0 );
Gilles Peskine69c12672018-06-28 00:07:19 +02003173 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003174 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003175
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003176 /* Perform the signature. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003177 PSA_ASSERT( psa_asymmetric_sign( handle, alg,
3178 input_data->x, input_data->len,
3179 signature, signature_size,
3180 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003181 /* Verify that the signature is what is expected. */
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003182 ASSERT_COMPARE( output_data->x, output_data->len,
3183 signature, signature_length );
Gilles Peskine20035e32018-02-03 22:44:14 +01003184
3185exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003186 psa_destroy_key( handle );
Gilles Peskine0189e752018-02-03 23:57:22 +01003187 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01003188 mbedtls_psa_crypto_free( );
3189}
3190/* END_CASE */
3191
3192/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003193void sign_fail( int key_type_arg, data_t *key_data,
3194 int alg_arg, data_t *input_data,
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003195 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01003196{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003197 psa_key_handle_t handle = 0;
Gilles Peskine20035e32018-02-03 22:44:14 +01003198 psa_key_type_t key_type = key_type_arg;
3199 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003200 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003201 psa_status_t actual_status;
3202 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01003203 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01003204 size_t signature_length = 0xdeadbeef;
Jaeden Amero70261c52019-01-04 11:47:20 +00003205 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003206
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003207 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003208
Gilles Peskine8817f612018-12-18 00:18:46 +01003209 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003210
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003211 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003212 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003213 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003214
Gilles Peskine8817f612018-12-18 00:18:46 +01003215 PSA_ASSERT( psa_import_key( handle, key_type,
3216 key_data->x,
3217 key_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003218
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003219 actual_status = psa_asymmetric_sign( handle, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003220 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01003221 signature, signature_size,
3222 &signature_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003223 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003224 /* The value of *signature_length is unspecified on error, but
3225 * whatever it is, it should be less than signature_size, so that
3226 * if the caller tries to read *signature_length bytes without
3227 * checking the error code then they don't overflow a buffer. */
3228 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003229
3230exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003231 psa_destroy_key( handle );
Gilles Peskine20035e32018-02-03 22:44:14 +01003232 mbedtls_free( signature );
3233 mbedtls_psa_crypto_free( );
3234}
3235/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03003236
3237/* BEGIN_CASE */
Gilles Peskine9911b022018-06-29 17:30:48 +02003238void sign_verify( int key_type_arg, data_t *key_data,
3239 int alg_arg, data_t *input_data )
3240{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003241 psa_key_handle_t handle = 0;
Gilles Peskine9911b022018-06-29 17:30:48 +02003242 psa_key_type_t key_type = key_type_arg;
3243 psa_algorithm_t alg = alg_arg;
3244 size_t key_bits;
3245 unsigned char *signature = NULL;
3246 size_t signature_size;
3247 size_t signature_length = 0xdeadbeef;
Jaeden Amero70261c52019-01-04 11:47:20 +00003248 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003249
Gilles Peskine8817f612018-12-18 00:18:46 +01003250 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003251
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003252 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003253 psa_key_policy_set_usage( &policy,
3254 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
3255 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003256 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003257
Gilles Peskine8817f612018-12-18 00:18:46 +01003258 PSA_ASSERT( psa_import_key( handle, key_type,
3259 key_data->x,
3260 key_data->len ) );
3261 PSA_ASSERT( psa_get_key_information( handle,
3262 NULL,
3263 &key_bits ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003264
3265 /* Allocate a buffer which has the size advertized by the
3266 * library. */
3267 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
3268 key_bits, alg );
3269 TEST_ASSERT( signature_size != 0 );
3270 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003271 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine9911b022018-06-29 17:30:48 +02003272
3273 /* Perform the signature. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003274 PSA_ASSERT( psa_asymmetric_sign( handle, alg,
3275 input_data->x, input_data->len,
3276 signature, signature_size,
3277 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003278 /* Check that the signature length looks sensible. */
3279 TEST_ASSERT( signature_length <= signature_size );
3280 TEST_ASSERT( signature_length > 0 );
3281
3282 /* Use the library to verify that the signature is correct. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003283 PSA_ASSERT( psa_asymmetric_verify(
3284 handle, alg,
3285 input_data->x, input_data->len,
3286 signature, signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003287
3288 if( input_data->len != 0 )
3289 {
3290 /* Flip a bit in the input and verify that the signature is now
3291 * detected as invalid. Flip a bit at the beginning, not at the end,
3292 * because ECDSA may ignore the last few bits of the input. */
3293 input_data->x[0] ^= 1;
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003294 TEST_EQUAL( psa_asymmetric_verify( handle, alg,
3295 input_data->x, input_data->len,
3296 signature, signature_length ),
3297 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine9911b022018-06-29 17:30:48 +02003298 }
3299
3300exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003301 psa_destroy_key( handle );
Gilles Peskine9911b022018-06-29 17:30:48 +02003302 mbedtls_free( signature );
3303 mbedtls_psa_crypto_free( );
3304}
3305/* END_CASE */
3306
3307/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003308void asymmetric_verify( int key_type_arg, data_t *key_data,
3309 int alg_arg, data_t *hash_data,
3310 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03003311{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003312 psa_key_handle_t handle = 0;
itayzafrir5c753392018-05-08 11:18:38 +03003313 psa_key_type_t key_type = key_type_arg;
3314 psa_algorithm_t alg = alg_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003315 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003316
Gilles Peskine69c12672018-06-28 00:07:19 +02003317 TEST_ASSERT( signature_data->len <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
3318
Gilles Peskine8817f612018-12-18 00:18:46 +01003319 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir5c753392018-05-08 11:18:38 +03003320
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003321 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003322 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003323 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
itayzafrir5c753392018-05-08 11:18:38 +03003324
Gilles Peskine8817f612018-12-18 00:18:46 +01003325 PSA_ASSERT( psa_import_key( handle, key_type,
3326 key_data->x,
3327 key_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03003328
Gilles Peskine8817f612018-12-18 00:18:46 +01003329 PSA_ASSERT( psa_asymmetric_verify( handle, alg,
3330 hash_data->x, hash_data->len,
3331 signature_data->x,
3332 signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03003333exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003334 psa_destroy_key( handle );
itayzafrir5c753392018-05-08 11:18:38 +03003335 mbedtls_psa_crypto_free( );
3336}
3337/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003338
3339/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03003340void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
3341 int alg_arg, data_t *hash_data,
3342 data_t *signature_data,
3343 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003344{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003345 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003346 psa_key_type_t key_type = key_type_arg;
3347 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003348 psa_status_t actual_status;
3349 psa_status_t expected_status = expected_status_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003350 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003351
Gilles Peskine8817f612018-12-18 00:18:46 +01003352 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003353
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003354 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003355 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003356 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003357
Gilles Peskine8817f612018-12-18 00:18:46 +01003358 PSA_ASSERT( psa_import_key( handle, key_type,
3359 key_data->x,
3360 key_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003361
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003362 actual_status = psa_asymmetric_verify( handle, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003363 hash_data->x, hash_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02003364 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003365 signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003366
Gilles Peskinefe11b722018-12-18 00:24:04 +01003367 TEST_EQUAL( actual_status, expected_status );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003368
3369exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003370 psa_destroy_key( handle );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003371 mbedtls_psa_crypto_free( );
3372}
3373/* END_CASE */
3374
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003375/* BEGIN_CASE */
Gilles Peskine656896e2018-06-29 19:12:28 +02003376void asymmetric_encrypt( int key_type_arg,
3377 data_t *key_data,
3378 int alg_arg,
3379 data_t *input_data,
Gilles Peskine68428122018-06-30 18:42:41 +02003380 data_t *label,
Gilles Peskine656896e2018-06-29 19:12:28 +02003381 int expected_output_length_arg,
3382 int expected_status_arg )
3383{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003384 psa_key_handle_t handle = 0;
Gilles Peskine656896e2018-06-29 19:12:28 +02003385 psa_key_type_t key_type = key_type_arg;
3386 psa_algorithm_t alg = alg_arg;
3387 size_t expected_output_length = expected_output_length_arg;
3388 size_t key_bits;
3389 unsigned char *output = NULL;
3390 size_t output_size;
3391 size_t output_length = ~0;
3392 psa_status_t actual_status;
3393 psa_status_t expected_status = expected_status_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003394 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003395
Gilles Peskine8817f612018-12-18 00:18:46 +01003396 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003397
Gilles Peskine656896e2018-06-29 19:12:28 +02003398 /* Import the key */
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003399 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003400 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003401 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
3402 PSA_ASSERT( psa_import_key( handle, key_type,
3403 key_data->x,
3404 key_data->len ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003405
3406 /* Determine the maximum output length */
Gilles Peskine8817f612018-12-18 00:18:46 +01003407 PSA_ASSERT( psa_get_key_information( handle,
3408 NULL,
3409 &key_bits ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003410 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003411 ASSERT_ALLOC( output, output_size );
Gilles Peskine656896e2018-06-29 19:12:28 +02003412
3413 /* Encrypt the input */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003414 actual_status = psa_asymmetric_encrypt( handle, alg,
Gilles Peskine656896e2018-06-29 19:12:28 +02003415 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003416 label->x, label->len,
Gilles Peskine656896e2018-06-29 19:12:28 +02003417 output, output_size,
3418 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003419 TEST_EQUAL( actual_status, expected_status );
3420 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine656896e2018-06-29 19:12:28 +02003421
Gilles Peskine68428122018-06-30 18:42:41 +02003422 /* If the label is empty, the test framework puts a non-null pointer
3423 * in label->x. Test that a null pointer works as well. */
3424 if( label->len == 0 )
3425 {
3426 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003427 if( output_size != 0 )
3428 memset( output, 0, output_size );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003429 actual_status = psa_asymmetric_encrypt( handle, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02003430 input_data->x, input_data->len,
3431 NULL, label->len,
3432 output, output_size,
3433 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003434 TEST_EQUAL( actual_status, expected_status );
3435 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003436 }
3437
Gilles Peskine656896e2018-06-29 19:12:28 +02003438exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003439 psa_destroy_key( handle );
Gilles Peskine656896e2018-06-29 19:12:28 +02003440 mbedtls_free( output );
3441 mbedtls_psa_crypto_free( );
3442}
3443/* END_CASE */
3444
3445/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003446void asymmetric_encrypt_decrypt( int key_type_arg,
3447 data_t *key_data,
3448 int alg_arg,
3449 data_t *input_data,
3450 data_t *label )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003451{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003452 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003453 psa_key_type_t key_type = key_type_arg;
3454 psa_algorithm_t alg = alg_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003455 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003456 unsigned char *output = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003457 size_t output_size;
3458 size_t output_length = ~0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003459 unsigned char *output2 = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003460 size_t output2_size;
3461 size_t output2_length = ~0;
Jaeden Amero70261c52019-01-04 11:47:20 +00003462 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003463
Gilles Peskine8817f612018-12-18 00:18:46 +01003464 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003465
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003466 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003467 psa_key_policy_set_usage( &policy,
3468 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003469 alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003470 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003471
Gilles Peskine8817f612018-12-18 00:18:46 +01003472 PSA_ASSERT( psa_import_key( handle, key_type,
3473 key_data->x,
3474 key_data->len ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003475
3476 /* Determine the maximum ciphertext length */
Gilles Peskine8817f612018-12-18 00:18:46 +01003477 PSA_ASSERT( psa_get_key_information( handle,
3478 NULL,
3479 &key_bits ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003480 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003481 ASSERT_ALLOC( output, output_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003482 output2_size = input_data->len;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003483 ASSERT_ALLOC( output2, output2_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003484
Gilles Peskineeebd7382018-06-08 18:11:54 +02003485 /* We test encryption by checking that encrypt-then-decrypt gives back
3486 * the original plaintext because of the non-optional random
3487 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003488 PSA_ASSERT( psa_asymmetric_encrypt( handle, alg,
3489 input_data->x, input_data->len,
3490 label->x, label->len,
3491 output, output_size,
3492 &output_length ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003493 /* We don't know what ciphertext length to expect, but check that
3494 * it looks sensible. */
3495 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003496
Gilles Peskine8817f612018-12-18 00:18:46 +01003497 PSA_ASSERT( psa_asymmetric_decrypt( handle, alg,
3498 output, output_length,
3499 label->x, label->len,
3500 output2, output2_size,
3501 &output2_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003502 ASSERT_COMPARE( input_data->x, input_data->len,
3503 output2, output2_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003504
3505exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003506 psa_destroy_key( handle );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003507 mbedtls_free( output );
3508 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003509 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003510}
3511/* END_CASE */
3512
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003513/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003514void asymmetric_decrypt( int key_type_arg,
3515 data_t *key_data,
3516 int alg_arg,
3517 data_t *input_data,
3518 data_t *label,
Gilles Peskine66763a02018-06-29 21:54:10 +02003519 data_t *expected_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003520{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003521 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003522 psa_key_type_t key_type = key_type_arg;
3523 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003524 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03003525 size_t output_size = 0;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003526 size_t output_length = ~0;
Jaeden Amero70261c52019-01-04 11:47:20 +00003527 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003528
Jaeden Amero412654a2019-02-06 12:57:46 +00003529 output_size = expected_data->len;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003530 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003531
Gilles Peskine8817f612018-12-18 00:18:46 +01003532 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003533
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003534 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003535 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003536 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003537
Gilles Peskine8817f612018-12-18 00:18:46 +01003538 PSA_ASSERT( psa_import_key( handle, key_type,
3539 key_data->x,
3540 key_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003541
Gilles Peskine8817f612018-12-18 00:18:46 +01003542 PSA_ASSERT( psa_asymmetric_decrypt( handle, alg,
3543 input_data->x, input_data->len,
3544 label->x, label->len,
3545 output,
3546 output_size,
3547 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003548 ASSERT_COMPARE( expected_data->x, expected_data->len,
3549 output, output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003550
Gilles Peskine68428122018-06-30 18:42:41 +02003551 /* If the label is empty, the test framework puts a non-null pointer
3552 * in label->x. Test that a null pointer works as well. */
3553 if( label->len == 0 )
3554 {
3555 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003556 if( output_size != 0 )
3557 memset( output, 0, output_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01003558 PSA_ASSERT( psa_asymmetric_decrypt( handle, alg,
3559 input_data->x, input_data->len,
3560 NULL, label->len,
3561 output,
3562 output_size,
3563 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003564 ASSERT_COMPARE( expected_data->x, expected_data->len,
3565 output, output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003566 }
3567
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003568exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003569 psa_destroy_key( handle );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003570 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003571 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003572}
3573/* END_CASE */
3574
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003575/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003576void asymmetric_decrypt_fail( int key_type_arg,
3577 data_t *key_data,
3578 int alg_arg,
3579 data_t *input_data,
3580 data_t *label,
Jaeden Amerof8daab72019-02-06 12:57:46 +00003581 int output_size_arg,
Gilles Peskine2d277862018-06-18 15:41:12 +02003582 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003583{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003584 psa_key_handle_t handle = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003585 psa_key_type_t key_type = key_type_arg;
3586 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003587 unsigned char *output = NULL;
Jaeden Amerof8daab72019-02-06 12:57:46 +00003588 size_t output_size = output_size_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003589 size_t output_length = ~0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003590 psa_status_t actual_status;
3591 psa_status_t expected_status = expected_status_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00003592 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003593
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003594 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003595
Gilles Peskine8817f612018-12-18 00:18:46 +01003596 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003597
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003598 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003599 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003600 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003601
Gilles Peskine8817f612018-12-18 00:18:46 +01003602 PSA_ASSERT( psa_import_key( handle, key_type,
3603 key_data->x,
3604 key_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003605
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003606 actual_status = psa_asymmetric_decrypt( handle, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003607 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003608 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003609 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02003610 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003611 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003612 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003613
Gilles Peskine68428122018-06-30 18:42:41 +02003614 /* If the label is empty, the test framework puts a non-null pointer
3615 * in label->x. Test that a null pointer works as well. */
3616 if( label->len == 0 )
3617 {
3618 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003619 if( output_size != 0 )
3620 memset( output, 0, output_size );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003621 actual_status = psa_asymmetric_decrypt( handle, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02003622 input_data->x, input_data->len,
3623 NULL, label->len,
3624 output, output_size,
3625 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003626 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003627 TEST_ASSERT( output_length <= output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02003628 }
3629
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003630exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003631 psa_destroy_key( handle );
Gilles Peskine2d277862018-06-18 15:41:12 +02003632 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003633 mbedtls_psa_crypto_free( );
3634}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003635/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02003636
3637/* BEGIN_CASE */
Jaeden Amerod94d6712019-01-04 14:11:48 +00003638void crypto_generator_init( )
3639{
3640 /* Test each valid way of initializing the object, except for `= {0}`, as
3641 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
3642 * though it's OK by the C standard. We could test for this, but we'd need
3643 * to supress the Clang warning for the test. */
Jaeden Amero5229bbb2019-02-07 16:33:37 +00003644 size_t capacity;
Jaeden Amerod94d6712019-01-04 14:11:48 +00003645 psa_crypto_generator_t func = psa_crypto_generator_init( );
3646 psa_crypto_generator_t init = PSA_CRYPTO_GENERATOR_INIT;
3647 psa_crypto_generator_t zero;
3648
3649 memset( &zero, 0, sizeof( zero ) );
3650
Jaeden Amero5229bbb2019-02-07 16:33:37 +00003651 /* A default generator should have no capacity. */
3652 PSA_ASSERT( psa_get_generator_capacity( &func, &capacity ) );
3653 TEST_EQUAL( capacity, 0 );
3654 PSA_ASSERT( psa_get_generator_capacity( &init, &capacity ) );
3655 TEST_EQUAL( capacity, 0 );
3656 PSA_ASSERT( psa_get_generator_capacity( &zero, &capacity ) );
3657 TEST_EQUAL( capacity, 0 );
3658
3659 /* A default generator should be abortable without error. */
3660 PSA_ASSERT( psa_generator_abort(&func) );
3661 PSA_ASSERT( psa_generator_abort(&init) );
3662 PSA_ASSERT( psa_generator_abort(&zero) );
Jaeden Amerod94d6712019-01-04 14:11:48 +00003663}
3664/* END_CASE */
3665
3666/* BEGIN_CASE */
Gilles Peskineea0fb492018-07-12 17:17:20 +02003667void derive_setup( int key_type_arg,
3668 data_t *key_data,
3669 int alg_arg,
3670 data_t *salt,
3671 data_t *label,
3672 int requested_capacity_arg,
3673 int expected_status_arg )
3674{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003675 psa_key_handle_t handle = 0;
Gilles Peskineea0fb492018-07-12 17:17:20 +02003676 size_t key_type = key_type_arg;
3677 psa_algorithm_t alg = alg_arg;
3678 size_t requested_capacity = requested_capacity_arg;
3679 psa_status_t expected_status = expected_status_arg;
3680 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00003681 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02003682
Gilles Peskine8817f612018-12-18 00:18:46 +01003683 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003684
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003685 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003686 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003687 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003688
Gilles Peskine8817f612018-12-18 00:18:46 +01003689 PSA_ASSERT( psa_import_key( handle, key_type,
3690 key_data->x,
3691 key_data->len ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003692
Gilles Peskinefe11b722018-12-18 00:24:04 +01003693 TEST_EQUAL( psa_key_derivation( &generator, handle, alg,
3694 salt->x, salt->len,
3695 label->x, label->len,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003696 requested_capacity ),
3697 expected_status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003698
3699exit:
3700 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003701 psa_destroy_key( handle );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003702 mbedtls_psa_crypto_free( );
3703}
3704/* END_CASE */
3705
3706/* BEGIN_CASE */
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02003707void test_derive_invalid_generator_state( )
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03003708{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003709 psa_key_handle_t handle = 0;
Nir Sonnenschein4eda37b2018-10-31 12:15:58 +02003710 size_t key_type = PSA_KEY_TYPE_DERIVE;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003711 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003712 psa_algorithm_t alg = PSA_ALG_HKDF( PSA_ALG_SHA_256 );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003713 uint8_t buffer[42];
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003714 size_t capacity = sizeof( buffer );
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02003715 const uint8_t key_data[22] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
3716 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
3717 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
Jaeden Amero70261c52019-01-04 11:47:20 +00003718 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03003719
Gilles Peskine8817f612018-12-18 00:18:46 +01003720 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003721
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003722 PSA_ASSERT( psa_allocate_key( &handle ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003723 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003724 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003725
Gilles Peskine8817f612018-12-18 00:18:46 +01003726 PSA_ASSERT( psa_import_key( handle, key_type,
3727 key_data,
3728 sizeof( key_data ) ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003729
3730 /* valid key derivation */
Gilles Peskine8817f612018-12-18 00:18:46 +01003731 PSA_ASSERT( psa_key_derivation( &generator, handle, alg,
3732 NULL, 0,
3733 NULL, 0,
3734 capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003735
3736 /* state of generator shouldn't allow additional generation */
Gilles Peskinefe11b722018-12-18 00:24:04 +01003737 TEST_EQUAL( psa_key_derivation( &generator, handle, alg,
3738 NULL, 0,
3739 NULL, 0,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003740 capacity ),
3741 PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003742
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003743 PSA_ASSERT( psa_generator_read( &generator, buffer, capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003744
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003745 TEST_EQUAL( psa_generator_read( &generator, buffer, capacity ),
3746 PSA_ERROR_INSUFFICIENT_CAPACITY );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003747
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003748exit:
3749 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003750 psa_destroy_key( handle );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003751 mbedtls_psa_crypto_free( );
3752}
3753/* END_CASE */
3754
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003755/* BEGIN_CASE */
3756void test_derive_invalid_generator_tests( )
3757{
3758 uint8_t output_buffer[16];
3759 size_t buffer_size = 16;
3760 size_t capacity = 0;
3761 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3762
Nir Sonnenschein50789302018-10-31 12:16:38 +02003763 TEST_ASSERT( psa_generator_read( &generator, output_buffer, buffer_size )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003764 == PSA_ERROR_INSUFFICIENT_CAPACITY ); // should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003765
3766 TEST_ASSERT( psa_get_generator_capacity( &generator, &capacity )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003767 == PSA_SUCCESS ); // should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003768
Gilles Peskine8817f612018-12-18 00:18:46 +01003769 PSA_ASSERT( psa_generator_abort( &generator ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003770
Nir Sonnenschein50789302018-10-31 12:16:38 +02003771 TEST_ASSERT( psa_generator_read( &generator, output_buffer, buffer_size )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003772 == PSA_ERROR_INSUFFICIENT_CAPACITY ); // should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003773
Nir Sonnenschein50789302018-10-31 12:16:38 +02003774 TEST_ASSERT( psa_get_generator_capacity( &generator, &capacity )
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02003775 == PSA_SUCCESS );// should be PSA_ERROR_BAD_STATE:#183
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03003776
3777exit:
3778 psa_generator_abort( &generator );
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03003779}
3780/* END_CASE */
3781
3782/* BEGIN_CASE */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003783void derive_output( int alg_arg,
3784 data_t *key_data,
3785 data_t *salt,
3786 data_t *label,
3787 int requested_capacity_arg,
3788 data_t *expected_output1,
3789 data_t *expected_output2 )
3790{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003791 psa_key_handle_t handle = 0;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003792 psa_algorithm_t alg = alg_arg;
3793 size_t requested_capacity = requested_capacity_arg;
3794 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3795 uint8_t *expected_outputs[2] =
3796 {expected_output1->x, expected_output2->x};
3797 size_t output_sizes[2] =
3798 {expected_output1->len, expected_output2->len};
3799 size_t output_buffer_size = 0;
3800 uint8_t *output_buffer = NULL;
3801 size_t expected_capacity;
3802 size_t current_capacity;
Jaeden Amero70261c52019-01-04 11:47:20 +00003803 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003804 psa_status_t status;
3805 unsigned i;
3806
3807 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
3808 {
3809 if( output_sizes[i] > output_buffer_size )
3810 output_buffer_size = output_sizes[i];
3811 if( output_sizes[i] == 0 )
3812 expected_outputs[i] = NULL;
3813 }
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003814 ASSERT_ALLOC( output_buffer, output_buffer_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01003815 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003816
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003817 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003818 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003819 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003820
Gilles Peskine8817f612018-12-18 00:18:46 +01003821 PSA_ASSERT( psa_import_key( handle, PSA_KEY_TYPE_DERIVE,
3822 key_data->x,
3823 key_data->len ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003824
3825 /* Extraction phase. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003826 PSA_ASSERT( psa_key_derivation( &generator, handle, alg,
3827 salt->x, salt->len,
3828 label->x, label->len,
3829 requested_capacity ) );
3830 PSA_ASSERT( psa_get_generator_capacity( &generator,
3831 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003832 TEST_EQUAL( current_capacity, requested_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003833 expected_capacity = requested_capacity;
3834
3835 /* Expansion phase. */
3836 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
3837 {
3838 /* Read some bytes. */
3839 status = psa_generator_read( &generator,
3840 output_buffer, output_sizes[i] );
3841 if( expected_capacity == 0 && output_sizes[i] == 0 )
3842 {
3843 /* Reading 0 bytes when 0 bytes are available can go either way. */
3844 TEST_ASSERT( status == PSA_SUCCESS ||
3845 status == PSA_ERROR_INSUFFICIENT_CAPACITY );
3846 continue;
3847 }
3848 else if( expected_capacity == 0 ||
3849 output_sizes[i] > expected_capacity )
3850 {
3851 /* Capacity exceeded. */
Gilles Peskinefe11b722018-12-18 00:24:04 +01003852 TEST_EQUAL( status, PSA_ERROR_INSUFFICIENT_CAPACITY );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003853 expected_capacity = 0;
3854 continue;
3855 }
3856 /* Success. Check the read data. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003857 PSA_ASSERT( status );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003858 if( output_sizes[i] != 0 )
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01003859 ASSERT_COMPARE( output_buffer, output_sizes[i],
3860 expected_outputs[i], output_sizes[i] );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003861 /* Check the generator status. */
3862 expected_capacity -= output_sizes[i];
Gilles Peskine8817f612018-12-18 00:18:46 +01003863 PSA_ASSERT( psa_get_generator_capacity( &generator,
3864 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003865 TEST_EQUAL( expected_capacity, current_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003866 }
Gilles Peskine8817f612018-12-18 00:18:46 +01003867 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003868
3869exit:
3870 mbedtls_free( output_buffer );
3871 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003872 psa_destroy_key( handle );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003873 mbedtls_psa_crypto_free( );
3874}
3875/* END_CASE */
3876
3877/* BEGIN_CASE */
Gilles Peskined54931c2018-07-17 21:06:59 +02003878void derive_full( int alg_arg,
3879 data_t *key_data,
3880 data_t *salt,
3881 data_t *label,
3882 int requested_capacity_arg )
3883{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003884 psa_key_handle_t handle = 0;
Gilles Peskined54931c2018-07-17 21:06:59 +02003885 psa_algorithm_t alg = alg_arg;
3886 size_t requested_capacity = requested_capacity_arg;
3887 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3888 unsigned char output_buffer[16];
3889 size_t expected_capacity = requested_capacity;
3890 size_t current_capacity;
Jaeden Amero70261c52019-01-04 11:47:20 +00003891 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02003892
Gilles Peskine8817f612018-12-18 00:18:46 +01003893 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02003894
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003895 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02003896 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003897 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02003898
Gilles Peskine8817f612018-12-18 00:18:46 +01003899 PSA_ASSERT( psa_import_key( handle, PSA_KEY_TYPE_DERIVE,
3900 key_data->x,
3901 key_data->len ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02003902
3903 /* Extraction phase. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003904 PSA_ASSERT( psa_key_derivation( &generator, handle, alg,
3905 salt->x, salt->len,
3906 label->x, label->len,
3907 requested_capacity ) );
3908 PSA_ASSERT( psa_get_generator_capacity( &generator,
3909 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003910 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02003911
3912 /* Expansion phase. */
3913 while( current_capacity > 0 )
3914 {
3915 size_t read_size = sizeof( output_buffer );
3916 if( read_size > current_capacity )
3917 read_size = current_capacity;
Gilles Peskine8817f612018-12-18 00:18:46 +01003918 PSA_ASSERT( psa_generator_read( &generator,
3919 output_buffer,
3920 read_size ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02003921 expected_capacity -= read_size;
Gilles Peskine8817f612018-12-18 00:18:46 +01003922 PSA_ASSERT( psa_get_generator_capacity( &generator,
3923 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003924 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02003925 }
3926
3927 /* Check that the generator refuses to go over capacity. */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003928 TEST_EQUAL( psa_generator_read( &generator, output_buffer, 1 ),
3929 PSA_ERROR_INSUFFICIENT_CAPACITY );
Gilles Peskined54931c2018-07-17 21:06:59 +02003930
Gilles Peskine8817f612018-12-18 00:18:46 +01003931 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02003932
3933exit:
3934 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003935 psa_destroy_key( handle );
Gilles Peskined54931c2018-07-17 21:06:59 +02003936 mbedtls_psa_crypto_free( );
3937}
3938/* END_CASE */
3939
3940/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02003941void derive_key_exercise( int alg_arg,
3942 data_t *key_data,
3943 data_t *salt,
3944 data_t *label,
3945 int derived_type_arg,
3946 int derived_bits_arg,
3947 int derived_usage_arg,
3948 int derived_alg_arg )
3949{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003950 psa_key_handle_t base_handle = 0;
3951 psa_key_handle_t derived_handle = 0;
Gilles Peskine0386fba2018-07-12 17:29:22 +02003952 psa_algorithm_t alg = alg_arg;
3953 psa_key_type_t derived_type = derived_type_arg;
3954 size_t derived_bits = derived_bits_arg;
3955 psa_key_usage_t derived_usage = derived_usage_arg;
3956 psa_algorithm_t derived_alg = derived_alg_arg;
3957 size_t capacity = PSA_BITS_TO_BYTES( derived_bits );
3958 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00003959 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02003960 psa_key_type_t got_type;
3961 size_t got_bits;
3962
Gilles Peskine8817f612018-12-18 00:18:46 +01003963 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02003964
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003965 PSA_ASSERT( psa_allocate_key( &base_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02003966 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003967 PSA_ASSERT( psa_set_key_policy( base_handle, &policy ) );
3968 PSA_ASSERT( psa_import_key( base_handle, PSA_KEY_TYPE_DERIVE,
3969 key_data->x,
3970 key_data->len ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02003971
3972 /* Derive a key. */
Gilles Peskine8817f612018-12-18 00:18:46 +01003973 PSA_ASSERT( psa_key_derivation( &generator, base_handle, alg,
3974 salt->x, salt->len,
3975 label->x, label->len,
3976 capacity ) );
Gilles Peskined40c1fb2019-01-19 12:20:52 +01003977 PSA_ASSERT( psa_allocate_key( &derived_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02003978 psa_key_policy_set_usage( &policy, derived_usage, derived_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01003979 PSA_ASSERT( psa_set_key_policy( derived_handle, &policy ) );
3980 PSA_ASSERT( psa_generator_import_key( derived_handle,
3981 derived_type,
3982 derived_bits,
3983 &generator ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02003984
3985 /* Test the key information */
Gilles Peskine8817f612018-12-18 00:18:46 +01003986 PSA_ASSERT( psa_get_key_information( derived_handle,
3987 &got_type,
3988 &got_bits ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003989 TEST_EQUAL( got_type, derived_type );
3990 TEST_EQUAL( got_bits, derived_bits );
Gilles Peskine0386fba2018-07-12 17:29:22 +02003991
3992 /* Exercise the derived key. */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003993 if( ! exercise_key( derived_handle, derived_usage, derived_alg ) )
Gilles Peskine0386fba2018-07-12 17:29:22 +02003994 goto exit;
3995
3996exit:
3997 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003998 psa_destroy_key( base_handle );
3999 psa_destroy_key( derived_handle );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004000 mbedtls_psa_crypto_free( );
4001}
4002/* END_CASE */
4003
4004/* BEGIN_CASE */
4005void derive_key_export( int alg_arg,
4006 data_t *key_data,
4007 data_t *salt,
4008 data_t *label,
4009 int bytes1_arg,
4010 int bytes2_arg )
4011{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004012 psa_key_handle_t base_handle = 0;
4013 psa_key_handle_t derived_handle = 0;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004014 psa_algorithm_t alg = alg_arg;
4015 size_t bytes1 = bytes1_arg;
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004016 size_t derived_bits = PSA_BYTES_TO_BITS( bytes1 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004017 size_t bytes2 = bytes2_arg;
4018 size_t capacity = bytes1 + bytes2;
4019 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004020 uint8_t *output_buffer = NULL;
4021 uint8_t *export_buffer = NULL;
Jaeden Amero70261c52019-01-04 11:47:20 +00004022 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004023 size_t length;
4024
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004025 ASSERT_ALLOC( output_buffer, capacity );
4026 ASSERT_ALLOC( export_buffer, capacity );
Gilles Peskine8817f612018-12-18 00:18:46 +01004027 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004028
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004029 PSA_ASSERT( psa_allocate_key( &base_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004030 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004031 PSA_ASSERT( psa_set_key_policy( base_handle, &policy ) );
4032 PSA_ASSERT( psa_import_key( base_handle, PSA_KEY_TYPE_DERIVE,
4033 key_data->x,
4034 key_data->len ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004035
4036 /* Derive some material and output it. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004037 PSA_ASSERT( psa_key_derivation( &generator, base_handle, alg,
4038 salt->x, salt->len,
4039 label->x, label->len,
4040 capacity ) );
4041 PSA_ASSERT( psa_generator_read( &generator,
4042 output_buffer,
4043 capacity ) );
4044 PSA_ASSERT( psa_generator_abort( &generator ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004045
4046 /* Derive the same output again, but this time store it in key objects. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004047 PSA_ASSERT( psa_key_derivation( &generator, base_handle, alg,
4048 salt->x, salt->len,
4049 label->x, label->len,
4050 capacity ) );
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004051 PSA_ASSERT( psa_allocate_key( &derived_handle ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004052 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, 0 );
Gilles Peskine8817f612018-12-18 00:18:46 +01004053 PSA_ASSERT( psa_set_key_policy( derived_handle, &policy ) );
4054 PSA_ASSERT( psa_generator_import_key( derived_handle,
4055 PSA_KEY_TYPE_RAW_DATA,
4056 derived_bits,
4057 &generator ) );
4058 PSA_ASSERT( psa_export_key( derived_handle,
4059 export_buffer, bytes1,
4060 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004061 TEST_EQUAL( length, bytes1 );
Gilles Peskine8817f612018-12-18 00:18:46 +01004062 PSA_ASSERT( psa_destroy_key( derived_handle ) );
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004063 PSA_ASSERT( psa_allocate_key( &derived_handle ) );
Gilles Peskine8817f612018-12-18 00:18:46 +01004064 PSA_ASSERT( psa_set_key_policy( derived_handle, &policy ) );
4065 PSA_ASSERT( psa_generator_import_key( derived_handle,
4066 PSA_KEY_TYPE_RAW_DATA,
4067 PSA_BYTES_TO_BITS( bytes2 ),
4068 &generator ) );
4069 PSA_ASSERT( psa_export_key( derived_handle,
4070 export_buffer + bytes1, bytes2,
4071 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004072 TEST_EQUAL( length, bytes2 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004073
4074 /* Compare the outputs from the two runs. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004075 ASSERT_COMPARE( output_buffer, bytes1 + bytes2,
4076 export_buffer, capacity );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004077
4078exit:
4079 mbedtls_free( output_buffer );
4080 mbedtls_free( export_buffer );
4081 psa_generator_abort( &generator );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004082 psa_destroy_key( base_handle );
4083 psa_destroy_key( derived_handle );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004084 mbedtls_psa_crypto_free( );
4085}
4086/* END_CASE */
4087
4088/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02004089void key_agreement_setup( int alg_arg,
4090 int our_key_type_arg, data_t *our_key_data,
4091 data_t *peer_key_data,
4092 int expected_status_arg )
4093{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004094 psa_key_handle_t our_key = 0;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004095 psa_algorithm_t alg = alg_arg;
4096 psa_key_type_t our_key_type = our_key_type_arg;
4097 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004098 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004099
Gilles Peskine8817f612018-12-18 00:18:46 +01004100 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004101
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004102 PSA_ASSERT( psa_allocate_key( &our_key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004103 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004104 PSA_ASSERT( psa_set_key_policy( our_key, &policy ) );
4105 PSA_ASSERT( psa_import_key( our_key, our_key_type,
4106 our_key_data->x,
4107 our_key_data->len ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004108
Gilles Peskinefe11b722018-12-18 00:24:04 +01004109 TEST_EQUAL( psa_key_agreement( &generator,
4110 our_key,
4111 peer_key_data->x, peer_key_data->len,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004112 alg ),
4113 expected_status_arg );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004114
4115exit:
4116 psa_generator_abort( &generator );
4117 psa_destroy_key( our_key );
4118 mbedtls_psa_crypto_free( );
4119}
4120/* END_CASE */
4121
4122/* BEGIN_CASE */
Gilles Peskine59685592018-09-18 12:11:34 +02004123void key_agreement_capacity( int alg_arg,
4124 int our_key_type_arg, data_t *our_key_data,
4125 data_t *peer_key_data,
4126 int expected_capacity_arg )
4127{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004128 psa_key_handle_t our_key = 0;
Gilles Peskine59685592018-09-18 12:11:34 +02004129 psa_algorithm_t alg = alg_arg;
4130 psa_key_type_t our_key_type = our_key_type_arg;
4131 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004132 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004133 size_t actual_capacity;
Gilles Peskinebf491972018-10-25 22:36:12 +02004134 unsigned char output[16];
Gilles Peskine59685592018-09-18 12:11:34 +02004135
Gilles Peskine8817f612018-12-18 00:18:46 +01004136 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004137
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004138 PSA_ASSERT( psa_allocate_key( &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004139 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004140 PSA_ASSERT( psa_set_key_policy( our_key, &policy ) );
4141 PSA_ASSERT( psa_import_key( our_key, our_key_type,
4142 our_key_data->x,
4143 our_key_data->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004144
Gilles Peskine8817f612018-12-18 00:18:46 +01004145 PSA_ASSERT( psa_key_agreement( &generator,
4146 our_key,
4147 peer_key_data->x, peer_key_data->len,
4148 alg ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004149
Gilles Peskinebf491972018-10-25 22:36:12 +02004150 /* Test the advertized capacity. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004151 PSA_ASSERT( psa_get_generator_capacity(
4152 &generator, &actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004153 TEST_EQUAL( actual_capacity, (size_t) expected_capacity_arg );
Gilles Peskine59685592018-09-18 12:11:34 +02004154
Gilles Peskinebf491972018-10-25 22:36:12 +02004155 /* Test the actual capacity by reading the output. */
4156 while( actual_capacity > sizeof( output ) )
4157 {
Gilles Peskine8817f612018-12-18 00:18:46 +01004158 PSA_ASSERT( psa_generator_read( &generator,
4159 output, sizeof( output ) ) );
Gilles Peskinebf491972018-10-25 22:36:12 +02004160 actual_capacity -= sizeof( output );
4161 }
Gilles Peskine8817f612018-12-18 00:18:46 +01004162 PSA_ASSERT( psa_generator_read( &generator,
4163 output, actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004164 TEST_EQUAL( psa_generator_read( &generator, output, 1 ),
4165 PSA_ERROR_INSUFFICIENT_CAPACITY );
Gilles Peskinebf491972018-10-25 22:36:12 +02004166
Gilles Peskine59685592018-09-18 12:11:34 +02004167exit:
4168 psa_generator_abort( &generator );
4169 psa_destroy_key( our_key );
4170 mbedtls_psa_crypto_free( );
4171}
4172/* END_CASE */
4173
4174/* BEGIN_CASE */
4175void key_agreement_output( int alg_arg,
4176 int our_key_type_arg, data_t *our_key_data,
4177 data_t *peer_key_data,
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004178 data_t *expected_output1, data_t *expected_output2 )
Gilles Peskine59685592018-09-18 12:11:34 +02004179{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004180 psa_key_handle_t our_key = 0;
Gilles Peskine59685592018-09-18 12:11:34 +02004181 psa_algorithm_t alg = alg_arg;
4182 psa_key_type_t our_key_type = our_key_type_arg;
4183 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004184 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004185 uint8_t *actual_output = NULL;
Gilles Peskine59685592018-09-18 12:11:34 +02004186
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004187 ASSERT_ALLOC( actual_output, MAX( expected_output1->len,
4188 expected_output2->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004189
Gilles Peskine8817f612018-12-18 00:18:46 +01004190 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004191
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004192 PSA_ASSERT( psa_allocate_key( &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004193 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004194 PSA_ASSERT( psa_set_key_policy( our_key, &policy ) );
4195 PSA_ASSERT( psa_import_key( our_key, our_key_type,
4196 our_key_data->x,
4197 our_key_data->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004198
Gilles Peskine8817f612018-12-18 00:18:46 +01004199 PSA_ASSERT( psa_key_agreement( &generator,
4200 our_key,
4201 peer_key_data->x, peer_key_data->len,
4202 alg ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004203
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004204 PSA_ASSERT( psa_generator_read( &generator,
4205 actual_output,
4206 expected_output1->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004207 ASSERT_COMPARE( actual_output, expected_output1->len,
4208 expected_output1->x, expected_output1->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004209 if( expected_output2->len != 0 )
4210 {
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004211 PSA_ASSERT( psa_generator_read( &generator,
4212 actual_output,
4213 expected_output2->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004214 ASSERT_COMPARE( actual_output, expected_output2->len,
4215 expected_output2->x, expected_output2->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004216 }
Gilles Peskine59685592018-09-18 12:11:34 +02004217
4218exit:
4219 psa_generator_abort( &generator );
4220 psa_destroy_key( our_key );
4221 mbedtls_psa_crypto_free( );
4222 mbedtls_free( actual_output );
4223}
4224/* END_CASE */
4225
4226/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02004227void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02004228{
Gilles Peskinea50d7392018-06-21 10:22:13 +02004229 size_t bytes = bytes_arg;
4230 const unsigned char trail[] = "don't overwrite me";
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004231 unsigned char *output = NULL;
4232 unsigned char *changed = NULL;
Gilles Peskinea50d7392018-06-21 10:22:13 +02004233 size_t i;
4234 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02004235
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004236 ASSERT_ALLOC( output, bytes + sizeof( trail ) );
4237 ASSERT_ALLOC( changed, bytes );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004238 memcpy( output + bytes, trail, sizeof( trail ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02004239
Gilles Peskine8817f612018-12-18 00:18:46 +01004240 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02004241
Gilles Peskinea50d7392018-06-21 10:22:13 +02004242 /* Run several times, to ensure that every output byte will be
4243 * nonzero at least once with overwhelming probability
4244 * (2^(-8*number_of_runs)). */
4245 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02004246 {
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004247 if( bytes != 0 )
4248 memset( output, 0, bytes );
Gilles Peskine8817f612018-12-18 00:18:46 +01004249 PSA_ASSERT( psa_generate_random( output, bytes ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004250
4251 /* Check that no more than bytes have been overwritten */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004252 ASSERT_COMPARE( output + bytes, sizeof( trail ),
4253 trail, sizeof( trail ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004254
4255 for( i = 0; i < bytes; i++ )
4256 {
4257 if( output[i] != 0 )
4258 ++changed[i];
4259 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004260 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02004261
4262 /* Check that every byte was changed to nonzero at least once. This
4263 * validates that psa_generate_random is overwriting every byte of
4264 * the output buffer. */
4265 for( i = 0; i < bytes; i++ )
4266 {
4267 TEST_ASSERT( changed[i] != 0 );
4268 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004269
4270exit:
4271 mbedtls_psa_crypto_free( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004272 mbedtls_free( output );
4273 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02004274}
4275/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02004276
4277/* BEGIN_CASE */
4278void generate_key( int type_arg,
4279 int bits_arg,
4280 int usage_arg,
4281 int alg_arg,
4282 int expected_status_arg )
4283{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004284 psa_key_handle_t handle = 0;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004285 psa_key_type_t type = type_arg;
4286 psa_key_usage_t usage = usage_arg;
4287 size_t bits = bits_arg;
4288 psa_algorithm_t alg = alg_arg;
4289 psa_status_t expected_status = expected_status_arg;
4290 psa_key_type_t got_type;
4291 size_t got_bits;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004292 psa_status_t expected_info_status =
4293 expected_status == PSA_SUCCESS ? PSA_SUCCESS : PSA_ERROR_EMPTY_SLOT;
Jaeden Amero70261c52019-01-04 11:47:20 +00004294 psa_key_policy_t policy = PSA_KEY_POLICY_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004295
Gilles Peskine8817f612018-12-18 00:18:46 +01004296 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004297
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004298 PSA_ASSERT( psa_allocate_key( &handle ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004299 psa_key_policy_set_usage( &policy, usage, alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004300 PSA_ASSERT( psa_set_key_policy( handle, &policy ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004301
4302 /* Generate a key */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004303 TEST_EQUAL( psa_generate_key( handle, type, bits, NULL, 0 ),
4304 expected_status );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004305
4306 /* Test the key information */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004307 TEST_EQUAL( psa_get_key_information( handle, &got_type, &got_bits ),
4308 expected_info_status );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004309 if( expected_info_status != PSA_SUCCESS )
4310 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +01004311 TEST_EQUAL( got_type, type );
4312 TEST_EQUAL( got_bits, bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004313
Gilles Peskine818ca122018-06-20 18:16:48 +02004314 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004315 if( ! exercise_key( handle, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +02004316 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004317
4318exit:
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004319 psa_destroy_key( handle );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004320 mbedtls_psa_crypto_free( );
4321}
4322/* END_CASE */
itayzafrir0adf0fc2018-09-06 16:24:41 +03004323
Darryl Greend49a4992018-06-18 17:27:26 +01004324/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C */
4325void persistent_key_load_key_from_storage( data_t *data, int type_arg,
4326 int bits, int usage_arg,
Darryl Green0c6575a2018-11-07 16:05:30 +00004327 int alg_arg, int generation_method,
4328 int export_status )
Darryl Greend49a4992018-06-18 17:27:26 +01004329{
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004330 psa_key_handle_t handle = 0;
4331 psa_key_handle_t base_key;
Darryl Greend49a4992018-06-18 17:27:26 +01004332 psa_key_type_t type = (psa_key_type_t) type_arg;
4333 psa_key_type_t type_get;
4334 size_t bits_get;
Jaeden Amero70261c52019-01-04 11:47:20 +00004335 psa_key_policy_t policy_set = PSA_KEY_POLICY_INIT;
4336 psa_key_policy_t policy_get = PSA_KEY_POLICY_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01004337 psa_key_usage_t policy_usage = (psa_key_usage_t) usage_arg;
4338 psa_algorithm_t policy_alg = (psa_algorithm_t) alg_arg;
Jaeden Amero70261c52019-01-04 11:47:20 +00004339 psa_key_policy_t base_policy_set = PSA_KEY_POLICY_INIT;
Darryl Green0c6575a2018-11-07 16:05:30 +00004340 psa_algorithm_t base_policy_alg = PSA_ALG_HKDF(PSA_ALG_SHA_256);
4341 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01004342 unsigned char *first_export = NULL;
4343 unsigned char *second_export = NULL;
4344 size_t export_size = PSA_KEY_EXPORT_MAX_SIZE( type, bits );
4345 size_t first_exported_length;
4346 size_t second_exported_length;
4347
4348 ASSERT_ALLOC( first_export, export_size );
4349 ASSERT_ALLOC( second_export, export_size );
4350
Gilles Peskine8817f612018-12-18 00:18:46 +01004351 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01004352
Gilles Peskine8817f612018-12-18 00:18:46 +01004353 PSA_ASSERT( psa_create_key( PSA_KEY_LIFETIME_PERSISTENT, 1,
Gilles Peskine8817f612018-12-18 00:18:46 +01004354 &handle ) );
Darryl Greend49a4992018-06-18 17:27:26 +01004355 psa_key_policy_set_usage( &policy_set, policy_usage,
4356 policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004357 PSA_ASSERT( psa_set_key_policy( handle, &policy_set ) );
Darryl Greend49a4992018-06-18 17:27:26 +01004358
Darryl Green0c6575a2018-11-07 16:05:30 +00004359 switch( generation_method )
4360 {
4361 case IMPORT_KEY:
4362 /* Import the key */
Gilles Peskine8817f612018-12-18 00:18:46 +01004363 PSA_ASSERT( psa_import_key( handle, type,
4364 data->x, data->len ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004365 break;
Darryl Greend49a4992018-06-18 17:27:26 +01004366
Darryl Green0c6575a2018-11-07 16:05:30 +00004367 case GENERATE_KEY:
4368 /* Generate a key */
Gilles Peskine8817f612018-12-18 00:18:46 +01004369 PSA_ASSERT( psa_generate_key( handle, type, bits,
4370 NULL, 0 ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004371 break;
4372
4373 case DERIVE_KEY:
4374 /* Create base key */
Gilles Peskined40c1fb2019-01-19 12:20:52 +01004375 PSA_ASSERT( psa_allocate_key( &base_key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004376 psa_key_policy_set_usage( &base_policy_set, PSA_KEY_USAGE_DERIVE,
4377 base_policy_alg );
Gilles Peskine8817f612018-12-18 00:18:46 +01004378 PSA_ASSERT( psa_set_key_policy(
4379 base_key, &base_policy_set ) );
4380 PSA_ASSERT( psa_import_key( base_key, PSA_KEY_TYPE_DERIVE,
4381 data->x, data->len ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004382 /* Derive a key. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004383 PSA_ASSERT( psa_key_derivation( &generator, base_key,
4384 base_policy_alg,
4385 NULL, 0, NULL, 0,
4386 export_size ) );
4387 PSA_ASSERT( psa_generator_import_key(
4388 handle, PSA_KEY_TYPE_RAW_DATA,
4389 bits, &generator ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00004390 break;
4391 }
Darryl Greend49a4992018-06-18 17:27:26 +01004392
4393 /* Export the key */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004394 TEST_EQUAL( psa_export_key( handle,
4395 first_export, export_size,
4396 &first_exported_length ),
4397 export_status );
Darryl Greend49a4992018-06-18 17:27:26 +01004398
4399 /* Shutdown and restart */
4400 mbedtls_psa_crypto_free();
Gilles Peskine8817f612018-12-18 00:18:46 +01004401 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01004402
Darryl Greend49a4992018-06-18 17:27:26 +01004403 /* Check key slot still contains key data */
Gilles Peskine8817f612018-12-18 00:18:46 +01004404 PSA_ASSERT( psa_open_key( PSA_KEY_LIFETIME_PERSISTENT, 1,
4405 &handle ) );
4406 PSA_ASSERT( psa_get_key_information(
4407 handle, &type_get, &bits_get ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004408 TEST_EQUAL( type_get, type );
4409 TEST_EQUAL( bits_get, (size_t) bits );
Darryl Greend49a4992018-06-18 17:27:26 +01004410
Gilles Peskine8817f612018-12-18 00:18:46 +01004411 PSA_ASSERT( psa_get_key_policy( handle, &policy_get ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004412 TEST_EQUAL( psa_key_policy_get_usage( &policy_get ), policy_usage );
4413 TEST_EQUAL( psa_key_policy_get_algorithm( &policy_get ), policy_alg );
Darryl Greend49a4992018-06-18 17:27:26 +01004414
4415 /* Export the key again */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004416 TEST_EQUAL( psa_export_key( handle,
4417 second_export, export_size,
4418 &second_exported_length ),
4419 export_status );
Darryl Greend49a4992018-06-18 17:27:26 +01004420
Darryl Green0c6575a2018-11-07 16:05:30 +00004421 if( export_status == PSA_SUCCESS )
4422 {
4423 ASSERT_COMPARE( first_export, first_exported_length,
4424 second_export, second_exported_length );
Darryl Greend49a4992018-06-18 17:27:26 +01004425
Darryl Green0c6575a2018-11-07 16:05:30 +00004426 switch( generation_method )
4427 {
4428 case IMPORT_KEY:
4429 ASSERT_COMPARE( data->x, data->len,
4430 first_export, first_exported_length );
4431 break;
4432 default:
4433 break;
4434 }
4435 }
4436
4437 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004438 if( ! exercise_key( handle, policy_usage, policy_alg ) )
Darryl Green0c6575a2018-11-07 16:05:30 +00004439 goto exit;
Darryl Greend49a4992018-06-18 17:27:26 +01004440
4441exit:
4442 mbedtls_free( first_export );
4443 mbedtls_free( second_export );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01004444 psa_destroy_key( handle );
Darryl Greend49a4992018-06-18 17:27:26 +01004445 mbedtls_psa_crypto_free();
4446}
4447/* END_CASE */