blob: 5f705e3e3c1f8bf9c226b7b46057857fedfe568c [file] [log] [blame]
Gilles Peskinee59236f2018-01-27 23:32:46 +01001/* BEGIN_HEADER */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002#include <stdint.h>
Gilles Peskine0b352bc2018-06-28 00:16:11 +02003#include "mbedtls/asn1write.h"
Gilles Peskinee59236f2018-01-27 23:32:46 +01004#include "psa/crypto.h"
itayzafrir3e02b3b2018-06-12 17:06:52 +03005
6#if(UINT32_MAX > SIZE_MAX)
Gilles Peskine2d277862018-06-18 15:41:12 +02007#define PSA_CRYPTO_TEST_SIZE_T_RANGE( x ) ( ( x ) <= SIZE_MAX )
itayzafrir3e02b3b2018-06-12 17:06:52 +03008#else
Gilles Peskine2d277862018-06-18 15:41:12 +02009#define PSA_CRYPTO_TEST_SIZE_T_RANGE( x ) 1
itayzafrir3e02b3b2018-06-12 17:06:52 +030010#endif
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020011
Jaeden Amerof24c7f82018-06-27 17:20:43 +010012/** An invalid export length that will never be set by psa_export_key(). */
13static const size_t INVALID_EXPORT_LENGTH = ~0U;
14
Gilles Peskined35a1cc2018-06-26 21:26:10 +020015/** Test if a buffer is all-bits zero.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020016 *
17 * \param buffer Pointer to the beginning of the buffer.
18 * \param size Size of the buffer in bytes.
19 *
Gilles Peskine3f669c32018-06-21 09:21:51 +020020 * \return 1 if the buffer is all-bits-zero.
21 * \return 0 if there is at least one nonzero byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020022 */
Gilles Peskine3f669c32018-06-21 09:21:51 +020023static int mem_is_zero( void *buffer, size_t size )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020024{
25 size_t i;
26 for( i = 0; i < size; i++ )
27 {
28 if( ( (unsigned char *) buffer )[i] != 0 )
Gilles Peskine3f669c32018-06-21 09:21:51 +020029 return( 0 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020030 }
Gilles Peskine3f669c32018-06-21 09:21:51 +020031 return( 1 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020032}
Gilles Peskine818ca122018-06-20 18:16:48 +020033
Gilles Peskine48c0ea12018-06-21 14:15:31 +020034static int key_type_is_raw_bytes( psa_key_type_t type )
35{
36 psa_key_type_t category = type & PSA_KEY_TYPE_CATEGORY_MASK;
37 return( category == PSA_KEY_TYPE_RAW_DATA ||
38 category == PSA_KEY_TYPE_CATEGORY_SYMMETRIC );
39}
40
Gilles Peskine0b352bc2018-06-28 00:16:11 +020041/* Write the ASN.1 INTEGER with the value 2^(bits-1)+x backwards from *p. */
42static int asn1_write_10x( unsigned char **p,
43 unsigned char *start,
44 size_t bits,
45 unsigned char x )
46{
47 int ret;
48 int len = bits / 8 + 1;
Gilles Peskine480416a2018-06-28 19:04:07 +020049 if( bits == 0 )
50 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
51 if( bits <= 8 && x >= 1 << ( bits - 1 ) )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020052 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
53 if( *p < start || *p - start < (ssize_t) len )
54 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
55 *p -= len;
56 ( *p )[len-1] = x;
57 if( bits % 8 == 0 )
58 ( *p )[1] |= 1;
59 else
60 ( *p )[0] |= 1 << ( bits % 8 );
61 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
62 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
63 MBEDTLS_ASN1_INTEGER ) );
64 return( len );
65}
66
67static int construct_fake_rsa_key( unsigned char *buffer,
68 size_t buffer_size,
69 unsigned char **p,
70 size_t bits,
71 int keypair )
72{
73 size_t half_bits = ( bits + 1 ) / 2;
74 int ret;
75 int len = 0;
76 /* Construct something that looks like a DER encoding of
77 * as defined by PKCS#1 v2.2 (RFC 8017) section A.1.2:
78 * RSAPrivateKey ::= SEQUENCE {
79 * version Version,
80 * modulus INTEGER, -- n
81 * publicExponent INTEGER, -- e
82 * privateExponent INTEGER, -- d
83 * prime1 INTEGER, -- p
84 * prime2 INTEGER, -- q
85 * exponent1 INTEGER, -- d mod (p-1)
86 * exponent2 INTEGER, -- d mod (q-1)
87 * coefficient INTEGER, -- (inverse of q) mod p
88 * otherPrimeInfos OtherPrimeInfos OPTIONAL
89 * }
90 * Or, for a public key, the same structure with only
91 * version, modulus and publicExponent.
92 */
93 *p = buffer + buffer_size;
94 if( keypair )
95 {
96 MBEDTLS_ASN1_CHK_ADD( len, /* pq */
97 asn1_write_10x( p, buffer, half_bits, 1 ) );
98 MBEDTLS_ASN1_CHK_ADD( len, /* dq */
99 asn1_write_10x( p, buffer, half_bits, 1 ) );
100 MBEDTLS_ASN1_CHK_ADD( len, /* dp */
101 asn1_write_10x( p, buffer, half_bits, 1 ) );
102 MBEDTLS_ASN1_CHK_ADD( len, /* q */
103 asn1_write_10x( p, buffer, half_bits, 1 ) );
104 MBEDTLS_ASN1_CHK_ADD( len, /* p != q to pass mbedtls sanity checks */
105 asn1_write_10x( p, buffer, half_bits, 3 ) );
106 MBEDTLS_ASN1_CHK_ADD( len, /* d */
107 asn1_write_10x( p, buffer, bits, 1 ) );
108 }
109 MBEDTLS_ASN1_CHK_ADD( len, /* e = 65537 */
110 asn1_write_10x( p, buffer, 17, 1 ) );
111 MBEDTLS_ASN1_CHK_ADD( len, /* n */
112 asn1_write_10x( p, buffer, bits, 1 ) );
113 if( keypair )
114 MBEDTLS_ASN1_CHK_ADD( len, /* version = 0 */
115 mbedtls_asn1_write_int( p, buffer, 0 ) );
116 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, buffer, len ) );
117 {
118 const unsigned char tag =
119 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE;
120 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, buffer, tag ) );
121 }
122 return( len );
123}
124
Gilles Peskine818ca122018-06-20 18:16:48 +0200125static int exercise_mac_key( psa_key_slot_t key,
126 psa_key_usage_t usage,
127 psa_algorithm_t alg )
128{
129 psa_mac_operation_t operation;
130 const unsigned char input[] = "foo";
Gilles Peskine69c12672018-06-28 00:07:19 +0200131 unsigned char mac[PSA_MAC_MAX_SIZE] = {0};
Gilles Peskine818ca122018-06-20 18:16:48 +0200132 size_t mac_length = sizeof( mac );
133
134 if( usage & PSA_KEY_USAGE_SIGN )
135 {
136 TEST_ASSERT( psa_mac_start( &operation, key, alg ) == PSA_SUCCESS );
137 TEST_ASSERT( psa_mac_update( &operation,
138 input, sizeof( input ) ) == PSA_SUCCESS );
139 TEST_ASSERT( psa_mac_finish( &operation,
140 mac, sizeof( input ),
141 &mac_length ) == PSA_SUCCESS );
142 }
143
144 if( usage & PSA_KEY_USAGE_VERIFY )
145 {
146 psa_status_t verify_status =
147 ( usage & PSA_KEY_USAGE_SIGN ?
148 PSA_SUCCESS :
149 PSA_ERROR_INVALID_SIGNATURE );
150 TEST_ASSERT( psa_mac_start( &operation, key, alg ) == PSA_SUCCESS );
151 TEST_ASSERT( psa_mac_update( &operation,
152 input, sizeof( input ) ) == PSA_SUCCESS );
153 TEST_ASSERT( psa_mac_verify( &operation, mac, mac_length ) == verify_status );
154 }
155
156 return( 1 );
157
158exit:
159 psa_mac_abort( &operation );
160 return( 0 );
161}
162
163static int exercise_cipher_key( psa_key_slot_t key,
164 psa_key_usage_t usage,
165 psa_algorithm_t alg )
166{
167 psa_cipher_operation_t operation;
168 unsigned char iv[16] = {0};
169 size_t iv_length = sizeof( iv );
170 const unsigned char plaintext[16] = "Hello, world...";
171 unsigned char ciphertext[32] = "(wabblewebblewibblewobblewubble)";
172 size_t ciphertext_length = sizeof( ciphertext );
173 unsigned char decrypted[sizeof( ciphertext )];
174 size_t part_length;
175
176 if( usage & PSA_KEY_USAGE_ENCRYPT )
177 {
178 TEST_ASSERT( psa_encrypt_setup( &operation, key, alg ) == PSA_SUCCESS );
179 TEST_ASSERT( psa_encrypt_generate_iv( &operation,
180 iv, sizeof( iv ),
181 &iv_length ) == PSA_SUCCESS );
182 TEST_ASSERT( psa_cipher_update( &operation,
183 plaintext, sizeof( plaintext ),
184 ciphertext, sizeof( ciphertext ),
185 &ciphertext_length ) == PSA_SUCCESS );
186 TEST_ASSERT( psa_cipher_finish( &operation,
187 ciphertext + ciphertext_length,
188 sizeof( ciphertext ) - ciphertext_length,
189 &part_length ) == PSA_SUCCESS );
190 ciphertext_length += part_length;
191 }
192
193 if( usage & PSA_KEY_USAGE_DECRYPT )
194 {
195 psa_status_t status;
Mohammad AboMokhadb9b232018-06-28 01:52:54 -0700196 psa_key_type_t type = PSA_KEY_TYPE_NONE;
Gilles Peskine818ca122018-06-20 18:16:48 +0200197 if( ! ( usage & PSA_KEY_USAGE_ENCRYPT ) )
198 {
Gilles Peskine818ca122018-06-20 18:16:48 +0200199 size_t bits;
200 TEST_ASSERT( psa_get_key_information( key, &type, &bits ) );
201 iv_length = PSA_BLOCK_CIPHER_BLOCK_SIZE( type );
202 }
203 TEST_ASSERT( psa_decrypt_setup( &operation, key, alg ) == PSA_SUCCESS );
204 TEST_ASSERT( psa_encrypt_set_iv( &operation,
205 iv, iv_length ) == PSA_SUCCESS );
206 TEST_ASSERT( psa_cipher_update( &operation,
207 ciphertext, ciphertext_length,
208 decrypted, sizeof( decrypted ),
209 &part_length ) == PSA_SUCCESS );
210 status = psa_cipher_finish( &operation,
211 decrypted + part_length,
212 sizeof( decrypted ) - part_length,
213 &part_length );
214 /* For a stream cipher, all inputs are valid. For a block cipher,
215 * if the input is some aribtrary data rather than an actual
216 ciphertext, a padding error is likely. */
Mohammad AboMokh65fa0b82018-06-28 02:14:00 -0700217 if( ( usage & PSA_KEY_USAGE_ENCRYPT ) ||
Mohammad AboMokhadb9b232018-06-28 01:52:54 -0700218 PSA_BLOCK_CIPHER_BLOCK_SIZE( type ) == 1 )
Gilles Peskine818ca122018-06-20 18:16:48 +0200219 TEST_ASSERT( status == PSA_SUCCESS );
220 else
221 TEST_ASSERT( status == PSA_SUCCESS ||
222 status == PSA_ERROR_INVALID_PADDING );
223 }
224
225 return( 1 );
226
227exit:
228 psa_cipher_abort( &operation );
229 return( 0 );
230}
231
232static int exercise_aead_key( psa_key_slot_t key,
233 psa_key_usage_t usage,
234 psa_algorithm_t alg )
235{
236 unsigned char nonce[16] = {0};
237 size_t nonce_length = sizeof( nonce );
238 unsigned char plaintext[16] = "Hello, world...";
239 unsigned char ciphertext[48] = "(wabblewebblewibblewobblewubble)";
240 size_t ciphertext_length = sizeof( ciphertext );
241 size_t plaintext_length = sizeof( ciphertext );
242
243 if( usage & PSA_KEY_USAGE_ENCRYPT )
244 {
245 TEST_ASSERT( psa_aead_encrypt( key, alg,
246 nonce, nonce_length,
247 NULL, 0,
248 plaintext, sizeof( plaintext ),
249 ciphertext, sizeof( ciphertext ),
250 &ciphertext_length ) == PSA_SUCCESS );
251 }
252
253 if( usage & PSA_KEY_USAGE_DECRYPT )
254 {
255 psa_status_t verify_status =
256 ( usage & PSA_KEY_USAGE_ENCRYPT ?
257 PSA_SUCCESS :
258 PSA_ERROR_INVALID_SIGNATURE );
259 TEST_ASSERT( psa_aead_decrypt( key, alg,
260 nonce, nonce_length,
261 NULL, 0,
262 ciphertext, ciphertext_length,
263 plaintext, sizeof( plaintext ),
264 &plaintext_length ) == verify_status );
265 }
266
267 return( 1 );
268
269exit:
270 return( 0 );
271}
272
273static int exercise_signature_key( psa_key_slot_t key,
274 psa_key_usage_t usage,
275 psa_algorithm_t alg )
276{
Gilles Peskineca45c352018-06-26 16:13:09 +0200277 unsigned char payload[16] = {1};
Gilles Peskine818ca122018-06-20 18:16:48 +0200278 size_t payload_length = sizeof( payload );
Gilles Peskine69c12672018-06-28 00:07:19 +0200279 unsigned char signature[PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE] = {0};
Gilles Peskine818ca122018-06-20 18:16:48 +0200280 size_t signature_length = sizeof( signature );
281
282 if( usage & PSA_KEY_USAGE_SIGN )
283 {
284 TEST_ASSERT( psa_asymmetric_sign( key, alg,
285 payload, payload_length,
286 NULL, 0,
287 signature, sizeof( signature ),
288 &signature_length ) == PSA_SUCCESS );
289 }
290
291 if( usage & PSA_KEY_USAGE_VERIFY )
292 {
293 psa_status_t verify_status =
294 ( usage & PSA_KEY_USAGE_SIGN ?
295 PSA_SUCCESS :
296 PSA_ERROR_INVALID_SIGNATURE );
297 TEST_ASSERT( psa_asymmetric_verify( key, alg,
298 payload, payload_length,
299 NULL, 0,
300 signature, signature_length ) ==
301 verify_status );
302 }
303
304 return( 1 );
305
306exit:
307 return( 0 );
308}
309
310static int exercise_asymmetric_encryption_key( psa_key_slot_t key,
311 psa_key_usage_t usage,
312 psa_algorithm_t alg )
313{
314 unsigned char plaintext[256] = "Hello, world...";
315 unsigned char ciphertext[256] = "(wabblewebblewibblewobblewubble)";
316 size_t ciphertext_length = sizeof( ciphertext );
317 size_t plaintext_length = 16;
318
319 if( usage & PSA_KEY_USAGE_ENCRYPT )
320 {
321 TEST_ASSERT(
322 psa_asymmetric_encrypt( key, alg,
323 plaintext, plaintext_length,
324 NULL, 0,
325 ciphertext, sizeof( ciphertext ),
326 &ciphertext_length ) == PSA_SUCCESS );
327 }
328
329 if( usage & PSA_KEY_USAGE_DECRYPT )
330 {
331 psa_status_t status =
332 psa_asymmetric_decrypt( key, alg,
333 ciphertext, ciphertext_length,
334 NULL, 0,
335 plaintext, sizeof( plaintext ),
336 &plaintext_length );
337 TEST_ASSERT( status == PSA_SUCCESS ||
338 ( ( usage & PSA_KEY_USAGE_ENCRYPT ) == 0 &&
339 ( status == PSA_ERROR_INVALID_ARGUMENT ||
340 status == PSA_ERROR_INVALID_PADDING ) ) );
341 }
342
343 return( 1 );
344
345exit:
346 return( 0 );
347}
Gilles Peskinee59236f2018-01-27 23:32:46 +0100348/* END_HEADER */
349
350/* BEGIN_DEPENDENCIES
351 * depends_on:MBEDTLS_PSA_CRYPTO_C
352 * END_DEPENDENCIES
353 */
354
355/* BEGIN_CASE */
Gilles Peskine2d277862018-06-18 15:41:12 +0200356void init_deinit( )
Gilles Peskinee59236f2018-01-27 23:32:46 +0100357{
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100358 psa_status_t status;
Gilles Peskinee59236f2018-01-27 23:32:46 +0100359 int i;
360 for( i = 0; i <= 1; i++ )
361 {
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100362 status = psa_crypto_init( );
363 TEST_ASSERT( status == PSA_SUCCESS );
364 status = psa_crypto_init( );
365 TEST_ASSERT( status == PSA_SUCCESS );
Gilles Peskinee59236f2018-01-27 23:32:46 +0100366 mbedtls_psa_crypto_free( );
367 }
368}
369/* END_CASE */
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100370
371/* BEGIN_CASE */
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200372void import( data_t *data, int type, int expected_status_arg )
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100373{
374 int slot = 1;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200375 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100376 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100377
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100378 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300379 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100380 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
381
Gilles Peskine4abf7412018-06-18 16:35:34 +0200382 status = psa_import_key( slot, type, data->x, data->len );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200383 TEST_ASSERT( status == expected_status );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100384 if( status == PSA_SUCCESS )
385 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
386
387exit:
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100388 mbedtls_psa_crypto_free( );
389}
390/* END_CASE */
391
392/* BEGIN_CASE */
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200393void import_rsa_made_up( int bits_arg, int keypair, int expected_status_arg )
394{
395 int slot = 1;
396 size_t bits = bits_arg;
397 psa_status_t expected_status = expected_status_arg;
398 psa_status_t status;
399 psa_key_type_t type =
400 keypair ? PSA_KEY_TYPE_RSA_KEYPAIR : PSA_KEY_TYPE_RSA_PUBLIC_KEY;
401 size_t buffer_size = /* Slight overapproximations */
402 keypair ? bits * 9 / 16 + 80 : bits / 8 + 20;
403 unsigned char *buffer = mbedtls_calloc( 1, buffer_size );
404 unsigned char *p;
405 int ret;
406 size_t length;
407
408 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
409 TEST_ASSERT( buffer != NULL );
410
411 TEST_ASSERT( ( ret = construct_fake_rsa_key( buffer, buffer_size, &p,
412 bits, keypair ) ) >= 0 );
413 length = ret;
414
415 /* Try importing the key */
416 status = psa_import_key( slot, type, p, length );
417 TEST_ASSERT( status == expected_status );
418 if( status == PSA_SUCCESS )
419 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
420
421exit:
422 mbedtls_free( buffer );
423 mbedtls_psa_crypto_free( );
424}
425/* END_CASE */
426
427/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300428void import_export( data_t *data,
Moran Pekera964a8f2018-06-04 18:42:36 +0300429 int type_arg,
430 int alg_arg,
431 int usage_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100432 int expected_bits,
433 int export_size_delta,
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200434 int expected_export_status_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100435 int canonical_input )
436{
437 int slot = 1;
438 int slot2 = slot + 1;
439 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200440 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200441 psa_status_t expected_export_status = expected_export_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100442 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100443 unsigned char *exported = NULL;
444 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100445 size_t export_size;
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100446 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100447 size_t reexported_length;
448 psa_key_type_t got_type;
449 size_t got_bits;
Gilles Peskinedec72612018-06-18 18:12:37 +0200450 psa_key_policy_t policy;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100451
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100452 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300453 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
454 export_size = (ssize_t) data->len + export_size_delta;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100455 exported = mbedtls_calloc( 1, export_size );
456 TEST_ASSERT( exported != NULL );
457 if( ! canonical_input )
458 {
459 reexported = mbedtls_calloc( 1, export_size );
460 TEST_ASSERT( reexported != NULL );
461 }
462 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
463
mohammad1603a97cb8c2018-03-28 03:46:26 -0700464 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200465 psa_key_policy_set_usage( &policy, usage_arg, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -0700466 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
467
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100468 /* Import the key */
469 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200470 data->x, data->len ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100471
472 /* Test the key information */
473 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200474 &got_type,
475 &got_bits ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100476 TEST_ASSERT( got_type == type );
477 TEST_ASSERT( got_bits == (size_t) expected_bits );
478
479 /* Export the key */
480 status = psa_export_key( slot,
481 exported, export_size,
482 &exported_length );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200483 TEST_ASSERT( status == expected_export_status );
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100484
485 /* The exported length must be set by psa_export_key() to a value between 0
486 * and export_size. On errors, the exported length must be 0. */
487 TEST_ASSERT( exported_length != INVALID_EXPORT_LENGTH );
488 TEST_ASSERT( status == PSA_SUCCESS || exported_length == 0 );
489 TEST_ASSERT( exported_length <= export_size );
490
Gilles Peskine3f669c32018-06-21 09:21:51 +0200491 TEST_ASSERT( mem_is_zero( exported + exported_length,
492 export_size - exported_length ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100493 if( status != PSA_SUCCESS )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200494 {
495 TEST_ASSERT( exported_length == 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100496 goto destroy;
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200497 }
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100498
499 if( canonical_input )
500 {
Gilles Peskine4abf7412018-06-18 16:35:34 +0200501 TEST_ASSERT( exported_length == data->len );
502 TEST_ASSERT( memcmp( exported, data->x, data->len ) == 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100503 }
504 else
505 {
mohammad1603a97cb8c2018-03-28 03:46:26 -0700506 TEST_ASSERT( psa_set_key_policy( slot2, &policy ) == PSA_SUCCESS );
507
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100508 TEST_ASSERT( psa_import_key( slot2, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200509 exported,
510 export_size ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100511 TEST_ASSERT( psa_export_key( slot2,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200512 reexported,
513 export_size,
514 &reexported_length ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100515 TEST_ASSERT( reexported_length == exported_length );
516 TEST_ASSERT( memcmp( reexported, exported,
517 exported_length ) == 0 );
518 }
519
520destroy:
521 /* Destroy the key */
522 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
523 TEST_ASSERT( psa_get_key_information(
524 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
525
526exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300527 mbedtls_free( exported );
528 mbedtls_free( reexported );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100529 mbedtls_psa_crypto_free( );
530}
531/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100532
Moran Pekerf709f4a2018-06-06 17:26:04 +0300533/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300534void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200535 int type_arg,
536 int alg_arg,
537 int expected_bits,
538 int public_key_expected_length,
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200539 int expected_export_status_arg )
Moran Pekerf709f4a2018-06-06 17:26:04 +0300540{
541 int slot = 1;
542 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200543 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200544 psa_status_t expected_export_status = expected_export_status_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300545 psa_status_t status;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300546 unsigned char *exported = NULL;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300547 size_t export_size;
Jaeden Amero2a671e92018-06-27 17:47:40 +0100548 size_t exported_length = INVALID_EXPORT_LENGTH;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300549 psa_key_type_t got_type;
550 size_t got_bits;
Gilles Peskinedec72612018-06-18 18:12:37 +0200551 psa_key_policy_t policy;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300552
Moran Pekerf709f4a2018-06-06 17:26:04 +0300553 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300554 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
555 export_size = (ssize_t) data->len;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300556 exported = mbedtls_calloc( 1, export_size );
557 TEST_ASSERT( exported != NULL );
558
559 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
560
561 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200562 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, alg );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300563 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
564
565 /* Import the key */
566 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200567 data->x, data->len ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300568
569 /* Test the key information */
570 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200571 &got_type,
572 &got_bits ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300573 TEST_ASSERT( got_type == type );
574 TEST_ASSERT( got_bits == (size_t) expected_bits );
575
576 /* Export the key */
577 status = psa_export_public_key( slot,
Gilles Peskine2d277862018-06-18 15:41:12 +0200578 exported, export_size,
579 &exported_length );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200580 TEST_ASSERT( status == expected_export_status );
Jaeden Amero2a671e92018-06-27 17:47:40 +0100581 TEST_ASSERT( exported_length == (size_t) public_key_expected_length );
582 TEST_ASSERT( mem_is_zero( exported + exported_length,
583 export_size - exported_length ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300584 if( status != PSA_SUCCESS )
585 goto destroy;
586
Moran Pekerf709f4a2018-06-06 17:26:04 +0300587destroy:
588 /* Destroy the key */
589 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
590 TEST_ASSERT( psa_get_key_information(
591 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
592
593exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300594 mbedtls_free( exported );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300595 mbedtls_psa_crypto_free( );
596}
597/* END_CASE */
598
Gilles Peskine20035e32018-02-03 22:44:14 +0100599/* BEGIN_CASE */
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200600void import_and_exercise_key( data_t *data,
601 int type_arg,
602 int bits_arg,
603 int alg_arg )
604{
605 int slot = 1;
606 psa_key_type_t type = type_arg;
607 size_t bits = bits_arg;
608 psa_algorithm_t alg = alg_arg;
609 psa_key_usage_t usage =
610 ( PSA_ALG_IS_MAC( alg ) || PSA_ALG_IS_SIGN( alg ) ?
611 ( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ?
612 PSA_KEY_USAGE_VERIFY :
613 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY ) :
614 PSA_ALG_IS_CIPHER( alg ) || PSA_ALG_IS_AEAD( alg ) ||
615 PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) ?
616 ( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ?
617 PSA_KEY_USAGE_ENCRYPT :
618 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT ) :
619 0 );
620 psa_key_policy_t policy;
621 psa_key_type_t got_type;
622 size_t got_bits;
623 psa_status_t status;
624
625 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
626
627 psa_key_policy_init( &policy );
628 psa_key_policy_set_usage( &policy, usage, alg );
629 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
630
631 /* Import the key */
632 status = psa_import_key( slot, type, data->x, data->len );
633 TEST_ASSERT( status == PSA_SUCCESS );
634
635 /* Test the key information */
636 TEST_ASSERT( psa_get_key_information( slot,
637 &got_type,
638 &got_bits ) == PSA_SUCCESS );
639 TEST_ASSERT( got_type == type );
640 TEST_ASSERT( got_bits == bits );
641
642 /* Do something with the key according to its type and permitted usage. */
643 if( PSA_ALG_IS_MAC( alg ) )
644 exercise_mac_key( slot, usage, alg );
645 else if( PSA_ALG_IS_CIPHER( alg ) )
646 exercise_cipher_key( slot, usage, alg );
647 else if( PSA_ALG_IS_AEAD( alg ) )
648 exercise_aead_key( slot, usage, alg );
649 else if( PSA_ALG_IS_SIGN( alg ) )
650 exercise_signature_key( slot, usage, alg );
651 else if( PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) )
652 exercise_asymmetric_encryption_key( slot, usage, alg );
653
654exit:
655 psa_destroy_key( slot );
656 mbedtls_psa_crypto_free( );
657}
658/* END_CASE */
659
660/* BEGIN_CASE */
Gilles Peskined5b33222018-06-18 22:20:03 +0200661void key_policy( int usage_arg, int alg_arg )
662{
663 int key_slot = 1;
664 psa_algorithm_t alg = alg_arg;
665 psa_key_usage_t usage = usage_arg;
666 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
667 unsigned char key[32] = {0};
668 psa_key_policy_t policy_set;
669 psa_key_policy_t policy_get;
670
671 memset( key, 0x2a, sizeof( key ) );
672
673 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
674
675 psa_key_policy_init( &policy_set );
676 psa_key_policy_init( &policy_get );
677
678 psa_key_policy_set_usage( &policy_set, usage, alg );
679
680 TEST_ASSERT( psa_key_policy_get_usage( &policy_set ) == usage );
681 TEST_ASSERT( psa_key_policy_get_algorithm( &policy_set ) == alg );
682 TEST_ASSERT( psa_set_key_policy( key_slot, &policy_set ) == PSA_SUCCESS );
683
684 TEST_ASSERT( psa_import_key( key_slot, key_type,
685 key, sizeof( key ) ) == PSA_SUCCESS );
686
687 TEST_ASSERT( psa_get_key_policy( key_slot, &policy_get ) == PSA_SUCCESS );
688
689 TEST_ASSERT( policy_get.usage == policy_set.usage );
690 TEST_ASSERT( policy_get.alg == policy_set.alg );
691
692exit:
693 psa_destroy_key( key_slot );
694 mbedtls_psa_crypto_free( );
695}
696/* END_CASE */
697
698/* BEGIN_CASE */
699void key_policy_fail( int usage_arg, int alg_arg, int expected_status,
700 data_t *keypair )
701{
702 int key_slot = 1;
703 psa_algorithm_t alg = alg_arg;
704 psa_key_usage_t usage = usage_arg;
705 size_t signature_length = 0;
706 psa_key_policy_t policy;
707 int actual_status = PSA_SUCCESS;
708
709 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
710
711 psa_key_policy_init( &policy );
712 psa_key_policy_set_usage( &policy, usage, alg );
713 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
714
715 if( usage & PSA_KEY_USAGE_EXPORT )
716 {
717 TEST_ASSERT( keypair != NULL );
718 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
719 TEST_ASSERT( psa_import_key( key_slot,
720 PSA_KEY_TYPE_RSA_KEYPAIR,
721 keypair->x,
722 keypair->len ) == PSA_SUCCESS );
723 actual_status = psa_asymmetric_sign( key_slot, alg,
724 NULL, 0,
725 NULL, 0,
726 NULL, 0, &signature_length );
727 }
728
729 if( usage & PSA_KEY_USAGE_SIGN )
730 {
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100731 size_t data_length;
Gilles Peskined5b33222018-06-18 22:20:03 +0200732 TEST_ASSERT( keypair != NULL );
733 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
734 TEST_ASSERT( psa_import_key( key_slot,
735 PSA_KEY_TYPE_RSA_KEYPAIR,
736 keypair->x,
737 keypair->len ) == PSA_SUCCESS );
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100738 actual_status = psa_export_key( key_slot, NULL, 0, &data_length );
Gilles Peskined5b33222018-06-18 22:20:03 +0200739 }
740
741 TEST_ASSERT( actual_status == expected_status );
742
743exit:
744 psa_destroy_key( key_slot );
745 mbedtls_psa_crypto_free( );
746}
747/* END_CASE */
748
749/* BEGIN_CASE */
750void key_lifetime( int lifetime_arg )
751{
752 int key_slot = 1;
753 psa_key_type_t key_type = PSA_ALG_CBC_BASE;
754 unsigned char key[32] = {0};
755 psa_key_lifetime_t lifetime_set = lifetime_arg;
756 psa_key_lifetime_t lifetime_get;
757
758 memset( key, 0x2a, sizeof( key ) );
759
760 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
761
762 TEST_ASSERT( psa_set_key_lifetime( key_slot,
763 lifetime_set ) == PSA_SUCCESS );
764
765 TEST_ASSERT( psa_import_key( key_slot, key_type,
766 key, sizeof( key ) ) == PSA_SUCCESS );
767
768 TEST_ASSERT( psa_get_key_lifetime( key_slot,
769 &lifetime_get ) == PSA_SUCCESS );
770
771 TEST_ASSERT( lifetime_get == lifetime_set );
772
773exit:
774 psa_destroy_key( key_slot );
775 mbedtls_psa_crypto_free( );
776}
777/* END_CASE */
778
779/* BEGIN_CASE */
780void key_lifetime_set_fail( int key_slot_arg,
781 int lifetime_arg,
782 int expected_status_arg )
783{
784 psa_key_slot_t key_slot = key_slot_arg;
785 psa_key_lifetime_t lifetime_set = lifetime_arg;
786 psa_status_t actual_status;
787 psa_status_t expected_status = expected_status_arg;
788
789 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
790
791 actual_status = psa_set_key_lifetime( key_slot, lifetime_set );
792
793 if( actual_status == PSA_SUCCESS )
794 actual_status = psa_set_key_lifetime( key_slot, lifetime_set );
795
796 TEST_ASSERT( expected_status == actual_status );
797
798exit:
799 psa_destroy_key( key_slot );
800 mbedtls_psa_crypto_free( );
801}
802/* END_CASE */
803
804/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200805void hash_setup( int alg_arg,
806 int expected_status_arg )
807{
808 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200809 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200810 psa_hash_operation_t operation;
811 psa_status_t status;
812
813 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
814
815 status = psa_hash_start( &operation, alg );
816 psa_hash_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200817 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200818
819exit:
820 mbedtls_psa_crypto_free( );
821}
822/* END_CASE */
823
824/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300825void hash_finish( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100826{
827 psa_algorithm_t alg = alg_arg;
Gilles Peskineb3e6e5d2018-06-18 22:16:43 +0200828 unsigned char actual_hash[PSA_HASH_MAX_SIZE];
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100829 size_t actual_hash_length;
830 psa_hash_operation_t operation;
831
Gilles Peskine69c12672018-06-28 00:07:19 +0200832 TEST_ASSERT( expected_hash->len == PSA_HASH_SIZE( alg ) );
833 TEST_ASSERT( expected_hash->len <= PSA_HASH_MAX_SIZE );
834
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100835 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300836 TEST_ASSERT( expected_hash != NULL );
837 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
838 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100839
840 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
841
842 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
843 TEST_ASSERT( psa_hash_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200844 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100845 TEST_ASSERT( psa_hash_finish( &operation,
846 actual_hash, sizeof( actual_hash ),
847 &actual_hash_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200848 TEST_ASSERT( actual_hash_length == expected_hash->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300849 TEST_ASSERT( memcmp( expected_hash->x, actual_hash,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200850 expected_hash->len ) == 0 );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100851
852exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100853 mbedtls_psa_crypto_free( );
854}
855/* END_CASE */
856
857/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300858void hash_verify( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100859{
860 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100861 psa_hash_operation_t operation;
862
Gilles Peskine69c12672018-06-28 00:07:19 +0200863 TEST_ASSERT( expected_hash->len == PSA_HASH_SIZE( alg ) );
864 TEST_ASSERT( expected_hash->len <= PSA_HASH_MAX_SIZE );
865
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100866 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300867 TEST_ASSERT( expected_hash != NULL );
868 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
869 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100870
871 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
872
873 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
874 TEST_ASSERT( psa_hash_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200875 input->x,
876 input->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100877 TEST_ASSERT( psa_hash_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300878 expected_hash->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200879 expected_hash->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100880
881exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100882 mbedtls_psa_crypto_free( );
883}
884/* END_CASE */
885
886/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200887void mac_setup( int key_type_arg,
888 data_t *key,
889 int alg_arg,
890 int expected_status_arg )
891{
892 int key_slot = 1;
893 psa_key_type_t key_type = key_type_arg;
894 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200895 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200896 psa_mac_operation_t operation;
897 psa_key_policy_t policy;
898 psa_status_t status;
899
900 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
901
902 psa_key_policy_init( &policy );
903 psa_key_policy_set_usage( &policy,
904 PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY,
905 alg );
906 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
907
908 TEST_ASSERT( psa_import_key( key_slot, key_type,
909 key->x, key->len ) == PSA_SUCCESS );
910
911 status = psa_mac_start( &operation, key_slot, alg );
912 psa_mac_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200913 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200914
915exit:
916 psa_destroy_key( key_slot );
917 mbedtls_psa_crypto_free( );
918}
919/* END_CASE */
920
921/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +0200922void mac_verify( int key_type_arg,
923 data_t *key,
924 int alg_arg,
925 data_t *input,
926 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +0100927{
928 int key_slot = 1;
929 psa_key_type_t key_type = key_type_arg;
930 psa_algorithm_t alg = alg_arg;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100931 psa_mac_operation_t operation;
mohammad16036df908f2018-04-02 08:34:15 -0700932 psa_key_policy_t policy;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100933
Gilles Peskine69c12672018-06-28 00:07:19 +0200934 TEST_ASSERT( expected_mac->len <= PSA_MAC_MAX_SIZE );
935
Gilles Peskine8c9def32018-02-08 10:02:12 +0100936 TEST_ASSERT( key != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100937 TEST_ASSERT( input != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100938 TEST_ASSERT( expected_mac != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300939 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300940 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
941 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100942
943 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
944
mohammad16036df908f2018-04-02 08:34:15 -0700945 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200946 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
mohammad16036df908f2018-04-02 08:34:15 -0700947 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
948
Gilles Peskine8c9def32018-02-08 10:02:12 +0100949 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200950 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskinec0ec9722018-06-18 17:03:37 +0200951
Gilles Peskine8c9def32018-02-08 10:02:12 +0100952 TEST_ASSERT( psa_mac_start( &operation, key_slot, alg ) == PSA_SUCCESS );
953 TEST_ASSERT( psa_destroy_key( key_slot ) == PSA_SUCCESS );
954 TEST_ASSERT( psa_mac_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200955 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100956 TEST_ASSERT( psa_mac_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300957 expected_mac->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200958 expected_mac->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100959
960exit:
Gilles Peskine8c9def32018-02-08 10:02:12 +0100961 psa_destroy_key( key_slot );
962 mbedtls_psa_crypto_free( );
963}
964/* END_CASE */
965
966/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200967void cipher_setup( int key_type_arg,
968 data_t *key,
969 int alg_arg,
970 int expected_status_arg )
971{
972 int key_slot = 1;
973 psa_key_type_t key_type = key_type_arg;
974 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200975 psa_status_t expected_status = expected_status_arg;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200976 psa_cipher_operation_t operation;
977 psa_key_policy_t policy;
978 psa_status_t status;
979
980 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
981
982 psa_key_policy_init( &policy );
983 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
984 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
985
986 TEST_ASSERT( psa_import_key( key_slot, key_type,
987 key->x, key->len ) == PSA_SUCCESS );
988
989 status = psa_encrypt_setup( &operation, key_slot, alg );
990 psa_cipher_abort( &operation );
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200991 TEST_ASSERT( status == expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +0200992
993exit:
994 psa_destroy_key( key_slot );
995 mbedtls_psa_crypto_free( );
996}
997/* END_CASE */
998
999/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02001000void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001001 data_t *key,
1002 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001003 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001004{
1005 int key_slot = 1;
1006 psa_status_t status;
1007 psa_key_type_t key_type = key_type_arg;
1008 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001009 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001010 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001011 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001012 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001013 size_t output_buffer_size = 0;
1014 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001015 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001016 psa_cipher_operation_t operation;
1017
Gilles Peskine50e586b2018-06-08 14:28:46 +02001018 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001019 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001020 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001021 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1022 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1023 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001024
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001025 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1026 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001027
1028 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1029
1030 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001031 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001032
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001033 TEST_ASSERT( psa_encrypt_setup( &operation,
1034 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001035
1036 TEST_ASSERT( psa_encrypt_set_iv( &operation,
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001037 iv, iv_size ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001038 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001039 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001040 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001041
Gilles Peskine4abf7412018-06-18 16:35:34 +02001042 TEST_ASSERT( psa_cipher_update( &operation,
1043 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001044 output, output_buffer_size,
1045 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001046 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001047 status = psa_cipher_finish( &operation,
1048 output + function_output_length,
1049 output_buffer_size,
1050 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001051 total_output_length += function_output_length;
1052
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001053 TEST_ASSERT( status == expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001054 if( expected_status == PSA_SUCCESS )
1055 {
1056 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001057 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001058 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001059 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001060 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001061
Gilles Peskine50e586b2018-06-08 14:28:46 +02001062exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001063 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001064 psa_destroy_key( key_slot );
1065 mbedtls_psa_crypto_free( );
1066}
1067/* END_CASE */
1068
1069/* BEGIN_CASE */
1070void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001071 data_t *key,
1072 data_t *input,
1073 int first_part_size,
1074 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001075{
1076 int key_slot = 1;
1077 psa_key_type_t key_type = key_type_arg;
1078 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001079 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001080 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001081 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001082 size_t output_buffer_size = 0;
1083 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001084 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001085 psa_cipher_operation_t operation;
1086
Gilles Peskine50e586b2018-06-08 14:28:46 +02001087 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001088 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001089 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001090 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1091 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1092 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001093
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001094 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1095 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001096
1097 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1098
1099 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001100 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001101
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001102 TEST_ASSERT( psa_encrypt_setup( &operation,
1103 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001104
1105 TEST_ASSERT( psa_encrypt_set_iv( &operation,
1106 iv, sizeof( iv ) ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001107 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001108 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001109 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001110
Gilles Peskine4abf7412018-06-18 16:35:34 +02001111 TEST_ASSERT( (unsigned int) first_part_size < input->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001112 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001113 output, output_buffer_size,
1114 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001115 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001116 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001117 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001118 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001119 output, output_buffer_size,
1120 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001121 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001122 TEST_ASSERT( psa_cipher_finish( &operation,
1123 output + function_output_length,
1124 output_buffer_size,
1125 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001126 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001127 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
1128
Gilles Peskine4abf7412018-06-18 16:35:34 +02001129 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001130 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001131 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001132
1133exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001134 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001135 psa_destroy_key( key_slot );
1136 mbedtls_psa_crypto_free( );
1137}
1138/* END_CASE */
1139
1140/* BEGIN_CASE */
1141void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001142 data_t *key,
1143 data_t *input,
1144 int first_part_size,
1145 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001146{
1147 int key_slot = 1;
1148
1149 psa_key_type_t key_type = key_type_arg;
1150 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001151 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001152 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001153 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001154 size_t output_buffer_size = 0;
1155 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001156 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001157 psa_cipher_operation_t operation;
1158
Gilles Peskine50e586b2018-06-08 14:28:46 +02001159 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001160 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001161 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001162 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1163 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1164 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001165
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001166 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1167 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001168
1169 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1170
1171 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001172 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001173
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001174 TEST_ASSERT( psa_decrypt_setup( &operation,
1175 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001176
1177 TEST_ASSERT( psa_encrypt_set_iv( &operation,
1178 iv, sizeof( iv ) ) == PSA_SUCCESS );
1179
Gilles Peskine4abf7412018-06-18 16:35:34 +02001180 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001181 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001182 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001183
Gilles Peskine4abf7412018-06-18 16:35:34 +02001184 TEST_ASSERT( (unsigned int) first_part_size < input->len );
1185 TEST_ASSERT( psa_cipher_update( &operation,
1186 input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001187 output, output_buffer_size,
1188 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001189 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001190 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001191 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001192 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001193 output, output_buffer_size,
1194 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001195 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001196 TEST_ASSERT( psa_cipher_finish( &operation,
1197 output + function_output_length,
1198 output_buffer_size,
1199 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001200 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001201 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
1202
Gilles Peskine4abf7412018-06-18 16:35:34 +02001203 TEST_ASSERT( total_output_length == expected_output->len );
Gilles Peskine2d277862018-06-18 15:41:12 +02001204 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001205 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001206
1207exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001208 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001209 psa_destroy_key( key_slot );
1210 mbedtls_psa_crypto_free( );
1211}
1212/* END_CASE */
1213
Gilles Peskine50e586b2018-06-08 14:28:46 +02001214/* BEGIN_CASE */
1215void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001216 data_t *key,
1217 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001218 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02001219{
1220 int key_slot = 1;
1221 psa_status_t status;
1222 psa_key_type_t key_type = key_type_arg;
1223 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001224 psa_status_t expected_status = expected_status_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001225 unsigned char iv[16] = {0};
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001226 size_t iv_size;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001227 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001228 size_t output_buffer_size = 0;
1229 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001230 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001231 psa_cipher_operation_t operation;
1232
Gilles Peskine50e586b2018-06-08 14:28:46 +02001233 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001234 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001235 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001236 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1237 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
1238 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001239
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001240 iv_size = PSA_BLOCK_CIPHER_BLOCK_SIZE( key_type );
1241 memset( iv, 0x2a, iv_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001242
1243 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1244
1245 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001246 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001247
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001248 TEST_ASSERT( psa_decrypt_setup( &operation,
1249 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001250
1251 TEST_ASSERT( psa_encrypt_set_iv( &operation,
Gilles Peskine9ad29e22018-06-21 09:40:04 +02001252 iv, iv_size ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001253
Gilles Peskine4abf7412018-06-18 16:35:34 +02001254 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001255 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001256 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001257
Gilles Peskine4abf7412018-06-18 16:35:34 +02001258 TEST_ASSERT( psa_cipher_update( &operation,
1259 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001260 output, output_buffer_size,
1261 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001262 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +02001263 status = psa_cipher_finish( &operation,
1264 output + function_output_length,
1265 output_buffer_size,
1266 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02001267 total_output_length += function_output_length;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001268 TEST_ASSERT( status == expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001269
1270 if( expected_status == PSA_SUCCESS )
1271 {
1272 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001273 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001274 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001275 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001276 }
1277
Gilles Peskine50e586b2018-06-08 14:28:46 +02001278exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001279 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +02001280 psa_destroy_key( key_slot );
1281 mbedtls_psa_crypto_free( );
1282}
1283/* END_CASE */
1284
Gilles Peskine50e586b2018-06-08 14:28:46 +02001285/* BEGIN_CASE */
1286void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001287 data_t *key,
1288 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02001289{
1290 int key_slot = 1;
1291 psa_key_type_t key_type = key_type_arg;
1292 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -07001293 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +02001294 size_t iv_size = 16;
1295 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001296 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001297 size_t output1_size = 0;
1298 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001299 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001300 size_t output2_size = 0;
1301 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001302 size_t function_output_length = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001303 psa_cipher_operation_t operation1;
1304 psa_cipher_operation_t operation2;
1305
mohammad1603d7d7ba52018-03-12 18:51:53 +02001306 TEST_ASSERT( key != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001307 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001308 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1309 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001310
mohammad1603d7d7ba52018-03-12 18:51:53 +02001311 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1312
1313 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001314 key->x, key->len ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001315
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001316 TEST_ASSERT( psa_encrypt_setup( &operation1,
1317 key_slot, alg ) == PSA_SUCCESS );
1318 TEST_ASSERT( psa_decrypt_setup( &operation2,
1319 key_slot, alg ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001320
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001321 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
1322 iv, iv_size,
1323 &iv_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001324 output1_size = input->len + operation1.block_size;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001325 output1 = mbedtls_calloc( 1, output1_size );
1326 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001327
Gilles Peskine4abf7412018-06-18 16:35:34 +02001328 TEST_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001329 output1, output1_size,
1330 &output1_length ) == PSA_SUCCESS );
1331 TEST_ASSERT( psa_cipher_finish( &operation1,
1332 output1 + output1_length, output1_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001333 &function_output_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001334
Gilles Peskine048b7f02018-06-08 14:20:49 +02001335 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001336
1337 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
1338
1339 output2_size = output1_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001340 output2 = mbedtls_calloc( 1, output2_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001341 TEST_ASSERT( output2 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001342
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001343 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
1344 iv, iv_length ) == PSA_SUCCESS );
1345 TEST_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
1346 output2, output2_size,
1347 &output2_length ) == PSA_SUCCESS );
Gilles Peskine048b7f02018-06-08 14:20:49 +02001348 function_output_length = 0;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001349 TEST_ASSERT( psa_cipher_finish( &operation2,
1350 output2 + output2_length,
1351 output2_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001352 &function_output_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001353
Gilles Peskine048b7f02018-06-08 14:20:49 +02001354 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001355
Moran Pekerded84402018-06-06 16:36:50 +03001356 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
1357
Gilles Peskine4abf7412018-06-18 16:35:34 +02001358 TEST_ASSERT( input->len == output2_length );
1359 TEST_ASSERT( memcmp( input->x, output2, input->len ) == 0 );
Moran Pekerded84402018-06-06 16:36:50 +03001360
1361exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001362 mbedtls_free( output1 );
1363 mbedtls_free( output2 );
Moran Pekerded84402018-06-06 16:36:50 +03001364 psa_destroy_key( key_slot );
1365 mbedtls_psa_crypto_free( );
1366}
1367/* END_CASE */
1368
1369/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02001370void cipher_verify_output_multipart( int alg_arg,
1371 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001372 data_t *key,
1373 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +02001374 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +03001375{
1376 int key_slot = 1;
1377 psa_key_type_t key_type = key_type_arg;
1378 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +03001379 unsigned char iv[16] = {0};
1380 size_t iv_size = 16;
1381 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001382 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001383 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03001384 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001385 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001386 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03001387 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001388 size_t function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001389 psa_cipher_operation_t operation1;
1390 psa_cipher_operation_t operation2;
1391
Moran Pekerded84402018-06-06 16:36:50 +03001392 TEST_ASSERT( key != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001393 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001394 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
1395 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001396
Moran Pekerded84402018-06-06 16:36:50 +03001397 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1398
1399 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001400 key->x, key->len ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001401
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001402 TEST_ASSERT( psa_encrypt_setup( &operation1,
1403 key_slot, alg ) == PSA_SUCCESS );
1404 TEST_ASSERT( psa_decrypt_setup( &operation2,
1405 key_slot, alg ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001406
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001407 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
1408 iv, iv_size,
1409 &iv_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001410 output1_buffer_size = input->len + operation1.block_size;
Gilles Peskine048b7f02018-06-08 14:20:49 +02001411 output1 = mbedtls_calloc( 1, output1_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001412 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +03001413
Gilles Peskine4abf7412018-06-18 16:35:34 +02001414 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001415
itayzafrir3e02b3b2018-06-12 17:06:52 +03001416 TEST_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001417 output1, output1_buffer_size,
1418 &function_output_length ) == PSA_SUCCESS );
1419 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001420
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001421 TEST_ASSERT( psa_cipher_update( &operation1,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001422 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001423 input->len - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001424 output1, output1_buffer_size,
1425 &function_output_length ) == PSA_SUCCESS );
1426 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001427
Gilles Peskine048b7f02018-06-08 14:20:49 +02001428 TEST_ASSERT( psa_cipher_finish( &operation1,
1429 output1 + output1_length,
1430 output1_buffer_size - output1_length,
1431 &function_output_length ) == PSA_SUCCESS );
1432 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02001433
1434 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
1435
Gilles Peskine048b7f02018-06-08 14:20:49 +02001436 output2_buffer_size = output1_length;
1437 output2 = mbedtls_calloc( 1, output2_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001438 TEST_ASSERT( output2 != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001439
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001440 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
1441 iv, iv_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +03001442
1443 TEST_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001444 output2, output2_buffer_size,
1445 &function_output_length ) == PSA_SUCCESS );
1446 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001447
Gilles Peskine048b7f02018-06-08 14:20:49 +02001448 TEST_ASSERT( psa_cipher_update( &operation2,
1449 output1 + first_part_size,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001450 output1_length - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001451 output2, output2_buffer_size,
1452 &function_output_length ) == PSA_SUCCESS );
1453 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03001454
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001455 TEST_ASSERT( psa_cipher_finish( &operation2,
1456 output2 + output2_length,
Gilles Peskine048b7f02018-06-08 14:20:49 +02001457 output2_buffer_size - output2_length,
1458 &function_output_length ) == PSA_SUCCESS );
1459 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02001460
mohammad1603d7d7ba52018-03-12 18:51:53 +02001461 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
1462
Gilles Peskine4abf7412018-06-18 16:35:34 +02001463 TEST_ASSERT( input->len == output2_length );
1464 TEST_ASSERT( memcmp( input->x, output2, input->len ) == 0 );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001465
1466exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03001467 mbedtls_free( output1 );
1468 mbedtls_free( output2 );
mohammad1603d7d7ba52018-03-12 18:51:53 +02001469 psa_destroy_key( key_slot );
1470 mbedtls_psa_crypto_free( );
1471}
1472/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02001473
Gilles Peskine20035e32018-02-03 22:44:14 +01001474/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001475void aead_encrypt_decrypt( int key_type_arg,
1476 data_t * key_data,
1477 int alg_arg,
1478 data_t * input_data,
1479 data_t * nonce,
1480 data_t * additional_data,
1481 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001482{
1483 int slot = 1;
1484 psa_key_type_t key_type = key_type_arg;
1485 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001486 unsigned char *output_data = NULL;
1487 size_t output_size = 0;
1488 size_t output_length = 0;
1489 unsigned char *output_data2 = NULL;
1490 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001491 size_t tag_length = 16;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001492 psa_status_t expected_result = expected_result_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001493 psa_key_policy_t policy;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001494
Gilles Peskinea1cac842018-06-11 19:33:02 +02001495 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001496 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001497 TEST_ASSERT( nonce != NULL );
1498 TEST_ASSERT( additional_data != NULL );
1499 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1500 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1501 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
1502 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
1503
Gilles Peskine4abf7412018-06-18 16:35:34 +02001504 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001505 output_data = mbedtls_calloc( 1, output_size );
1506 TEST_ASSERT( output_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001507
1508 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1509
1510 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001511 psa_key_policy_set_usage( &policy,
1512 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
1513 alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001514 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1515
1516 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001517 key_data->x, key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001518
1519 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001520 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001521 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001522 additional_data->len,
1523 input_data->x, input_data->len,
1524 output_data, output_size,
1525 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001526
1527 if( PSA_SUCCESS == expected_result )
1528 {
1529 output_data2 = mbedtls_calloc( 1, output_length );
1530 TEST_ASSERT( output_data2 != NULL );
1531
1532 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001533 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001534 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001535 additional_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001536 output_data, output_length,
1537 output_data2, output_length,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001538 &output_length2 ) == expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02001539
itayzafrir3e02b3b2018-06-12 17:06:52 +03001540 TEST_ASSERT( memcmp( input_data->x, output_data2,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001541 input_data->len ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001542 }
Gilles Peskine2d277862018-06-18 15:41:12 +02001543
Gilles Peskinea1cac842018-06-11 19:33:02 +02001544exit:
1545 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001546 mbedtls_free( output_data );
1547 mbedtls_free( output_data2 );
1548 mbedtls_psa_crypto_free( );
1549}
1550/* END_CASE */
1551
1552/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001553void aead_encrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001554 int alg_arg, data_t * input_data,
1555 data_t * additional_data, data_t * nonce,
1556 data_t * expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001557{
1558 int slot = 1;
1559 psa_key_type_t key_type = key_type_arg;
1560 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001561 unsigned char *output_data = NULL;
1562 size_t output_size = 0;
1563 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001564 size_t tag_length = 16;
Gilles Peskinedec72612018-06-18 18:12:37 +02001565 psa_key_policy_t policy;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001566
Gilles Peskinea1cac842018-06-11 19:33:02 +02001567 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001568 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001569 TEST_ASSERT( additional_data != NULL );
1570 TEST_ASSERT( nonce != NULL );
1571 TEST_ASSERT( expected_result != NULL );
1572 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1573 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1574 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
1575 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
1576 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_result->len ) );
1577
Gilles Peskine4abf7412018-06-18 16:35:34 +02001578 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001579 output_data = mbedtls_calloc( 1, output_size );
1580 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +02001581
Gilles Peskinea1cac842018-06-11 19:33:02 +02001582 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1583
1584 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001585 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001586 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1587
1588 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001589 key_data->x,
1590 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001591
1592 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001593 nonce->x, nonce->len,
1594 additional_data->x, additional_data->len,
1595 input_data->x, input_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001596 output_data, output_size,
1597 &output_length ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001598
itayzafrir3e02b3b2018-06-12 17:06:52 +03001599 TEST_ASSERT( memcmp( output_data, expected_result->x,
Gilles Peskine2d277862018-06-18 15:41:12 +02001600 output_length ) == 0 );
1601
Gilles Peskinea1cac842018-06-11 19:33:02 +02001602exit:
1603 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001604 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001605 mbedtls_psa_crypto_free( );
1606}
1607/* END_CASE */
1608
1609/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001610void aead_decrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001611 int alg_arg, data_t * input_data,
1612 data_t * additional_data, data_t * nonce,
1613 data_t * expected_data, int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001614{
1615 int slot = 1;
1616 psa_key_type_t key_type = key_type_arg;
1617 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001618 unsigned char *output_data = NULL;
1619 size_t output_size = 0;
1620 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001621 size_t tag_length = 16;
Gilles Peskinedec72612018-06-18 18:12:37 +02001622 psa_key_policy_t policy;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001623 psa_status_t expected_result = expected_result_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001624
Gilles Peskinea1cac842018-06-11 19:33:02 +02001625 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001626 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001627 TEST_ASSERT( additional_data != NULL );
1628 TEST_ASSERT( nonce != NULL );
1629 TEST_ASSERT( expected_data != NULL );
1630 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1631 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1632 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
1633 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
1634 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
1635
Gilles Peskine4abf7412018-06-18 16:35:34 +02001636 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +02001637 output_data = mbedtls_calloc( 1, output_size );
1638 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +02001639
Gilles Peskinea1cac842018-06-11 19:33:02 +02001640 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1641
1642 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001643 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001644 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1645
1646 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001647 key_data->x,
1648 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001649
1650 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001651 nonce->x, nonce->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001652 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001653 additional_data->len,
1654 input_data->x, input_data->len,
1655 output_data, output_size,
1656 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001657
Gilles Peskine2d277862018-06-18 15:41:12 +02001658 if( expected_result == PSA_SUCCESS )
Gilles Peskinea1cac842018-06-11 19:33:02 +02001659 {
itayzafrir3e02b3b2018-06-12 17:06:52 +03001660 TEST_ASSERT( memcmp( output_data, expected_data->x,
Gilles Peskine2d277862018-06-18 15:41:12 +02001661 output_length ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001662 }
1663
Gilles Peskinea1cac842018-06-11 19:33:02 +02001664exit:
1665 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001666 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +02001667 mbedtls_psa_crypto_free( );
1668}
1669/* END_CASE */
1670
1671/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001672void signature_size( int type_arg,
1673 int bits,
1674 int alg_arg,
1675 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01001676{
1677 psa_key_type_t type = type_arg;
1678 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +02001679 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinee59236f2018-01-27 23:32:46 +01001680 TEST_ASSERT( actual_size == (size_t) expected_size_arg );
1681exit:
1682 ;
1683}
1684/* END_CASE */
1685
1686/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001687void sign_deterministic( int key_type_arg, data_t *key_data,
1688 int alg_arg, data_t *input_data,
1689 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01001690{
1691 int slot = 1;
1692 psa_key_type_t key_type = key_type_arg;
1693 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001694 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01001695 unsigned char *signature = NULL;
1696 size_t signature_size;
1697 size_t signature_length = 0xdeadbeef;
Gilles Peskinedec72612018-06-18 18:12:37 +02001698 psa_key_policy_t policy;
Gilles Peskine20035e32018-02-03 22:44:14 +01001699
Gilles Peskine20035e32018-02-03 22:44:14 +01001700 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001701 TEST_ASSERT( input_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001702 TEST_ASSERT( output_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001703 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1704 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1705 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( output_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01001706
1707 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1708
mohammad1603a97cb8c2018-03-28 03:46:26 -07001709 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001710 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001711 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1712
Gilles Peskine20035e32018-02-03 22:44:14 +01001713 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001714 key_data->x,
1715 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001716 TEST_ASSERT( psa_get_key_information( slot,
1717 NULL,
1718 &key_bits ) == PSA_SUCCESS );
1719
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001720 /* Allocate a buffer which has the size advertized by the
1721 * library. */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001722 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
1723 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01001724 TEST_ASSERT( signature_size != 0 );
Gilles Peskine69c12672018-06-28 00:07:19 +02001725 TEST_ASSERT( signature_size <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
Gilles Peskine20035e32018-02-03 22:44:14 +01001726 signature = mbedtls_calloc( 1, signature_size );
1727 TEST_ASSERT( signature != NULL );
1728
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001729 /* Perform the signature. */
Gilles Peskine20035e32018-02-03 22:44:14 +01001730 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001731 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001732 NULL, 0,
1733 signature, signature_size,
1734 &signature_length ) == PSA_SUCCESS );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001735 /* Verify that the signature is correct. */
Gilles Peskine4abf7412018-06-18 16:35:34 +02001736 TEST_ASSERT( signature_length == output_data->len );
Gilles Peskine2d277862018-06-18 15:41:12 +02001737 TEST_ASSERT( memcmp( signature, output_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001738 output_data->len ) == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001739
1740exit:
1741 psa_destroy_key( slot );
Gilles Peskine0189e752018-02-03 23:57:22 +01001742 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01001743 mbedtls_psa_crypto_free( );
1744}
1745/* END_CASE */
1746
1747/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001748void sign_fail( int key_type_arg, data_t *key_data,
1749 int alg_arg, data_t *input_data,
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001750 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01001751{
1752 int slot = 1;
1753 psa_key_type_t key_type = key_type_arg;
1754 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001755 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001756 psa_status_t actual_status;
1757 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01001758 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01001759 size_t signature_length = 0xdeadbeef;
Gilles Peskinedec72612018-06-18 18:12:37 +02001760 psa_key_policy_t policy;
Gilles Peskine20035e32018-02-03 22:44:14 +01001761
Gilles Peskine20035e32018-02-03 22:44:14 +01001762 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001763 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001764 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1765 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1766
Gilles Peskine20035e32018-02-03 22:44:14 +01001767 signature = mbedtls_calloc( 1, signature_size );
1768 TEST_ASSERT( signature != NULL );
1769
1770 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1771
mohammad1603a97cb8c2018-03-28 03:46:26 -07001772 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001773 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001774 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1775
Gilles Peskine20035e32018-02-03 22:44:14 +01001776 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001777 key_data->x,
1778 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001779
1780 actual_status = psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001781 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001782 NULL, 0,
1783 signature, signature_size,
1784 &signature_length );
1785 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02001786 /* The value of *signature_length is unspecified on error, but
1787 * whatever it is, it should be less than signature_size, so that
1788 * if the caller tries to read *signature_length bytes without
1789 * checking the error code then they don't overflow a buffer. */
1790 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01001791
1792exit:
1793 psa_destroy_key( slot );
Gilles Peskine20035e32018-02-03 22:44:14 +01001794 mbedtls_free( signature );
1795 mbedtls_psa_crypto_free( );
1796}
1797/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03001798
1799/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001800void asymmetric_verify( int key_type_arg, data_t *key_data,
1801 int alg_arg, data_t *hash_data,
1802 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03001803{
1804 int slot = 1;
1805 psa_key_type_t key_type = key_type_arg;
1806 psa_algorithm_t alg = alg_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001807 psa_key_policy_t policy;
itayzafrir5c753392018-05-08 11:18:38 +03001808
Gilles Peskine69c12672018-06-28 00:07:19 +02001809 TEST_ASSERT( signature_data->len <= PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE );
1810
itayzafrir5c753392018-05-08 11:18:38 +03001811 TEST_ASSERT( key_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001812 TEST_ASSERT( hash_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001813 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001814 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1815 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1816 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03001817
1818 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1819
1820 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001821 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
itayzafrir5c753392018-05-08 11:18:38 +03001822 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1823
1824 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001825 key_data->x,
1826 key_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001827
1828 TEST_ASSERT( psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001829 hash_data->x, hash_data->len,
itayzafrir5c753392018-05-08 11:18:38 +03001830 NULL, 0,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001831 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001832 signature_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001833exit:
1834 psa_destroy_key( slot );
itayzafrir5c753392018-05-08 11:18:38 +03001835 mbedtls_psa_crypto_free( );
1836}
1837/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001838
1839/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001840void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
1841 int alg_arg, data_t *hash_data,
1842 data_t *signature_data,
1843 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001844{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001845 int slot = 1;
1846 psa_key_type_t key_type = key_type_arg;
1847 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001848 psa_status_t actual_status;
1849 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001850 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001851
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001852 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001853 TEST_ASSERT( hash_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001854 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001855 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1856 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1857 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001858
1859 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1860
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001861 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001862 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001863 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1864
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001865 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001866 key_data->x,
1867 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001868
1869 actual_status = psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001870 hash_data->x, hash_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001871 NULL, 0,
1872 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001873 signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001874
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001875 TEST_ASSERT( actual_status == expected_status );
1876
1877exit:
1878 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001879 mbedtls_psa_crypto_free( );
1880}
1881/* END_CASE */
1882
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001883/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001884void asymmetric_encrypt_decrypt( int key_type_arg, data_t *key_data,
1885 int alg_arg, data_t *input_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001886{
1887 int slot = 1;
1888 psa_key_type_t key_type = key_type_arg;
1889 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001890 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001891 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001892 size_t output_length = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001893 unsigned char *output2 = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001894 size_t output2_size = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001895 size_t output2_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02001896 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001897
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001898 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001899 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001900 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1901 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1902
Gilles Peskine4abf7412018-06-18 16:35:34 +02001903 output_size = key_data->len;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001904 output2_size = output_size;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001905 output = mbedtls_calloc( 1, output_size );
1906 TEST_ASSERT( output != NULL );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001907 output2 = mbedtls_calloc( 1, output2_size );
1908 TEST_ASSERT( output2 != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001909
1910 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1911
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001912 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001913 psa_key_policy_set_usage( &policy,
1914 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001915 alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001916 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1917
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001918 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001919 key_data->x,
1920 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001921
Gilles Peskineeebd7382018-06-08 18:11:54 +02001922 /* We test encryption by checking that encrypt-then-decrypt gives back
1923 * the original plaintext because of the non-optional random
1924 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine2d277862018-06-18 15:41:12 +02001925 TEST_ASSERT( psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001926 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001927 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001928 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001929 &output_length ) == PSA_SUCCESS );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001930
Gilles Peskine2d277862018-06-18 15:41:12 +02001931 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001932 output, output_length,
Gilles Peskine2d277862018-06-18 15:41:12 +02001933 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001934 output2, output2_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001935 &output2_length ) == PSA_SUCCESS );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001936 TEST_ASSERT( memcmp( input_data->x, output2,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001937 input_data->len ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001938
1939exit:
1940 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001941 mbedtls_free( output );
1942 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001943 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001944}
1945/* END_CASE */
1946
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001947/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001948void asymmetric_encrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001949 int alg_arg, data_t *input_data,
1950 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001951{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001952 int slot = 1;
1953 psa_key_type_t key_type = key_type_arg;
1954 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001955 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001956 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001957 size_t output_length = 0;
1958 psa_status_t actual_status;
1959 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001960 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001961
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001962 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001963 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001964 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1965 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1966
Gilles Peskine4abf7412018-06-18 16:35:34 +02001967 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001968 output = mbedtls_calloc( 1, output_size );
1969 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001970
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001971 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1972
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001973 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001974 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001975 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1976
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001977 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001978 key_data->x,
1979 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001980
Gilles Peskine2d277862018-06-18 15:41:12 +02001981 actual_status = psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001982 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001983 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001984 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001985 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001986 TEST_ASSERT( actual_status == expected_status );
1987
1988exit:
1989 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001990 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001991 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001992}
1993/* END_CASE */
1994
1995/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001996void asymmetric_decrypt( int key_type_arg, data_t *key_data,
1997 int alg_arg, data_t *input_data,
1998 data_t *expected_data, int expected_size )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001999{
2000 int slot = 1;
2001 psa_key_type_t key_type = key_type_arg;
2002 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002003 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002004 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002005 size_t output_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02002006 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002007
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002008 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002009 TEST_ASSERT( input_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002010 TEST_ASSERT( expected_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002011 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2012 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2013 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
2014
Gilles Peskine4abf7412018-06-18 16:35:34 +02002015 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002016 output = mbedtls_calloc( 1, output_size );
2017 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002018
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002019 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2020
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002021 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002022 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002023 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2024
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002025 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002026 key_data->x,
2027 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002028
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03002029 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002030 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002031 NULL, 0,
2032 output,
2033 output_size,
2034 &output_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002035 TEST_ASSERT( (size_t) expected_size == output_length );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002036 TEST_ASSERT( memcmp( expected_data->x, output, output_length ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002037
2038exit:
2039 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002040 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002041 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002042}
2043/* END_CASE */
2044
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002045/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002046void asymmetric_decrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02002047 int alg_arg, data_t *input_data,
2048 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002049{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002050 int slot = 1;
2051 psa_key_type_t key_type = key_type_arg;
2052 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002053 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03002054 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002055 size_t output_length = 0;
2056 psa_status_t actual_status;
2057 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02002058 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002059
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002060 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002061 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002062 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
2063 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
2064
Gilles Peskine4abf7412018-06-18 16:35:34 +02002065 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002066 output = mbedtls_calloc( 1, output_size );
2067 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002068
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002069 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2070
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002071 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02002072 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03002073 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2074
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002075 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002076 key_data->x,
2077 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002078
Gilles Peskine2d277862018-06-18 15:41:12 +02002079 actual_status = psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002080 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02002081 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02002082 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02002083 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002084 TEST_ASSERT( actual_status == expected_status );
2085
2086exit:
2087 psa_destroy_key( slot );
Gilles Peskine2d277862018-06-18 15:41:12 +02002088 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03002089 mbedtls_psa_crypto_free( );
2090}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02002091/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02002092
2093/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02002094void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02002095{
Gilles Peskinea50d7392018-06-21 10:22:13 +02002096 size_t bytes = bytes_arg;
2097 const unsigned char trail[] = "don't overwrite me";
2098 unsigned char *output = mbedtls_calloc( 1, bytes + sizeof( trail ) );
2099 unsigned char *changed = mbedtls_calloc( 1, bytes );
2100 size_t i;
2101 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02002102
Gilles Peskinea50d7392018-06-21 10:22:13 +02002103 TEST_ASSERT( output != NULL );
2104 TEST_ASSERT( changed != NULL );
2105 memcpy( output + bytes, trail, sizeof( trail ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02002106
2107 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2108
Gilles Peskinea50d7392018-06-21 10:22:13 +02002109 /* Run several times, to ensure that every output byte will be
2110 * nonzero at least once with overwhelming probability
2111 * (2^(-8*number_of_runs)). */
2112 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02002113 {
Gilles Peskinea50d7392018-06-21 10:22:13 +02002114 memset( output, 0, bytes );
2115 TEST_ASSERT( psa_generate_random( output, bytes ) == PSA_SUCCESS );
2116
2117 /* Check that no more than bytes have been overwritten */
2118 TEST_ASSERT( memcmp( output + bytes, trail, sizeof( trail ) ) == 0 );
2119
2120 for( i = 0; i < bytes; i++ )
2121 {
2122 if( output[i] != 0 )
2123 ++changed[i];
2124 }
Gilles Peskine05d69892018-06-19 22:00:52 +02002125 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02002126
2127 /* Check that every byte was changed to nonzero at least once. This
2128 * validates that psa_generate_random is overwriting every byte of
2129 * the output buffer. */
2130 for( i = 0; i < bytes; i++ )
2131 {
2132 TEST_ASSERT( changed[i] != 0 );
2133 }
Gilles Peskine05d69892018-06-19 22:00:52 +02002134
2135exit:
2136 mbedtls_psa_crypto_free( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02002137 mbedtls_free( output );
2138 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02002139}
2140/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02002141
2142/* BEGIN_CASE */
2143void generate_key( int type_arg,
2144 int bits_arg,
2145 int usage_arg,
2146 int alg_arg,
2147 int expected_status_arg )
2148{
2149 int slot = 1;
2150 psa_key_type_t type = type_arg;
2151 psa_key_usage_t usage = usage_arg;
2152 size_t bits = bits_arg;
2153 psa_algorithm_t alg = alg_arg;
2154 psa_status_t expected_status = expected_status_arg;
2155 psa_key_type_t got_type;
2156 size_t got_bits;
2157 unsigned char exported[616] = {0}; /* enough for a 1024-bit RSA key */
2158 size_t exported_length;
2159 psa_status_t expected_export_status =
2160 usage & PSA_KEY_USAGE_EXPORT ? PSA_SUCCESS : PSA_ERROR_NOT_PERMITTED;
2161 psa_status_t expected_info_status =
2162 expected_status == PSA_SUCCESS ? PSA_SUCCESS : PSA_ERROR_EMPTY_SLOT;
2163 psa_key_policy_t policy;
2164
2165 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
2166
2167 psa_key_policy_init( &policy );
2168 psa_key_policy_set_usage( &policy, usage, alg );
2169 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
2170
2171 /* Generate a key */
2172 TEST_ASSERT( psa_generate_key( slot, type, bits,
2173 NULL, 0 ) == expected_status );
2174
2175 /* Test the key information */
2176 TEST_ASSERT( psa_get_key_information( slot,
2177 &got_type,
2178 &got_bits ) == expected_info_status );
2179 if( expected_info_status != PSA_SUCCESS )
2180 goto exit;
2181 TEST_ASSERT( got_type == type );
2182 TEST_ASSERT( got_bits == bits );
2183
2184 /* Export the key */
2185 TEST_ASSERT( psa_export_key( slot,
2186 exported, sizeof( exported ),
2187 &exported_length ) == expected_export_status );
2188 if( expected_export_status == PSA_SUCCESS )
2189 {
Gilles Peskine48c0ea12018-06-21 14:15:31 +02002190 if( key_type_is_raw_bytes( type ) )
Gilles Peskine12313cd2018-06-20 00:20:32 +02002191 TEST_ASSERT( exported_length == ( bits + 7 ) / 8 );
2192#if defined(MBEDTLS_DES_C)
2193 if( type == PSA_KEY_TYPE_DES )
2194 {
2195 /* Check the parity bits. */
2196 unsigned i;
2197 for( i = 0; i < bits / 8; i++ )
2198 {
2199 unsigned bit_count = 0;
2200 unsigned m;
2201 for( m = 1; m <= 0x100; m <<= 1 )
2202 {
2203 if( exported[i] & m )
2204 ++bit_count;
2205 }
2206 TEST_ASSERT( bit_count % 2 != 0 );
2207 }
2208 }
2209#endif
2210#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_PARSE_C)
2211 if( type == PSA_KEY_TYPE_RSA_KEYPAIR )
2212 {
2213 /* Sanity check: does this look like the beginning of a PKCS#8
2214 * RSA key pair? Assumes bits is a multiple of 8. */
2215 size_t n_bytes = bits / 8 + 1;
2216 size_t n_encoded_bytes;
2217 unsigned char *n_end;
2218 TEST_ASSERT( exported_length >= 7 + ( n_bytes + 3 ) * 9 / 2 );
2219 TEST_ASSERT( exported[0] == 0x30 );
2220 TEST_ASSERT( exported[1] == 0x82 ); // assumes >=416-bit key
2221 TEST_ASSERT( exported[4] == 0x02 );
2222 TEST_ASSERT( exported[5] == 0x01 );
2223 TEST_ASSERT( exported[6] == 0x00 );
2224 TEST_ASSERT( exported[7] == 0x02 );
2225 n_encoded_bytes = exported[8];
2226 n_end = exported + 9 + n_encoded_bytes;
2227 if( n_encoded_bytes & 0x80 )
2228 {
2229 n_encoded_bytes = ( n_encoded_bytes & 0x7f ) << 7;
2230 n_encoded_bytes |= exported[9] & 0x7f;
2231 n_end += 1;
2232 }
2233 /* The encoding of n should start with a 0 byte since it should
2234 * have its high bit set. However Mbed TLS is not compliant and
2235 * generates an invalid, but widely tolerated, encoding of
2236 * positive INTEGERs with a bit size that is a multiple of 8
2237 * with no leading 0 byte. Accept this here. */
2238 TEST_ASSERT( n_bytes == n_encoded_bytes ||
2239 n_bytes == n_encoded_bytes + 1 );
2240 if( n_bytes == n_encoded_bytes )
2241 TEST_ASSERT( exported[n_encoded_bytes <= 127 ? 9 : 10] == 0x00 );
2242 /* Sanity check: e must be 3 */
2243 TEST_ASSERT( n_end[0] == 0x02 );
2244 TEST_ASSERT( n_end[1] == 0x03 );
2245 TEST_ASSERT( n_end[2] == 0x01 );
2246 TEST_ASSERT( n_end[3] == 0x00 );
2247 TEST_ASSERT( n_end[4] == 0x01 );
2248 TEST_ASSERT( n_end[5] == 0x02 );
2249 }
2250#endif /* MBEDTLS_RSA_C */
2251#if defined(MBEDTLS_ECP_C)
2252 if( PSA_KEY_TYPE_IS_ECC( type ) )
2253 {
2254 /* Sanity check: does this look like the beginning of a PKCS#8
2255 * elliptic curve key pair? */
2256 TEST_ASSERT( exported_length >= bits * 3 / 8 + 10 );
2257 TEST_ASSERT( exported[0] == 0x30 );
2258 }
2259#endif /* MBEDTLS_ECP_C */
2260 }
2261
Gilles Peskine818ca122018-06-20 18:16:48 +02002262 /* Do something with the key according to its type and permitted usage. */
2263 if( PSA_ALG_IS_MAC( alg ) )
2264 exercise_mac_key( slot, usage, alg );
2265 else if( PSA_ALG_IS_CIPHER( alg ) )
2266 exercise_cipher_key( slot, usage, alg );
2267 else if( PSA_ALG_IS_AEAD( alg ) )
2268 exercise_aead_key( slot, usage, alg );
2269 else if( PSA_ALG_IS_SIGN( alg ) )
2270 exercise_signature_key( slot, usage, alg );
2271 else if( PSA_ALG_IS_ASYMMETRIC_ENCRYPTION( alg ) )
2272 exercise_asymmetric_encryption_key( slot, usage, alg );
Gilles Peskine12313cd2018-06-20 00:20:32 +02002273
2274exit:
2275 psa_destroy_key( slot );
2276 mbedtls_psa_crypto_free( );
2277}
2278/* END_CASE */