blob: a6ab78ede441cd9dad13f07aabe6929851a92b6f [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
Gilles Peskine96ee5c72018-07-12 17:24:54 +020014#define ARRAY_LENGTH( array ) ( sizeof( array ) / sizeof( *( array ) ) )
15
itayzafrir3e02b3b2018-06-12 17:06:52 +030016#if(UINT32_MAX > SIZE_MAX)
Gilles Peskine2d277862018-06-18 15:41:12 +020017#define PSA_CRYPTO_TEST_SIZE_T_RANGE( x ) ( ( x ) <= SIZE_MAX )
itayzafrir3e02b3b2018-06-12 17:06:52 +030018#else
Gilles Peskine2d277862018-06-18 15:41:12 +020019#define PSA_CRYPTO_TEST_SIZE_T_RANGE( x ) 1
itayzafrir3e02b3b2018-06-12 17:06:52 +030020#endif
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020021
Jaeden Amerof24c7f82018-06-27 17:20:43 +010022/** An invalid export length that will never be set by psa_export_key(). */
23static const size_t INVALID_EXPORT_LENGTH = ~0U;
24
Gilles Peskinea7aa4422018-08-14 15:17:54 +020025/** Test if a buffer contains a constant byte value.
26 *
27 * `mem_is_char(buffer, c, size)` is true after `memset(buffer, c, size)`.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020028 *
29 * \param buffer Pointer to the beginning of the buffer.
Gilles Peskinea7aa4422018-08-14 15:17:54 +020030 * \param c Expected value of every byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020031 * \param size Size of the buffer in bytes.
32 *
Gilles Peskine3f669c32018-06-21 09:21:51 +020033 * \return 1 if the buffer is all-bits-zero.
34 * \return 0 if there is at least one nonzero byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020035 */
Gilles Peskinea7aa4422018-08-14 15:17:54 +020036static int mem_is_char( void *buffer, unsigned char c, size_t size )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020037{
38 size_t i;
39 for( i = 0; i < size; i++ )
40 {
Gilles Peskinea7aa4422018-08-14 15:17:54 +020041 if( ( (unsigned char *) buffer )[i] != c )
Gilles Peskine3f669c32018-06-21 09:21:51 +020042 return( 0 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020043 }
Gilles Peskine3f669c32018-06-21 09:21:51 +020044 return( 1 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020045}
Gilles Peskine818ca122018-06-20 18:16:48 +020046
Gilles Peskine0b352bc2018-06-28 00:16:11 +020047/* Write the ASN.1 INTEGER with the value 2^(bits-1)+x backwards from *p. */
48static int asn1_write_10x( unsigned char **p,
49 unsigned char *start,
50 size_t bits,
51 unsigned char x )
52{
53 int ret;
54 int len = bits / 8 + 1;
Gilles Peskine480416a2018-06-28 19:04:07 +020055 if( bits == 0 )
56 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
57 if( bits <= 8 && x >= 1 << ( bits - 1 ) )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020058 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
Moran Pekercb088e72018-07-17 17:36:59 +030059 if( *p < start || *p - start < (ptrdiff_t) len )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020060 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
61 *p -= len;
62 ( *p )[len-1] = x;
63 if( bits % 8 == 0 )
64 ( *p )[1] |= 1;
65 else
66 ( *p )[0] |= 1 << ( bits % 8 );
67 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
68 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
69 MBEDTLS_ASN1_INTEGER ) );
70 return( len );
71}
72
73static int construct_fake_rsa_key( unsigned char *buffer,
74 size_t buffer_size,
75 unsigned char **p,
76 size_t bits,
77 int keypair )
78{
79 size_t half_bits = ( bits + 1 ) / 2;
80 int ret;
81 int len = 0;
82 /* Construct something that looks like a DER encoding of
83 * as defined by PKCS#1 v2.2 (RFC 8017) section A.1.2:
84 * RSAPrivateKey ::= SEQUENCE {
85 * version Version,
86 * modulus INTEGER, -- n
87 * publicExponent INTEGER, -- e
88 * privateExponent INTEGER, -- d
89 * prime1 INTEGER, -- p
90 * prime2 INTEGER, -- q
91 * exponent1 INTEGER, -- d mod (p-1)
92 * exponent2 INTEGER, -- d mod (q-1)
93 * coefficient INTEGER, -- (inverse of q) mod p
94 * otherPrimeInfos OtherPrimeInfos OPTIONAL
95 * }
96 * Or, for a public key, the same structure with only
97 * version, modulus and publicExponent.
98 */
99 *p = buffer + buffer_size;
100 if( keypair )
101 {
102 MBEDTLS_ASN1_CHK_ADD( len, /* pq */
103 asn1_write_10x( p, buffer, half_bits, 1 ) );
104 MBEDTLS_ASN1_CHK_ADD( len, /* dq */
105 asn1_write_10x( p, buffer, half_bits, 1 ) );
106 MBEDTLS_ASN1_CHK_ADD( len, /* dp */
107 asn1_write_10x( p, buffer, half_bits, 1 ) );
108 MBEDTLS_ASN1_CHK_ADD( len, /* q */
109 asn1_write_10x( p, buffer, half_bits, 1 ) );
110 MBEDTLS_ASN1_CHK_ADD( len, /* p != q to pass mbedtls sanity checks */
111 asn1_write_10x( p, buffer, half_bits, 3 ) );
112 MBEDTLS_ASN1_CHK_ADD( len, /* d */
113 asn1_write_10x( p, buffer, bits, 1 ) );
114 }
115 MBEDTLS_ASN1_CHK_ADD( len, /* e = 65537 */
116 asn1_write_10x( p, buffer, 17, 1 ) );
117 MBEDTLS_ASN1_CHK_ADD( len, /* n */
118 asn1_write_10x( p, buffer, bits, 1 ) );
119 if( keypair )
120 MBEDTLS_ASN1_CHK_ADD( len, /* version = 0 */
121 mbedtls_asn1_write_int( p, buffer, 0 ) );
122 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, buffer, len ) );
123 {
124 const unsigned char tag =
125 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE;
126 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, buffer, tag ) );
127 }
128 return( len );
129}
130
Gilles Peskine818ca122018-06-20 18:16:48 +0200131static int exercise_mac_key( psa_key_slot_t key,
132 psa_key_usage_t usage,
133 psa_algorithm_t alg )
134{
135 psa_mac_operation_t operation;
136 const unsigned char input[] = "foo";
Gilles Peskine69c12672018-06-28 00:07:19 +0200137 unsigned char mac[PSA_MAC_MAX_SIZE] = {0};
Gilles Peskine818ca122018-06-20 18:16:48 +0200138 size_t mac_length = sizeof( mac );
139
140 if( usage & PSA_KEY_USAGE_SIGN )
141 {
Gilles Peskine89167cb2018-07-08 20:12:23 +0200142 TEST_ASSERT( psa_mac_sign_setup( &operation,
143 key, alg ) == PSA_SUCCESS );
Gilles Peskine818ca122018-06-20 18:16:48 +0200144 TEST_ASSERT( psa_mac_update( &operation,
145 input, sizeof( input ) ) == PSA_SUCCESS );
Gilles Peskineacd4be32018-07-08 19:56:25 +0200146 TEST_ASSERT( psa_mac_sign_finish( &operation,
Gilles Peskineef0cb402018-07-12 16:55:59 +0200147 mac, sizeof( mac ),
Gilles Peskineacd4be32018-07-08 19:56:25 +0200148 &mac_length ) == PSA_SUCCESS );
Gilles Peskine818ca122018-06-20 18:16:48 +0200149 }
150
151 if( usage & PSA_KEY_USAGE_VERIFY )
152 {
153 psa_status_t verify_status =
154 ( usage & PSA_KEY_USAGE_SIGN ?
155 PSA_SUCCESS :
156 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine89167cb2018-07-08 20:12:23 +0200157 TEST_ASSERT( psa_mac_verify_setup( &operation,
158 key, alg ) == PSA_SUCCESS );
Gilles Peskine818ca122018-06-20 18:16:48 +0200159 TEST_ASSERT( psa_mac_update( &operation,
160 input, sizeof( input ) ) == PSA_SUCCESS );
Gilles Peskineacd4be32018-07-08 19:56:25 +0200161 TEST_ASSERT( psa_mac_verify_finish( &operation,
162 mac,
163 mac_length ) == verify_status );
Gilles Peskine818ca122018-06-20 18:16:48 +0200164 }
165
166 return( 1 );
167
168exit:
169 psa_mac_abort( &operation );
170 return( 0 );
171}
172
173static int exercise_cipher_key( psa_key_slot_t key,
174 psa_key_usage_t usage,
175 psa_algorithm_t alg )
176{
177 psa_cipher_operation_t operation;
178 unsigned char iv[16] = {0};
179 size_t iv_length = sizeof( iv );
180 const unsigned char plaintext[16] = "Hello, world...";
181 unsigned char ciphertext[32] = "(wabblewebblewibblewobblewubble)";
182 size_t ciphertext_length = sizeof( ciphertext );
183 unsigned char decrypted[sizeof( ciphertext )];
184 size_t part_length;
185
186 if( usage & PSA_KEY_USAGE_ENCRYPT )
187 {
Gilles Peskinefe119512018-07-08 21:39:34 +0200188 TEST_ASSERT( psa_cipher_encrypt_setup( &operation,
189 key, alg ) == PSA_SUCCESS );
190 TEST_ASSERT( psa_cipher_generate_iv( &operation,
191 iv, sizeof( iv ),
192 &iv_length ) == PSA_SUCCESS );
Gilles Peskine818ca122018-06-20 18:16:48 +0200193 TEST_ASSERT( psa_cipher_update( &operation,
194 plaintext, sizeof( plaintext ),
195 ciphertext, sizeof( ciphertext ),
196 &ciphertext_length ) == PSA_SUCCESS );
197 TEST_ASSERT( psa_cipher_finish( &operation,
198 ciphertext + ciphertext_length,
199 sizeof( ciphertext ) - ciphertext_length,
200 &part_length ) == PSA_SUCCESS );
201 ciphertext_length += part_length;
202 }
203
204 if( usage & PSA_KEY_USAGE_DECRYPT )
205 {
206 psa_status_t status;
Mohammad AboMokhadb9b232018-06-28 01:52:54 -0700207 psa_key_type_t type = PSA_KEY_TYPE_NONE;
Gilles Peskine818ca122018-06-20 18:16:48 +0200208 if( ! ( usage & PSA_KEY_USAGE_ENCRYPT ) )
209 {
Gilles Peskine818ca122018-06-20 18:16:48 +0200210 size_t bits;
211 TEST_ASSERT( psa_get_key_information( key, &type, &bits ) );
212 iv_length = PSA_BLOCK_CIPHER_BLOCK_SIZE( type );
213 }
Gilles Peskinefe119512018-07-08 21:39:34 +0200214 TEST_ASSERT( psa_cipher_decrypt_setup( &operation,
215 key, alg ) == PSA_SUCCESS );
216 TEST_ASSERT( psa_cipher_set_iv( &operation,
217 iv, iv_length ) == PSA_SUCCESS );
Gilles Peskine818ca122018-06-20 18:16:48 +0200218 TEST_ASSERT( psa_cipher_update( &operation,
219 ciphertext, ciphertext_length,
220 decrypted, sizeof( decrypted ),
221 &part_length ) == PSA_SUCCESS );
222 status = psa_cipher_finish( &operation,
223 decrypted + part_length,
224 sizeof( decrypted ) - part_length,
225 &part_length );
226 /* For a stream cipher, all inputs are valid. For a block cipher,
227 * if the input is some aribtrary data rather than an actual
228 ciphertext, a padding error is likely. */
Mohammad AboMokh65fa0b82018-06-28 02:14:00 -0700229 if( ( usage & PSA_KEY_USAGE_ENCRYPT ) ||
Mohammad AboMokhadb9b232018-06-28 01:52:54 -0700230 PSA_BLOCK_CIPHER_BLOCK_SIZE( type ) == 1 )
Gilles Peskine818ca122018-06-20 18:16:48 +0200231 TEST_ASSERT( status == PSA_SUCCESS );
232 else
233 TEST_ASSERT( status == PSA_SUCCESS ||
234 status == PSA_ERROR_INVALID_PADDING );
235 }
236
237 return( 1 );
238
239exit:
240 psa_cipher_abort( &operation );
241 return( 0 );
242}
243
244static int exercise_aead_key( psa_key_slot_t key,
245 psa_key_usage_t usage,
246 psa_algorithm_t alg )
247{
248 unsigned char nonce[16] = {0};
249 size_t nonce_length = sizeof( nonce );
250 unsigned char plaintext[16] = "Hello, world...";
251 unsigned char ciphertext[48] = "(wabblewebblewibblewobblewubble)";
252 size_t ciphertext_length = sizeof( ciphertext );
253 size_t plaintext_length = sizeof( ciphertext );
254
255 if( usage & PSA_KEY_USAGE_ENCRYPT )
256 {
257 TEST_ASSERT( psa_aead_encrypt( key, alg,
258 nonce, nonce_length,
259 NULL, 0,
260 plaintext, sizeof( plaintext ),
261 ciphertext, sizeof( ciphertext ),
262 &ciphertext_length ) == PSA_SUCCESS );
263 }
264
265 if( usage & PSA_KEY_USAGE_DECRYPT )
266 {
267 psa_status_t verify_status =
268 ( usage & PSA_KEY_USAGE_ENCRYPT ?
269 PSA_SUCCESS :
270 PSA_ERROR_INVALID_SIGNATURE );
271 TEST_ASSERT( psa_aead_decrypt( key, alg,
272 nonce, nonce_length,
273 NULL, 0,
274 ciphertext, ciphertext_length,
275 plaintext, sizeof( plaintext ),
276 &plaintext_length ) == verify_status );
277 }
278
279 return( 1 );
280
281exit:
282 return( 0 );
283}
284
285static int exercise_signature_key( psa_key_slot_t key,
286 psa_key_usage_t usage,
287 psa_algorithm_t alg )
288{
Gilles Peskinef969b3a2018-06-30 00:20:25 +0200289 unsigned char payload[PSA_HASH_MAX_SIZE] = {1};
290 size_t payload_length = 16;
Gilles Peskine69c12672018-06-28 00:07:19 +0200291 unsigned char signature[PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE] = {0};
Gilles Peskine818ca122018-06-20 18:16:48 +0200292 size_t signature_length = sizeof( signature );
293
294 if( usage & PSA_KEY_USAGE_SIGN )
295 {
Gilles Peskinef969b3a2018-06-30 00:20:25 +0200296 /* Some algorithms require the payload to have the size of
297 * the hash encoded in the algorithm. Use this input size
298 * even for algorithms that allow other input sizes. */
299 psa_algorithm_t hash_alg = PSA_ALG_SIGN_GET_HASH( alg );
300 if( hash_alg != 0 )
301 payload_length = PSA_HASH_SIZE( hash_alg );
Gilles Peskine818ca122018-06-20 18:16:48 +0200302 TEST_ASSERT( psa_asymmetric_sign( key, alg,
303 payload, payload_length,
Gilles Peskine818ca122018-06-20 18:16:48 +0200304 signature, sizeof( signature ),
305 &signature_length ) == PSA_SUCCESS );
306 }
307
308 if( usage & PSA_KEY_USAGE_VERIFY )
309 {
310 psa_status_t verify_status =
311 ( usage & PSA_KEY_USAGE_SIGN ?
312 PSA_SUCCESS :
313 PSA_ERROR_INVALID_SIGNATURE );
314 TEST_ASSERT( psa_asymmetric_verify( key, alg,
315 payload, payload_length,
Gilles Peskine818ca122018-06-20 18:16:48 +0200316 signature, signature_length ) ==
317 verify_status );
318 }
319
320 return( 1 );
321
322exit:
323 return( 0 );
324}
325
326static int exercise_asymmetric_encryption_key( psa_key_slot_t key,
327 psa_key_usage_t usage,
328 psa_algorithm_t alg )
329{
330 unsigned char plaintext[256] = "Hello, world...";
331 unsigned char ciphertext[256] = "(wabblewebblewibblewobblewubble)";
332 size_t ciphertext_length = sizeof( ciphertext );
333 size_t plaintext_length = 16;
334
335 if( usage & PSA_KEY_USAGE_ENCRYPT )
336 {
337 TEST_ASSERT(
338 psa_asymmetric_encrypt( key, alg,
339 plaintext, plaintext_length,
340 NULL, 0,
341 ciphertext, sizeof( ciphertext ),
342 &ciphertext_length ) == PSA_SUCCESS );
343 }
344
345 if( usage & PSA_KEY_USAGE_DECRYPT )
346 {
347 psa_status_t status =
348 psa_asymmetric_decrypt( key, alg,
349 ciphertext, ciphertext_length,
350 NULL, 0,
351 plaintext, sizeof( plaintext ),
352 &plaintext_length );
353 TEST_ASSERT( status == PSA_SUCCESS ||
354 ( ( usage & PSA_KEY_USAGE_ENCRYPT ) == 0 &&
355 ( status == PSA_ERROR_INVALID_ARGUMENT ||
356 status == PSA_ERROR_INVALID_PADDING ) ) );
357 }
358
359 return( 1 );
360
361exit:
362 return( 0 );
363}
Gilles Peskine02b75072018-07-01 22:31:34 +0200364
Gilles Peskineea0fb492018-07-12 17:17:20 +0200365static int exercise_key_derivation_key( psa_key_slot_t key,
366 psa_key_usage_t usage,
367 psa_algorithm_t alg )
368{
369 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
370 unsigned char label[16] = "This is a label.";
371 size_t label_length = sizeof( label );
372 unsigned char seed[16] = "abcdefghijklmnop";
373 size_t seed_length = sizeof( seed );
374 unsigned char output[1];
375
376 if( usage & PSA_KEY_USAGE_DERIVE )
377 {
378 TEST_ASSERT( psa_key_derivation( &generator,
379 key, alg,
380 label, label_length,
381 seed, seed_length,
382 sizeof( output ) ) == PSA_SUCCESS );
383 TEST_ASSERT( psa_generator_read( &generator,
384 output,
385 sizeof( output ) ) == PSA_SUCCESS );
386 TEST_ASSERT( psa_generator_abort( &generator ) == PSA_SUCCESS );
387 }
388
389 return( 1 );
390
391exit:
392 return( 0 );
393}
394
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200395static int is_oid_of_key_type( psa_key_type_t type,
396 const uint8_t *oid, size_t oid_length )
397{
Gilles Peskineae3d2a22018-08-13 14:14:22 +0200398 const uint8_t *expected_oid = NULL;
399 size_t expected_oid_length = 0;
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200400#if defined(MBEDTLS_RSA_C)
Gilles Peskineae3d2a22018-08-13 14:14:22 +0200401 if( PSA_KEY_TYPE_IS_RSA( type ) )
402 {
403 expected_oid = (uint8_t *) MBEDTLS_OID_PKCS1_RSA;
404 expected_oid_length = sizeof( MBEDTLS_OID_PKCS1_RSA ) - 1;
405 }
406 else
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200407#endif /* MBEDTLS_RSA_C */
408#if defined(MBEDTLS_ECP_C)
Gilles Peskineae3d2a22018-08-13 14:14:22 +0200409 if( PSA_KEY_TYPE_IS_ECC( type ) )
410 {
411 expected_oid = (uint8_t *) MBEDTLS_OID_EC_ALG_UNRESTRICTED;
412 expected_oid_length = sizeof( MBEDTLS_OID_EC_ALG_UNRESTRICTED ) - 1;
413 }
414 else
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200415#endif /* MBEDTLS_ECP_C */
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200416 {
417 char message[40];
418 mbedtls_snprintf( message, sizeof( message ),
419 "OID not known for key type=0x%08lx",
420 (unsigned long) type );
421 test_fail( message, __LINE__, __FILE__ );
422 return( 0 );
423 }
424
Gilles Peskinebd7dea92018-09-27 13:57:19 +0200425 ASSERT_COMPARE( expected_oid, expected_oid_length, oid, oid_length );
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200426 return( 1 );
427
428exit:
429 return( 0 );
430}
431
432static int asn1_skip_integer( unsigned char **p, const unsigned char *end,
433 size_t min_bits, size_t max_bits,
434 int must_be_odd )
435{
436 size_t len;
437 size_t actual_bits;
438 unsigned char msb;
439 TEST_ASSERT( mbedtls_asn1_get_tag( p, end, &len,
440 MBEDTLS_ASN1_INTEGER ) == 0 );
441 /* Tolerate a slight departure from DER encoding:
442 * - 0 may be represented by an empty string or a 1-byte string.
443 * - The sign bit may be used as a value bit. */
444 if( ( len == 1 && ( *p )[0] == 0 ) ||
445 ( len > 1 && ( *p )[0] == 0 && ( ( *p )[1] & 0x80 ) != 0 ) )
446 {
447 ++( *p );
448 --len;
449 }
450 if( min_bits == 0 && len == 0 )
451 return( 1 );
452 msb = ( *p )[0];
453 TEST_ASSERT( msb != 0 );
454 actual_bits = 8 * ( len - 1 );
455 while( msb != 0 )
456 {
457 msb >>= 1;
458 ++actual_bits;
459 }
460 TEST_ASSERT( actual_bits >= min_bits );
461 TEST_ASSERT( actual_bits <= max_bits );
462 if( must_be_odd )
463 TEST_ASSERT( ( ( *p )[len-1] & 1 ) != 0 );
464 *p += len;
465 return( 1 );
466exit:
467 return( 0 );
468}
469
470static int asn1_get_implicit_tag( unsigned char **p, const unsigned char *end,
471 size_t *len,
472 unsigned char n, unsigned char tag )
473{
474 int ret;
475 ret = mbedtls_asn1_get_tag( p, end, len,
476 MBEDTLS_ASN1_CONTEXT_SPECIFIC |
477 MBEDTLS_ASN1_CONSTRUCTED | ( n ) );
478 if( ret != 0 )
479 return( ret );
480 end = *p + *len;
481 ret = mbedtls_asn1_get_tag( p, end, len, tag );
482 if( ret != 0 )
483 return( ret );
484 if( *p + *len != end )
485 return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
486 return( 0 );
487}
488
489static int exported_key_sanity_check( psa_key_type_t type, size_t bits,
490 uint8_t *exported, size_t exported_length )
491{
492 if( PSA_KEY_TYPE_IS_UNSTRUCTURED( type ) )
Gilles Peskined14664a2018-08-10 19:07:32 +0200493 TEST_ASSERT( exported_length == ( bits + 7 ) / 8 );
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200494 else
495 TEST_ASSERT( exported_length <= PSA_KEY_EXPORT_MAX_SIZE( type, bits ) );
Gilles Peskined14664a2018-08-10 19:07:32 +0200496
497#if defined(MBEDTLS_DES_C)
498 if( type == PSA_KEY_TYPE_DES )
499 {
500 /* Check the parity bits. */
501 unsigned i;
502 for( i = 0; i < bits / 8; i++ )
503 {
504 unsigned bit_count = 0;
505 unsigned m;
506 for( m = 1; m <= 0x100; m <<= 1 )
507 {
508 if( exported[i] & m )
509 ++bit_count;
510 }
511 TEST_ASSERT( bit_count % 2 != 0 );
512 }
513 }
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200514 else
Gilles Peskined14664a2018-08-10 19:07:32 +0200515#endif
516
517#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_PARSE_C)
518 if( type == PSA_KEY_TYPE_RSA_KEYPAIR )
519 {
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200520 uint8_t *p = exported;
521 uint8_t *end = exported + exported_length;
522 size_t len;
523 /* RSAPrivateKey ::= SEQUENCE {
Gilles Peskinedea46cf2018-08-21 16:12:54 +0200524 * version INTEGER, -- must be 0
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200525 * modulus INTEGER, -- n
526 * publicExponent INTEGER, -- e
527 * privateExponent INTEGER, -- d
528 * prime1 INTEGER, -- p
529 * prime2 INTEGER, -- q
530 * exponent1 INTEGER, -- d mod (p-1)
531 * exponent2 INTEGER, -- d mod (q-1)
532 * coefficient INTEGER, -- (inverse of q) mod p
533 * }
534 */
535 TEST_ASSERT( mbedtls_asn1_get_tag( &p, end, &len,
536 MBEDTLS_ASN1_SEQUENCE |
537 MBEDTLS_ASN1_CONSTRUCTED ) == 0 );
538 TEST_ASSERT( p + len == end );
539 if( ! asn1_skip_integer( &p, end, 0, 0, 0 ) )
540 goto exit;
541 if( ! asn1_skip_integer( &p, end, bits, bits, 1 ) )
542 goto exit;
543 if( ! asn1_skip_integer( &p, end, 2, bits, 1 ) )
544 goto exit;
545 /* Require d to be at least half the size of n. */
546 if( ! asn1_skip_integer( &p, end, bits / 2, bits, 1 ) )
547 goto exit;
548 /* Require p and q to be at most half the size of n, rounded up. */
549 if( ! asn1_skip_integer( &p, end, bits / 2, bits / 2 + 1, 1 ) )
550 goto exit;
551 if( ! asn1_skip_integer( &p, end, bits / 2, bits / 2 + 1, 1 ) )
552 goto exit;
553 if( ! asn1_skip_integer( &p, end, 1, bits / 2 + 1, 0 ) )
554 goto exit;
555 if( ! asn1_skip_integer( &p, end, 1, bits / 2 + 1, 0 ) )
556 goto exit;
557 if( ! asn1_skip_integer( &p, end, 1, bits / 2 + 1, 0 ) )
558 goto exit;
559 TEST_ASSERT( p == end );
560 }
561 else
Gilles Peskined14664a2018-08-10 19:07:32 +0200562#endif /* MBEDTLS_RSA_C */
563
564#if defined(MBEDTLS_ECP_C)
565 if( PSA_KEY_TYPE_IS_ECC_KEYPAIR( type ) )
566 {
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200567 uint8_t *p = exported;
568 uint8_t *end = exported + exported_length;
569 size_t len;
570 int version;
571 /* ECPrivateKey ::= SEQUENCE {
572 * version INTEGER, -- must be 1
573 * privateKey OCTET STRING,
574 * -- `ceiling(log_{256}(n))`-byte string, big endian,
575 * -- where n is the order of the curve.
576 * parameters ECParameters {{ NamedCurve }}, -- mandatory
577 * publicKey BIT STRING -- mandatory
578 * }
579 */
580 TEST_ASSERT( mbedtls_asn1_get_tag( &p, end, &len,
581 MBEDTLS_ASN1_SEQUENCE |
582 MBEDTLS_ASN1_CONSTRUCTED ) == 0 );
583 TEST_ASSERT( p + len == end );
584 TEST_ASSERT( mbedtls_asn1_get_int( &p, end, &version ) == 0 );
585 TEST_ASSERT( version == 1 );
586 TEST_ASSERT( mbedtls_asn1_get_tag( &p, end, &len,
587 MBEDTLS_ASN1_OCTET_STRING ) == 0 );
588 /* Bug in Mbed TLS: the length of the octet string depends on the value */
589 // TEST_ASSERT( len == PSA_BITS_TO_BYTES( bits ) );
590 p += len;
591 TEST_ASSERT( asn1_get_implicit_tag( &p, end, &len, 0,
592 MBEDTLS_ASN1_OID ) == 0 );
593 p += len;
Gilles Peskinec6290c02018-08-13 17:24:59 +0200594 /* publicKey: ECPoint in uncompressed representation (as below) */
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200595 TEST_ASSERT( asn1_get_implicit_tag( &p, end, &len, 1,
596 MBEDTLS_ASN1_BIT_STRING ) == 0 );
597 TEST_ASSERT( p + len == end );
598 TEST_ASSERT( p[0] == 0 ); /* 0 unused bits in the bit string */
599 ++p;
600 TEST_ASSERT( p + 1 + 2 * PSA_BITS_TO_BYTES( bits ) == end );
601 TEST_ASSERT( p[0] == 4 );
602 }
603 else
Gilles Peskined14664a2018-08-10 19:07:32 +0200604#endif /* MBEDTLS_ECP_C */
605
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200606 if( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) )
607 {
608 uint8_t *p = exported;
609 uint8_t *end = exported + exported_length;
610 size_t len;
611 mbedtls_asn1_buf alg;
612 mbedtls_asn1_buf params;
613 mbedtls_asn1_bitstring bitstring;
614 /* SubjectPublicKeyInfo ::= SEQUENCE {
615 * algorithm AlgorithmIdentifier,
616 * subjectPublicKey BIT STRING }
617 * AlgorithmIdentifier ::= SEQUENCE {
618 * algorithm OBJECT IDENTIFIER,
619 * parameters ANY DEFINED BY algorithm OPTIONAL }
620 */
621 TEST_ASSERT( mbedtls_asn1_get_tag( &p, end, &len,
622 MBEDTLS_ASN1_SEQUENCE |
623 MBEDTLS_ASN1_CONSTRUCTED ) == 0 );
624 TEST_ASSERT( p + len == end );
625 TEST_ASSERT( mbedtls_asn1_get_alg( &p, end, &alg, &params ) == 0 );
626 if( ! is_oid_of_key_type( type, alg.p, alg.len ) )
627 goto exit;
628 TEST_ASSERT( mbedtls_asn1_get_bitstring( &p, end, &bitstring ) == 0 );
629 TEST_ASSERT( p == end );
630 p = bitstring.p;
631#if defined(MBEDTLS_RSA_C)
632 if( type == PSA_KEY_TYPE_RSA_PUBLIC_KEY )
633 {
634 /* RSAPublicKey ::= SEQUENCE {
635 * modulus INTEGER, -- n
636 * publicExponent INTEGER } -- e
637 */
638 TEST_ASSERT( bitstring.unused_bits == 0 );
639 TEST_ASSERT( mbedtls_asn1_get_tag( &p, end, &len,
640 MBEDTLS_ASN1_SEQUENCE |
641 MBEDTLS_ASN1_CONSTRUCTED ) == 0 );
642 TEST_ASSERT( p + len == end );
643 if( ! asn1_skip_integer( &p, end, bits, bits, 1 ) )
644 goto exit;
645 if( ! asn1_skip_integer( &p, end, 2, bits, 1 ) )
646 goto exit;
647 TEST_ASSERT( p == end );
648 }
649 else
650#endif /* MBEDTLS_RSA_C */
651#if defined(MBEDTLS_ECP_C)
652 if( PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY( type ) )
653 {
654 /* ECPoint ::= ...
Gilles Peskinec6290c02018-08-13 17:24:59 +0200655 * -- first 8 bits: 0x04 (uncompressed representation);
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200656 * -- then x_P as an n-bit string, big endian;
657 * -- then y_P as a n-bit string, big endian,
658 * -- where n is the order of the curve.
659 */
660 TEST_ASSERT( bitstring.unused_bits == 0 );
661 TEST_ASSERT( p + 1 + 2 * PSA_BITS_TO_BYTES( bits ) == end );
662 TEST_ASSERT( p[0] == 4 );
663 }
664 else
665#endif /* MBEDTLS_ECP_C */
666 {
667 char message[40];
668 mbedtls_snprintf( message, sizeof( message ),
669 "No sanity check for public key type=0x%08lx",
670 (unsigned long) type );
671 test_fail( message, __LINE__, __FILE__ );
672 return( 0 );
673 }
674 }
675 else
676
677 {
678 /* No sanity checks for other types */
679 }
680
681 return( 1 );
Gilles Peskined14664a2018-08-10 19:07:32 +0200682
683exit:
Gilles Peskinedd2f95b2018-08-11 01:22:42 +0200684 return( 0 );
Gilles Peskined14664a2018-08-10 19:07:32 +0200685}
686
687static int exercise_export_key( psa_key_slot_t slot,
688 psa_key_usage_t usage )
689{
690 psa_key_type_t type;
691 size_t bits;
692 uint8_t *exported = NULL;
693 size_t exported_size = 0;
694 size_t exported_length = 0;
695 int ok = 0;
696
Gilles Peskineacec7b6f2018-09-13 20:34:11 +0200697 TEST_ASSERT( psa_get_key_information( slot, &type, &bits ) == PSA_SUCCESS );
698
699 if( ( usage & PSA_KEY_USAGE_EXPORT ) == 0 &&
700 ! PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) )
Gilles Peskined14664a2018-08-10 19:07:32 +0200701 {
702 TEST_ASSERT( psa_export_key( slot, NULL, 0, &exported_length ) ==
703 PSA_ERROR_NOT_PERMITTED );
704 return( 1 );
705 }
706
Gilles Peskined14664a2018-08-10 19:07:32 +0200707 exported_size = PSA_KEY_EXPORT_MAX_SIZE( type, bits );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200708 ASSERT_ALLOC( exported, exported_size );
Gilles Peskined14664a2018-08-10 19:07:32 +0200709
710 TEST_ASSERT( psa_export_key( slot,
711 exported, exported_size,
712 &exported_length ) == PSA_SUCCESS );
713 ok = exported_key_sanity_check( type, bits, exported, exported_length );
714
715exit:
716 mbedtls_free( exported );
717 return( ok );
718}
719
720static int exercise_export_public_key( psa_key_slot_t slot )
721{
722 psa_key_type_t type;
723 psa_key_type_t public_type;
724 size_t bits;
725 uint8_t *exported = NULL;
726 size_t exported_size = 0;
727 size_t exported_length = 0;
728 int ok = 0;
729
730 TEST_ASSERT( psa_get_key_information( slot, &type, &bits ) == PSA_SUCCESS );
731 if( ! PSA_KEY_TYPE_IS_ASYMMETRIC( type ) )
732 {
733 TEST_ASSERT( psa_export_public_key( slot,
734 NULL, 0, &exported_length ) ==
735 PSA_ERROR_INVALID_ARGUMENT );
736 return( 1 );
737 }
738
739 public_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEYPAIR( type );
740 exported_size = PSA_KEY_EXPORT_MAX_SIZE( public_type, bits );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200741 ASSERT_ALLOC( exported, exported_size );
Gilles Peskined14664a2018-08-10 19:07:32 +0200742
743 TEST_ASSERT( psa_export_public_key( slot,
744 exported, exported_size,
745 &exported_length ) == PSA_SUCCESS );
746 ok = exported_key_sanity_check( public_type, bits,
747 exported, exported_length );
748
749exit:
750 mbedtls_free( exported );
751 return( ok );
752}
753
Gilles Peskine02b75072018-07-01 22:31:34 +0200754static int exercise_key( psa_key_slot_t slot,
755 psa_key_usage_t usage,
756 psa_algorithm_t alg )
757{
758 int ok;
759 if( alg == 0 )
760 ok = 1; /* If no algorihm, do nothing (used for raw data "keys"). */
761 else if( PSA_ALG_IS_MAC( alg ) )
762 ok = exercise_mac_key( slot, usage, alg );
763 else if( PSA_ALG_IS_CIPHER( alg ) )
764 ok = exercise_cipher_key( slot, usage, alg );
765 else if( PSA_ALG_IS_AEAD( alg ) )
766 ok = exercise_aead_key( slot, usage, alg );
767 else if( PSA_ALG_IS_SIGN( alg ) )
768 ok = exercise_signature_key( slot, usage, alg );
769 else if( PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) )
770 ok = exercise_asymmetric_encryption_key( slot, usage, alg );
Gilles Peskineea0fb492018-07-12 17:17:20 +0200771 else if( PSA_ALG_IS_KEY_DERIVATION( alg ) )
772 ok = exercise_key_derivation_key( slot, usage, alg );
Gilles Peskine02b75072018-07-01 22:31:34 +0200773 else
774 {
775 char message[40];
776 mbedtls_snprintf( message, sizeof( message ),
777 "No code to exercise alg=0x%08lx",
778 (unsigned long) alg );
779 test_fail( message, __LINE__, __FILE__ );
780 ok = 0;
781 }
Gilles Peskined14664a2018-08-10 19:07:32 +0200782
783 ok = ok && exercise_export_key( slot, usage );
784 ok = ok && exercise_export_public_key( slot );
785
Gilles Peskine02b75072018-07-01 22:31:34 +0200786 return( ok );
787}
788
Gilles Peskinee59236f2018-01-27 23:32:46 +0100789/* END_HEADER */
790
791/* BEGIN_DEPENDENCIES
792 * depends_on:MBEDTLS_PSA_CRYPTO_C
793 * END_DEPENDENCIES
794 */
795
796/* BEGIN_CASE */
Gilles Peskinee1f2d7d2018-08-21 14:54:54 +0200797void static_checks( )
798{
799 size_t max_truncated_mac_size =
800 PSA_ALG_MAC_TRUNCATION_MASK >> PSA_MAC_TRUNCATION_OFFSET;
801
802 /* Check that the length for a truncated MAC always fits in the algorithm
803 * encoding. The shifted mask is the maximum truncated value. The
804 * untruncated algorithm may be one byte larger. */
805 TEST_ASSERT( PSA_MAC_MAX_SIZE <= 1 + max_truncated_mac_size );
806}
807/* END_CASE */
808
809/* BEGIN_CASE */
Gilles Peskine2d277862018-06-18 15:41:12 +0200810void init_deinit( )
Gilles Peskinee59236f2018-01-27 23:32:46 +0100811{
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100812 psa_status_t status;
Gilles Peskinee59236f2018-01-27 23:32:46 +0100813 int i;
814 for( i = 0; i <= 1; i++ )
815 {
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100816 status = psa_crypto_init( );
817 TEST_ASSERT( status == PSA_SUCCESS );
818 status = psa_crypto_init( );
819 TEST_ASSERT( status == PSA_SUCCESS );
Gilles Peskinee59236f2018-01-27 23:32:46 +0100820 mbedtls_psa_crypto_free( );
821 }
822}
823/* END_CASE */
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100824
825/* BEGIN_CASE */
Gilles Peskine996deb12018-08-01 15:45:45 +0200826void fill_slots( int max_arg )
827{
828 /* Fill all the slots until we run out of memory or out of slots,
829 * or until some limit specified in the test data for the sake of
830 * implementations with an essentially unlimited number of slots.
831 * This test assumes that available slots are numbered from 1. */
832
833 psa_key_slot_t slot;
834 psa_key_slot_t max = 0;
835 psa_key_policy_t policy;
836 uint8_t exported[sizeof( max )];
837 size_t exported_size;
838 psa_status_t status;
839
840 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
841
842 psa_key_policy_init( &policy );
843 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, 0 );
844
845 for( max = 1; max <= (size_t) max_arg; max++ )
846 {
847 status = psa_set_key_policy( max, &policy );
848 /* Stop filling slots if we run out of memory or out of
849 * available slots. */
850 TEST_ASSERT( status == PSA_SUCCESS ||
851 status == PSA_ERROR_INSUFFICIENT_MEMORY ||
852 status == PSA_ERROR_INVALID_ARGUMENT );
853 if( status != PSA_SUCCESS )
854 break;
855 status = psa_import_key( max, PSA_KEY_TYPE_RAW_DATA,
856 (uint8_t*) &max, sizeof( max ) );
857 /* Since psa_set_key_policy succeeded, we know that the slot
858 * number is valid. But we may legitimately run out of memory. */
859 TEST_ASSERT( status == PSA_SUCCESS ||
860 status == PSA_ERROR_INSUFFICIENT_MEMORY );
861 if( status != PSA_SUCCESS )
862 break;
863 }
864 /* `max` is now the first slot number that wasn't filled. */
865 max -= 1;
866
867 for( slot = 1; slot <= max; slot++ )
868 {
869 TEST_ASSERT( psa_export_key( slot,
870 exported, sizeof( exported ),
871 &exported_size ) == PSA_SUCCESS );
Gilles Peskinebd7dea92018-09-27 13:57:19 +0200872 ASSERT_COMPARE( &slot, sizeof( slot ), exported, exported_size );
Gilles Peskine996deb12018-08-01 15:45:45 +0200873 }
874
875exit:
Gilles Peskine9a056342018-08-01 15:46:54 +0200876 /* Do not destroy the keys. mbedtls_psa_crypto_free() should do it. */
Gilles Peskine996deb12018-08-01 15:45:45 +0200877 mbedtls_psa_crypto_free( );
878}
879/* END_CASE */
880
881/* BEGIN_CASE */
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200882void import( data_t *data, int type, int expected_status_arg )
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100883{
884 int slot = 1;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200885 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100886 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100887
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100888 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300889 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100890 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
891
Gilles Peskine4abf7412018-06-18 16:35:34 +0200892 status = psa_import_key( slot, type, data->x, data->len );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200893 TEST_ASSERT( status == expected_status );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100894 if( status == PSA_SUCCESS )
895 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
896
897exit:
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100898 mbedtls_psa_crypto_free( );
899}
900/* END_CASE */
901
902/* BEGIN_CASE */
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200903void import_rsa_made_up( int bits_arg, int keypair, int expected_status_arg )
904{
905 int slot = 1;
906 size_t bits = bits_arg;
907 psa_status_t expected_status = expected_status_arg;
908 psa_status_t status;
909 psa_key_type_t type =
910 keypair ? PSA_KEY_TYPE_RSA_KEYPAIR : PSA_KEY_TYPE_RSA_PUBLIC_KEY;
911 size_t buffer_size = /* Slight overapproximations */
912 keypair ? bits * 9 / 16 + 80 : bits / 8 + 20;
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200913 unsigned char *buffer = NULL;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200914 unsigned char *p;
915 int ret;
916 size_t length;
917
918 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200919 ASSERT_ALLOC( buffer, buffer_size );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200920
921 TEST_ASSERT( ( ret = construct_fake_rsa_key( buffer, buffer_size, &p,
922 bits, keypair ) ) >= 0 );
923 length = ret;
924
925 /* Try importing the key */
926 status = psa_import_key( slot, type, p, length );
927 TEST_ASSERT( status == expected_status );
928 if( status == PSA_SUCCESS )
929 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
930
931exit:
932 mbedtls_free( buffer );
933 mbedtls_psa_crypto_free( );
934}
935/* END_CASE */
936
937/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300938void import_export( data_t *data,
Moran Pekera964a8f2018-06-04 18:42:36 +0300939 int type_arg,
940 int alg_arg,
941 int usage_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100942 int expected_bits,
943 int export_size_delta,
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200944 int expected_export_status_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100945 int canonical_input )
946{
947 int slot = 1;
948 int slot2 = slot + 1;
949 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200950 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200951 psa_status_t expected_export_status = expected_export_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100952 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100953 unsigned char *exported = NULL;
954 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100955 size_t export_size;
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100956 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100957 size_t reexported_length;
958 psa_key_type_t got_type;
959 size_t got_bits;
Gilles Peskinedec72612018-06-18 18:12:37 +0200960 psa_key_policy_t policy;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100961
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100962 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300963 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
Moran Pekercb088e72018-07-17 17:36:59 +0300964 export_size = (ptrdiff_t) data->len + export_size_delta;
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200965 ASSERT_ALLOC( exported, export_size );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100966 if( ! canonical_input )
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200967 ASSERT_ALLOC( reexported, export_size );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100968 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
969
mohammad1603a97cb8c2018-03-28 03:46:26 -0700970 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200971 psa_key_policy_set_usage( &policy, usage_arg, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -0700972 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
973
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100974 /* Import the key */
975 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200976 data->x, data->len ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100977
978 /* Test the key information */
979 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200980 &got_type,
981 &got_bits ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100982 TEST_ASSERT( got_type == type );
983 TEST_ASSERT( got_bits == (size_t) expected_bits );
984
985 /* Export the key */
986 status = psa_export_key( slot,
987 exported, export_size,
988 &exported_length );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200989 TEST_ASSERT( status == expected_export_status );
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100990
991 /* The exported length must be set by psa_export_key() to a value between 0
992 * and export_size. On errors, the exported length must be 0. */
993 TEST_ASSERT( exported_length != INVALID_EXPORT_LENGTH );
994 TEST_ASSERT( status == PSA_SUCCESS || exported_length == 0 );
995 TEST_ASSERT( exported_length <= export_size );
996
Gilles Peskinea7aa4422018-08-14 15:17:54 +0200997 TEST_ASSERT( mem_is_char( exported + exported_length, 0,
Gilles Peskine3f669c32018-06-21 09:21:51 +0200998 export_size - exported_length ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100999 if( status != PSA_SUCCESS )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +02001000 {
1001 TEST_ASSERT( exported_length == 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001002 goto destroy;
Gilles Peskinee66ca3b2018-06-20 00:11:45 +02001003 }
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001004
Gilles Peskine8f609232018-08-11 01:24:55 +02001005 if( ! exercise_export_key( slot, usage_arg ) )
1006 goto exit;
1007
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001008 if( canonical_input )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02001009 ASSERT_COMPARE( data->x, data->len, exported, exported_length );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001010 else
1011 {
mohammad1603a97cb8c2018-03-28 03:46:26 -07001012 TEST_ASSERT( psa_set_key_policy( slot2, &policy ) == PSA_SUCCESS );
1013
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001014 TEST_ASSERT( psa_import_key( slot2, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001015 exported,
Gilles Peskineb67f3082018-08-07 15:33:10 +02001016 exported_length ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001017 TEST_ASSERT( psa_export_key( slot2,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001018 reexported,
1019 export_size,
1020 &reexported_length ) == PSA_SUCCESS );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02001021 ASSERT_COMPARE( exported, exported_length,
1022 reexported, reexported_length );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001023 }
1024
1025destroy:
1026 /* Destroy the key */
1027 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
1028 TEST_ASSERT( psa_get_key_information(
1029 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
1030
1031exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001032 mbedtls_free( exported );
1033 mbedtls_free( reexported );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001034 mbedtls_psa_crypto_free( );
1035}
1036/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +01001037
Moran Pekerf709f4a2018-06-06 17:26:04 +03001038/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001039void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001040 int type_arg,
1041 int alg_arg,
1042 int expected_bits,
1043 int public_key_expected_length,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001044 int expected_export_status_arg )
Moran Pekerf709f4a2018-06-06 17:26:04 +03001045{
1046 int slot = 1;
1047 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001048 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001049 psa_status_t expected_export_status = expected_export_status_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +03001050 psa_status_t status;
Moran Pekerf709f4a2018-06-06 17:26:04 +03001051 unsigned char *exported = NULL;
Moran Pekerf709f4a2018-06-06 17:26:04 +03001052 size_t export_size;
Jaeden Amero2a671e92018-06-27 17:47:40 +01001053 size_t exported_length = INVALID_EXPORT_LENGTH;
Moran Pekerf709f4a2018-06-06 17:26:04 +03001054 psa_key_type_t got_type;
1055 size_t got_bits;
Gilles Peskinedec72612018-06-18 18:12:37 +02001056 psa_key_policy_t policy;
Moran Pekerf709f4a2018-06-06 17:26:04 +03001057
Moran Pekerf709f4a2018-06-06 17:26:04 +03001058 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001059 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
Moran Pekercb088e72018-07-17 17:36:59 +03001060 export_size = (ptrdiff_t) data->len;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02001061 ASSERT_ALLOC( exported, export_size );
Moran Pekerf709f4a2018-06-06 17:26:04 +03001062
1063 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1064
1065 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001066 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, alg );
Moran Pekerf709f4a2018-06-06 17:26:04 +03001067 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1068
1069 /* Import the key */
1070 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001071 data->x, data->len ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +03001072
1073 /* Test the key information */
1074 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001075 &got_type,
1076 &got_bits ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +03001077 TEST_ASSERT( got_type == type );
1078 TEST_ASSERT( got_bits == (size_t) expected_bits );
1079
1080 /* Export the key */
1081 status = psa_export_public_key( slot,
Gilles Peskine2d277862018-06-18 15:41:12 +02001082 exported, export_size,
1083 &exported_length );
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001084 TEST_ASSERT( status == expected_export_status );
Jaeden Amero2a671e92018-06-27 17:47:40 +01001085 TEST_ASSERT( exported_length == (size_t) public_key_expected_length );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001086 TEST_ASSERT( mem_is_char( exported + exported_length, 0,
Jaeden Amero2a671e92018-06-27 17:47:40 +01001087 export_size - exported_length ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +03001088 if( status != PSA_SUCCESS )
1089 goto destroy;
1090
Moran Pekerf709f4a2018-06-06 17:26:04 +03001091destroy:
1092 /* Destroy the key */
1093 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
1094 TEST_ASSERT( psa_get_key_information(
1095 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
1096
1097exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001098 mbedtls_free( exported );
Moran Pekerf709f4a2018-06-06 17:26:04 +03001099 mbedtls_psa_crypto_free( );
1100}
1101/* END_CASE */
1102
Gilles Peskine20035e32018-02-03 22:44:14 +01001103/* BEGIN_CASE */
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001104void import_and_exercise_key( data_t *data,
1105 int type_arg,
1106 int bits_arg,
1107 int alg_arg )
1108{
1109 int slot = 1;
1110 psa_key_type_t type = type_arg;
1111 size_t bits = bits_arg;
1112 psa_algorithm_t alg = alg_arg;
1113 psa_key_usage_t usage =
1114 ( PSA_ALG_IS_MAC( alg ) || PSA_ALG_IS_SIGN( alg ) ?
1115 ( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ?
1116 PSA_KEY_USAGE_VERIFY :
1117 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY ) :
1118 PSA_ALG_IS_CIPHER( alg ) || PSA_ALG_IS_AEAD( alg ) ||
1119 PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) ?
1120 ( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ?
1121 PSA_KEY_USAGE_ENCRYPT :
1122 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT ) :
Gilles Peskineea0fb492018-07-12 17:17:20 +02001123 PSA_ALG_IS_KEY_DERIVATION( alg ) ? PSA_KEY_USAGE_DERIVE :
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001124 0 );
1125 psa_key_policy_t policy;
1126 psa_key_type_t got_type;
1127 size_t got_bits;
1128 psa_status_t status;
1129
1130 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1131
1132 psa_key_policy_init( &policy );
1133 psa_key_policy_set_usage( &policy, usage, alg );
1134 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1135
1136 /* Import the key */
1137 status = psa_import_key( slot, type, data->x, data->len );
1138 TEST_ASSERT( status == PSA_SUCCESS );
1139
1140 /* Test the key information */
1141 TEST_ASSERT( psa_get_key_information( slot,
1142 &got_type,
1143 &got_bits ) == PSA_SUCCESS );
1144 TEST_ASSERT( got_type == type );
1145 TEST_ASSERT( got_bits == bits );
1146
1147 /* Do something with the key according to its type and permitted usage. */
Gilles Peskine02b75072018-07-01 22:31:34 +02001148 if( ! exercise_key( slot, usage, alg ) )
1149 goto exit;
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001150
1151exit:
1152 psa_destroy_key( slot );
1153 mbedtls_psa_crypto_free( );
1154}
1155/* END_CASE */
1156
1157/* BEGIN_CASE */
Gilles Peskined5b33222018-06-18 22:20:03 +02001158void key_policy( int usage_arg, int alg_arg )
1159{
1160 int key_slot = 1;
1161 psa_algorithm_t alg = alg_arg;
1162 psa_key_usage_t usage = usage_arg;
1163 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
1164 unsigned char key[32] = {0};
1165 psa_key_policy_t policy_set;
1166 psa_key_policy_t policy_get;
1167
1168 memset( key, 0x2a, sizeof( key ) );
1169
1170 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1171
1172 psa_key_policy_init( &policy_set );
1173 psa_key_policy_init( &policy_get );
1174
1175 psa_key_policy_set_usage( &policy_set, usage, alg );
1176
1177 TEST_ASSERT( psa_key_policy_get_usage( &policy_set ) == usage );
1178 TEST_ASSERT( psa_key_policy_get_algorithm( &policy_set ) == alg );
1179 TEST_ASSERT( psa_set_key_policy( key_slot, &policy_set ) == PSA_SUCCESS );
1180
1181 TEST_ASSERT( psa_import_key( key_slot, key_type,
1182 key, sizeof( key ) ) == PSA_SUCCESS );
1183
1184 TEST_ASSERT( psa_get_key_policy( key_slot, &policy_get ) == PSA_SUCCESS );
1185
1186 TEST_ASSERT( policy_get.usage == policy_set.usage );
1187 TEST_ASSERT( policy_get.alg == policy_set.alg );
1188
1189exit:
1190 psa_destroy_key( key_slot );
1191 mbedtls_psa_crypto_free( );
1192}
1193/* END_CASE */
1194
1195/* BEGIN_CASE */
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001196void mac_key_policy( int policy_usage,
1197 int policy_alg,
1198 int key_type,
1199 data_t *key_data,
1200 int exercise_alg )
Gilles Peskined5b33222018-06-18 22:20:03 +02001201{
1202 int key_slot = 1;
Gilles Peskined5b33222018-06-18 22:20:03 +02001203 psa_key_policy_t policy;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001204 psa_mac_operation_t operation;
1205 psa_status_t status;
1206 unsigned char mac[PSA_MAC_MAX_SIZE];
Gilles Peskined5b33222018-06-18 22:20:03 +02001207
1208 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1209
1210 psa_key_policy_init( &policy );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001211 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
Gilles Peskined5b33222018-06-18 22:20:03 +02001212 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1213
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001214 TEST_ASSERT( psa_import_key( key_slot, key_type,
1215 key_data->x, key_data->len ) == PSA_SUCCESS );
Gilles Peskined5b33222018-06-18 22:20:03 +02001216
Gilles Peskine89167cb2018-07-08 20:12:23 +02001217 status = psa_mac_sign_setup( &operation, key_slot, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001218 if( policy_alg == exercise_alg &&
1219 ( policy_usage & PSA_KEY_USAGE_SIGN ) != 0 )
1220 TEST_ASSERT( status == PSA_SUCCESS );
1221 else
1222 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
1223 psa_mac_abort( &operation );
Gilles Peskined5b33222018-06-18 22:20:03 +02001224
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001225 memset( mac, 0, sizeof( mac ) );
Gilles Peskine89167cb2018-07-08 20:12:23 +02001226 status = psa_mac_verify_setup( &operation, key_slot, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001227 if( policy_alg == exercise_alg &&
1228 ( policy_usage & PSA_KEY_USAGE_VERIFY ) != 0 )
Gilles Peskine89167cb2018-07-08 20:12:23 +02001229 TEST_ASSERT( status == PSA_SUCCESS );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001230 else
1231 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
1232
1233exit:
1234 psa_mac_abort( &operation );
1235 psa_destroy_key( key_slot );
1236 mbedtls_psa_crypto_free( );
1237}
1238/* END_CASE */
1239
1240/* BEGIN_CASE */
1241void cipher_key_policy( int policy_usage,
1242 int policy_alg,
1243 int key_type,
1244 data_t *key_data,
1245 int exercise_alg )
1246{
1247 int key_slot = 1;
1248 psa_key_policy_t policy;
1249 psa_cipher_operation_t operation;
1250 psa_status_t status;
1251
1252 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1253
1254 psa_key_policy_init( &policy );
1255 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
1256 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1257
1258 TEST_ASSERT( psa_import_key( key_slot, key_type,
1259 key_data->x, key_data->len ) == PSA_SUCCESS );
1260
Gilles Peskinefe119512018-07-08 21:39:34 +02001261 status = psa_cipher_encrypt_setup( &operation, key_slot, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001262 if( policy_alg == exercise_alg &&
1263 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
1264 TEST_ASSERT( status == PSA_SUCCESS );
1265 else
1266 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
1267 psa_cipher_abort( &operation );
1268
Gilles Peskinefe119512018-07-08 21:39:34 +02001269 status = psa_cipher_decrypt_setup( &operation, key_slot, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001270 if( policy_alg == exercise_alg &&
1271 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
1272 TEST_ASSERT( status == PSA_SUCCESS );
1273 else
1274 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
1275
1276exit:
1277 psa_cipher_abort( &operation );
1278 psa_destroy_key( key_slot );
1279 mbedtls_psa_crypto_free( );
1280}
1281/* END_CASE */
1282
1283/* BEGIN_CASE */
1284void aead_key_policy( int policy_usage,
1285 int policy_alg,
1286 int key_type,
1287 data_t *key_data,
1288 int nonce_length_arg,
1289 int tag_length_arg,
1290 int exercise_alg )
1291{
1292 int key_slot = 1;
1293 psa_key_policy_t policy;
1294 psa_status_t status;
1295 unsigned char nonce[16] = {0};
1296 size_t nonce_length = nonce_length_arg;
1297 unsigned char tag[16];
1298 size_t tag_length = tag_length_arg;
1299 size_t output_length;
1300
1301 TEST_ASSERT( nonce_length <= sizeof( nonce ) );
1302 TEST_ASSERT( tag_length <= sizeof( tag ) );
1303
1304 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1305
1306 psa_key_policy_init( &policy );
1307 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
1308 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1309
1310 TEST_ASSERT( psa_import_key( key_slot, key_type,
1311 key_data->x, key_data->len ) == PSA_SUCCESS );
1312
1313 status = psa_aead_encrypt( key_slot, exercise_alg,
1314 nonce, nonce_length,
1315 NULL, 0,
1316 NULL, 0,
1317 tag, tag_length,
1318 &output_length );
1319 if( policy_alg == exercise_alg &&
1320 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
1321 TEST_ASSERT( status == PSA_SUCCESS );
1322 else
1323 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
1324
1325 memset( tag, 0, sizeof( tag ) );
1326 status = psa_aead_decrypt( key_slot, exercise_alg,
1327 nonce, nonce_length,
1328 NULL, 0,
1329 tag, tag_length,
1330 NULL, 0,
1331 &output_length );
1332 if( policy_alg == exercise_alg &&
1333 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
1334 TEST_ASSERT( status == PSA_ERROR_INVALID_SIGNATURE );
1335 else
1336 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
1337
1338exit:
1339 psa_destroy_key( key_slot );
1340 mbedtls_psa_crypto_free( );
1341}
1342/* END_CASE */
1343
1344/* BEGIN_CASE */
1345void asymmetric_encryption_key_policy( int policy_usage,
1346 int policy_alg,
1347 int key_type,
1348 data_t *key_data,
1349 int exercise_alg )
1350{
1351 int key_slot = 1;
1352 psa_key_policy_t policy;
1353 psa_status_t status;
1354 size_t key_bits;
1355 size_t buffer_length;
1356 unsigned char *buffer = NULL;
1357 size_t output_length;
1358
1359 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1360
1361 psa_key_policy_init( &policy );
1362 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
1363 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1364
1365 TEST_ASSERT( psa_import_key( key_slot, key_type,
1366 key_data->x, key_data->len ) == PSA_SUCCESS );
1367
1368 TEST_ASSERT( psa_get_key_information( key_slot,
1369 NULL,
1370 &key_bits ) == PSA_SUCCESS );
1371 buffer_length = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits,
1372 exercise_alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02001373 ASSERT_ALLOC( buffer, buffer_length );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001374
1375 status = psa_asymmetric_encrypt( key_slot, exercise_alg,
1376 NULL, 0,
1377 NULL, 0,
1378 buffer, buffer_length,
1379 &output_length );
1380 if( policy_alg == exercise_alg &&
1381 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
1382 TEST_ASSERT( status == PSA_SUCCESS );
1383 else
1384 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
1385
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02001386 if( buffer_length != 0 )
1387 memset( buffer, 0, buffer_length );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001388 status = psa_asymmetric_decrypt( key_slot, exercise_alg,
1389 buffer, buffer_length,
1390 NULL, 0,
1391 buffer, buffer_length,
1392 &output_length );
1393 if( policy_alg == exercise_alg &&
1394 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
1395 TEST_ASSERT( status == PSA_ERROR_INVALID_PADDING );
1396 else
1397 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
1398
1399exit:
1400 psa_destroy_key( key_slot );
1401 mbedtls_psa_crypto_free( );
1402 mbedtls_free( buffer );
1403}
1404/* END_CASE */
1405
1406/* BEGIN_CASE */
1407void asymmetric_signature_key_policy( int policy_usage,
1408 int policy_alg,
1409 int key_type,
1410 data_t *key_data,
1411 int exercise_alg )
1412{
1413 int key_slot = 1;
1414 psa_key_policy_t policy;
1415 psa_status_t status;
1416 unsigned char payload[16] = {1};
1417 size_t payload_length = sizeof( payload );
1418 unsigned char signature[PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE] = {0};
1419 size_t signature_length;
1420
1421 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1422
1423 psa_key_policy_init( &policy );
1424 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
1425 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1426
1427 TEST_ASSERT( psa_import_key( key_slot, key_type,
1428 key_data->x, key_data->len ) == PSA_SUCCESS );
1429
1430 status = psa_asymmetric_sign( key_slot, exercise_alg,
1431 payload, payload_length,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001432 signature, sizeof( signature ),
1433 &signature_length );
1434 if( policy_alg == exercise_alg &&
1435 ( policy_usage & PSA_KEY_USAGE_SIGN ) != 0 )
1436 TEST_ASSERT( status == PSA_SUCCESS );
1437 else
1438 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
1439
1440 memset( signature, 0, sizeof( signature ) );
1441 status = psa_asymmetric_verify( key_slot, exercise_alg,
1442 payload, payload_length,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001443 signature, sizeof( signature ) );
1444 if( policy_alg == exercise_alg &&
1445 ( policy_usage & PSA_KEY_USAGE_VERIFY ) != 0 )
1446 TEST_ASSERT( status == PSA_ERROR_INVALID_SIGNATURE );
1447 else
1448 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
Gilles Peskined5b33222018-06-18 22:20:03 +02001449
1450exit:
1451 psa_destroy_key( key_slot );
1452 mbedtls_psa_crypto_free( );
1453}
1454/* END_CASE */
1455
1456/* BEGIN_CASE */
Gilles Peskineea0fb492018-07-12 17:17:20 +02001457void derive_key_policy( int policy_usage,
1458 int policy_alg,
1459 int key_type,
1460 data_t *key_data,
1461 int exercise_alg )
1462{
1463 int key_slot = 1;
1464 psa_key_policy_t policy;
1465 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
1466 psa_status_t status;
1467
1468 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1469
1470 psa_key_policy_init( &policy );
1471 psa_key_policy_set_usage( &policy, policy_usage, policy_alg );
1472 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1473
1474 TEST_ASSERT( psa_import_key( key_slot, key_type,
1475 key_data->x, key_data->len ) == PSA_SUCCESS );
1476
1477 status = psa_key_derivation( &generator, key_slot,
1478 exercise_alg,
1479 NULL, 0,
1480 NULL, 0,
1481 1 );
1482 if( policy_alg == exercise_alg &&
1483 ( policy_usage & PSA_KEY_USAGE_DERIVE ) != 0 )
1484 TEST_ASSERT( status == PSA_SUCCESS );
1485 else
1486 TEST_ASSERT( status == PSA_ERROR_NOT_PERMITTED );
1487
1488exit:
1489 psa_generator_abort( &generator );
1490 psa_destroy_key( key_slot );
1491 mbedtls_psa_crypto_free( );
1492}
1493/* END_CASE */
1494
1495/* BEGIN_CASE */
Gilles Peskined5b33222018-06-18 22:20:03 +02001496void key_lifetime( int lifetime_arg )
1497{
1498 int key_slot = 1;
Gilles Peskinec32f0302018-08-10 16:02:11 +02001499 psa_key_type_t key_type = PSA_KEY_TYPE_RAW_DATA;
Gilles Peskined5b33222018-06-18 22:20:03 +02001500 unsigned char key[32] = {0};
1501 psa_key_lifetime_t lifetime_set = lifetime_arg;
1502 psa_key_lifetime_t lifetime_get;
1503
1504 memset( key, 0x2a, sizeof( key ) );
1505
1506 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1507
1508 TEST_ASSERT( psa_set_key_lifetime( key_slot,
1509 lifetime_set ) == PSA_SUCCESS );
1510
1511 TEST_ASSERT( psa_import_key( key_slot, key_type,
1512 key, sizeof( key ) ) == PSA_SUCCESS );
1513
1514 TEST_ASSERT( psa_get_key_lifetime( key_slot,
1515 &lifetime_get ) == PSA_SUCCESS );
1516
1517 TEST_ASSERT( lifetime_get == lifetime_set );
1518
1519exit:
1520 psa_destroy_key( key_slot );
1521 mbedtls_psa_crypto_free( );
1522}
1523/* END_CASE */
1524
1525/* BEGIN_CASE */
1526void key_lifetime_set_fail( int key_slot_arg,
1527 int lifetime_arg,
1528 int expected_status_arg )
1529{
1530 psa_key_slot_t key_slot = key_slot_arg;
1531 psa_key_lifetime_t lifetime_set = lifetime_arg;
1532 psa_status_t actual_status;
1533 psa_status_t expected_status = expected_status_arg;
1534
1535 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1536
1537 actual_status = psa_set_key_lifetime( key_slot, lifetime_set );
1538
1539 if( actual_status == PSA_SUCCESS )
1540 actual_status = psa_set_key_lifetime( key_slot, lifetime_set );
1541
1542 TEST_ASSERT( expected_status == actual_status );
1543
1544exit:
1545 psa_destroy_key( key_slot );
1546 mbedtls_psa_crypto_free( );
1547}
1548/* END_CASE */
1549
1550/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001551void hash_setup( int alg_arg,
1552 int expected_status_arg )
1553{
1554 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001555 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001556 psa_hash_operation_t operation;
1557 psa_status_t status;
1558
1559 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1560
Gilles Peskineda8191d1c2018-07-08 19:46:38 +02001561 status = psa_hash_setup( &operation, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001562 psa_hash_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001563 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001564
1565exit:
1566 mbedtls_psa_crypto_free( );
1567}
1568/* END_CASE */
1569
1570/* BEGIN_CASE */
itayzafrirf86548d2018-11-01 10:44:32 +02001571void hash_bad_order( )
1572{
1573 unsigned char input[] = "";
1574 /* SHA-256 hash of an empty string */
1575 unsigned char hash[] = {
1576 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
1577 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
1578 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55 };
1579 size_t hash_len;
1580 psa_hash_operation_t operation;
1581
1582 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1583
1584 /* psa_hash_update without calling psa_hash_setup beforehand */
1585 memset( &operation, 0, sizeof( operation ) );
1586 TEST_ASSERT( psa_hash_update( &operation,
1587 input, sizeof( input ) ) ==
1588 PSA_ERROR_INVALID_ARGUMENT );
1589
1590 /* psa_hash_verify without calling psa_hash_setup beforehand */
1591 memset( &operation, 0, sizeof( operation ) );
1592 TEST_ASSERT( psa_hash_verify( &operation,
1593 hash, sizeof( hash ) ) ==
1594 PSA_ERROR_INVALID_ARGUMENT );
1595
1596 /* psa_hash_finish without calling psa_hash_setup beforehand */
1597 memset( &operation, 0, sizeof( operation ) );
1598 TEST_ASSERT( psa_hash_finish( &operation,
1599 hash, sizeof( hash ), &hash_len ) ==
1600 PSA_ERROR_INVALID_ARGUMENT );
1601
1602exit:
1603 mbedtls_psa_crypto_free( );
1604}
1605/* END_CASE */
1606
1607/* BEGIN_CASE */
itayzafrir58028322018-10-25 10:22:01 +03001608void hash_verify_bad_paths( )
itayzafrirec93d302018-10-18 18:01:10 +03001609{
1610 psa_algorithm_t alg = PSA_ALG_SHA_256;
1611 unsigned char hash[PSA_HASH_MAX_SIZE] = { 0 };
1612 size_t expected_size = PSA_HASH_SIZE( alg );
1613 unsigned char input[] = "input";
1614 psa_hash_operation_t operation;
itayzafrirec93d302018-10-18 18:01:10 +03001615
itayzafrir4271df92018-10-24 18:16:19 +03001616 /* SHA-256 hash digest of the string 'input' with 2 extra bytes appended at
1617 * the end */
1618 unsigned char extra_length_digest[] =
1619 {
1620 0x3a, 0x28, 0x92, 0x32, 0x39, 0x9a, 0x20, 0x75, 0x09, 0xf4, 0xfa, 0x9d,
1621 0x70, 0xfa, 0x6f, 0x68, 0x81, 0x7c, 0xe6, 0xa6, 0x6f, 0x21, 0x50, 0xff,
1622 0x08, 0x23, 0x36, 0x31, 0x1f, 0x4e, 0x55, 0xfe, 0xaa, 0xbb
1623 };
1624
itayzafrirec93d302018-10-18 18:01:10 +03001625 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1626
itayzafrir69290f02018-10-24 13:50:54 +03001627 /* psa_hash_verify with a smaller hash digest than expected */
itayzafrirec93d302018-10-18 18:01:10 +03001628 TEST_ASSERT( psa_hash_setup( &operation, alg ) == PSA_SUCCESS );
1629 TEST_ASSERT( psa_hash_verify( &operation,
1630 hash, expected_size - 1 ) ==
1631 PSA_ERROR_INVALID_SIGNATURE );
1632
itayzafrir69290f02018-10-24 13:50:54 +03001633 /* psa_hash_verify with a non-matching hash digest */
itayzafrirec93d302018-10-18 18:01:10 +03001634 TEST_ASSERT( psa_hash_setup( &operation, alg ) == PSA_SUCCESS );
1635 TEST_ASSERT( psa_hash_update( &operation,
1636 input, sizeof( input ) ) == PSA_SUCCESS );
1637 TEST_ASSERT( psa_hash_verify( &operation,
1638 hash, expected_size ) ==
1639 PSA_ERROR_INVALID_SIGNATURE );
1640
itayzafrir4271df92018-10-24 18:16:19 +03001641 /* psa_hash_verify with a hash digest longer than expected, where the first
1642 * 32 bytes match the expected digest but 2 extra bytes are appended at the
1643 * end of the digest */
1644 memset( hash, 0, sizeof( hash ) );
1645 TEST_ASSERT( psa_hash_setup( &operation, alg ) == PSA_SUCCESS );
1646 TEST_ASSERT( psa_hash_update( &operation,
1647 input, sizeof( input ) ) == PSA_SUCCESS );
1648 TEST_ASSERT( psa_hash_verify( &operation,
1649 extra_length_digest,
1650 sizeof( extra_length_digest ) ) ==
1651 PSA_ERROR_INVALID_SIGNATURE );
1652
itayzafrirec93d302018-10-18 18:01:10 +03001653exit:
1654 mbedtls_psa_crypto_free( );
1655}
1656/* END_CASE */
1657
1658/* BEGIN_CASE */
itayzafrir58028322018-10-25 10:22:01 +03001659void hash_finish_bad_paths( )
1660{
1661 psa_algorithm_t alg = PSA_ALG_SHA_256;
1662 unsigned char hash[PSA_HASH_MAX_SIZE] = { 0 };
1663 size_t expected_size = PSA_HASH_SIZE( alg );
1664 psa_hash_operation_t operation;
1665 size_t hash_len;
1666
1667 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1668
itayzafrir58028322018-10-25 10:22:01 +03001669 /* psa_hash_finish with a smaller hash buffer than expected */
1670 TEST_ASSERT( psa_hash_setup( &operation, alg ) == PSA_SUCCESS );
1671 TEST_ASSERT( psa_hash_finish( &operation,
1672 hash, expected_size - 1,
1673 &hash_len ) == PSA_ERROR_BUFFER_TOO_SMALL );
1674
1675exit:
1676 mbedtls_psa_crypto_free( );
1677}
1678/* END_CASE */
1679
1680/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001681void mac_setup( int key_type_arg,
1682 data_t *key,
1683 int alg_arg,
1684 int expected_status_arg )
1685{
1686 int key_slot = 1;
1687 psa_key_type_t key_type = key_type_arg;
1688 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001689 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001690 psa_mac_operation_t operation;
1691 psa_key_policy_t policy;
1692 psa_status_t status;
1693
1694 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1695
1696 psa_key_policy_init( &policy );
1697 psa_key_policy_set_usage( &policy,
1698 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
1699 alg );
1700 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1701
1702 TEST_ASSERT( psa_import_key( key_slot, key_type,
1703 key->x, key->len ) == PSA_SUCCESS );
1704
Gilles Peskine89167cb2018-07-08 20:12:23 +02001705 status = psa_mac_sign_setup( &operation, key_slot, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001706 psa_mac_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001707 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001708
1709exit:
1710 psa_destroy_key( key_slot );
1711 mbedtls_psa_crypto_free( );
1712}
1713/* END_CASE */
1714
1715/* BEGIN_CASE */
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001716void mac_sign( int key_type_arg,
1717 data_t *key,
1718 int alg_arg,
1719 data_t *input,
1720 data_t *expected_mac )
1721{
1722 int key_slot = 1;
1723 psa_key_type_t key_type = key_type_arg;
1724 psa_algorithm_t alg = alg_arg;
1725 psa_mac_operation_t operation;
1726 psa_key_policy_t policy;
1727 /* Leave a little extra room in the output buffer. At the end of the
1728 * test, we'll check that the implementation didn't overwrite onto
1729 * this extra room. */
1730 uint8_t actual_mac[PSA_MAC_MAX_SIZE + 10];
1731 size_t mac_buffer_size =
1732 PSA_MAC_FINAL_SIZE( key_type, PSA_BYTES_TO_BITS( key->len ), alg );
1733 size_t mac_length = 0;
1734
1735 memset( actual_mac, '+', sizeof( actual_mac ) );
1736 TEST_ASSERT( mac_buffer_size <= PSA_MAC_MAX_SIZE );
1737 TEST_ASSERT( expected_mac->len <= mac_buffer_size );
1738
1739 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1740
1741 psa_key_policy_init( &policy );
1742 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
1743 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1744
1745 TEST_ASSERT( psa_import_key( key_slot, key_type,
1746 key->x, key->len ) == PSA_SUCCESS );
1747
1748 /* Calculate the MAC. */
1749 TEST_ASSERT( psa_mac_sign_setup( &operation,
1750 key_slot, alg ) == PSA_SUCCESS );
1751 TEST_ASSERT( psa_mac_update( &operation,
1752 input->x, input->len ) == PSA_SUCCESS );
1753 TEST_ASSERT( psa_mac_sign_finish( &operation,
1754 actual_mac, mac_buffer_size,
1755 &mac_length ) == PSA_SUCCESS );
1756
1757 /* Compare with the expected value. */
1758 TEST_ASSERT( mac_length == expected_mac->len );
1759 TEST_ASSERT( memcmp( actual_mac, expected_mac->x, mac_length ) == 0 );
1760
1761 /* Verify that the end of the buffer is untouched. */
1762 TEST_ASSERT( mem_is_char( actual_mac + mac_length, '+',
1763 sizeof( actual_mac ) - mac_length ) );
1764
1765exit:
1766 psa_destroy_key( key_slot );
1767 mbedtls_psa_crypto_free( );
1768}
1769/* END_CASE */
1770
1771/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +02001772void mac_verify( int key_type_arg,
1773 data_t *key,
1774 int alg_arg,
1775 data_t *input,
1776 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +01001777{
1778 int key_slot = 1;
1779 psa_key_type_t key_type = key_type_arg;
1780 psa_algorithm_t alg = alg_arg;
Gilles Peskine8c9def32018-02-08 10:02:12 +01001781 psa_mac_operation_t operation;
mohammad16036df908f2018-04-02 08:34:15 -07001782 psa_key_policy_t policy;
Gilles Peskine8c9def32018-02-08 10:02:12 +01001783
Gilles Peskine69c12672018-06-28 00:07:19 +02001784 TEST_ASSERT( expected_mac->len <= PSA_MAC_MAX_SIZE );
1785
Gilles Peskine8c9def32018-02-08 10:02:12 +01001786 TEST_ASSERT( key != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +01001787 TEST_ASSERT( input != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +01001788 TEST_ASSERT( expected_mac != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001789 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001790 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1791 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01001792
1793 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1794
mohammad16036df908f2018-04-02 08:34:15 -07001795 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001796 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
mohammad16036df908f2018-04-02 08:34:15 -07001797 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1798
Gilles Peskine8c9def32018-02-08 10:02:12 +01001799 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001800 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskinec0ec9722018-06-18 17:03:37 +02001801
Gilles Peskine89167cb2018-07-08 20:12:23 +02001802 TEST_ASSERT( psa_mac_verify_setup( &operation,
1803 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +01001804 TEST_ASSERT( psa_destroy_key( key_slot ) == PSA_SUCCESS );
1805 TEST_ASSERT( psa_mac_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001806 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskineacd4be32018-07-08 19:56:25 +02001807 TEST_ASSERT( psa_mac_verify_finish( &operation,
1808 expected_mac->x,
1809 expected_mac->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +01001810
1811exit:
Gilles Peskine8c9def32018-02-08 10:02:12 +01001812 psa_destroy_key( key_slot );
1813 mbedtls_psa_crypto_free( );
1814}
1815/* END_CASE */
1816
1817/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001818void cipher_setup( int key_type_arg,
1819 data_t *key,
1820 int alg_arg,
1821 int expected_status_arg )
1822{
1823 int key_slot = 1;
1824 psa_key_type_t key_type = key_type_arg;
1825 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001826 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001827 psa_cipher_operation_t operation;
1828 psa_key_policy_t policy;
1829 psa_status_t status;
1830
1831 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1832
1833 psa_key_policy_init( &policy );
1834 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
1835 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1836
1837 TEST_ASSERT( psa_import_key( key_slot, key_type,
1838 key->x, key->len ) == PSA_SUCCESS );
1839
Gilles Peskinefe119512018-07-08 21:39:34 +02001840 status = psa_cipher_encrypt_setup( &operation, key_slot, alg );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001841 psa_cipher_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001842 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001843
1844exit:
1845 psa_destroy_key( key_slot );
1846 mbedtls_psa_crypto_free( );
1847}
1848/* END_CASE */
1849
1850/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02001851void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001852 data_t *key,
1853 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001854 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001855{
1856 int key_slot = 1;
1857 psa_status_t status;
1858 psa_key_type_t key_type = key_type_arg;
1859 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001860 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001861 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001862 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001863 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001864 size_t output_buffer_size = 0;
1865 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001866 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001867 psa_cipher_operation_t operation;
Moran Pekered346952018-07-05 15:22:45 +03001868 psa_key_policy_t policy;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001869
Gilles Peskine50e586b2018-06-08 14:28:46 +02001870 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001871 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001872 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001873 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1874 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1875 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001876
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001877 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1878 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001879
1880 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1881
Moran Pekered346952018-07-05 15:22:45 +03001882 psa_key_policy_init( &policy );
1883 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
1884 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1885
Gilles Peskine50e586b2018-06-08 14:28:46 +02001886 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001887 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001888
Gilles Peskinefe119512018-07-08 21:39:34 +02001889 TEST_ASSERT( psa_cipher_encrypt_setup( &operation,
1890 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001891
Gilles Peskinefe119512018-07-08 21:39:34 +02001892 TEST_ASSERT( psa_cipher_set_iv( &operation,
1893 iv, iv_size ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03001894 output_buffer_size = (size_t) input->len +
1895 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02001896 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001897
Gilles Peskine4abf7412018-06-18 16:35:34 +02001898 TEST_ASSERT( psa_cipher_update( &operation,
1899 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001900 output, output_buffer_size,
1901 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001902 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001903 status = psa_cipher_finish( &operation,
1904 output + function_output_length,
1905 output_buffer_size,
1906 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001907 total_output_length += function_output_length;
1908
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001909 TEST_ASSERT( status == expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001910 if( expected_status == PSA_SUCCESS )
1911 {
1912 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02001913 ASSERT_COMPARE( expected_output->x, expected_output->len,
1914 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001915 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001916
Gilles Peskine50e586b2018-06-08 14:28:46 +02001917exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001918 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001919 psa_destroy_key( key_slot );
1920 mbedtls_psa_crypto_free( );
1921}
1922/* END_CASE */
1923
1924/* BEGIN_CASE */
1925void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001926 data_t *key,
1927 data_t *input,
1928 int first_part_size,
1929 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001930{
1931 int key_slot = 1;
1932 psa_key_type_t key_type = key_type_arg;
1933 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001934 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001935 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001936 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001937 size_t output_buffer_size = 0;
1938 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001939 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001940 psa_cipher_operation_t operation;
Moran Pekered346952018-07-05 15:22:45 +03001941 psa_key_policy_t policy;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001942
Gilles Peskine50e586b2018-06-08 14:28:46 +02001943 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001944 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001945 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001946 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1947 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1948 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001949
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001950 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1951 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001952
1953 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1954
Moran Pekered346952018-07-05 15:22:45 +03001955 psa_key_policy_init( &policy );
1956 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
1957 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1958
Gilles Peskine50e586b2018-06-08 14:28:46 +02001959 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001960 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001961
Gilles Peskinefe119512018-07-08 21:39:34 +02001962 TEST_ASSERT( psa_cipher_encrypt_setup( &operation,
1963 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001964
Gilles Peskinefe119512018-07-08 21:39:34 +02001965 TEST_ASSERT( psa_cipher_set_iv( &operation,
1966 iv, sizeof( iv ) ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03001967 output_buffer_size = (size_t) input->len +
1968 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02001969 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001970
Gilles Peskine4abf7412018-06-18 16:35:34 +02001971 TEST_ASSERT( (unsigned int) first_part_size < input->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001972 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001973 output, output_buffer_size,
1974 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001975 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001976 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001977 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001978 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001979 output, output_buffer_size,
1980 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001981 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001982 TEST_ASSERT( psa_cipher_finish( &operation,
1983 output + function_output_length,
1984 output_buffer_size,
1985 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001986 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001987 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
1988
Gilles Peskinebd7dea92018-09-27 13:57:19 +02001989 ASSERT_COMPARE( expected_output->x, expected_output->len,
1990 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001991
1992exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001993 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001994 psa_destroy_key( key_slot );
1995 mbedtls_psa_crypto_free( );
1996}
1997/* END_CASE */
1998
1999/* BEGIN_CASE */
2000void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002001 data_t *key,
2002 data_t *input,
2003 int first_part_size,
2004 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002005{
2006 int key_slot = 1;
2007
2008 psa_key_type_t key_type = key_type_arg;
2009 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002010 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002011 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002012 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002013 size_t output_buffer_size = 0;
2014 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002015 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002016 psa_cipher_operation_t operation;
Moran Pekered346952018-07-05 15:22:45 +03002017 psa_key_policy_t policy;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002018
Gilles Peskine50e586b2018-06-08 14:28:46 +02002019 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002020 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002021 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002022 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
2023 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
2024 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002025
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002026 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2027 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002028
2029 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2030
Moran Pekered346952018-07-05 15:22:45 +03002031 psa_key_policy_init( &policy );
2032 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
2033 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
2034
Gilles Peskine50e586b2018-06-08 14:28:46 +02002035 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002036 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002037
Gilles Peskinefe119512018-07-08 21:39:34 +02002038 TEST_ASSERT( psa_cipher_decrypt_setup( &operation,
2039 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002040
Gilles Peskinefe119512018-07-08 21:39:34 +02002041 TEST_ASSERT( psa_cipher_set_iv( &operation,
2042 iv, sizeof( iv ) ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002043
mohammad16033d91abe2018-07-03 13:15:54 +03002044 output_buffer_size = (size_t) input->len +
2045 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002046 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002047
Gilles Peskine4abf7412018-06-18 16:35:34 +02002048 TEST_ASSERT( (unsigned int) first_part_size < input->len );
2049 TEST_ASSERT( psa_cipher_update( &operation,
2050 input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002051 output, output_buffer_size,
2052 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002053 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002054 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002055 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002056 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002057 output, output_buffer_size,
2058 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002059 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002060 TEST_ASSERT( psa_cipher_finish( &operation,
2061 output + function_output_length,
2062 output_buffer_size,
2063 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002064 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002065 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
2066
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002067 ASSERT_COMPARE( expected_output->x, expected_output->len,
2068 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002069
2070exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002071 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002072 psa_destroy_key( key_slot );
2073 mbedtls_psa_crypto_free( );
2074}
2075/* END_CASE */
2076
Gilles Peskine50e586b2018-06-08 14:28:46 +02002077/* BEGIN_CASE */
2078void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002079 data_t *key,
2080 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002081 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002082{
2083 int key_slot = 1;
2084 psa_status_t status;
2085 psa_key_type_t key_type = key_type_arg;
2086 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002087 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002088 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002089 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002090 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002091 size_t output_buffer_size = 0;
2092 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002093 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002094 psa_cipher_operation_t operation;
Moran Pekered346952018-07-05 15:22:45 +03002095 psa_key_policy_t policy;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002096
Gilles Peskine50e586b2018-06-08 14:28:46 +02002097 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002098 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002099 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002100 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
2101 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
2102 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002103
Gilles Peskine9ad29e22018-06-21 09:40:04 +02002104 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
2105 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002106
2107 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2108
Moran Pekered346952018-07-05 15:22:45 +03002109 psa_key_policy_init( &policy );
2110 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
2111 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
2112
Gilles Peskine50e586b2018-06-08 14:28:46 +02002113 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002114 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002115
Gilles Peskinefe119512018-07-08 21:39:34 +02002116 TEST_ASSERT( psa_cipher_decrypt_setup( &operation,
2117 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002118
Gilles Peskinefe119512018-07-08 21:39:34 +02002119 TEST_ASSERT( psa_cipher_set_iv( &operation,
2120 iv, iv_size ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002121
mohammad16033d91abe2018-07-03 13:15:54 +03002122 output_buffer_size = (size_t) input->len +
2123 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002124 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002125
Gilles Peskine4abf7412018-06-18 16:35:34 +02002126 TEST_ASSERT( psa_cipher_update( &operation,
2127 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002128 output, output_buffer_size,
2129 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002130 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002131 status = psa_cipher_finish( &operation,
2132 output + function_output_length,
2133 output_buffer_size,
2134 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002135 total_output_length += function_output_length;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002136 TEST_ASSERT( status == expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002137
2138 if( expected_status == PSA_SUCCESS )
2139 {
2140 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002141 ASSERT_COMPARE( expected_output->x, expected_output->len,
2142 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002143 }
2144
Gilles Peskine50e586b2018-06-08 14:28:46 +02002145exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002146 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002147 psa_destroy_key( key_slot );
2148 mbedtls_psa_crypto_free( );
2149}
2150/* END_CASE */
2151
Gilles Peskine50e586b2018-06-08 14:28:46 +02002152/* BEGIN_CASE */
2153void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002154 data_t *key,
2155 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02002156{
2157 int key_slot = 1;
2158 psa_key_type_t key_type = key_type_arg;
2159 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -07002160 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +02002161 size_t iv_size = 16;
2162 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002163 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002164 size_t output1_size = 0;
2165 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002166 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002167 size_t output2_size = 0;
2168 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002169 size_t function_output_length = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002170 psa_cipher_operation_t operation1;
2171 psa_cipher_operation_t operation2;
Moran Pekered346952018-07-05 15:22:45 +03002172 psa_key_policy_t policy;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002173
mohammad1603d7d7ba52018-03-12 18:51:53 +02002174 TEST_ASSERT( key != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002175 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002176 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
2177 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002178
mohammad1603d7d7ba52018-03-12 18:51:53 +02002179 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2180
Moran Pekered346952018-07-05 15:22:45 +03002181 psa_key_policy_init( &policy );
2182 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg );
2183 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
2184
mohammad1603d7d7ba52018-03-12 18:51:53 +02002185 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002186 key->x, key->len ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002187
Gilles Peskinefe119512018-07-08 21:39:34 +02002188 TEST_ASSERT( psa_cipher_encrypt_setup( &operation1,
2189 key_slot, alg ) == PSA_SUCCESS );
2190 TEST_ASSERT( psa_cipher_decrypt_setup( &operation2,
2191 key_slot, alg ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002192
Gilles Peskinefe119512018-07-08 21:39:34 +02002193 TEST_ASSERT( psa_cipher_generate_iv( &operation1,
2194 iv, iv_size,
2195 &iv_length ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03002196 output1_size = (size_t) input->len +
2197 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002198 ASSERT_ALLOC( output1, output1_size );
Moran Pekerded84402018-06-06 16:36:50 +03002199
Gilles Peskine4abf7412018-06-18 16:35:34 +02002200 TEST_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002201 output1, output1_size,
2202 &output1_length ) == PSA_SUCCESS );
2203 TEST_ASSERT( psa_cipher_finish( &operation1,
2204 output1 + output1_length, output1_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02002205 &function_output_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002206
Gilles Peskine048b7f02018-06-08 14:20:49 +02002207 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002208
2209 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
2210
2211 output2_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002212 ASSERT_ALLOC( output2, output2_size );
Moran Pekerded84402018-06-06 16:36:50 +03002213
Gilles Peskinefe119512018-07-08 21:39:34 +02002214 TEST_ASSERT( psa_cipher_set_iv( &operation2,
2215 iv, iv_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002216 TEST_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
2217 output2, output2_size,
2218 &output2_length ) == PSA_SUCCESS );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002219 function_output_length = 0;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002220 TEST_ASSERT( psa_cipher_finish( &operation2,
2221 output2 + output2_length,
2222 output2_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02002223 &function_output_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03002224
Gilles Peskine048b7f02018-06-08 14:20:49 +02002225 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002226
Janos Follath25c4fa82018-07-06 16:23:25 +01002227 TEST_ASSERT( psa_cipher_abort( &operation2 ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03002228
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002229 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
Moran Pekerded84402018-06-06 16:36:50 +03002230
2231exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002232 mbedtls_free( output1 );
2233 mbedtls_free( output2 );
Moran Pekerded84402018-06-06 16:36:50 +03002234 psa_destroy_key( key_slot );
2235 mbedtls_psa_crypto_free( );
2236}
2237/* END_CASE */
2238
2239/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002240void cipher_verify_output_multipart( int alg_arg,
2241 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002242 data_t *key,
2243 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002244 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +03002245{
2246 int key_slot = 1;
2247 psa_key_type_t key_type = key_type_arg;
2248 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +03002249 unsigned char iv[16] = {0};
2250 size_t iv_size = 16;
2251 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002252 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002253 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002254 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002255 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002256 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002257 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002258 size_t function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002259 psa_cipher_operation_t operation1;
2260 psa_cipher_operation_t operation2;
Moran Pekered346952018-07-05 15:22:45 +03002261 psa_key_policy_t policy;
Moran Pekerded84402018-06-06 16:36:50 +03002262
Moran Pekerded84402018-06-06 16:36:50 +03002263 TEST_ASSERT( key != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03002264 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002265 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
2266 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002267
Moran Pekerded84402018-06-06 16:36:50 +03002268 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2269
Moran Pekered346952018-07-05 15:22:45 +03002270 psa_key_policy_init( &policy );
2271 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg );
2272 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
2273
Moran Pekerded84402018-06-06 16:36:50 +03002274 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002275 key->x, key->len ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03002276
Gilles Peskinefe119512018-07-08 21:39:34 +02002277 TEST_ASSERT( psa_cipher_encrypt_setup( &operation1,
2278 key_slot, alg ) == PSA_SUCCESS );
2279 TEST_ASSERT( psa_cipher_decrypt_setup( &operation2,
2280 key_slot, alg ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03002281
Gilles Peskinefe119512018-07-08 21:39:34 +02002282 TEST_ASSERT( psa_cipher_generate_iv( &operation1,
2283 iv, iv_size,
2284 &iv_length ) == PSA_SUCCESS );
mohammad16033d91abe2018-07-03 13:15:54 +03002285 output1_buffer_size = (size_t) input->len +
2286 PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002287 ASSERT_ALLOC( output1, output1_buffer_size );
Moran Pekerded84402018-06-06 16:36:50 +03002288
Gilles Peskine4abf7412018-06-18 16:35:34 +02002289 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002290
itayzafrir3e02b3b2018-06-12 17:06:52 +03002291 TEST_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02002292 output1, output1_buffer_size,
2293 &function_output_length ) == PSA_SUCCESS );
2294 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002295
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002296 TEST_ASSERT( psa_cipher_update( &operation1,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002297 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002298 input->len - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02002299 output1, output1_buffer_size,
2300 &function_output_length ) == PSA_SUCCESS );
2301 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002302
Gilles Peskine048b7f02018-06-08 14:20:49 +02002303 TEST_ASSERT( psa_cipher_finish( &operation1,
2304 output1 + output1_length,
2305 output1_buffer_size - output1_length,
2306 &function_output_length ) == PSA_SUCCESS );
2307 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002308
2309 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
2310
Gilles Peskine048b7f02018-06-08 14:20:49 +02002311 output2_buffer_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002312 ASSERT_ALLOC( output2, output2_buffer_size );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002313
Gilles Peskinefe119512018-07-08 21:39:34 +02002314 TEST_ASSERT( psa_cipher_set_iv( &operation2,
2315 iv, iv_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03002316
2317 TEST_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02002318 output2, output2_buffer_size,
2319 &function_output_length ) == PSA_SUCCESS );
2320 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002321
Gilles Peskine048b7f02018-06-08 14:20:49 +02002322 TEST_ASSERT( psa_cipher_update( &operation2,
2323 output1 + first_part_size,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002324 output1_length - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02002325 output2, output2_buffer_size,
2326 &function_output_length ) == PSA_SUCCESS );
2327 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002328
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002329 TEST_ASSERT( psa_cipher_finish( &operation2,
2330 output2 + output2_length,
Gilles Peskine048b7f02018-06-08 14:20:49 +02002331 output2_buffer_size - output2_length,
2332 &function_output_length ) == PSA_SUCCESS );
2333 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002334
Janos Follath25c4fa82018-07-06 16:23:25 +01002335 TEST_ASSERT( psa_cipher_abort( &operation2 ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002336
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002337 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002338
2339exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002340 mbedtls_free( output1 );
2341 mbedtls_free( output2 );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002342 psa_destroy_key( key_slot );
2343 mbedtls_psa_crypto_free( );
2344}
2345/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02002346
Gilles Peskine20035e32018-02-03 22:44:14 +01002347/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02002348void aead_encrypt_decrypt( int key_type_arg, data_t *key_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002349 int alg_arg,
Gilles Peskine7da96b02018-08-17 18:45:42 +02002350 data_t *nonce,
2351 data_t *additional_data,
2352 data_t *input_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002353 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02002354{
2355 int slot = 1;
2356 psa_key_type_t key_type = key_type_arg;
2357 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002358 unsigned char *output_data = NULL;
2359 size_t output_size = 0;
2360 size_t output_length = 0;
2361 unsigned char *output_data2 = NULL;
2362 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002363 size_t tag_length = 16;
Gilles Peskine4abf7412018-06-18 16:35:34 +02002364 psa_status_t expected_result = expected_result_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002365 psa_key_policy_t policy;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002366
Gilles Peskinea1cac842018-06-11 19:33:02 +02002367 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002368 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002369 TEST_ASSERT( nonce != NULL );
2370 TEST_ASSERT( additional_data != NULL );
2371 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2372 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2373 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
2374 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
2375
Gilles Peskine4abf7412018-06-18 16:35:34 +02002376 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002377 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002378
2379 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2380
2381 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002382 psa_key_policy_set_usage( &policy,
2383 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
2384 alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002385 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2386
2387 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002388 key_data->x, key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002389
2390 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002391 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002392 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002393 additional_data->len,
2394 input_data->x, input_data->len,
2395 output_data, output_size,
2396 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002397
2398 if( PSA_SUCCESS == expected_result )
2399 {
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002400 ASSERT_ALLOC( output_data2, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002401
2402 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002403 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002404 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002405 additional_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002406 output_data, output_length,
2407 output_data2, output_length,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002408 &output_length2 ) == expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02002409
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002410 ASSERT_COMPARE( input_data->x, input_data->len,
2411 output_data2, output_length2 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002412 }
Gilles Peskine2d277862018-06-18 15:41:12 +02002413
Gilles Peskinea1cac842018-06-11 19:33:02 +02002414exit:
2415 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002416 mbedtls_free( output_data );
2417 mbedtls_free( output_data2 );
2418 mbedtls_psa_crypto_free( );
2419}
2420/* END_CASE */
2421
2422/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02002423void aead_encrypt( int key_type_arg, data_t *key_data,
2424 int alg_arg,
2425 data_t *nonce,
2426 data_t *additional_data,
2427 data_t *input_data,
2428 data_t *expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02002429{
2430 int slot = 1;
2431 psa_key_type_t key_type = key_type_arg;
2432 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002433 unsigned char *output_data = NULL;
2434 size_t output_size = 0;
2435 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002436 size_t tag_length = 16;
Gilles Peskinedec72612018-06-18 18:12:37 +02002437 psa_key_policy_t policy;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002438
Gilles Peskinea1cac842018-06-11 19:33:02 +02002439 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002440 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002441 TEST_ASSERT( additional_data != NULL );
2442 TEST_ASSERT( nonce != NULL );
2443 TEST_ASSERT( expected_result != NULL );
2444 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2445 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2446 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
2447 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
2448 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_result->len ) );
2449
Gilles Peskine4abf7412018-06-18 16:35:34 +02002450 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002451 ASSERT_ALLOC( output_data, output_size );
Gilles Peskine2d277862018-06-18 15:41:12 +02002452
Gilles Peskinea1cac842018-06-11 19:33:02 +02002453 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2454
2455 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002456 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002457 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2458
2459 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002460 key_data->x,
2461 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002462
2463 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002464 nonce->x, nonce->len,
2465 additional_data->x, additional_data->len,
2466 input_data->x, input_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002467 output_data, output_size,
2468 &output_length ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002469
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002470 ASSERT_COMPARE( expected_result->x, expected_result->len,
2471 output_data, output_length );
Gilles Peskine2d277862018-06-18 15:41:12 +02002472
Gilles Peskinea1cac842018-06-11 19:33:02 +02002473exit:
2474 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002475 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002476 mbedtls_psa_crypto_free( );
2477}
2478/* END_CASE */
2479
2480/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02002481void aead_decrypt( int key_type_arg, data_t *key_data,
2482 int alg_arg,
2483 data_t *nonce,
2484 data_t *additional_data,
2485 data_t *input_data,
2486 data_t *expected_data,
2487 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02002488{
2489 int slot = 1;
2490 psa_key_type_t key_type = key_type_arg;
2491 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002492 unsigned char *output_data = NULL;
2493 size_t output_size = 0;
2494 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002495 size_t tag_length = 16;
Gilles Peskinedec72612018-06-18 18:12:37 +02002496 psa_key_policy_t policy;
Gilles Peskine4abf7412018-06-18 16:35:34 +02002497 psa_status_t expected_result = expected_result_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002498
Gilles Peskinea1cac842018-06-11 19:33:02 +02002499 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002500 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002501 TEST_ASSERT( additional_data != NULL );
2502 TEST_ASSERT( nonce != NULL );
2503 TEST_ASSERT( expected_data != NULL );
2504 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2505 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2506 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
2507 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
2508 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
2509
Gilles Peskine4abf7412018-06-18 16:35:34 +02002510 output_size = input_data->len + tag_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002511 ASSERT_ALLOC( output_data, output_size );
Gilles Peskine2d277862018-06-18 15:41:12 +02002512
Gilles Peskinea1cac842018-06-11 19:33:02 +02002513 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2514
2515 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002516 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002517 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2518
2519 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002520 key_data->x,
2521 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002522
2523 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002524 nonce->x, nonce->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002525 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002526 additional_data->len,
2527 input_data->x, input_data->len,
2528 output_data, output_size,
2529 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002530
Gilles Peskine2d277862018-06-18 15:41:12 +02002531 if( expected_result == PSA_SUCCESS )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002532 ASSERT_COMPARE( expected_data->x, expected_data->len,
2533 output_data, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002534
Gilles Peskinea1cac842018-06-11 19:33:02 +02002535exit:
2536 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002537 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002538 mbedtls_psa_crypto_free( );
2539}
2540/* END_CASE */
2541
2542/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002543void signature_size( int type_arg,
2544 int bits,
2545 int alg_arg,
2546 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01002547{
2548 psa_key_type_t type = type_arg;
2549 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +02002550 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinee59236f2018-01-27 23:32:46 +01002551 TEST_ASSERT( actual_size == (size_t) expected_size_arg );
2552exit:
2553 ;
2554}
2555/* END_CASE */
2556
2557/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002558void sign_deterministic( int key_type_arg, data_t *key_data,
2559 int alg_arg, data_t *input_data,
2560 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01002561{
2562 int slot = 1;
2563 psa_key_type_t key_type = key_type_arg;
2564 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01002565 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01002566 unsigned char *signature = NULL;
2567 size_t signature_size;
2568 size_t signature_length = 0xdeadbeef;
Gilles Peskinedec72612018-06-18 18:12:37 +02002569 psa_key_policy_t policy;
Gilles Peskine20035e32018-02-03 22:44:14 +01002570
Gilles Peskine20035e32018-02-03 22:44:14 +01002571 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01002572 TEST_ASSERT( input_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01002573 TEST_ASSERT( output_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002574 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2575 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2576 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( output_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01002577
2578 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2579
mohammad1603a97cb8c2018-03-28 03:46:26 -07002580 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002581 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07002582 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2583
Gilles Peskine20035e32018-02-03 22:44:14 +01002584 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002585 key_data->x,
2586 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01002587 TEST_ASSERT( psa_get_key_information( slot,
2588 NULL,
2589 &key_bits ) == PSA_SUCCESS );
2590
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002591 /* Allocate a buffer which has the size advertized by the
2592 * library. */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002593 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
2594 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01002595 TEST_ASSERT( signature_size != 0 );
Gilles Peskine69c12672018-06-28 00:07:19 +02002596 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002597 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01002598
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002599 /* Perform the signature. */
Gilles Peskine20035e32018-02-03 22:44:14 +01002600 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002601 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01002602 signature, signature_size,
2603 &signature_length ) == PSA_SUCCESS );
Gilles Peskine9911b022018-06-29 17:30:48 +02002604 /* Verify that the signature is what is expected. */
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002605 ASSERT_COMPARE( output_data->x, output_data->len,
2606 signature, signature_length );
Gilles Peskine20035e32018-02-03 22:44:14 +01002607
2608exit:
2609 psa_destroy_key( slot );
Gilles Peskine0189e752018-02-03 23:57:22 +01002610 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01002611 mbedtls_psa_crypto_free( );
2612}
2613/* END_CASE */
2614
2615/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002616void sign_fail( int key_type_arg, data_t *key_data,
2617 int alg_arg, data_t *input_data,
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002618 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01002619{
2620 int slot = 1;
2621 psa_key_type_t key_type = key_type_arg;
2622 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002623 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01002624 psa_status_t actual_status;
2625 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01002626 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01002627 size_t signature_length = 0xdeadbeef;
Gilles Peskinedec72612018-06-18 18:12:37 +02002628 psa_key_policy_t policy;
Gilles Peskine20035e32018-02-03 22:44:14 +01002629
Gilles Peskine20035e32018-02-03 22:44:14 +01002630 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01002631 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002632 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2633 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2634
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002635 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01002636
2637 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2638
mohammad1603a97cb8c2018-03-28 03:46:26 -07002639 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002640 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07002641 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2642
Gilles Peskine20035e32018-02-03 22:44:14 +01002643 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002644 key_data->x,
2645 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01002646
2647 actual_status = psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002648 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01002649 signature, signature_size,
2650 &signature_length );
2651 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02002652 /* The value of *signature_length is unspecified on error, but
2653 * whatever it is, it should be less than signature_size, so that
2654 * if the caller tries to read *signature_length bytes without
2655 * checking the error code then they don't overflow a buffer. */
2656 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01002657
2658exit:
2659 psa_destroy_key( slot );
Gilles Peskine20035e32018-02-03 22:44:14 +01002660 mbedtls_free( signature );
2661 mbedtls_psa_crypto_free( );
2662}
2663/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03002664
2665/* BEGIN_CASE */
Gilles Peskine9911b022018-06-29 17:30:48 +02002666void sign_verify( int key_type_arg, data_t *key_data,
2667 int alg_arg, data_t *input_data )
2668{
2669 int slot = 1;
2670 psa_key_type_t key_type = key_type_arg;
2671 psa_algorithm_t alg = alg_arg;
2672 size_t key_bits;
2673 unsigned char *signature = NULL;
2674 size_t signature_size;
2675 size_t signature_length = 0xdeadbeef;
2676 psa_key_policy_t policy;
2677
2678 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2679
2680 psa_key_policy_init( &policy );
2681 psa_key_policy_set_usage( &policy,
2682 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
2683 alg );
2684 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2685
2686 TEST_ASSERT( psa_import_key( slot, key_type,
2687 key_data->x,
2688 key_data->len ) == PSA_SUCCESS );
2689 TEST_ASSERT( psa_get_key_information( slot,
2690 NULL,
2691 &key_bits ) == PSA_SUCCESS );
2692
2693 /* Allocate a buffer which has the size advertized by the
2694 * library. */
2695 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
2696 key_bits, alg );
2697 TEST_ASSERT( signature_size != 0 );
2698 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002699 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine9911b022018-06-29 17:30:48 +02002700
2701 /* Perform the signature. */
2702 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
2703 input_data->x, input_data->len,
Gilles Peskine9911b022018-06-29 17:30:48 +02002704 signature, signature_size,
2705 &signature_length ) == PSA_SUCCESS );
2706 /* Check that the signature length looks sensible. */
2707 TEST_ASSERT( signature_length <= signature_size );
2708 TEST_ASSERT( signature_length > 0 );
2709
2710 /* Use the library to verify that the signature is correct. */
2711 TEST_ASSERT( psa_asymmetric_verify(
2712 slot, alg,
2713 input_data->x, input_data->len,
Gilles Peskine9911b022018-06-29 17:30:48 +02002714 signature, signature_length ) == PSA_SUCCESS );
2715
2716 if( input_data->len != 0 )
2717 {
2718 /* Flip a bit in the input and verify that the signature is now
2719 * detected as invalid. Flip a bit at the beginning, not at the end,
2720 * because ECDSA may ignore the last few bits of the input. */
2721 input_data->x[0] ^= 1;
2722 TEST_ASSERT( psa_asymmetric_verify(
2723 slot, alg,
2724 input_data->x, input_data->len,
Gilles Peskine9911b022018-06-29 17:30:48 +02002725 signature,
2726 signature_length ) == PSA_ERROR_INVALID_SIGNATURE );
2727 }
2728
2729exit:
2730 psa_destroy_key( slot );
2731 mbedtls_free( signature );
2732 mbedtls_psa_crypto_free( );
2733}
2734/* END_CASE */
2735
2736/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002737void asymmetric_verify( int key_type_arg, data_t *key_data,
2738 int alg_arg, data_t *hash_data,
2739 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03002740{
2741 int slot = 1;
2742 psa_key_type_t key_type = key_type_arg;
2743 psa_algorithm_t alg = alg_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002744 psa_key_policy_t policy;
itayzafrir5c753392018-05-08 11:18:38 +03002745
Gilles Peskine69c12672018-06-28 00:07:19 +02002746 TEST_ASSERT( signature_data->len <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
2747
itayzafrir5c753392018-05-08 11:18:38 +03002748 TEST_ASSERT( key_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03002749 TEST_ASSERT( hash_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03002750 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002751 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2752 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
2753 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03002754
2755 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2756
2757 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002758 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
itayzafrir5c753392018-05-08 11:18:38 +03002759 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2760
2761 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002762 key_data->x,
2763 key_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03002764
2765 TEST_ASSERT( psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002766 hash_data->x, hash_data->len,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002767 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002768 signature_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03002769exit:
2770 psa_destroy_key( slot );
itayzafrir5c753392018-05-08 11:18:38 +03002771 mbedtls_psa_crypto_free( );
2772}
2773/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002774
2775/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002776void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
2777 int alg_arg, data_t *hash_data,
2778 data_t *signature_data,
2779 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002780{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002781 int slot = 1;
2782 psa_key_type_t key_type = key_type_arg;
2783 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002784 psa_status_t actual_status;
2785 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002786 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002787
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002788 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002789 TEST_ASSERT( hash_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002790 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002791 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2792 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
2793 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002794
2795 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2796
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002797 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002798 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002799 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2800
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002801 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002802 key_data->x,
2803 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002804
2805 actual_status = psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002806 hash_data->x, hash_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002807 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002808 signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002809
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002810 TEST_ASSERT( actual_status == expected_status );
2811
2812exit:
2813 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002814 mbedtls_psa_crypto_free( );
2815}
2816/* END_CASE */
2817
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002818/* BEGIN_CASE */
Gilles Peskine656896e2018-06-29 19:12:28 +02002819void asymmetric_encrypt( int key_type_arg,
2820 data_t *key_data,
2821 int alg_arg,
2822 data_t *input_data,
Gilles Peskine68428122018-06-30 18:42:41 +02002823 data_t *label,
Gilles Peskine656896e2018-06-29 19:12:28 +02002824 int expected_output_length_arg,
2825 int expected_status_arg )
2826{
2827 int slot = 1;
2828 psa_key_type_t key_type = key_type_arg;
2829 psa_algorithm_t alg = alg_arg;
2830 size_t expected_output_length = expected_output_length_arg;
2831 size_t key_bits;
2832 unsigned char *output = NULL;
2833 size_t output_size;
2834 size_t output_length = ~0;
2835 psa_status_t actual_status;
2836 psa_status_t expected_status = expected_status_arg;
2837 psa_key_policy_t policy;
2838
2839 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2840
2841 /* Import the key */
2842 psa_key_policy_init( &policy );
2843 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
2844 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2845 TEST_ASSERT( psa_import_key( slot, key_type,
2846 key_data->x,
2847 key_data->len ) == PSA_SUCCESS );
2848
2849 /* Determine the maximum output length */
2850 TEST_ASSERT( psa_get_key_information( slot,
2851 NULL,
2852 &key_bits ) == PSA_SUCCESS );
2853 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002854 ASSERT_ALLOC( output, output_size );
Gilles Peskine656896e2018-06-29 19:12:28 +02002855
2856 /* Encrypt the input */
2857 actual_status = psa_asymmetric_encrypt( slot, alg,
2858 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02002859 label->x, label->len,
Gilles Peskine656896e2018-06-29 19:12:28 +02002860 output, output_size,
2861 &output_length );
2862 TEST_ASSERT( actual_status == expected_status );
2863 TEST_ASSERT( output_length == expected_output_length );
2864
Gilles Peskine68428122018-06-30 18:42:41 +02002865 /* If the label is empty, the test framework puts a non-null pointer
2866 * in label->x. Test that a null pointer works as well. */
2867 if( label->len == 0 )
2868 {
2869 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02002870 if( output_size != 0 )
2871 memset( output, 0, output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02002872 actual_status = psa_asymmetric_encrypt( slot, alg,
2873 input_data->x, input_data->len,
2874 NULL, label->len,
2875 output, output_size,
2876 &output_length );
2877 TEST_ASSERT( actual_status == expected_status );
2878 TEST_ASSERT( output_length == expected_output_length );
2879 }
2880
Gilles Peskine656896e2018-06-29 19:12:28 +02002881exit:
2882 psa_destroy_key( slot );
2883 mbedtls_free( output );
2884 mbedtls_psa_crypto_free( );
2885}
2886/* END_CASE */
2887
2888/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02002889void asymmetric_encrypt_decrypt( int key_type_arg,
2890 data_t *key_data,
2891 int alg_arg,
2892 data_t *input_data,
2893 data_t *label )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002894{
2895 int slot = 1;
2896 psa_key_type_t key_type = key_type_arg;
2897 psa_algorithm_t alg = alg_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02002898 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002899 unsigned char *output = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02002900 size_t output_size;
2901 size_t output_length = ~0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002902 unsigned char *output2 = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02002903 size_t output2_size;
2904 size_t output2_length = ~0;
Gilles Peskinedec72612018-06-18 18:12:37 +02002905 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002906
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002907 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002908 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002909 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2910 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2911
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002912 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2913
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002914 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002915 psa_key_policy_set_usage( &policy,
2916 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002917 alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002918 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2919
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002920 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002921 key_data->x,
2922 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002923
Gilles Peskine55c94dd2018-06-30 18:54:48 +02002924
2925 /* Determine the maximum ciphertext length */
2926 TEST_ASSERT( psa_get_key_information( slot,
2927 NULL,
2928 &key_bits ) == PSA_SUCCESS );
2929 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002930 ASSERT_ALLOC( output, output_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02002931 output2_size = input_data->len;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002932 ASSERT_ALLOC( output2, output2_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02002933
Gilles Peskineeebd7382018-06-08 18:11:54 +02002934 /* We test encryption by checking that encrypt-then-decrypt gives back
2935 * the original plaintext because of the non-optional random
2936 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine2d277862018-06-18 15:41:12 +02002937 TEST_ASSERT( psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002938 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02002939 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002940 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002941 &output_length ) == PSA_SUCCESS );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02002942 /* We don't know what ciphertext length to expect, but check that
2943 * it looks sensible. */
2944 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002945
Gilles Peskine2d277862018-06-18 15:41:12 +02002946 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002947 output, output_length,
Gilles Peskine68428122018-06-30 18:42:41 +02002948 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002949 output2, output2_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002950 &output2_length ) == PSA_SUCCESS );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002951 ASSERT_COMPARE( input_data->x, input_data->len,
2952 output2, output2_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002953
2954exit:
2955 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002956 mbedtls_free( output );
2957 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002958 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002959}
2960/* END_CASE */
2961
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002962/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02002963void asymmetric_decrypt( int key_type_arg,
2964 data_t *key_data,
2965 int alg_arg,
2966 data_t *input_data,
2967 data_t *label,
Gilles Peskine66763a02018-06-29 21:54:10 +02002968 data_t *expected_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002969{
2970 int slot = 1;
2971 psa_key_type_t key_type = key_type_arg;
2972 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002973 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002974 size_t output_size = 0;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02002975 size_t output_length = ~0;
Gilles Peskinedec72612018-06-18 18:12:37 +02002976 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002977
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002978 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002979 TEST_ASSERT( input_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002980 TEST_ASSERT( expected_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002981 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2982 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2983 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
2984
Gilles Peskine4abf7412018-06-18 16:35:34 +02002985 output_size = key_data->len;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002986 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002987
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002988 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2989
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002990 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002991 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002992 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2993
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002994 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002995 key_data->x,
2996 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002997
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002998 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002999 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003000 label->x, label->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02003001 output,
3002 output_size,
3003 &output_length ) == PSA_SUCCESS );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003004 ASSERT_COMPARE( expected_data->x, expected_data->len,
3005 output, output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003006
Gilles Peskine68428122018-06-30 18:42:41 +02003007 /* If the label is empty, the test framework puts a non-null pointer
3008 * in label->x. Test that a null pointer works as well. */
3009 if( label->len == 0 )
3010 {
3011 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003012 if( output_size != 0 )
3013 memset( output, 0, output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02003014 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
3015 input_data->x, input_data->len,
3016 NULL, label->len,
3017 output,
3018 output_size,
3019 &output_length ) == PSA_SUCCESS );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003020 ASSERT_COMPARE( expected_data->x, expected_data->len,
3021 output, output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003022 }
3023
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003024exit:
3025 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003026 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003027 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003028}
3029/* END_CASE */
3030
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003031/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003032void asymmetric_decrypt_fail( int key_type_arg,
3033 data_t *key_data,
3034 int alg_arg,
3035 data_t *input_data,
3036 data_t *label,
Gilles Peskine2d277862018-06-18 15:41:12 +02003037 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003038{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003039 int slot = 1;
3040 psa_key_type_t key_type = key_type_arg;
3041 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003042 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03003043 size_t output_size = 0;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003044 size_t output_length = ~0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003045 psa_status_t actual_status;
3046 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02003047 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003048
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003049 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003050 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003051 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
3052 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
3053
Gilles Peskine4abf7412018-06-18 16:35:34 +02003054 output_size = key_data->len;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003055 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003056
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003057 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
3058
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003059 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02003060 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003061 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
3062
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003063 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003064 key_data->x,
3065 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003066
Gilles Peskine2d277862018-06-18 15:41:12 +02003067 actual_status = psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003068 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003069 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003070 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02003071 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003072 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003073 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003074
Gilles Peskine68428122018-06-30 18:42:41 +02003075 /* If the label is empty, the test framework puts a non-null pointer
3076 * in label->x. Test that a null pointer works as well. */
3077 if( label->len == 0 )
3078 {
3079 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003080 if( output_size != 0 )
3081 memset( output, 0, output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02003082 actual_status = psa_asymmetric_decrypt( slot, alg,
3083 input_data->x, input_data->len,
3084 NULL, label->len,
3085 output, output_size,
3086 &output_length );
3087 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003088 TEST_ASSERT( output_length <= output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02003089 }
3090
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003091exit:
3092 psa_destroy_key( slot );
Gilles Peskine2d277862018-06-18 15:41:12 +02003093 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003094 mbedtls_psa_crypto_free( );
3095}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003096/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02003097
3098/* BEGIN_CASE */
Gilles Peskineea0fb492018-07-12 17:17:20 +02003099void derive_setup( int key_type_arg,
3100 data_t *key_data,
3101 int alg_arg,
3102 data_t *salt,
3103 data_t *label,
3104 int requested_capacity_arg,
3105 int expected_status_arg )
3106{
3107 psa_key_slot_t slot = 1;
3108 size_t key_type = key_type_arg;
3109 psa_algorithm_t alg = alg_arg;
3110 size_t requested_capacity = requested_capacity_arg;
3111 psa_status_t expected_status = expected_status_arg;
3112 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3113 psa_key_policy_t policy;
3114
3115 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
3116
3117 psa_key_policy_init( &policy );
3118 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
3119 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
3120
3121 TEST_ASSERT( psa_import_key( slot, key_type,
3122 key_data->x,
3123 key_data->len ) == PSA_SUCCESS );
3124
3125 TEST_ASSERT( psa_key_derivation( &generator, slot, alg,
3126 salt->x, salt->len,
3127 label->x, label->len,
3128 requested_capacity ) == expected_status );
3129
3130exit:
3131 psa_generator_abort( &generator );
3132 psa_destroy_key( slot );
3133 mbedtls_psa_crypto_free( );
3134}
3135/* END_CASE */
3136
3137/* BEGIN_CASE */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003138void derive_output( int alg_arg,
3139 data_t *key_data,
3140 data_t *salt,
3141 data_t *label,
3142 int requested_capacity_arg,
3143 data_t *expected_output1,
3144 data_t *expected_output2 )
3145{
3146 psa_key_slot_t slot = 1;
3147 psa_algorithm_t alg = alg_arg;
3148 size_t requested_capacity = requested_capacity_arg;
3149 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3150 uint8_t *expected_outputs[2] =
3151 {expected_output1->x, expected_output2->x};
3152 size_t output_sizes[2] =
3153 {expected_output1->len, expected_output2->len};
3154 size_t output_buffer_size = 0;
3155 uint8_t *output_buffer = NULL;
3156 size_t expected_capacity;
3157 size_t current_capacity;
3158 psa_key_policy_t policy;
3159 psa_status_t status;
3160 unsigned i;
3161
3162 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
3163 {
3164 if( output_sizes[i] > output_buffer_size )
3165 output_buffer_size = output_sizes[i];
3166 if( output_sizes[i] == 0 )
3167 expected_outputs[i] = NULL;
3168 }
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003169 ASSERT_ALLOC( output_buffer, output_buffer_size );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02003170 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
3171
3172 psa_key_policy_init( &policy );
3173 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
3174 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
3175
3176 TEST_ASSERT( psa_import_key( slot, PSA_KEY_TYPE_DERIVE,
3177 key_data->x,
3178 key_data->len ) == PSA_SUCCESS );
3179
3180 /* Extraction phase. */
3181 TEST_ASSERT( psa_key_derivation( &generator, slot, alg,
3182 salt->x, salt->len,
3183 label->x, label->len,
3184 requested_capacity ) == PSA_SUCCESS );
3185 TEST_ASSERT( psa_get_generator_capacity( &generator,
3186 &current_capacity ) ==
3187 PSA_SUCCESS );
3188 TEST_ASSERT( current_capacity == requested_capacity );
3189 expected_capacity = requested_capacity;
3190
3191 /* Expansion phase. */
3192 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
3193 {
3194 /* Read some bytes. */
3195 status = psa_generator_read( &generator,
3196 output_buffer, output_sizes[i] );
3197 if( expected_capacity == 0 && output_sizes[i] == 0 )
3198 {
3199 /* Reading 0 bytes when 0 bytes are available can go either way. */
3200 TEST_ASSERT( status == PSA_SUCCESS ||
3201 status == PSA_ERROR_INSUFFICIENT_CAPACITY );
3202 continue;
3203 }
3204 else if( expected_capacity == 0 ||
3205 output_sizes[i] > expected_capacity )
3206 {
3207 /* Capacity exceeded. */
3208 TEST_ASSERT( status == PSA_ERROR_INSUFFICIENT_CAPACITY );
3209 expected_capacity = 0;
3210 continue;
3211 }
3212 /* Success. Check the read data. */
3213 TEST_ASSERT( status == PSA_SUCCESS );
3214 if( output_sizes[i] != 0 )
3215 TEST_ASSERT( memcmp( output_buffer, expected_outputs[i],
3216 output_sizes[i] ) == 0 );
3217 /* Check the generator status. */
3218 expected_capacity -= output_sizes[i];
3219 TEST_ASSERT( psa_get_generator_capacity( &generator,
3220 &current_capacity ) ==
3221 PSA_SUCCESS );
3222 TEST_ASSERT( expected_capacity == current_capacity );
3223 }
3224 TEST_ASSERT( psa_generator_abort( &generator ) == PSA_SUCCESS );
3225
3226exit:
3227 mbedtls_free( output_buffer );
3228 psa_generator_abort( &generator );
3229 psa_destroy_key( slot );
3230 mbedtls_psa_crypto_free( );
3231}
3232/* END_CASE */
3233
3234/* BEGIN_CASE */
Gilles Peskined54931c2018-07-17 21:06:59 +02003235void derive_full( int alg_arg,
3236 data_t *key_data,
3237 data_t *salt,
3238 data_t *label,
3239 int requested_capacity_arg )
3240{
3241 psa_key_slot_t slot = 1;
3242 psa_algorithm_t alg = alg_arg;
3243 size_t requested_capacity = requested_capacity_arg;
3244 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3245 unsigned char output_buffer[16];
3246 size_t expected_capacity = requested_capacity;
3247 size_t current_capacity;
3248 psa_key_policy_t policy;
3249
3250 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
3251
3252 psa_key_policy_init( &policy );
3253 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
3254 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
3255
3256 TEST_ASSERT( psa_import_key( slot, PSA_KEY_TYPE_DERIVE,
3257 key_data->x,
3258 key_data->len ) == PSA_SUCCESS );
3259
3260 /* Extraction phase. */
3261 TEST_ASSERT( psa_key_derivation( &generator, slot, alg,
3262 salt->x, salt->len,
3263 label->x, label->len,
3264 requested_capacity ) == PSA_SUCCESS );
3265 TEST_ASSERT( psa_get_generator_capacity( &generator,
3266 &current_capacity ) ==
3267 PSA_SUCCESS );
3268 TEST_ASSERT( current_capacity == expected_capacity );
3269
3270 /* Expansion phase. */
3271 while( current_capacity > 0 )
3272 {
3273 size_t read_size = sizeof( output_buffer );
3274 if( read_size > current_capacity )
3275 read_size = current_capacity;
3276 TEST_ASSERT( psa_generator_read( &generator,
3277 output_buffer,
3278 read_size ) == PSA_SUCCESS );
3279 expected_capacity -= read_size;
3280 TEST_ASSERT( psa_get_generator_capacity( &generator,
3281 &current_capacity ) ==
3282 PSA_SUCCESS );
3283 TEST_ASSERT( current_capacity == expected_capacity );
3284 }
3285
3286 /* Check that the generator refuses to go over capacity. */
3287 TEST_ASSERT( psa_generator_read( &generator,
3288 output_buffer,
3289 1 ) == PSA_ERROR_INSUFFICIENT_CAPACITY );
3290
3291 TEST_ASSERT( psa_generator_abort( &generator ) == PSA_SUCCESS );
3292
3293exit:
3294 psa_generator_abort( &generator );
3295 psa_destroy_key( slot );
3296 mbedtls_psa_crypto_free( );
3297}
3298/* END_CASE */
3299
3300/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02003301void derive_key_exercise( int alg_arg,
3302 data_t *key_data,
3303 data_t *salt,
3304 data_t *label,
3305 int derived_type_arg,
3306 int derived_bits_arg,
3307 int derived_usage_arg,
3308 int derived_alg_arg )
3309{
3310 psa_key_slot_t base_key = 1;
3311 psa_key_slot_t derived_key = 2;
3312 psa_algorithm_t alg = alg_arg;
3313 psa_key_type_t derived_type = derived_type_arg;
3314 size_t derived_bits = derived_bits_arg;
3315 psa_key_usage_t derived_usage = derived_usage_arg;
3316 psa_algorithm_t derived_alg = derived_alg_arg;
3317 size_t capacity = PSA_BITS_TO_BYTES( derived_bits );
3318 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3319 psa_key_policy_t policy;
3320 psa_key_type_t got_type;
3321 size_t got_bits;
3322
3323 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
3324
3325 psa_key_policy_init( &policy );
3326 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
3327 TEST_ASSERT( psa_set_key_policy( base_key, &policy ) == PSA_SUCCESS );
3328 TEST_ASSERT( psa_import_key( base_key, PSA_KEY_TYPE_DERIVE,
3329 key_data->x,
3330 key_data->len ) == PSA_SUCCESS );
3331
3332 /* Derive a key. */
3333 TEST_ASSERT( psa_key_derivation( &generator, base_key, alg,
3334 salt->x, salt->len,
3335 label->x, label->len,
3336 capacity ) == PSA_SUCCESS );
3337 psa_key_policy_set_usage( &policy, derived_usage, derived_alg );
3338 TEST_ASSERT( psa_set_key_policy( derived_key, &policy ) == PSA_SUCCESS );
3339 TEST_ASSERT( psa_generator_import_key( derived_key,
3340 derived_type,
3341 derived_bits,
3342 &generator ) == PSA_SUCCESS );
3343
3344 /* Test the key information */
3345 TEST_ASSERT( psa_get_key_information( derived_key,
3346 &got_type,
3347 &got_bits ) == PSA_SUCCESS );
3348 TEST_ASSERT( got_type == derived_type );
3349 TEST_ASSERT( got_bits == derived_bits );
3350
3351 /* Exercise the derived key. */
3352 if( ! exercise_key( derived_key, derived_usage, derived_alg ) )
3353 goto exit;
3354
3355exit:
3356 psa_generator_abort( &generator );
3357 psa_destroy_key( base_key );
3358 psa_destroy_key( derived_key );
3359 mbedtls_psa_crypto_free( );
3360}
3361/* END_CASE */
3362
3363/* BEGIN_CASE */
3364void derive_key_export( int alg_arg,
3365 data_t *key_data,
3366 data_t *salt,
3367 data_t *label,
3368 int bytes1_arg,
3369 int bytes2_arg )
3370{
3371 psa_key_slot_t base_key = 1;
3372 psa_key_slot_t derived_key = 2;
3373 psa_algorithm_t alg = alg_arg;
3374 size_t bytes1 = bytes1_arg;
3375 size_t bytes2 = bytes2_arg;
3376 size_t capacity = bytes1 + bytes2;
3377 psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003378 uint8_t *output_buffer = NULL;
3379 uint8_t *export_buffer = NULL;
Gilles Peskine0386fba2018-07-12 17:29:22 +02003380 psa_key_policy_t policy;
3381 size_t length;
3382
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003383 ASSERT_ALLOC( output_buffer, capacity );
3384 ASSERT_ALLOC( export_buffer, capacity );
Gilles Peskine0386fba2018-07-12 17:29:22 +02003385 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
3386
3387 psa_key_policy_init( &policy );
3388 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DERIVE, alg );
3389 TEST_ASSERT( psa_set_key_policy( base_key, &policy ) == PSA_SUCCESS );
3390 TEST_ASSERT( psa_import_key( base_key, PSA_KEY_TYPE_DERIVE,
3391 key_data->x,
3392 key_data->len ) == PSA_SUCCESS );
3393
3394 /* Derive some material and output it. */
3395 TEST_ASSERT( psa_key_derivation( &generator, base_key, alg,
3396 salt->x, salt->len,
3397 label->x, label->len,
3398 capacity ) == PSA_SUCCESS );
3399 TEST_ASSERT( psa_generator_read( &generator,
3400 output_buffer,
3401 capacity ) == PSA_SUCCESS );
3402 TEST_ASSERT( psa_generator_abort( &generator ) == PSA_SUCCESS );
3403
3404 /* Derive the same output again, but this time store it in key objects. */
3405 TEST_ASSERT( psa_key_derivation( &generator, base_key, alg,
3406 salt->x, salt->len,
3407 label->x, label->len,
3408 capacity ) == PSA_SUCCESS );
3409 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, 0 );
3410 TEST_ASSERT( psa_set_key_policy( derived_key, &policy ) == PSA_SUCCESS );
3411 TEST_ASSERT( psa_generator_import_key( derived_key,
3412 PSA_KEY_TYPE_RAW_DATA,
3413 PSA_BYTES_TO_BITS( bytes1 ),
3414 &generator ) == PSA_SUCCESS );
3415 TEST_ASSERT( psa_export_key( derived_key,
3416 export_buffer, bytes1,
3417 &length ) == PSA_SUCCESS );
3418 TEST_ASSERT( length == bytes1 );
3419 TEST_ASSERT( psa_destroy_key( derived_key ) == PSA_SUCCESS );
3420 TEST_ASSERT( psa_set_key_policy( derived_key, &policy ) == PSA_SUCCESS );
3421 TEST_ASSERT( psa_generator_import_key( derived_key,
3422 PSA_KEY_TYPE_RAW_DATA,
3423 PSA_BYTES_TO_BITS( bytes2 ),
3424 &generator ) == PSA_SUCCESS );
3425 TEST_ASSERT( psa_export_key( derived_key,
3426 export_buffer + bytes1, bytes2,
3427 &length ) == PSA_SUCCESS );
3428 TEST_ASSERT( length == bytes2 );
3429
3430 /* Compare the outputs from the two runs. */
3431 TEST_ASSERT( memcmp( output_buffer, export_buffer, capacity ) == 0 );
3432
3433exit:
3434 mbedtls_free( output_buffer );
3435 mbedtls_free( export_buffer );
3436 psa_generator_abort( &generator );
3437 psa_destroy_key( base_key );
3438 psa_destroy_key( derived_key );
3439 mbedtls_psa_crypto_free( );
3440}
3441/* END_CASE */
3442
3443/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02003444void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02003445{
Gilles Peskinea50d7392018-06-21 10:22:13 +02003446 size_t bytes = bytes_arg;
3447 const unsigned char trail[] = "don't overwrite me";
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003448 unsigned char *output = NULL;
3449 unsigned char *changed = NULL;
Gilles Peskinea50d7392018-06-21 10:22:13 +02003450 size_t i;
3451 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02003452
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003453 ASSERT_ALLOC( output, bytes + sizeof( trail ) );
3454 ASSERT_ALLOC( changed, bytes );
Gilles Peskinea50d7392018-06-21 10:22:13 +02003455 memcpy( output + bytes, trail, sizeof( trail ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02003456
3457 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
3458
Gilles Peskinea50d7392018-06-21 10:22:13 +02003459 /* Run several times, to ensure that every output byte will be
3460 * nonzero at least once with overwhelming probability
3461 * (2^(-8*number_of_runs)). */
3462 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02003463 {
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003464 if( bytes != 0 )
3465 memset( output, 0, bytes );
Gilles Peskinea50d7392018-06-21 10:22:13 +02003466 TEST_ASSERT( psa_generate_random( output, bytes ) == PSA_SUCCESS );
3467
3468 /* Check that no more than bytes have been overwritten */
3469 TEST_ASSERT( memcmp( output + bytes, trail, sizeof( trail ) ) == 0 );
3470
3471 for( i = 0; i < bytes; i++ )
3472 {
3473 if( output[i] != 0 )
3474 ++changed[i];
3475 }
Gilles Peskine05d69892018-06-19 22:00:52 +02003476 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02003477
3478 /* Check that every byte was changed to nonzero at least once. This
3479 * validates that psa_generate_random is overwriting every byte of
3480 * the output buffer. */
3481 for( i = 0; i < bytes; i++ )
3482 {
3483 TEST_ASSERT( changed[i] != 0 );
3484 }
Gilles Peskine05d69892018-06-19 22:00:52 +02003485
3486exit:
3487 mbedtls_psa_crypto_free( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02003488 mbedtls_free( output );
3489 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02003490}
3491/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02003492
3493/* BEGIN_CASE */
3494void generate_key( int type_arg,
3495 int bits_arg,
3496 int usage_arg,
3497 int alg_arg,
3498 int expected_status_arg )
3499{
3500 int slot = 1;
3501 psa_key_type_t type = type_arg;
3502 psa_key_usage_t usage = usage_arg;
3503 size_t bits = bits_arg;
3504 psa_algorithm_t alg = alg_arg;
3505 psa_status_t expected_status = expected_status_arg;
3506 psa_key_type_t got_type;
3507 size_t got_bits;
Gilles Peskine12313cd2018-06-20 00:20:32 +02003508 psa_status_t expected_info_status =
3509 expected_status == PSA_SUCCESS ? PSA_SUCCESS : PSA_ERROR_EMPTY_SLOT;
3510 psa_key_policy_t policy;
3511
3512 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
3513
3514 psa_key_policy_init( &policy );
3515 psa_key_policy_set_usage( &policy, usage, alg );
3516 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
3517
3518 /* Generate a key */
3519 TEST_ASSERT( psa_generate_key( slot, type, bits,
3520 NULL, 0 ) == expected_status );
3521
3522 /* Test the key information */
3523 TEST_ASSERT( psa_get_key_information( slot,
3524 &got_type,
3525 &got_bits ) == expected_info_status );
3526 if( expected_info_status != PSA_SUCCESS )
3527 goto exit;
3528 TEST_ASSERT( got_type == type );
3529 TEST_ASSERT( got_bits == bits );
3530
Gilles Peskine818ca122018-06-20 18:16:48 +02003531 /* Do something with the key according to its type and permitted usage. */
Gilles Peskine02b75072018-07-01 22:31:34 +02003532 if( ! exercise_key( slot, usage, alg ) )
3533 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02003534
3535exit:
3536 psa_destroy_key( slot );
3537 mbedtls_psa_crypto_free( );
3538}
3539/* END_CASE */
itayzafrir0adf0fc2018-09-06 16:24:41 +03003540
3541/* BEGIN_CASE */
3542void validate_module_init_generate_random( )
3543{
3544 psa_status_t status;
3545 uint8_t random[10] = { 0 };
3546 status = psa_generate_random( random, sizeof( random ) );
3547 TEST_ASSERT( status == PSA_ERROR_BAD_STATE );
3548}
3549/* END_CASE */
itayzafrir90d8c7a2018-09-12 11:44:52 +03003550
3551/* BEGIN_CASE */
3552void validate_module_init_key_based( )
3553{
3554 psa_status_t status;
3555 uint8_t data[10] = { 0 };
3556 status = psa_import_key( 1, PSA_KEY_TYPE_RAW_DATA, data, sizeof( data ) );
3557 TEST_ASSERT( status == PSA_ERROR_BAD_STATE );
3558}
3559/* END_CASE */