blob: 41e29729b5b1e819dc07bd8642027b740ec4ba28 [file] [log] [blame]
Gilles Peskinee59236f2018-01-27 23:32:46 +01001/* BEGIN_HEADER */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002#include <stdint.h>
mohammad160327010052018-07-03 13:16:15 +03003
Gilles Peskinedd2f95b2018-08-11 01:22:42 +02004#include "mbedtls/asn1.h"
Gilles Peskine0b352bc2018-06-28 00:16:11 +02005#include "mbedtls/asn1write.h"
Gilles Peskinedd2f95b2018-08-11 01:22:42 +02006#include "mbedtls/oid.h"
7
Gilles Peskinebdc96fd2019-08-07 12:08:04 +02008/* For MBEDTLS_CTR_DRBG_MAX_REQUEST, knowing that psa_generate_random()
9 * uses mbedtls_ctr_drbg internally. */
10#include "mbedtls/ctr_drbg.h"
11
Gilles Peskinebdc96fd2019-08-07 12:08:04 +020012#include "psa/crypto.h"
Ronald Cron41841072020-09-17 15:28:26 +020013#include "psa_crypto_slot_management.h"
Gilles Peskinebdc96fd2019-08-07 12:08:04 +020014
Gilles Peskine8e94efe2021-02-13 00:25:53 +010015#include "test/asn1_helpers.h"
Ronald Cron28a45ed2021-02-09 20:35:42 +010016#include "test/psa_crypto_helpers.h"
Gilles Peskinee78b0022021-02-13 00:41:11 +010017#include "test/psa_exercise_key.h"
Ronald Cron28a45ed2021-02-09 20:35:42 +010018
Gilles Peskine4023c012021-05-27 13:21:20 +020019/* If this comes up, it's a bug in the test code or in the test data. */
20#define UNUSED 0xdeadbeef
21
Dave Rodgman647791d2021-06-23 12:49:59 +010022/* Assert that an operation is (not) active.
23 * This serves as a proxy for checking if the operation is aborted. */
24#define ASSERT_OPERATION_IS_ACTIVE( operation ) TEST_ASSERT( operation.id != 0 )
25#define ASSERT_OPERATION_IS_INACTIVE( operation ) TEST_ASSERT( operation.id == 0 )
26
Jaeden Amerof24c7f82018-06-27 17:20:43 +010027/** An invalid export length that will never be set by psa_export_key(). */
28static const size_t INVALID_EXPORT_LENGTH = ~0U;
29
Gilles Peskinea7aa4422018-08-14 15:17:54 +020030/** Test if a buffer contains a constant byte value.
31 *
32 * `mem_is_char(buffer, c, size)` is true after `memset(buffer, c, size)`.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020033 *
34 * \param buffer Pointer to the beginning of the buffer.
Gilles Peskinea7aa4422018-08-14 15:17:54 +020035 * \param c Expected value of every byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020036 * \param size Size of the buffer in bytes.
37 *
Gilles Peskine3f669c32018-06-21 09:21:51 +020038 * \return 1 if the buffer is all-bits-zero.
39 * \return 0 if there is at least one nonzero byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020040 */
Gilles Peskinea7aa4422018-08-14 15:17:54 +020041static int mem_is_char( void *buffer, unsigned char c, size_t size )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020042{
43 size_t i;
44 for( i = 0; i < size; i++ )
45 {
Gilles Peskinea7aa4422018-08-14 15:17:54 +020046 if( ( (unsigned char *) buffer )[i] != c )
Gilles Peskine3f669c32018-06-21 09:21:51 +020047 return( 0 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020048 }
Gilles Peskine3f669c32018-06-21 09:21:51 +020049 return( 1 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020050}
Gilles Peskine818ca122018-06-20 18:16:48 +020051
Gilles Peskine0b352bc2018-06-28 00:16:11 +020052/* Write the ASN.1 INTEGER with the value 2^(bits-1)+x backwards from *p. */
53static int asn1_write_10x( unsigned char **p,
54 unsigned char *start,
55 size_t bits,
56 unsigned char x )
57{
58 int ret;
59 int len = bits / 8 + 1;
Gilles Peskine480416a2018-06-28 19:04:07 +020060 if( bits == 0 )
61 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
62 if( bits <= 8 && x >= 1 << ( bits - 1 ) )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020063 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
Moran Pekercb088e72018-07-17 17:36:59 +030064 if( *p < start || *p - start < (ptrdiff_t) len )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020065 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
66 *p -= len;
67 ( *p )[len-1] = x;
68 if( bits % 8 == 0 )
69 ( *p )[1] |= 1;
70 else
71 ( *p )[0] |= 1 << ( bits % 8 );
72 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
73 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
74 MBEDTLS_ASN1_INTEGER ) );
75 return( len );
76}
77
78static int construct_fake_rsa_key( unsigned char *buffer,
79 size_t buffer_size,
80 unsigned char **p,
81 size_t bits,
82 int keypair )
83{
84 size_t half_bits = ( bits + 1 ) / 2;
85 int ret;
86 int len = 0;
87 /* Construct something that looks like a DER encoding of
88 * as defined by PKCS#1 v2.2 (RFC 8017) section A.1.2:
89 * RSAPrivateKey ::= SEQUENCE {
90 * version Version,
91 * modulus INTEGER, -- n
92 * publicExponent INTEGER, -- e
93 * privateExponent INTEGER, -- d
94 * prime1 INTEGER, -- p
95 * prime2 INTEGER, -- q
96 * exponent1 INTEGER, -- d mod (p-1)
97 * exponent2 INTEGER, -- d mod (q-1)
98 * coefficient INTEGER, -- (inverse of q) mod p
99 * otherPrimeInfos OtherPrimeInfos OPTIONAL
100 * }
101 * Or, for a public key, the same structure with only
102 * version, modulus and publicExponent.
103 */
104 *p = buffer + buffer_size;
105 if( keypair )
106 {
107 MBEDTLS_ASN1_CHK_ADD( len, /* pq */
108 asn1_write_10x( p, buffer, half_bits, 1 ) );
109 MBEDTLS_ASN1_CHK_ADD( len, /* dq */
110 asn1_write_10x( p, buffer, half_bits, 1 ) );
111 MBEDTLS_ASN1_CHK_ADD( len, /* dp */
112 asn1_write_10x( p, buffer, half_bits, 1 ) );
113 MBEDTLS_ASN1_CHK_ADD( len, /* q */
114 asn1_write_10x( p, buffer, half_bits, 1 ) );
115 MBEDTLS_ASN1_CHK_ADD( len, /* p != q to pass mbedtls sanity checks */
116 asn1_write_10x( p, buffer, half_bits, 3 ) );
117 MBEDTLS_ASN1_CHK_ADD( len, /* d */
118 asn1_write_10x( p, buffer, bits, 1 ) );
119 }
120 MBEDTLS_ASN1_CHK_ADD( len, /* e = 65537 */
121 asn1_write_10x( p, buffer, 17, 1 ) );
122 MBEDTLS_ASN1_CHK_ADD( len, /* n */
123 asn1_write_10x( p, buffer, bits, 1 ) );
124 if( keypair )
125 MBEDTLS_ASN1_CHK_ADD( len, /* version = 0 */
126 mbedtls_asn1_write_int( p, buffer, 0 ) );
127 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, buffer, len ) );
128 {
129 const unsigned char tag =
130 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE;
131 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, buffer, tag ) );
132 }
133 return( len );
134}
135
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100136int exercise_mac_setup( psa_key_type_t key_type,
137 const unsigned char *key_bytes,
138 size_t key_length,
139 psa_algorithm_t alg,
140 psa_mac_operation_t *operation,
141 psa_status_t *status )
142{
Ronald Cron5425a212020-08-04 14:58:35 +0200143 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200144 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100145
Gilles Peskine89d8c5c2019-11-26 17:01:59 +0100146 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200147 psa_set_key_algorithm( &attributes, alg );
148 psa_set_key_type( &attributes, key_type );
Ronald Cron5425a212020-08-04 14:58:35 +0200149 PSA_ASSERT( psa_import_key( &attributes, key_bytes, key_length, &key ) );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100150
Ronald Cron5425a212020-08-04 14:58:35 +0200151 *status = psa_mac_sign_setup( operation, key, alg );
Gilles Peskine9e0a4a52019-02-25 22:11:18 +0100152 /* Whether setup succeeded or failed, abort must succeed. */
153 PSA_ASSERT( psa_mac_abort( operation ) );
154 /* If setup failed, reproduce the failure, so that the caller can
155 * test the resulting state of the operation object. */
156 if( *status != PSA_SUCCESS )
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100157 {
Ronald Cron5425a212020-08-04 14:58:35 +0200158 TEST_EQUAL( psa_mac_sign_setup( operation, key, alg ), *status );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100159 }
160
Ronald Cron5425a212020-08-04 14:58:35 +0200161 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100162 return( 1 );
163
164exit:
Ronald Cron5425a212020-08-04 14:58:35 +0200165 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100166 return( 0 );
167}
168
169int exercise_cipher_setup( psa_key_type_t key_type,
170 const unsigned char *key_bytes,
171 size_t key_length,
172 psa_algorithm_t alg,
173 psa_cipher_operation_t *operation,
174 psa_status_t *status )
175{
Ronald Cron5425a212020-08-04 14:58:35 +0200176 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200177 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100178
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200179 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
180 psa_set_key_algorithm( &attributes, alg );
181 psa_set_key_type( &attributes, key_type );
Ronald Cron5425a212020-08-04 14:58:35 +0200182 PSA_ASSERT( psa_import_key( &attributes, key_bytes, key_length, &key ) );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100183
Ronald Cron5425a212020-08-04 14:58:35 +0200184 *status = psa_cipher_encrypt_setup( operation, key, alg );
Gilles Peskine9e0a4a52019-02-25 22:11:18 +0100185 /* Whether setup succeeded or failed, abort must succeed. */
186 PSA_ASSERT( psa_cipher_abort( operation ) );
187 /* If setup failed, reproduce the failure, so that the caller can
188 * test the resulting state of the operation object. */
189 if( *status != PSA_SUCCESS )
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100190 {
Ronald Cron5425a212020-08-04 14:58:35 +0200191 TEST_EQUAL( psa_cipher_encrypt_setup( operation, key, alg ),
Gilles Peskine9e0a4a52019-02-25 22:11:18 +0100192 *status );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100193 }
194
Ronald Cron5425a212020-08-04 14:58:35 +0200195 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100196 return( 1 );
197
198exit:
Ronald Cron5425a212020-08-04 14:58:35 +0200199 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100200 return( 0 );
201}
202
Ronald Cron5425a212020-08-04 14:58:35 +0200203static int test_operations_on_invalid_key( mbedtls_svc_key_id_t key )
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200204{
205 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cronecfb2372020-07-23 17:13:42 +0200206 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, 0x6964 );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200207 uint8_t buffer[1];
208 size_t length;
209 int ok = 0;
210
Ronald Cronecfb2372020-07-23 17:13:42 +0200211 psa_set_key_id( &attributes, key_id );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200212 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
213 psa_set_key_algorithm( &attributes, PSA_ALG_CTR );
214 psa_set_key_type( &attributes, PSA_KEY_TYPE_AES );
Ronald Cron5425a212020-08-04 14:58:35 +0200215 TEST_EQUAL( psa_get_key_attributes( key, &attributes ),
Maulik Patel3240c9d2021-03-17 16:11:05 +0000216 PSA_ERROR_INVALID_HANDLE );
Ronald Cronecfb2372020-07-23 17:13:42 +0200217 TEST_EQUAL(
218 MBEDTLS_SVC_KEY_ID_GET_KEY_ID( psa_get_key_id( &attributes ) ), 0 );
219 TEST_EQUAL(
220 MBEDTLS_SVC_KEY_ID_GET_OWNER_ID( psa_get_key_id( &attributes ) ), 0 );
Gilles Peskine5c648ab2019-04-19 14:06:53 +0200221 TEST_EQUAL( psa_get_key_lifetime( &attributes ), 0 );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200222 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), 0 );
223 TEST_EQUAL( psa_get_key_algorithm( &attributes ), 0 );
224 TEST_EQUAL( psa_get_key_type( &attributes ), 0 );
225 TEST_EQUAL( psa_get_key_bits( &attributes ), 0 );
226
Ronald Cron5425a212020-08-04 14:58:35 +0200227 TEST_EQUAL( psa_export_key( key, buffer, sizeof( buffer ), &length ),
Maulik Patel3240c9d2021-03-17 16:11:05 +0000228 PSA_ERROR_INVALID_HANDLE );
Ronald Cron5425a212020-08-04 14:58:35 +0200229 TEST_EQUAL( psa_export_public_key( key,
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200230 buffer, sizeof( buffer ), &length ),
Maulik Patel3240c9d2021-03-17 16:11:05 +0000231 PSA_ERROR_INVALID_HANDLE );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200232
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200233 ok = 1;
234
235exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100236 /*
237 * Key attributes may have been returned by psa_get_key_attributes()
238 * thus reset them as required.
239 */
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200240 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100241
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200242 return( ok );
243}
244
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200245/* Assert that a key isn't reported as having a slot number. */
246#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
247#define ASSERT_NO_SLOT_NUMBER( attributes ) \
248 do \
249 { \
250 psa_key_slot_number_t ASSERT_NO_SLOT_NUMBER_slot_number; \
251 TEST_EQUAL( psa_get_key_slot_number( \
252 attributes, \
253 &ASSERT_NO_SLOT_NUMBER_slot_number ), \
254 PSA_ERROR_INVALID_ARGUMENT ); \
255 } \
256 while( 0 )
257#else /* MBEDTLS_PSA_CRYPTO_SE_C */
258#define ASSERT_NO_SLOT_NUMBER( attributes ) \
259 ( (void) 0 )
260#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
261
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100262/* An overapproximation of the amount of storage needed for a key of the
263 * given type and with the given content. The API doesn't make it easy
264 * to find a good value for the size. The current implementation doesn't
265 * care about the value anyway. */
266#define KEY_BITS_FROM_DATA( type, data ) \
267 ( data )->len
268
Darryl Green0c6575a2018-11-07 16:05:30 +0000269typedef enum {
270 IMPORT_KEY = 0,
271 GENERATE_KEY = 1,
272 DERIVE_KEY = 2
273} generate_method;
274
Gilles Peskinee59236f2018-01-27 23:32:46 +0100275/* END_HEADER */
276
277/* BEGIN_DEPENDENCIES
278 * depends_on:MBEDTLS_PSA_CRYPTO_C
279 * END_DEPENDENCIES
280 */
281
282/* BEGIN_CASE */
Gilles Peskinee1f2d7d2018-08-21 14:54:54 +0200283void static_checks( )
284{
285 size_t max_truncated_mac_size =
286 PSA_ALG_MAC_TRUNCATION_MASK >> PSA_MAC_TRUNCATION_OFFSET;
287
288 /* Check that the length for a truncated MAC always fits in the algorithm
289 * encoding. The shifted mask is the maximum truncated value. The
290 * untruncated algorithm may be one byte larger. */
291 TEST_ASSERT( PSA_MAC_MAX_SIZE <= 1 + max_truncated_mac_size );
292}
293/* END_CASE */
294
295/* BEGIN_CASE */
Gilles Peskine6edfa292019-07-31 15:53:45 +0200296void import_with_policy( int type_arg,
297 int usage_arg, int alg_arg,
298 int expected_status_arg )
299{
300 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
301 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +0200302 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine6edfa292019-07-31 15:53:45 +0200303 psa_key_type_t type = type_arg;
304 psa_key_usage_t usage = usage_arg;
305 psa_algorithm_t alg = alg_arg;
306 psa_status_t expected_status = expected_status_arg;
307 const uint8_t key_material[16] = {0};
308 psa_status_t status;
309
310 PSA_ASSERT( psa_crypto_init( ) );
311
312 psa_set_key_type( &attributes, type );
313 psa_set_key_usage_flags( &attributes, usage );
314 psa_set_key_algorithm( &attributes, alg );
315
316 status = psa_import_key( &attributes,
317 key_material, sizeof( key_material ),
Ronald Cron5425a212020-08-04 14:58:35 +0200318 &key );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200319 TEST_EQUAL( status, expected_status );
320 if( status != PSA_SUCCESS )
321 goto exit;
322
Ronald Cron5425a212020-08-04 14:58:35 +0200323 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200324 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
325 TEST_EQUAL( psa_get_key_usage_flags( &got_attributes ), usage );
326 TEST_EQUAL( psa_get_key_algorithm( &got_attributes ), alg );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200327 ASSERT_NO_SLOT_NUMBER( &got_attributes );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200328
Ronald Cron5425a212020-08-04 14:58:35 +0200329 PSA_ASSERT( psa_destroy_key( key ) );
330 test_operations_on_invalid_key( key );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200331
332exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100333 /*
334 * Key attributes may have been returned by psa_get_key_attributes()
335 * thus reset them as required.
336 */
Gilles Peskine6edfa292019-07-31 15:53:45 +0200337 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100338
339 psa_destroy_key( key );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200340 PSA_DONE( );
341}
342/* END_CASE */
343
344/* BEGIN_CASE */
345void import_with_data( data_t *data, int type_arg,
346 int attr_bits_arg,
347 int expected_status_arg )
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200348{
349 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
350 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +0200351 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200352 psa_key_type_t type = type_arg;
Gilles Peskine8fb3a9e2019-05-03 16:59:21 +0200353 size_t attr_bits = attr_bits_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200354 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100355 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100356
Gilles Peskine8817f612018-12-18 00:18:46 +0100357 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100358
Gilles Peskine4747d192019-04-17 15:05:45 +0200359 psa_set_key_type( &attributes, type );
Gilles Peskine8fb3a9e2019-05-03 16:59:21 +0200360 psa_set_key_bits( &attributes, attr_bits );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200361
Ronald Cron5425a212020-08-04 14:58:35 +0200362 status = psa_import_key( &attributes, data->x, data->len, &key );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100363 TEST_EQUAL( status, expected_status );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200364 if( status != PSA_SUCCESS )
365 goto exit;
366
Ronald Cron5425a212020-08-04 14:58:35 +0200367 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200368 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
Gilles Peskine8fb3a9e2019-05-03 16:59:21 +0200369 if( attr_bits != 0 )
Gilles Peskine7e0cff92019-07-30 13:48:52 +0200370 TEST_EQUAL( attr_bits, psa_get_key_bits( &got_attributes ) );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200371 ASSERT_NO_SLOT_NUMBER( &got_attributes );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200372
Ronald Cron5425a212020-08-04 14:58:35 +0200373 PSA_ASSERT( psa_destroy_key( key ) );
374 test_operations_on_invalid_key( key );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100375
376exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100377 /*
378 * Key attributes may have been returned by psa_get_key_attributes()
379 * thus reset them as required.
380 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +0200381 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100382
383 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200384 PSA_DONE( );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100385}
386/* END_CASE */
387
388/* BEGIN_CASE */
Gilles Peskinec744d992019-07-30 17:26:54 +0200389void import_large_key( int type_arg, int byte_size_arg,
390 int expected_status_arg )
391{
392 psa_key_type_t type = type_arg;
393 size_t byte_size = byte_size_arg;
394 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
395 psa_status_t expected_status = expected_status_arg;
Ronald Cron5425a212020-08-04 14:58:35 +0200396 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec744d992019-07-30 17:26:54 +0200397 psa_status_t status;
398 uint8_t *buffer = NULL;
399 size_t buffer_size = byte_size + 1;
400 size_t n;
401
Steven Cooreman69967ce2021-01-18 18:01:08 +0100402 /* Skip the test case if the target running the test cannot
403 * accomodate large keys due to heap size constraints */
404 ASSERT_ALLOC_WEAK( buffer, buffer_size );
Gilles Peskinec744d992019-07-30 17:26:54 +0200405 memset( buffer, 'K', byte_size );
406
407 PSA_ASSERT( psa_crypto_init( ) );
408
409 /* Try importing the key */
410 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT );
411 psa_set_key_type( &attributes, type );
Ronald Cron5425a212020-08-04 14:58:35 +0200412 status = psa_import_key( &attributes, buffer, byte_size, &key );
Steven Cooreman83fdb702021-01-21 14:24:39 +0100413 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
Gilles Peskinec744d992019-07-30 17:26:54 +0200414 TEST_EQUAL( status, expected_status );
415
416 if( status == PSA_SUCCESS )
417 {
Ronald Cron5425a212020-08-04 14:58:35 +0200418 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskinec744d992019-07-30 17:26:54 +0200419 TEST_EQUAL( psa_get_key_type( &attributes ), type );
420 TEST_EQUAL( psa_get_key_bits( &attributes ),
421 PSA_BYTES_TO_BITS( byte_size ) );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200422 ASSERT_NO_SLOT_NUMBER( &attributes );
Gilles Peskinec744d992019-07-30 17:26:54 +0200423 memset( buffer, 0, byte_size + 1 );
Ronald Cron5425a212020-08-04 14:58:35 +0200424 PSA_ASSERT( psa_export_key( key, buffer, byte_size, &n ) );
Gilles Peskinec744d992019-07-30 17:26:54 +0200425 for( n = 0; n < byte_size; n++ )
426 TEST_EQUAL( buffer[n], 'K' );
427 for( n = byte_size; n < buffer_size; n++ )
428 TEST_EQUAL( buffer[n], 0 );
429 }
430
431exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100432 /*
433 * Key attributes may have been returned by psa_get_key_attributes()
434 * thus reset them as required.
435 */
436 psa_reset_key_attributes( &attributes );
437
Ronald Cron5425a212020-08-04 14:58:35 +0200438 psa_destroy_key( key );
Gilles Peskinec744d992019-07-30 17:26:54 +0200439 PSA_DONE( );
440 mbedtls_free( buffer );
441}
442/* END_CASE */
443
444/* BEGIN_CASE */
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200445void import_rsa_made_up( int bits_arg, int keypair, int expected_status_arg )
446{
Ronald Cron5425a212020-08-04 14:58:35 +0200447 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200448 size_t bits = bits_arg;
449 psa_status_t expected_status = expected_status_arg;
450 psa_status_t status;
451 psa_key_type_t type =
Gilles Peskinec93b80c2019-05-16 19:39:54 +0200452 keypair ? PSA_KEY_TYPE_RSA_KEY_PAIR : PSA_KEY_TYPE_RSA_PUBLIC_KEY;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200453 size_t buffer_size = /* Slight overapproximations */
454 keypair ? bits * 9 / 16 + 80 : bits / 8 + 20;
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200455 unsigned char *buffer = NULL;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200456 unsigned char *p;
457 int ret;
458 size_t length;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200459 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200460
Gilles Peskine8817f612018-12-18 00:18:46 +0100461 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200462 ASSERT_ALLOC( buffer, buffer_size );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200463
464 TEST_ASSERT( ( ret = construct_fake_rsa_key( buffer, buffer_size, &p,
465 bits, keypair ) ) >= 0 );
466 length = ret;
467
468 /* Try importing the key */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200469 psa_set_key_type( &attributes, type );
Ronald Cron5425a212020-08-04 14:58:35 +0200470 status = psa_import_key( &attributes, p, length, &key );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100471 TEST_EQUAL( status, expected_status );
Gilles Peskine76b29a72019-05-28 14:08:50 +0200472
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200473 if( status == PSA_SUCCESS )
Ronald Cron5425a212020-08-04 14:58:35 +0200474 PSA_ASSERT( psa_destroy_key( key ) );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200475
476exit:
477 mbedtls_free( buffer );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200478 PSA_DONE( );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200479}
480/* END_CASE */
481
482/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300483void import_export( data_t *data,
Moran Pekera964a8f2018-06-04 18:42:36 +0300484 int type_arg,
Gilles Peskine1ecf92c22019-05-24 15:00:06 +0200485 int usage_arg, int alg_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100486 int expected_bits,
487 int export_size_delta,
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200488 int expected_export_status_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100489 int canonical_input )
490{
Ronald Cron5425a212020-08-04 14:58:35 +0200491 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100492 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200493 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200494 psa_status_t expected_export_status = expected_export_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100495 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100496 unsigned char *exported = NULL;
497 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100498 size_t export_size;
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100499 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100500 size_t reexported_length;
Gilles Peskine4747d192019-04-17 15:05:45 +0200501 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200502 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100503
Moran Pekercb088e72018-07-17 17:36:59 +0300504 export_size = (ptrdiff_t) data->len + export_size_delta;
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200505 ASSERT_ALLOC( exported, export_size );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100506 if( ! canonical_input )
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200507 ASSERT_ALLOC( reexported, export_size );
Gilles Peskine8817f612018-12-18 00:18:46 +0100508 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100509
Gilles Peskine4747d192019-04-17 15:05:45 +0200510 psa_set_key_usage_flags( &attributes, usage_arg );
511 psa_set_key_algorithm( &attributes, alg );
512 psa_set_key_type( &attributes, type );
mohammad1603a97cb8c2018-03-28 03:46:26 -0700513
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100514 /* Import the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200515 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len, &key ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100516
517 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +0200518 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200519 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
520 TEST_EQUAL( psa_get_key_bits( &got_attributes ), (size_t) expected_bits );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200521 ASSERT_NO_SLOT_NUMBER( &got_attributes );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100522
523 /* Export the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200524 status = psa_export_key( key, exported, export_size, &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100525 TEST_EQUAL( status, expected_export_status );
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100526
527 /* The exported length must be set by psa_export_key() to a value between 0
528 * and export_size. On errors, the exported length must be 0. */
529 TEST_ASSERT( exported_length != INVALID_EXPORT_LENGTH );
530 TEST_ASSERT( status == PSA_SUCCESS || exported_length == 0 );
531 TEST_ASSERT( exported_length <= export_size );
532
Gilles Peskinea7aa4422018-08-14 15:17:54 +0200533 TEST_ASSERT( mem_is_char( exported + exported_length, 0,
Gilles Peskine3f669c32018-06-21 09:21:51 +0200534 export_size - exported_length ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100535 if( status != PSA_SUCCESS )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200536 {
Gilles Peskinefe11b722018-12-18 00:24:04 +0100537 TEST_EQUAL( exported_length, 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100538 goto destroy;
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200539 }
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100540
Gilles Peskineea38a922021-02-13 00:05:16 +0100541 /* Run sanity checks on the exported key. For non-canonical inputs,
542 * this validates the canonical representations. For canonical inputs,
543 * this doesn't directly validate the implementation, but it still helps
544 * by cross-validating the test data with the sanity check code. */
545 if( ! mbedtls_test_psa_exercise_key( key, usage_arg, 0 ) )
Gilles Peskine8f609232018-08-11 01:24:55 +0200546 goto exit;
547
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100548 if( canonical_input )
Gilles Peskinebd7dea92018-09-27 13:57:19 +0200549 ASSERT_COMPARE( data->x, data->len, exported, exported_length );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100550 else
551 {
Ronald Cron5425a212020-08-04 14:58:35 +0200552 mbedtls_svc_key_id_t key2 = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine049c7532019-05-15 20:22:09 +0200553 PSA_ASSERT( psa_import_key( &attributes, exported, exported_length,
Ronald Cron5425a212020-08-04 14:58:35 +0200554 &key2 ) );
555 PSA_ASSERT( psa_export_key( key2,
Gilles Peskine8817f612018-12-18 00:18:46 +0100556 reexported,
557 export_size,
558 &reexported_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +0200559 ASSERT_COMPARE( exported, exported_length,
560 reexported, reexported_length );
Ronald Cron5425a212020-08-04 14:58:35 +0200561 PSA_ASSERT( psa_destroy_key( key2 ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100562 }
gabor-mezei-armceface22021-01-21 12:26:17 +0100563 TEST_ASSERT( exported_length <=
564 PSA_EXPORT_KEY_OUTPUT_SIZE( type,
565 psa_get_key_bits( &got_attributes ) ) );
566 TEST_ASSERT( exported_length <= PSA_EXPORT_KEY_PAIR_MAX_SIZE );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100567
568destroy:
569 /* Destroy the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200570 PSA_ASSERT( psa_destroy_key( key ) );
571 test_operations_on_invalid_key( key );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100572
573exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100574 /*
575 * Key attributes may have been returned by psa_get_key_attributes()
576 * thus reset them as required.
577 */
578 psa_reset_key_attributes( &got_attributes );
579
itayzafrir3e02b3b2018-06-12 17:06:52 +0300580 mbedtls_free( exported );
581 mbedtls_free( reexported );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200582 PSA_DONE( );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100583}
584/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100585
Moran Pekerf709f4a2018-06-06 17:26:04 +0300586/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300587void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200588 int type_arg,
589 int alg_arg,
Gilles Peskine49c25912018-10-29 15:15:31 +0100590 int export_size_delta,
591 int expected_export_status_arg,
592 data_t *expected_public_key )
Moran Pekerf709f4a2018-06-06 17:26:04 +0300593{
Ronald Cron5425a212020-08-04 14:58:35 +0200594 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300595 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200596 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200597 psa_status_t expected_export_status = expected_export_status_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300598 psa_status_t status;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300599 unsigned char *exported = NULL;
Gilles Peskine49c25912018-10-29 15:15:31 +0100600 size_t export_size = expected_public_key->len + export_size_delta;
Jaeden Amero2a671e92018-06-27 17:47:40 +0100601 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine4747d192019-04-17 15:05:45 +0200602 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300603
Gilles Peskine8817f612018-12-18 00:18:46 +0100604 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300605
Gilles Peskine4747d192019-04-17 15:05:45 +0200606 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT );
607 psa_set_key_algorithm( &attributes, alg );
608 psa_set_key_type( &attributes, type );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300609
610 /* Import the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200611 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len, &key ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300612
Gilles Peskine49c25912018-10-29 15:15:31 +0100613 /* Export the public key */
614 ASSERT_ALLOC( exported, export_size );
Ronald Cron5425a212020-08-04 14:58:35 +0200615 status = psa_export_public_key( key,
Gilles Peskine2d277862018-06-18 15:41:12 +0200616 exported, export_size,
617 &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100618 TEST_EQUAL( status, expected_export_status );
Gilles Peskine49c25912018-10-29 15:15:31 +0100619 if( status == PSA_SUCCESS )
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100620 {
Gilles Peskinec93b80c2019-05-16 19:39:54 +0200621 psa_key_type_t public_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR( type );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100622 size_t bits;
Ronald Cron5425a212020-08-04 14:58:35 +0200623 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200624 bits = psa_get_key_bits( &attributes );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100625 TEST_ASSERT( expected_public_key->len <=
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100626 PSA_EXPORT_KEY_OUTPUT_SIZE( public_type, bits ) );
gabor-mezei-armceface22021-01-21 12:26:17 +0100627 TEST_ASSERT( expected_public_key->len <=
628 PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE( public_type, bits ) );
629 TEST_ASSERT( expected_public_key->len <=
630 PSA_EXPORT_PUBLIC_KEY_MAX_SIZE );
Gilles Peskine49c25912018-10-29 15:15:31 +0100631 ASSERT_COMPARE( expected_public_key->x, expected_public_key->len,
632 exported, exported_length );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100633 }
Moran Pekerf709f4a2018-06-06 17:26:04 +0300634
635exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100636 /*
637 * Key attributes may have been returned by psa_get_key_attributes()
638 * thus reset them as required.
639 */
640 psa_reset_key_attributes( &attributes );
641
itayzafrir3e02b3b2018-06-12 17:06:52 +0300642 mbedtls_free( exported );
Ronald Cron5425a212020-08-04 14:58:35 +0200643 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200644 PSA_DONE( );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300645}
646/* END_CASE */
647
Gilles Peskine20035e32018-02-03 22:44:14 +0100648/* BEGIN_CASE */
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200649void import_and_exercise_key( data_t *data,
650 int type_arg,
651 int bits_arg,
652 int alg_arg )
653{
Ronald Cron5425a212020-08-04 14:58:35 +0200654 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200655 psa_key_type_t type = type_arg;
656 size_t bits = bits_arg;
657 psa_algorithm_t alg = alg_arg;
Gilles Peskinec18e25f2021-02-12 23:48:20 +0100658 psa_key_usage_t usage = mbedtls_test_psa_usage_to_exercise( type, alg );
Gilles Peskine4747d192019-04-17 15:05:45 +0200659 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200660 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200661
Gilles Peskine8817f612018-12-18 00:18:46 +0100662 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200663
Gilles Peskine4747d192019-04-17 15:05:45 +0200664 psa_set_key_usage_flags( &attributes, usage );
665 psa_set_key_algorithm( &attributes, alg );
666 psa_set_key_type( &attributes, type );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200667
668 /* Import the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200669 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len, &key ) );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200670
671 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +0200672 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200673 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
674 TEST_EQUAL( psa_get_key_bits( &got_attributes ), bits );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200675
676 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +0100677 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +0200678 goto exit;
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200679
Ronald Cron5425a212020-08-04 14:58:35 +0200680 PSA_ASSERT( psa_destroy_key( key ) );
681 test_operations_on_invalid_key( key );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200682
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200683exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100684 /*
685 * Key attributes may have been returned by psa_get_key_attributes()
686 * thus reset them as required.
687 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +0200688 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100689
690 psa_reset_key_attributes( &attributes );
691 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200692 PSA_DONE( );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200693}
694/* END_CASE */
695
696/* BEGIN_CASE */
Gilles Peskine06c28892019-11-26 18:07:46 +0100697void effective_key_attributes( int type_arg, int expected_type_arg,
698 int bits_arg, int expected_bits_arg,
699 int usage_arg, int expected_usage_arg,
700 int alg_arg, int expected_alg_arg )
Gilles Peskined5b33222018-06-18 22:20:03 +0200701{
Ronald Cron5425a212020-08-04 14:58:35 +0200702 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine1a960492019-11-26 17:12:21 +0100703 psa_key_type_t key_type = type_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +0100704 psa_key_type_t expected_key_type = expected_type_arg;
Gilles Peskine1a960492019-11-26 17:12:21 +0100705 size_t bits = bits_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +0100706 size_t expected_bits = expected_bits_arg;
Gilles Peskined5b33222018-06-18 22:20:03 +0200707 psa_algorithm_t alg = alg_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +0100708 psa_algorithm_t expected_alg = expected_alg_arg;
Gilles Peskined5b33222018-06-18 22:20:03 +0200709 psa_key_usage_t usage = usage_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +0100710 psa_key_usage_t expected_usage = expected_usage_arg;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200711 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskined5b33222018-06-18 22:20:03 +0200712
Gilles Peskine8817f612018-12-18 00:18:46 +0100713 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined5b33222018-06-18 22:20:03 +0200714
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200715 psa_set_key_usage_flags( &attributes, usage );
716 psa_set_key_algorithm( &attributes, alg );
717 psa_set_key_type( &attributes, key_type );
Gilles Peskine1a960492019-11-26 17:12:21 +0100718 psa_set_key_bits( &attributes, bits );
Gilles Peskined5b33222018-06-18 22:20:03 +0200719
Ronald Cron5425a212020-08-04 14:58:35 +0200720 PSA_ASSERT( psa_generate_key( &attributes, &key ) );
Gilles Peskine1a960492019-11-26 17:12:21 +0100721 psa_reset_key_attributes( &attributes );
Gilles Peskined5b33222018-06-18 22:20:03 +0200722
Ronald Cron5425a212020-08-04 14:58:35 +0200723 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine06c28892019-11-26 18:07:46 +0100724 TEST_EQUAL( psa_get_key_type( &attributes ), expected_key_type );
725 TEST_EQUAL( psa_get_key_bits( &attributes ), expected_bits );
726 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), expected_usage );
727 TEST_EQUAL( psa_get_key_algorithm( &attributes ), expected_alg );
Gilles Peskined5b33222018-06-18 22:20:03 +0200728
729exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100730 /*
731 * Key attributes may have been returned by psa_get_key_attributes()
732 * thus reset them as required.
733 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +0200734 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100735
736 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200737 PSA_DONE( );
Gilles Peskined5b33222018-06-18 22:20:03 +0200738}
739/* END_CASE */
740
741/* BEGIN_CASE */
Gilles Peskine06c28892019-11-26 18:07:46 +0100742void check_key_policy( int type_arg, int bits_arg,
743 int usage_arg, int alg_arg )
744{
745 test_effective_key_attributes( type_arg, type_arg, bits_arg, bits_arg,
746 usage_arg, usage_arg, alg_arg, alg_arg );
747 goto exit;
748}
749/* END_CASE */
750
751/* BEGIN_CASE */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200752void key_attributes_init( )
Jaeden Amero70261c52019-01-04 11:47:20 +0000753{
754 /* Test each valid way of initializing the object, except for `= {0}`, as
755 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
756 * though it's OK by the C standard. We could test for this, but we'd need
757 * to supress the Clang warning for the test. */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200758 psa_key_attributes_t func = psa_key_attributes_init( );
759 psa_key_attributes_t init = PSA_KEY_ATTRIBUTES_INIT;
760 psa_key_attributes_t zero;
Jaeden Amero70261c52019-01-04 11:47:20 +0000761
762 memset( &zero, 0, sizeof( zero ) );
763
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200764 TEST_EQUAL( psa_get_key_lifetime( &func ), PSA_KEY_LIFETIME_VOLATILE );
765 TEST_EQUAL( psa_get_key_lifetime( &init ), PSA_KEY_LIFETIME_VOLATILE );
766 TEST_EQUAL( psa_get_key_lifetime( &zero ), PSA_KEY_LIFETIME_VOLATILE );
Jaeden Amero5229bbb2019-02-07 16:33:37 +0000767
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200768 TEST_EQUAL( psa_get_key_type( &func ), 0 );
769 TEST_EQUAL( psa_get_key_type( &init ), 0 );
770 TEST_EQUAL( psa_get_key_type( &zero ), 0 );
771
772 TEST_EQUAL( psa_get_key_bits( &func ), 0 );
773 TEST_EQUAL( psa_get_key_bits( &init ), 0 );
774 TEST_EQUAL( psa_get_key_bits( &zero ), 0 );
775
776 TEST_EQUAL( psa_get_key_usage_flags( &func ), 0 );
777 TEST_EQUAL( psa_get_key_usage_flags( &init ), 0 );
778 TEST_EQUAL( psa_get_key_usage_flags( &zero ), 0 );
779
780 TEST_EQUAL( psa_get_key_algorithm( &func ), 0 );
781 TEST_EQUAL( psa_get_key_algorithm( &init ), 0 );
782 TEST_EQUAL( psa_get_key_algorithm( &zero ), 0 );
Jaeden Amero70261c52019-01-04 11:47:20 +0000783}
784/* END_CASE */
785
786/* BEGIN_CASE */
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200787void mac_key_policy( int policy_usage,
788 int policy_alg,
789 int key_type,
790 data_t *key_data,
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100791 int exercise_alg,
792 int expected_status_arg )
Gilles Peskined5b33222018-06-18 22:20:03 +0200793{
Ronald Cron5425a212020-08-04 14:58:35 +0200794 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200795 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Amero769ce272019-01-04 11:48:03 +0000796 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200797 psa_status_t status;
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100798 psa_status_t expected_status = expected_status_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200799 unsigned char mac[PSA_MAC_MAX_SIZE];
Gilles Peskined5b33222018-06-18 22:20:03 +0200800
Gilles Peskine8817f612018-12-18 00:18:46 +0100801 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined5b33222018-06-18 22:20:03 +0200802
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200803 psa_set_key_usage_flags( &attributes, policy_usage );
804 psa_set_key_algorithm( &attributes, policy_alg );
805 psa_set_key_type( &attributes, key_type );
Gilles Peskined5b33222018-06-18 22:20:03 +0200806
Gilles Peskine049c7532019-05-15 20:22:09 +0200807 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +0200808 &key ) );
Gilles Peskined5b33222018-06-18 22:20:03 +0200809
Ronald Cron5425a212020-08-04 14:58:35 +0200810 status = psa_mac_sign_setup( &operation, key, exercise_alg );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100811 if( ( policy_usage & PSA_KEY_USAGE_SIGN_HASH ) == 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +0100812 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100813 else
814 TEST_EQUAL( status, expected_status );
815
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200816 psa_mac_abort( &operation );
Gilles Peskined5b33222018-06-18 22:20:03 +0200817
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200818 memset( mac, 0, sizeof( mac ) );
Ronald Cron5425a212020-08-04 14:58:35 +0200819 status = psa_mac_verify_setup( &operation, key, exercise_alg );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100820 if( ( policy_usage & PSA_KEY_USAGE_VERIFY_HASH ) == 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +0100821 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100822 else
823 TEST_EQUAL( status, expected_status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200824
825exit:
826 psa_mac_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +0200827 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200828 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200829}
830/* END_CASE */
831
832/* BEGIN_CASE */
833void cipher_key_policy( int policy_usage,
834 int policy_alg,
835 int key_type,
836 data_t *key_data,
837 int exercise_alg )
838{
Ronald Cron5425a212020-08-04 14:58:35 +0200839 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200840 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Amero5bae2272019-01-04 11:48:27 +0000841 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200842 psa_status_t status;
843
Gilles Peskine8817f612018-12-18 00:18:46 +0100844 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200845
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200846 psa_set_key_usage_flags( &attributes, policy_usage );
847 psa_set_key_algorithm( &attributes, policy_alg );
848 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200849
Gilles Peskine049c7532019-05-15 20:22:09 +0200850 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +0200851 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200852
Ronald Cron5425a212020-08-04 14:58:35 +0200853 status = psa_cipher_encrypt_setup( &operation, key, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200854 if( policy_alg == exercise_alg &&
855 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +0100856 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200857 else
Gilles Peskinefe11b722018-12-18 00:24:04 +0100858 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200859 psa_cipher_abort( &operation );
860
Ronald Cron5425a212020-08-04 14:58:35 +0200861 status = psa_cipher_decrypt_setup( &operation, key, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200862 if( policy_alg == exercise_alg &&
863 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +0100864 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200865 else
Gilles Peskinefe11b722018-12-18 00:24:04 +0100866 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200867
868exit:
869 psa_cipher_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +0200870 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200871 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200872}
873/* END_CASE */
874
875/* BEGIN_CASE */
876void aead_key_policy( int policy_usage,
877 int policy_alg,
878 int key_type,
879 data_t *key_data,
880 int nonce_length_arg,
881 int tag_length_arg,
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100882 int exercise_alg,
883 int expected_status_arg )
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200884{
Ronald Cron5425a212020-08-04 14:58:35 +0200885 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200886 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200887 psa_status_t status;
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100888 psa_status_t expected_status = expected_status_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200889 unsigned char nonce[16] = {0};
890 size_t nonce_length = nonce_length_arg;
891 unsigned char tag[16];
892 size_t tag_length = tag_length_arg;
893 size_t output_length;
894
895 TEST_ASSERT( nonce_length <= sizeof( nonce ) );
896 TEST_ASSERT( tag_length <= sizeof( tag ) );
897
Gilles Peskine8817f612018-12-18 00:18:46 +0100898 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200899
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200900 psa_set_key_usage_flags( &attributes, policy_usage );
901 psa_set_key_algorithm( &attributes, policy_alg );
902 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200903
Gilles Peskine049c7532019-05-15 20:22:09 +0200904 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +0200905 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200906
Ronald Cron5425a212020-08-04 14:58:35 +0200907 status = psa_aead_encrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200908 nonce, nonce_length,
909 NULL, 0,
910 NULL, 0,
911 tag, tag_length,
912 &output_length );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100913 if( ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
914 TEST_EQUAL( status, expected_status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200915 else
Gilles Peskinefe11b722018-12-18 00:24:04 +0100916 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200917
918 memset( tag, 0, sizeof( tag ) );
Ronald Cron5425a212020-08-04 14:58:35 +0200919 status = psa_aead_decrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200920 nonce, nonce_length,
921 NULL, 0,
922 tag, tag_length,
923 NULL, 0,
924 &output_length );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100925 if( ( policy_usage & PSA_KEY_USAGE_DECRYPT ) == 0 )
926 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
927 else if( expected_status == PSA_SUCCESS )
Gilles Peskinefe11b722018-12-18 00:24:04 +0100928 TEST_EQUAL( status, PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200929 else
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100930 TEST_EQUAL( status, expected_status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200931
932exit:
Ronald Cron5425a212020-08-04 14:58:35 +0200933 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200934 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200935}
936/* END_CASE */
937
938/* BEGIN_CASE */
939void asymmetric_encryption_key_policy( int policy_usage,
940 int policy_alg,
941 int key_type,
942 data_t *key_data,
943 int exercise_alg )
944{
Ronald Cron5425a212020-08-04 14:58:35 +0200945 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200946 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200947 psa_status_t status;
948 size_t key_bits;
949 size_t buffer_length;
950 unsigned char *buffer = NULL;
951 size_t output_length;
952
Gilles Peskine8817f612018-12-18 00:18:46 +0100953 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200954
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200955 psa_set_key_usage_flags( &attributes, policy_usage );
956 psa_set_key_algorithm( &attributes, policy_alg );
957 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200958
Gilles Peskine049c7532019-05-15 20:22:09 +0200959 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +0200960 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200961
Ronald Cron5425a212020-08-04 14:58:35 +0200962 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200963 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200964 buffer_length = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits,
965 exercise_alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200966 ASSERT_ALLOC( buffer, buffer_length );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200967
Ronald Cron5425a212020-08-04 14:58:35 +0200968 status = psa_asymmetric_encrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200969 NULL, 0,
970 NULL, 0,
971 buffer, buffer_length,
972 &output_length );
973 if( policy_alg == exercise_alg &&
974 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +0100975 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200976 else
Gilles Peskinefe11b722018-12-18 00:24:04 +0100977 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200978
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +0200979 if( buffer_length != 0 )
980 memset( buffer, 0, buffer_length );
Ronald Cron5425a212020-08-04 14:58:35 +0200981 status = psa_asymmetric_decrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200982 buffer, buffer_length,
983 NULL, 0,
984 buffer, buffer_length,
985 &output_length );
986 if( policy_alg == exercise_alg &&
987 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +0100988 TEST_EQUAL( status, PSA_ERROR_INVALID_PADDING );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200989 else
Gilles Peskinefe11b722018-12-18 00:24:04 +0100990 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200991
992exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100993 /*
994 * Key attributes may have been returned by psa_get_key_attributes()
995 * thus reset them as required.
996 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +0200997 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100998
999 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001000 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001001 mbedtls_free( buffer );
1002}
1003/* END_CASE */
1004
1005/* BEGIN_CASE */
1006void asymmetric_signature_key_policy( int policy_usage,
1007 int policy_alg,
1008 int key_type,
1009 data_t *key_data,
Gilles Peskine30f77cd2019-01-14 16:06:39 +01001010 int exercise_alg,
1011 int payload_length_arg )
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001012{
Ronald Cron5425a212020-08-04 14:58:35 +02001013 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001014 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001015 psa_status_t status;
Gilles Peskine30f77cd2019-01-14 16:06:39 +01001016 unsigned char payload[PSA_HASH_MAX_SIZE] = {1};
1017 /* If `payload_length_arg > 0`, `exercise_alg` is supposed to be
1018 * compatible with the policy and `payload_length_arg` is supposed to be
1019 * a valid input length to sign. If `payload_length_arg <= 0`,
1020 * `exercise_alg` is supposed to be forbidden by the policy. */
1021 int compatible_alg = payload_length_arg > 0;
1022 size_t payload_length = compatible_alg ? payload_length_arg : 0;
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001023 unsigned char signature[PSA_SIGNATURE_MAX_SIZE] = {0};
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001024 size_t signature_length;
1025
Gilles Peskine8817f612018-12-18 00:18:46 +01001026 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001027
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001028 psa_set_key_usage_flags( &attributes, policy_usage );
1029 psa_set_key_algorithm( &attributes, policy_alg );
1030 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001031
Gilles Peskine049c7532019-05-15 20:22:09 +02001032 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001033 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001034
Ronald Cron5425a212020-08-04 14:58:35 +02001035 status = psa_sign_hash( key, exercise_alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001036 payload, payload_length,
1037 signature, sizeof( signature ),
1038 &signature_length );
1039 if( compatible_alg && ( policy_usage & PSA_KEY_USAGE_SIGN_HASH ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001040 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001041 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001042 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001043
1044 memset( signature, 0, sizeof( signature ) );
Ronald Cron5425a212020-08-04 14:58:35 +02001045 status = psa_verify_hash( key, exercise_alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001046 payload, payload_length,
1047 signature, sizeof( signature ) );
1048 if( compatible_alg && ( policy_usage & PSA_KEY_USAGE_VERIFY_HASH ) != 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +01001049 TEST_EQUAL( status, PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001050 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001051 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskined5b33222018-06-18 22:20:03 +02001052
1053exit:
Ronald Cron5425a212020-08-04 14:58:35 +02001054 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001055 PSA_DONE( );
Gilles Peskined5b33222018-06-18 22:20:03 +02001056}
1057/* END_CASE */
1058
Janos Follathba3fab92019-06-11 14:50:16 +01001059/* BEGIN_CASE */
Gilles Peskineea0fb492018-07-12 17:17:20 +02001060void derive_key_policy( int policy_usage,
1061 int policy_alg,
1062 int key_type,
1063 data_t *key_data,
1064 int exercise_alg )
1065{
Ronald Cron5425a212020-08-04 14:58:35 +02001066 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001067 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001068 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02001069 psa_status_t status;
1070
Gilles Peskine8817f612018-12-18 00:18:46 +01001071 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001072
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001073 psa_set_key_usage_flags( &attributes, policy_usage );
1074 psa_set_key_algorithm( &attributes, policy_alg );
1075 psa_set_key_type( &attributes, key_type );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001076
Gilles Peskine049c7532019-05-15 20:22:09 +02001077 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001078 &key ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001079
Janos Follathba3fab92019-06-11 14:50:16 +01001080 PSA_ASSERT( psa_key_derivation_setup( &operation, exercise_alg ) );
1081
1082 if( PSA_ALG_IS_TLS12_PRF( exercise_alg ) ||
1083 PSA_ALG_IS_TLS12_PSK_TO_MS( exercise_alg ) )
Janos Follath0c1ed842019-06-28 13:35:36 +01001084 {
Janos Follathba3fab92019-06-11 14:50:16 +01001085 PSA_ASSERT( psa_key_derivation_input_bytes(
1086 &operation,
1087 PSA_KEY_DERIVATION_INPUT_SEED,
1088 (const uint8_t*) "", 0) );
Janos Follath0c1ed842019-06-28 13:35:36 +01001089 }
Janos Follathba3fab92019-06-11 14:50:16 +01001090
1091 status = psa_key_derivation_input_key( &operation,
1092 PSA_KEY_DERIVATION_INPUT_SECRET,
Ronald Cron5425a212020-08-04 14:58:35 +02001093 key );
Janos Follathba3fab92019-06-11 14:50:16 +01001094
Gilles Peskineea0fb492018-07-12 17:17:20 +02001095 if( policy_alg == exercise_alg &&
1096 ( policy_usage & PSA_KEY_USAGE_DERIVE ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001097 PSA_ASSERT( status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001098 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001099 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001100
1101exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001102 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001103 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001104 PSA_DONE( );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001105}
1106/* END_CASE */
1107
1108/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02001109void agreement_key_policy( int policy_usage,
1110 int policy_alg,
1111 int key_type_arg,
1112 data_t *key_data,
Steven Cooremance48e852020-10-05 16:02:45 +02001113 int exercise_alg,
1114 int expected_status_arg )
Gilles Peskine01d718c2018-09-18 12:01:02 +02001115{
Ronald Cron5425a212020-08-04 14:58:35 +02001116 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001117 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001118 psa_key_type_t key_type = key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001119 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001120 psa_status_t status;
Steven Cooremance48e852020-10-05 16:02:45 +02001121 psa_status_t expected_status = expected_status_arg;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001122
Gilles Peskine8817f612018-12-18 00:18:46 +01001123 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001124
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001125 psa_set_key_usage_flags( &attributes, policy_usage );
1126 psa_set_key_algorithm( &attributes, policy_alg );
1127 psa_set_key_type( &attributes, key_type );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001128
Gilles Peskine049c7532019-05-15 20:22:09 +02001129 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001130 &key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001131
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001132 PSA_ASSERT( psa_key_derivation_setup( &operation, exercise_alg ) );
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001133 status = mbedtls_test_psa_key_agreement_with_self( &operation, key );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001134
Steven Cooremance48e852020-10-05 16:02:45 +02001135 TEST_EQUAL( status, expected_status );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001136
1137exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001138 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001139 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001140 PSA_DONE( );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001141}
1142/* END_CASE */
1143
1144/* BEGIN_CASE */
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001145void key_policy_alg2( int key_type_arg, data_t *key_data,
1146 int usage_arg, int alg_arg, int alg2_arg )
1147{
Ronald Cron5425a212020-08-04 14:58:35 +02001148 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001149 psa_key_type_t key_type = key_type_arg;
1150 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1151 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
1152 psa_key_usage_t usage = usage_arg;
1153 psa_algorithm_t alg = alg_arg;
1154 psa_algorithm_t alg2 = alg2_arg;
1155
1156 PSA_ASSERT( psa_crypto_init( ) );
1157
1158 psa_set_key_usage_flags( &attributes, usage );
1159 psa_set_key_algorithm( &attributes, alg );
1160 psa_set_key_enrollment_algorithm( &attributes, alg2 );
1161 psa_set_key_type( &attributes, key_type );
1162 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001163 &key ) );
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001164
Ronald Cron5425a212020-08-04 14:58:35 +02001165 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001166 TEST_EQUAL( psa_get_key_usage_flags( &got_attributes ), usage );
1167 TEST_EQUAL( psa_get_key_algorithm( &got_attributes ), alg );
1168 TEST_EQUAL( psa_get_key_enrollment_algorithm( &got_attributes ), alg2 );
1169
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001170 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001171 goto exit;
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001172 if( ! mbedtls_test_psa_exercise_key( key, usage, alg2 ) )
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001173 goto exit;
1174
1175exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001176 /*
1177 * Key attributes may have been returned by psa_get_key_attributes()
1178 * thus reset them as required.
1179 */
1180 psa_reset_key_attributes( &got_attributes );
1181
Ronald Cron5425a212020-08-04 14:58:35 +02001182 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001183 PSA_DONE( );
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001184}
1185/* END_CASE */
1186
1187/* BEGIN_CASE */
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001188void raw_agreement_key_policy( int policy_usage,
1189 int policy_alg,
1190 int key_type_arg,
1191 data_t *key_data,
Steven Cooremance48e852020-10-05 16:02:45 +02001192 int exercise_alg,
1193 int expected_status_arg )
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001194{
Ronald Cron5425a212020-08-04 14:58:35 +02001195 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001196 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001197 psa_key_type_t key_type = key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001198 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001199 psa_status_t status;
Steven Cooremance48e852020-10-05 16:02:45 +02001200 psa_status_t expected_status = expected_status_arg;
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001201
1202 PSA_ASSERT( psa_crypto_init( ) );
1203
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001204 psa_set_key_usage_flags( &attributes, policy_usage );
1205 psa_set_key_algorithm( &attributes, policy_alg );
1206 psa_set_key_type( &attributes, key_type );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001207
Gilles Peskine049c7532019-05-15 20:22:09 +02001208 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001209 &key ) );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001210
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001211 status = mbedtls_test_psa_raw_key_agreement_with_self( exercise_alg, key );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001212
Steven Cooremance48e852020-10-05 16:02:45 +02001213 TEST_EQUAL( status, expected_status );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001214
1215exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001216 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001217 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001218 PSA_DONE( );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001219}
1220/* END_CASE */
1221
1222/* BEGIN_CASE */
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001223void copy_success( int source_usage_arg,
1224 int source_alg_arg, int source_alg2_arg,
Gilles Peskine4a644642019-05-03 17:14:08 +02001225 int type_arg, data_t *material,
1226 int copy_attributes,
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001227 int target_usage_arg,
1228 int target_alg_arg, int target_alg2_arg,
1229 int expected_usage_arg,
1230 int expected_alg_arg, int expected_alg2_arg )
Gilles Peskine57ab7212019-01-28 13:03:09 +01001231{
Gilles Peskineca25db92019-04-19 11:43:08 +02001232 psa_key_attributes_t source_attributes = PSA_KEY_ATTRIBUTES_INIT;
1233 psa_key_attributes_t target_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine57ab7212019-01-28 13:03:09 +01001234 psa_key_usage_t expected_usage = expected_usage_arg;
1235 psa_algorithm_t expected_alg = expected_alg_arg;
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001236 psa_algorithm_t expected_alg2 = expected_alg2_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02001237 mbedtls_svc_key_id_t source_key = MBEDTLS_SVC_KEY_ID_INIT;
1238 mbedtls_svc_key_id_t target_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine57ab7212019-01-28 13:03:09 +01001239 uint8_t *export_buffer = NULL;
1240
Gilles Peskine57ab7212019-01-28 13:03:09 +01001241 PSA_ASSERT( psa_crypto_init( ) );
1242
Gilles Peskineca25db92019-04-19 11:43:08 +02001243 /* Prepare the source key. */
1244 psa_set_key_usage_flags( &source_attributes, source_usage_arg );
1245 psa_set_key_algorithm( &source_attributes, source_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001246 psa_set_key_enrollment_algorithm( &source_attributes, source_alg2_arg );
Gilles Peskineca25db92019-04-19 11:43:08 +02001247 psa_set_key_type( &source_attributes, type_arg );
Gilles Peskine049c7532019-05-15 20:22:09 +02001248 PSA_ASSERT( psa_import_key( &source_attributes,
1249 material->x, material->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001250 &source_key ) );
1251 PSA_ASSERT( psa_get_key_attributes( source_key, &source_attributes ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001252
Gilles Peskineca25db92019-04-19 11:43:08 +02001253 /* Prepare the target attributes. */
1254 if( copy_attributes )
Ronald Cron65f38a32020-10-23 17:11:13 +02001255 {
Gilles Peskineca25db92019-04-19 11:43:08 +02001256 target_attributes = source_attributes;
Ronald Cron65f38a32020-10-23 17:11:13 +02001257 /* Set volatile lifetime to reset the key identifier to 0. */
1258 psa_set_key_lifetime( &target_attributes, PSA_KEY_LIFETIME_VOLATILE );
1259 }
1260
Gilles Peskineca25db92019-04-19 11:43:08 +02001261 if( target_usage_arg != -1 )
1262 psa_set_key_usage_flags( &target_attributes, target_usage_arg );
1263 if( target_alg_arg != -1 )
1264 psa_set_key_algorithm( &target_attributes, target_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001265 if( target_alg2_arg != -1 )
1266 psa_set_key_enrollment_algorithm( &target_attributes, target_alg2_arg );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001267
1268 /* Copy the key. */
Ronald Cron5425a212020-08-04 14:58:35 +02001269 PSA_ASSERT( psa_copy_key( source_key,
1270 &target_attributes, &target_key ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001271
1272 /* Destroy the source to ensure that this doesn't affect the target. */
Ronald Cron5425a212020-08-04 14:58:35 +02001273 PSA_ASSERT( psa_destroy_key( source_key ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001274
1275 /* Test that the target slot has the expected content and policy. */
Ronald Cron5425a212020-08-04 14:58:35 +02001276 PSA_ASSERT( psa_get_key_attributes( target_key, &target_attributes ) );
Gilles Peskineca25db92019-04-19 11:43:08 +02001277 TEST_EQUAL( psa_get_key_type( &source_attributes ),
1278 psa_get_key_type( &target_attributes ) );
1279 TEST_EQUAL( psa_get_key_bits( &source_attributes ),
1280 psa_get_key_bits( &target_attributes ) );
1281 TEST_EQUAL( expected_usage, psa_get_key_usage_flags( &target_attributes ) );
1282 TEST_EQUAL( expected_alg, psa_get_key_algorithm( &target_attributes ) );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001283 TEST_EQUAL( expected_alg2,
1284 psa_get_key_enrollment_algorithm( &target_attributes ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001285 if( expected_usage & PSA_KEY_USAGE_EXPORT )
1286 {
1287 size_t length;
1288 ASSERT_ALLOC( export_buffer, material->len );
Ronald Cron5425a212020-08-04 14:58:35 +02001289 PSA_ASSERT( psa_export_key( target_key, export_buffer,
Gilles Peskine57ab7212019-01-28 13:03:09 +01001290 material->len, &length ) );
1291 ASSERT_COMPARE( material->x, material->len,
1292 export_buffer, length );
1293 }
Steven Cooremanb3ce8152021-02-18 12:03:50 +01001294
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001295 if( ! mbedtls_test_psa_exercise_key( target_key, expected_usage, expected_alg ) )
Gilles Peskine57ab7212019-01-28 13:03:09 +01001296 goto exit;
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001297 if( ! mbedtls_test_psa_exercise_key( target_key, expected_usage, expected_alg2 ) )
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001298 goto exit;
Gilles Peskine57ab7212019-01-28 13:03:09 +01001299
Ronald Cron5425a212020-08-04 14:58:35 +02001300 PSA_ASSERT( psa_destroy_key( target_key ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001301
1302exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001303 /*
1304 * Source and target key attributes may have been returned by
1305 * psa_get_key_attributes() thus reset them as required.
1306 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02001307 psa_reset_key_attributes( &source_attributes );
1308 psa_reset_key_attributes( &target_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001309
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001310 PSA_DONE( );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001311 mbedtls_free( export_buffer );
1312}
1313/* END_CASE */
1314
1315/* BEGIN_CASE */
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001316void copy_fail( int source_usage_arg,
1317 int source_alg_arg, int source_alg2_arg,
Gilles Peskine4a644642019-05-03 17:14:08 +02001318 int type_arg, data_t *material,
1319 int target_type_arg, int target_bits_arg,
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001320 int target_usage_arg,
1321 int target_alg_arg, int target_alg2_arg,
Ronald Cron88a55462021-03-31 09:39:07 +02001322 int target_id_arg, int target_lifetime_arg,
Gilles Peskine4a644642019-05-03 17:14:08 +02001323 int expected_status_arg )
1324{
1325 psa_key_attributes_t source_attributes = PSA_KEY_ATTRIBUTES_INIT;
1326 psa_key_attributes_t target_attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +02001327 mbedtls_svc_key_id_t source_key = MBEDTLS_SVC_KEY_ID_INIT;
1328 mbedtls_svc_key_id_t target_key = MBEDTLS_SVC_KEY_ID_INIT;
Ronald Cron88a55462021-03-31 09:39:07 +02001329 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, target_id_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001330
1331 PSA_ASSERT( psa_crypto_init( ) );
1332
1333 /* Prepare the source key. */
1334 psa_set_key_usage_flags( &source_attributes, source_usage_arg );
1335 psa_set_key_algorithm( &source_attributes, source_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001336 psa_set_key_enrollment_algorithm( &source_attributes, source_alg2_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001337 psa_set_key_type( &source_attributes, type_arg );
Gilles Peskine049c7532019-05-15 20:22:09 +02001338 PSA_ASSERT( psa_import_key( &source_attributes,
1339 material->x, material->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001340 &source_key ) );
Gilles Peskine4a644642019-05-03 17:14:08 +02001341
1342 /* Prepare the target attributes. */
Ronald Cron88a55462021-03-31 09:39:07 +02001343 psa_set_key_id( &target_attributes, key_id );
1344 psa_set_key_lifetime( &target_attributes, target_lifetime_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001345 psa_set_key_type( &target_attributes, target_type_arg );
1346 psa_set_key_bits( &target_attributes, target_bits_arg );
1347 psa_set_key_usage_flags( &target_attributes, target_usage_arg );
1348 psa_set_key_algorithm( &target_attributes, target_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001349 psa_set_key_enrollment_algorithm( &target_attributes, target_alg2_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001350
1351 /* Try to copy the key. */
Ronald Cron5425a212020-08-04 14:58:35 +02001352 TEST_EQUAL( psa_copy_key( source_key,
1353 &target_attributes, &target_key ),
Gilles Peskine4a644642019-05-03 17:14:08 +02001354 expected_status_arg );
Gilles Peskine76b29a72019-05-28 14:08:50 +02001355
Ronald Cron5425a212020-08-04 14:58:35 +02001356 PSA_ASSERT( psa_destroy_key( source_key ) );
Gilles Peskine76b29a72019-05-28 14:08:50 +02001357
Gilles Peskine4a644642019-05-03 17:14:08 +02001358exit:
1359 psa_reset_key_attributes( &source_attributes );
1360 psa_reset_key_attributes( &target_attributes );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001361 PSA_DONE( );
Gilles Peskine4a644642019-05-03 17:14:08 +02001362}
1363/* END_CASE */
1364
1365/* BEGIN_CASE */
Jaeden Amero6a25b412019-01-04 11:47:44 +00001366void hash_operation_init( )
1367{
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001368 const uint8_t input[1] = { 0 };
Jaeden Amero6a25b412019-01-04 11:47:44 +00001369 /* Test each valid way of initializing the object, except for `= {0}`, as
1370 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
1371 * though it's OK by the C standard. We could test for this, but we'd need
1372 * to supress the Clang warning for the test. */
1373 psa_hash_operation_t func = psa_hash_operation_init( );
1374 psa_hash_operation_t init = PSA_HASH_OPERATION_INIT;
1375 psa_hash_operation_t zero;
1376
1377 memset( &zero, 0, sizeof( zero ) );
1378
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001379 /* A freshly-initialized hash operation should not be usable. */
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001380 TEST_EQUAL( psa_hash_update( &func, input, sizeof( input ) ),
1381 PSA_ERROR_BAD_STATE );
1382 TEST_EQUAL( psa_hash_update( &init, input, sizeof( input ) ),
1383 PSA_ERROR_BAD_STATE );
1384 TEST_EQUAL( psa_hash_update( &zero, input, sizeof( input ) ),
1385 PSA_ERROR_BAD_STATE );
1386
Jaeden Amero5229bbb2019-02-07 16:33:37 +00001387 /* A default hash operation should be abortable without error. */
1388 PSA_ASSERT( psa_hash_abort( &func ) );
1389 PSA_ASSERT( psa_hash_abort( &init ) );
1390 PSA_ASSERT( psa_hash_abort( &zero ) );
Jaeden Amero6a25b412019-01-04 11:47:44 +00001391}
1392/* END_CASE */
1393
1394/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001395void hash_setup( int alg_arg,
1396 int expected_status_arg )
1397{
1398 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001399 psa_status_t expected_status = expected_status_arg;
Jaeden Amero6a25b412019-01-04 11:47:44 +00001400 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001401 psa_status_t status;
1402
Gilles Peskine8817f612018-12-18 00:18:46 +01001403 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001404
Gilles Peskineda8191d1c2018-07-08 19:46:38 +02001405 status = psa_hash_setup( &operation, alg );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001406 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001407
Gilles Peskine9e0a4a52019-02-25 22:11:18 +01001408 /* Whether setup succeeded or failed, abort must succeed. */
1409 PSA_ASSERT( psa_hash_abort( &operation ) );
1410
1411 /* If setup failed, reproduce the failure, so as to
1412 * test the resulting state of the operation object. */
1413 if( status != PSA_SUCCESS )
1414 TEST_EQUAL( psa_hash_setup( &operation, alg ), status );
1415
Gilles Peskinef426e0f2019-02-25 17:42:03 +01001416 /* Now the operation object should be reusable. */
1417#if defined(KNOWN_SUPPORTED_HASH_ALG)
1418 PSA_ASSERT( psa_hash_setup( &operation, KNOWN_SUPPORTED_HASH_ALG ) );
1419 PSA_ASSERT( psa_hash_abort( &operation ) );
1420#endif
1421
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001422exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001423 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001424}
1425/* END_CASE */
1426
1427/* BEGIN_CASE */
Gilles Peskine0a749c82019-11-28 19:33:58 +01001428void hash_compute_fail( int alg_arg, data_t *input,
1429 int output_size_arg, int expected_status_arg )
1430{
1431 psa_algorithm_t alg = alg_arg;
1432 uint8_t *output = NULL;
1433 size_t output_size = output_size_arg;
1434 size_t output_length = INVALID_EXPORT_LENGTH;
1435 psa_status_t expected_status = expected_status_arg;
1436 psa_status_t status;
1437
1438 ASSERT_ALLOC( output, output_size );
1439
1440 PSA_ASSERT( psa_crypto_init( ) );
1441
1442 status = psa_hash_compute( alg, input->x, input->len,
1443 output, output_size, &output_length );
1444 TEST_EQUAL( status, expected_status );
1445 TEST_ASSERT( output_length <= output_size );
1446
1447exit:
1448 mbedtls_free( output );
1449 PSA_DONE( );
1450}
1451/* END_CASE */
1452
1453/* BEGIN_CASE */
Gilles Peskine88e08462020-01-28 20:43:00 +01001454void hash_compare_fail( int alg_arg, data_t *input,
1455 data_t *reference_hash,
1456 int expected_status_arg )
1457{
1458 psa_algorithm_t alg = alg_arg;
1459 psa_status_t expected_status = expected_status_arg;
1460 psa_status_t status;
1461
1462 PSA_ASSERT( psa_crypto_init( ) );
1463
1464 status = psa_hash_compare( alg, input->x, input->len,
1465 reference_hash->x, reference_hash->len );
1466 TEST_EQUAL( status, expected_status );
1467
1468exit:
1469 PSA_DONE( );
1470}
1471/* END_CASE */
1472
1473/* BEGIN_CASE */
Gilles Peskine0a749c82019-11-28 19:33:58 +01001474void hash_compute_compare( int alg_arg, data_t *input,
1475 data_t *expected_output )
1476{
1477 psa_algorithm_t alg = alg_arg;
1478 uint8_t output[PSA_HASH_MAX_SIZE + 1];
1479 size_t output_length = INVALID_EXPORT_LENGTH;
1480 size_t i;
1481
1482 PSA_ASSERT( psa_crypto_init( ) );
1483
1484 /* Compute with tight buffer */
1485 PSA_ASSERT( psa_hash_compute( alg, input->x, input->len,
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001486 output, PSA_HASH_LENGTH( alg ),
Gilles Peskine0a749c82019-11-28 19:33:58 +01001487 &output_length ) );
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001488 TEST_EQUAL( output_length, PSA_HASH_LENGTH( alg ) );
Gilles Peskine0a749c82019-11-28 19:33:58 +01001489 ASSERT_COMPARE( output, output_length,
1490 expected_output->x, expected_output->len );
1491
1492 /* Compute with larger buffer */
1493 PSA_ASSERT( psa_hash_compute( alg, input->x, input->len,
1494 output, sizeof( output ),
1495 &output_length ) );
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001496 TEST_EQUAL( output_length, PSA_HASH_LENGTH( alg ) );
Gilles Peskine0a749c82019-11-28 19:33:58 +01001497 ASSERT_COMPARE( output, output_length,
1498 expected_output->x, expected_output->len );
1499
1500 /* Compare with correct hash */
1501 PSA_ASSERT( psa_hash_compare( alg, input->x, input->len,
1502 output, output_length ) );
1503
1504 /* Compare with trailing garbage */
1505 TEST_EQUAL( psa_hash_compare( alg, input->x, input->len,
1506 output, output_length + 1 ),
1507 PSA_ERROR_INVALID_SIGNATURE );
1508
1509 /* Compare with truncated hash */
1510 TEST_EQUAL( psa_hash_compare( alg, input->x, input->len,
1511 output, output_length - 1 ),
1512 PSA_ERROR_INVALID_SIGNATURE );
1513
1514 /* Compare with corrupted value */
1515 for( i = 0; i < output_length; i++ )
1516 {
Chris Jones9634bb12021-01-20 15:56:42 +00001517 mbedtls_test_set_step( i );
Gilles Peskine0a749c82019-11-28 19:33:58 +01001518 output[i] ^= 1;
1519 TEST_EQUAL( psa_hash_compare( alg, input->x, input->len,
1520 output, output_length ),
1521 PSA_ERROR_INVALID_SIGNATURE );
1522 output[i] ^= 1;
1523 }
1524
1525exit:
1526 PSA_DONE( );
1527}
1528/* END_CASE */
1529
Gilles Peskined6dc40c2021-01-12 12:55:31 +01001530/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
itayzafrirf86548d2018-11-01 10:44:32 +02001531void hash_bad_order( )
1532{
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001533 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrirf86548d2018-11-01 10:44:32 +02001534 unsigned char input[] = "";
1535 /* SHA-256 hash of an empty string */
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001536 const unsigned char valid_hash[] = {
itayzafrirf86548d2018-11-01 10:44:32 +02001537 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
1538 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
1539 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55 };
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001540 unsigned char hash[sizeof(valid_hash)] = { 0 };
itayzafrirf86548d2018-11-01 10:44:32 +02001541 size_t hash_len;
Jaeden Amero6a25b412019-01-04 11:47:44 +00001542 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirf86548d2018-11-01 10:44:32 +02001543
Gilles Peskine8817f612018-12-18 00:18:46 +01001544 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirf86548d2018-11-01 10:44:32 +02001545
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001546 /* Call setup twice in a row. */
1547 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001548 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001549 TEST_EQUAL( psa_hash_setup( &operation, alg ),
1550 PSA_ERROR_BAD_STATE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001551 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001552 PSA_ASSERT( psa_hash_abort( &operation ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001553 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001554
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001555 /* Call update without calling setup beforehand. */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001556 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001557 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001558 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02001559
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001560 /* Check that update calls abort on error. */
1561 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Dave Rodgman6f710582021-06-24 18:14:52 +01001562 operation.id = UINT_MAX;
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001563 ASSERT_OPERATION_IS_ACTIVE( operation );
1564 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
1565 PSA_ERROR_BAD_STATE );
1566 ASSERT_OPERATION_IS_INACTIVE( operation );
1567 PSA_ASSERT( psa_hash_abort( &operation ) );
1568 ASSERT_OPERATION_IS_INACTIVE( operation );
1569
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001570 /* Call update after finish. */
1571 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
1572 PSA_ASSERT( psa_hash_finish( &operation,
1573 hash, sizeof( hash ), &hash_len ) );
1574 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001575 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001576 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02001577
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001578 /* Call verify without calling setup beforehand. */
1579 TEST_EQUAL( psa_hash_verify( &operation,
1580 valid_hash, sizeof( valid_hash ) ),
1581 PSA_ERROR_BAD_STATE );
1582 PSA_ASSERT( psa_hash_abort( &operation ) );
1583
1584 /* Call verify after finish. */
1585 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
1586 PSA_ASSERT( psa_hash_finish( &operation,
1587 hash, sizeof( hash ), &hash_len ) );
1588 TEST_EQUAL( psa_hash_verify( &operation,
1589 valid_hash, sizeof( valid_hash ) ),
1590 PSA_ERROR_BAD_STATE );
1591 PSA_ASSERT( psa_hash_abort( &operation ) );
1592
1593 /* Call verify twice in a row. */
1594 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001595 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001596 PSA_ASSERT( psa_hash_verify( &operation,
1597 valid_hash, sizeof( valid_hash ) ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001598 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001599 TEST_EQUAL( psa_hash_verify( &operation,
1600 valid_hash, sizeof( valid_hash ) ),
1601 PSA_ERROR_BAD_STATE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001602 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001603 PSA_ASSERT( psa_hash_abort( &operation ) );
1604
1605 /* Call finish without calling setup beforehand. */
Gilles Peskinefe11b722018-12-18 00:24:04 +01001606 TEST_EQUAL( psa_hash_finish( &operation,
1607 hash, sizeof( hash ), &hash_len ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001608 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001609 PSA_ASSERT( psa_hash_abort( &operation ) );
1610
1611 /* Call finish twice in a row. */
1612 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
1613 PSA_ASSERT( psa_hash_finish( &operation,
1614 hash, sizeof( hash ), &hash_len ) );
1615 TEST_EQUAL( psa_hash_finish( &operation,
1616 hash, sizeof( hash ), &hash_len ),
1617 PSA_ERROR_BAD_STATE );
1618 PSA_ASSERT( psa_hash_abort( &operation ) );
1619
1620 /* Call finish after calling verify. */
1621 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
1622 PSA_ASSERT( psa_hash_verify( &operation,
1623 valid_hash, sizeof( valid_hash ) ) );
1624 TEST_EQUAL( psa_hash_finish( &operation,
1625 hash, sizeof( hash ), &hash_len ),
1626 PSA_ERROR_BAD_STATE );
1627 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02001628
1629exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001630 PSA_DONE( );
itayzafrirf86548d2018-11-01 10:44:32 +02001631}
1632/* END_CASE */
1633
Gilles Peskined6dc40c2021-01-12 12:55:31 +01001634/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
itayzafrir27e69452018-11-01 14:26:34 +02001635void hash_verify_bad_args( )
itayzafrirec93d302018-10-18 18:01:10 +03001636{
1637 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrir27e69452018-11-01 14:26:34 +02001638 /* SHA-256 hash of an empty string with 2 extra bytes (0xaa and 0xbb)
1639 * appended to it */
1640 unsigned char hash[] = {
1641 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
1642 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
1643 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55, 0xaa, 0xbb };
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001644 size_t expected_size = PSA_HASH_LENGTH( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00001645 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirec93d302018-10-18 18:01:10 +03001646
Gilles Peskine8817f612018-12-18 00:18:46 +01001647 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirec93d302018-10-18 18:01:10 +03001648
itayzafrir27e69452018-11-01 14:26:34 +02001649 /* psa_hash_verify with a smaller hash than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01001650 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001651 ASSERT_OPERATION_IS_ACTIVE( operation );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001652 TEST_EQUAL( psa_hash_verify( &operation, hash, expected_size - 1 ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01001653 PSA_ERROR_INVALID_SIGNATURE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001654 ASSERT_OPERATION_IS_INACTIVE( operation );
1655 PSA_ASSERT( psa_hash_abort( &operation ) );
1656 ASSERT_OPERATION_IS_INACTIVE( operation );
itayzafrirec93d302018-10-18 18:01:10 +03001657
itayzafrir27e69452018-11-01 14:26:34 +02001658 /* psa_hash_verify with a non-matching hash */
Gilles Peskine8817f612018-12-18 00:18:46 +01001659 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001660 TEST_EQUAL( psa_hash_verify( &operation, hash + 1, expected_size ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01001661 PSA_ERROR_INVALID_SIGNATURE );
itayzafrirec93d302018-10-18 18:01:10 +03001662
itayzafrir27e69452018-11-01 14:26:34 +02001663 /* psa_hash_verify with a hash longer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01001664 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001665 TEST_EQUAL( psa_hash_verify( &operation, hash, sizeof( hash ) ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01001666 PSA_ERROR_INVALID_SIGNATURE );
itayzafrir4271df92018-10-24 18:16:19 +03001667
itayzafrirec93d302018-10-18 18:01:10 +03001668exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001669 PSA_DONE( );
itayzafrirec93d302018-10-18 18:01:10 +03001670}
1671/* END_CASE */
1672
Ronald Cronee414c72021-03-18 18:50:08 +01001673/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
itayzafrirb2dd5ed2018-11-01 11:58:59 +02001674void hash_finish_bad_args( )
itayzafrir58028322018-10-25 10:22:01 +03001675{
1676 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrirb2dd5ed2018-11-01 11:58:59 +02001677 unsigned char hash[PSA_HASH_MAX_SIZE];
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001678 size_t expected_size = PSA_HASH_LENGTH( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00001679 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrir58028322018-10-25 10:22:01 +03001680 size_t hash_len;
1681
Gilles Peskine8817f612018-12-18 00:18:46 +01001682 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir58028322018-10-25 10:22:01 +03001683
itayzafrir58028322018-10-25 10:22:01 +03001684 /* psa_hash_finish with a smaller hash buffer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01001685 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001686 TEST_EQUAL( psa_hash_finish( &operation,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001687 hash, expected_size - 1, &hash_len ),
1688 PSA_ERROR_BUFFER_TOO_SMALL );
itayzafrir58028322018-10-25 10:22:01 +03001689
1690exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001691 PSA_DONE( );
itayzafrir58028322018-10-25 10:22:01 +03001692}
1693/* END_CASE */
1694
Ronald Cronee414c72021-03-18 18:50:08 +01001695/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01001696void hash_clone_source_state( )
1697{
1698 psa_algorithm_t alg = PSA_ALG_SHA_256;
1699 unsigned char hash[PSA_HASH_MAX_SIZE];
1700 psa_hash_operation_t op_source = PSA_HASH_OPERATION_INIT;
1701 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
1702 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
1703 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
1704 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
1705 size_t hash_len;
1706
1707 PSA_ASSERT( psa_crypto_init( ) );
1708 PSA_ASSERT( psa_hash_setup( &op_source, alg ) );
1709
1710 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
1711 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
1712 PSA_ASSERT( psa_hash_finish( &op_finished,
1713 hash, sizeof( hash ), &hash_len ) );
1714 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
1715 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
1716
1717 TEST_EQUAL( psa_hash_clone( &op_source, &op_setup ),
1718 PSA_ERROR_BAD_STATE );
1719
1720 PSA_ASSERT( psa_hash_clone( &op_source, &op_init ) );
1721 PSA_ASSERT( psa_hash_finish( &op_init,
1722 hash, sizeof( hash ), &hash_len ) );
1723 PSA_ASSERT( psa_hash_clone( &op_source, &op_finished ) );
1724 PSA_ASSERT( psa_hash_finish( &op_finished,
1725 hash, sizeof( hash ), &hash_len ) );
1726 PSA_ASSERT( psa_hash_clone( &op_source, &op_aborted ) );
1727 PSA_ASSERT( psa_hash_finish( &op_aborted,
1728 hash, sizeof( hash ), &hash_len ) );
1729
1730exit:
1731 psa_hash_abort( &op_source );
1732 psa_hash_abort( &op_init );
1733 psa_hash_abort( &op_setup );
1734 psa_hash_abort( &op_finished );
1735 psa_hash_abort( &op_aborted );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001736 PSA_DONE( );
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01001737}
1738/* END_CASE */
1739
Ronald Cronee414c72021-03-18 18:50:08 +01001740/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01001741void hash_clone_target_state( )
1742{
1743 psa_algorithm_t alg = PSA_ALG_SHA_256;
1744 unsigned char hash[PSA_HASH_MAX_SIZE];
1745 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
1746 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
1747 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
1748 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
1749 psa_hash_operation_t op_target = PSA_HASH_OPERATION_INIT;
1750 size_t hash_len;
1751
1752 PSA_ASSERT( psa_crypto_init( ) );
1753
1754 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
1755 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
1756 PSA_ASSERT( psa_hash_finish( &op_finished,
1757 hash, sizeof( hash ), &hash_len ) );
1758 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
1759 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
1760
1761 PSA_ASSERT( psa_hash_clone( &op_setup, &op_target ) );
1762 PSA_ASSERT( psa_hash_finish( &op_target,
1763 hash, sizeof( hash ), &hash_len ) );
1764
1765 TEST_EQUAL( psa_hash_clone( &op_init, &op_target ), PSA_ERROR_BAD_STATE );
1766 TEST_EQUAL( psa_hash_clone( &op_finished, &op_target ),
1767 PSA_ERROR_BAD_STATE );
1768 TEST_EQUAL( psa_hash_clone( &op_aborted, &op_target ),
1769 PSA_ERROR_BAD_STATE );
1770
1771exit:
1772 psa_hash_abort( &op_target );
1773 psa_hash_abort( &op_init );
1774 psa_hash_abort( &op_setup );
1775 psa_hash_abort( &op_finished );
1776 psa_hash_abort( &op_aborted );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001777 PSA_DONE( );
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01001778}
1779/* END_CASE */
1780
itayzafrir58028322018-10-25 10:22:01 +03001781/* BEGIN_CASE */
Jaeden Amero769ce272019-01-04 11:48:03 +00001782void mac_operation_init( )
1783{
Jaeden Amero252ef282019-02-15 14:05:35 +00001784 const uint8_t input[1] = { 0 };
1785
Jaeden Amero769ce272019-01-04 11:48:03 +00001786 /* Test each valid way of initializing the object, except for `= {0}`, as
1787 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
1788 * though it's OK by the C standard. We could test for this, but we'd need
1789 * to supress the Clang warning for the test. */
1790 psa_mac_operation_t func = psa_mac_operation_init( );
1791 psa_mac_operation_t init = PSA_MAC_OPERATION_INIT;
1792 psa_mac_operation_t zero;
1793
1794 memset( &zero, 0, sizeof( zero ) );
1795
Jaeden Amero252ef282019-02-15 14:05:35 +00001796 /* A freshly-initialized MAC operation should not be usable. */
1797 TEST_EQUAL( psa_mac_update( &func,
1798 input, sizeof( input ) ),
1799 PSA_ERROR_BAD_STATE );
1800 TEST_EQUAL( psa_mac_update( &init,
1801 input, sizeof( input ) ),
1802 PSA_ERROR_BAD_STATE );
1803 TEST_EQUAL( psa_mac_update( &zero,
1804 input, sizeof( input ) ),
1805 PSA_ERROR_BAD_STATE );
1806
Jaeden Amero5229bbb2019-02-07 16:33:37 +00001807 /* A default MAC operation should be abortable without error. */
1808 PSA_ASSERT( psa_mac_abort( &func ) );
1809 PSA_ASSERT( psa_mac_abort( &init ) );
1810 PSA_ASSERT( psa_mac_abort( &zero ) );
Jaeden Amero769ce272019-01-04 11:48:03 +00001811}
1812/* END_CASE */
1813
1814/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001815void mac_setup( int key_type_arg,
1816 data_t *key,
1817 int alg_arg,
1818 int expected_status_arg )
1819{
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001820 psa_key_type_t key_type = key_type_arg;
1821 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001822 psa_status_t expected_status = expected_status_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00001823 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskinef426e0f2019-02-25 17:42:03 +01001824 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
1825#if defined(KNOWN_SUPPORTED_MAC_ALG)
1826 const uint8_t smoke_test_key_data[16] = "kkkkkkkkkkkkkkkk";
1827#endif
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001828
Gilles Peskine8817f612018-12-18 00:18:46 +01001829 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001830
Gilles Peskinef426e0f2019-02-25 17:42:03 +01001831 if( ! exercise_mac_setup( key_type, key->x, key->len, alg,
1832 &operation, &status ) )
1833 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +01001834 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001835
Gilles Peskinef426e0f2019-02-25 17:42:03 +01001836 /* The operation object should be reusable. */
1837#if defined(KNOWN_SUPPORTED_MAC_ALG)
1838 if( ! exercise_mac_setup( KNOWN_SUPPORTED_MAC_KEY_TYPE,
1839 smoke_test_key_data,
1840 sizeof( smoke_test_key_data ),
1841 KNOWN_SUPPORTED_MAC_ALG,
1842 &operation, &status ) )
1843 goto exit;
1844 TEST_EQUAL( status, PSA_SUCCESS );
1845#endif
1846
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001847exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001848 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001849}
1850/* END_CASE */
1851
Gilles Peskined6dc40c2021-01-12 12:55:31 +01001852/* BEGIN_CASE depends_on:PSA_WANT_KEY_TYPE_HMAC:PSA_WANT_ALG_HMAC:PSA_WANT_ALG_SHA_256 */
Jaeden Amero252ef282019-02-15 14:05:35 +00001853void mac_bad_order( )
1854{
Ronald Cron5425a212020-08-04 14:58:35 +02001855 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Jaeden Amero252ef282019-02-15 14:05:35 +00001856 psa_key_type_t key_type = PSA_KEY_TYPE_HMAC;
1857 psa_algorithm_t alg = PSA_ALG_HMAC(PSA_ALG_SHA_256);
Ronald Cron5425a212020-08-04 14:58:35 +02001858 const uint8_t key_data[] = {
Jaeden Amero252ef282019-02-15 14:05:35 +00001859 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1860 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1861 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001862 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Amero252ef282019-02-15 14:05:35 +00001863 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
1864 uint8_t sign_mac[PSA_MAC_MAX_SIZE + 10] = { 0 };
1865 size_t sign_mac_length = 0;
1866 const uint8_t input[] = { 0xbb, 0xbb, 0xbb, 0xbb };
1867 const uint8_t verify_mac[] = {
1868 0x74, 0x65, 0x93, 0x8c, 0xeb, 0x1d, 0xb3, 0x76, 0x5a, 0x38, 0xe7, 0xdd,
1869 0x85, 0xc5, 0xad, 0x4f, 0x07, 0xe7, 0xd5, 0xb2, 0x64, 0xf0, 0x1a, 0x1a,
1870 0x2c, 0xf9, 0x18, 0xca, 0x59, 0x7e, 0x5d, 0xf6 };
1871
1872 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001873 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001874 psa_set_key_algorithm( &attributes, alg );
1875 psa_set_key_type( &attributes, key_type );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001876
Ronald Cron5425a212020-08-04 14:58:35 +02001877 PSA_ASSERT( psa_import_key( &attributes, key_data, sizeof( key_data ),
1878 &key ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001879
Jaeden Amero252ef282019-02-15 14:05:35 +00001880 /* Call update without calling setup beforehand. */
1881 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
1882 PSA_ERROR_BAD_STATE );
1883 PSA_ASSERT( psa_mac_abort( &operation ) );
1884
1885 /* Call sign finish without calling setup beforehand. */
1886 TEST_EQUAL( psa_mac_sign_finish( &operation, sign_mac, sizeof( sign_mac ),
1887 &sign_mac_length),
1888 PSA_ERROR_BAD_STATE );
1889 PSA_ASSERT( psa_mac_abort( &operation ) );
1890
1891 /* Call verify finish without calling setup beforehand. */
1892 TEST_EQUAL( psa_mac_verify_finish( &operation,
1893 verify_mac, sizeof( verify_mac ) ),
1894 PSA_ERROR_BAD_STATE );
1895 PSA_ASSERT( psa_mac_abort( &operation ) );
1896
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001897 /* Call setup twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02001898 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001899 ASSERT_OPERATION_IS_ACTIVE( operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001900 TEST_EQUAL( psa_mac_sign_setup( &operation, key, alg ),
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001901 PSA_ERROR_BAD_STATE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001902 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001903 PSA_ASSERT( psa_mac_abort( &operation ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01001904 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001905
Jaeden Amero252ef282019-02-15 14:05:35 +00001906 /* Call update after sign finish. */
Ronald Cron5425a212020-08-04 14:58:35 +02001907 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001908 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
1909 PSA_ASSERT( psa_mac_sign_finish( &operation,
1910 sign_mac, sizeof( sign_mac ),
1911 &sign_mac_length ) );
1912 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
1913 PSA_ERROR_BAD_STATE );
1914 PSA_ASSERT( psa_mac_abort( &operation ) );
1915
1916 /* Call update after verify finish. */
Ronald Cron5425a212020-08-04 14:58:35 +02001917 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001918 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
1919 PSA_ASSERT( psa_mac_verify_finish( &operation,
1920 verify_mac, sizeof( verify_mac ) ) );
1921 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
1922 PSA_ERROR_BAD_STATE );
1923 PSA_ASSERT( psa_mac_abort( &operation ) );
1924
1925 /* Call sign finish twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02001926 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001927 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
1928 PSA_ASSERT( psa_mac_sign_finish( &operation,
1929 sign_mac, sizeof( sign_mac ),
1930 &sign_mac_length ) );
1931 TEST_EQUAL( psa_mac_sign_finish( &operation,
1932 sign_mac, sizeof( sign_mac ),
1933 &sign_mac_length ),
1934 PSA_ERROR_BAD_STATE );
1935 PSA_ASSERT( psa_mac_abort( &operation ) );
1936
1937 /* Call verify finish twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02001938 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001939 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
1940 PSA_ASSERT( psa_mac_verify_finish( &operation,
1941 verify_mac, sizeof( verify_mac ) ) );
1942 TEST_EQUAL( psa_mac_verify_finish( &operation,
1943 verify_mac, sizeof( verify_mac ) ),
1944 PSA_ERROR_BAD_STATE );
1945 PSA_ASSERT( psa_mac_abort( &operation ) );
1946
1947 /* Setup sign but try verify. */
Ronald Cron5425a212020-08-04 14:58:35 +02001948 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001949 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01001950 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Amero252ef282019-02-15 14:05:35 +00001951 TEST_EQUAL( psa_mac_verify_finish( &operation,
1952 verify_mac, sizeof( verify_mac ) ),
1953 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01001954 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero252ef282019-02-15 14:05:35 +00001955 PSA_ASSERT( psa_mac_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01001956 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero252ef282019-02-15 14:05:35 +00001957
1958 /* Setup verify but try sign. */
Ronald Cron5425a212020-08-04 14:58:35 +02001959 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001960 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01001961 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Amero252ef282019-02-15 14:05:35 +00001962 TEST_EQUAL( psa_mac_sign_finish( &operation,
1963 sign_mac, sizeof( sign_mac ),
1964 &sign_mac_length ),
1965 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01001966 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero252ef282019-02-15 14:05:35 +00001967 PSA_ASSERT( psa_mac_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01001968 ASSERT_OPERATION_IS_INACTIVE( operation );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001969
Ronald Cron5425a212020-08-04 14:58:35 +02001970 PSA_ASSERT( psa_destroy_key( key ) );
Gilles Peskine76b29a72019-05-28 14:08:50 +02001971
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001972exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001973 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001974}
1975/* END_CASE */
1976
1977/* BEGIN_CASE */
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001978void mac_sign( int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02001979 data_t *key_data,
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001980 int alg_arg,
1981 data_t *input,
1982 data_t *expected_mac )
1983{
Ronald Cron5425a212020-08-04 14:58:35 +02001984 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001985 psa_key_type_t key_type = key_type_arg;
1986 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00001987 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001988 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine5e65cec2020-08-25 23:38:39 +02001989 uint8_t *actual_mac = NULL;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001990 size_t mac_buffer_size =
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001991 PSA_MAC_LENGTH( key_type, PSA_BYTES_TO_BITS( key_data->len ), alg );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001992 size_t mac_length = 0;
Gilles Peskine8b356b52020-08-25 23:44:59 +02001993 const size_t output_sizes_to_test[] = {
1994 0,
1995 1,
1996 expected_mac->len - 1,
1997 expected_mac->len,
1998 expected_mac->len + 1,
1999 };
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002000
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002001 TEST_ASSERT( mac_buffer_size <= PSA_MAC_MAX_SIZE );
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002002 /* We expect PSA_MAC_LENGTH to be exact. */
Gilles Peskine3d404d62020-08-25 23:47:36 +02002003 TEST_ASSERT( expected_mac->len == mac_buffer_size );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002004
Gilles Peskine8817f612018-12-18 00:18:46 +01002005 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002006
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01002007 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002008 psa_set_key_algorithm( &attributes, alg );
2009 psa_set_key_type( &attributes, key_type );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002010
Ronald Cron5425a212020-08-04 14:58:35 +02002011 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2012 &key ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002013
Gilles Peskine8b356b52020-08-25 23:44:59 +02002014 for( size_t i = 0; i < ARRAY_LENGTH( output_sizes_to_test ); i++ )
2015 {
2016 const size_t output_size = output_sizes_to_test[i];
2017 psa_status_t expected_status =
2018 ( output_size >= expected_mac->len ? PSA_SUCCESS :
2019 PSA_ERROR_BUFFER_TOO_SMALL );
Gilles Peskine5e65cec2020-08-25 23:38:39 +02002020
Chris Jones9634bb12021-01-20 15:56:42 +00002021 mbedtls_test_set_step( output_size );
Gilles Peskine8b356b52020-08-25 23:44:59 +02002022 ASSERT_ALLOC( actual_mac, output_size );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002023
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002024 /* Calculate the MAC, one-shot case. */
2025 TEST_EQUAL( psa_mac_compute( key, alg,
2026 input->x, input->len,
2027 actual_mac, output_size, &mac_length ),
2028 expected_status );
2029 if( expected_status == PSA_SUCCESS )
2030 {
2031 ASSERT_COMPARE( expected_mac->x, expected_mac->len,
2032 actual_mac, mac_length );
2033 }
2034
2035 if( output_size > 0 )
2036 memset( actual_mac, 0, output_size );
2037
2038 /* Calculate the MAC, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002039 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Gilles Peskine8b356b52020-08-25 23:44:59 +02002040 PSA_ASSERT( psa_mac_update( &operation,
2041 input->x, input->len ) );
2042 TEST_EQUAL( psa_mac_sign_finish( &operation,
2043 actual_mac, output_size,
2044 &mac_length ),
2045 expected_status );
2046 PSA_ASSERT( psa_mac_abort( &operation ) );
2047
2048 if( expected_status == PSA_SUCCESS )
2049 {
2050 ASSERT_COMPARE( expected_mac->x, expected_mac->len,
2051 actual_mac, mac_length );
2052 }
2053 mbedtls_free( actual_mac );
2054 actual_mac = NULL;
2055 }
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002056
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002057exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002058 psa_mac_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002059 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002060 PSA_DONE( );
Gilles Peskine5e65cec2020-08-25 23:38:39 +02002061 mbedtls_free( actual_mac );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002062}
2063/* END_CASE */
2064
2065/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002066void mac_verify( int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002067 data_t *key_data,
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002068 int alg_arg,
2069 data_t *input,
2070 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +01002071{
Ronald Cron5425a212020-08-04 14:58:35 +02002072 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002073 psa_key_type_t key_type = key_type_arg;
2074 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002075 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002076 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002077 uint8_t *perturbed_mac = NULL;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002078
Gilles Peskine69c12672018-06-28 00:07:19 +02002079 TEST_ASSERT( expected_mac->len <= PSA_MAC_MAX_SIZE );
2080
Gilles Peskine8817f612018-12-18 00:18:46 +01002081 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002082
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01002083 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002084 psa_set_key_algorithm( &attributes, alg );
2085 psa_set_key_type( &attributes, key_type );
mohammad16036df908f2018-04-02 08:34:15 -07002086
Ronald Cron5425a212020-08-04 14:58:35 +02002087 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2088 &key ) );
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002089
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002090 /* Verify correct MAC, one-shot case. */
2091 PSA_ASSERT( psa_mac_verify( key, alg, input->x, input->len,
2092 expected_mac->x, expected_mac->len ) );
2093
2094 /* Verify correct MAC, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002095 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine8817f612018-12-18 00:18:46 +01002096 PSA_ASSERT( psa_mac_update( &operation,
2097 input->x, input->len ) );
2098 PSA_ASSERT( psa_mac_verify_finish( &operation,
2099 expected_mac->x,
2100 expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002101
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002102 /* Test a MAC that's too short, one-shot case. */
2103 TEST_EQUAL( psa_mac_verify( key, alg,
2104 input->x, input->len,
2105 expected_mac->x,
2106 expected_mac->len - 1 ),
2107 PSA_ERROR_INVALID_SIGNATURE );
2108
2109 /* Test a MAC that's too short, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002110 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002111 PSA_ASSERT( psa_mac_update( &operation,
2112 input->x, input->len ) );
2113 TEST_EQUAL( psa_mac_verify_finish( &operation,
2114 expected_mac->x,
2115 expected_mac->len - 1 ),
2116 PSA_ERROR_INVALID_SIGNATURE );
2117
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002118 /* Test a MAC that's too long, one-shot case. */
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002119 ASSERT_ALLOC( perturbed_mac, expected_mac->len + 1 );
2120 memcpy( perturbed_mac, expected_mac->x, expected_mac->len );
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002121 TEST_EQUAL( psa_mac_verify( key, alg,
2122 input->x, input->len,
2123 perturbed_mac, expected_mac->len + 1 ),
2124 PSA_ERROR_INVALID_SIGNATURE );
2125
2126 /* Test a MAC that's too long, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002127 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002128 PSA_ASSERT( psa_mac_update( &operation,
2129 input->x, input->len ) );
2130 TEST_EQUAL( psa_mac_verify_finish( &operation,
2131 perturbed_mac,
2132 expected_mac->len + 1 ),
2133 PSA_ERROR_INVALID_SIGNATURE );
2134
2135 /* Test changing one byte. */
2136 for( size_t i = 0; i < expected_mac->len; i++ )
2137 {
Chris Jones9634bb12021-01-20 15:56:42 +00002138 mbedtls_test_set_step( i );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002139 perturbed_mac[i] ^= 1;
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002140
2141 TEST_EQUAL( psa_mac_verify( key, alg,
2142 input->x, input->len,
2143 perturbed_mac, expected_mac->len ),
2144 PSA_ERROR_INVALID_SIGNATURE );
2145
Ronald Cron5425a212020-08-04 14:58:35 +02002146 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002147 PSA_ASSERT( psa_mac_update( &operation,
2148 input->x, input->len ) );
2149 TEST_EQUAL( psa_mac_verify_finish( &operation,
2150 perturbed_mac,
2151 expected_mac->len ),
2152 PSA_ERROR_INVALID_SIGNATURE );
2153 perturbed_mac[i] ^= 1;
2154 }
2155
Gilles Peskine8c9def32018-02-08 10:02:12 +01002156exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002157 psa_mac_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002158 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002159 PSA_DONE( );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002160 mbedtls_free( perturbed_mac );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002161}
2162/* END_CASE */
2163
2164/* BEGIN_CASE */
Jaeden Amero5bae2272019-01-04 11:48:27 +00002165void cipher_operation_init( )
2166{
Jaeden Ameroab439972019-02-15 14:12:05 +00002167 const uint8_t input[1] = { 0 };
2168 unsigned char output[1] = { 0 };
2169 size_t output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002170 /* Test each valid way of initializing the object, except for `= {0}`, as
2171 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
2172 * though it's OK by the C standard. We could test for this, but we'd need
2173 * to supress the Clang warning for the test. */
2174 psa_cipher_operation_t func = psa_cipher_operation_init( );
2175 psa_cipher_operation_t init = PSA_CIPHER_OPERATION_INIT;
2176 psa_cipher_operation_t zero;
2177
2178 memset( &zero, 0, sizeof( zero ) );
2179
Jaeden Ameroab439972019-02-15 14:12:05 +00002180 /* A freshly-initialized cipher operation should not be usable. */
2181 TEST_EQUAL( psa_cipher_update( &func,
2182 input, sizeof( input ),
2183 output, sizeof( output ),
2184 &output_length ),
2185 PSA_ERROR_BAD_STATE );
2186 TEST_EQUAL( psa_cipher_update( &init,
2187 input, sizeof( input ),
2188 output, sizeof( output ),
2189 &output_length ),
2190 PSA_ERROR_BAD_STATE );
2191 TEST_EQUAL( psa_cipher_update( &zero,
2192 input, sizeof( input ),
2193 output, sizeof( output ),
2194 &output_length ),
2195 PSA_ERROR_BAD_STATE );
2196
Jaeden Amero5229bbb2019-02-07 16:33:37 +00002197 /* A default cipher operation should be abortable without error. */
2198 PSA_ASSERT( psa_cipher_abort( &func ) );
2199 PSA_ASSERT( psa_cipher_abort( &init ) );
2200 PSA_ASSERT( psa_cipher_abort( &zero ) );
Jaeden Amero5bae2272019-01-04 11:48:27 +00002201}
2202/* END_CASE */
2203
2204/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002205void cipher_setup( int key_type_arg,
2206 data_t *key,
2207 int alg_arg,
2208 int expected_status_arg )
2209{
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002210 psa_key_type_t key_type = key_type_arg;
2211 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002212 psa_status_t expected_status = expected_status_arg;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002213 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002214 psa_status_t status;
Gilles Peskine612ffd22021-01-20 18:51:00 +01002215#if defined(KNOWN_SUPPORTED_CIPHER_ALG)
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002216 const uint8_t smoke_test_key_data[16] = "kkkkkkkkkkkkkkkk";
2217#endif
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002218
Gilles Peskine8817f612018-12-18 00:18:46 +01002219 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002220
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002221 if( ! exercise_cipher_setup( key_type, key->x, key->len, alg,
2222 &operation, &status ) )
2223 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002224 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002225
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002226 /* The operation object should be reusable. */
2227#if defined(KNOWN_SUPPORTED_CIPHER_ALG)
2228 if( ! exercise_cipher_setup( KNOWN_SUPPORTED_CIPHER_KEY_TYPE,
2229 smoke_test_key_data,
2230 sizeof( smoke_test_key_data ),
2231 KNOWN_SUPPORTED_CIPHER_ALG,
2232 &operation, &status ) )
2233 goto exit;
2234 TEST_EQUAL( status, PSA_SUCCESS );
2235#endif
2236
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002237exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002238 psa_cipher_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002239 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002240}
2241/* END_CASE */
2242
Ronald Cronee414c72021-03-18 18:50:08 +01002243/* BEGIN_CASE depends_on:PSA_WANT_KEY_TYPE_AES:PSA_WANT_ALG_CBC_PKCS7 */
Jaeden Ameroab439972019-02-15 14:12:05 +00002244void cipher_bad_order( )
2245{
Ronald Cron5425a212020-08-04 14:58:35 +02002246 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Jaeden Ameroab439972019-02-15 14:12:05 +00002247 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
2248 psa_algorithm_t alg = PSA_ALG_CBC_PKCS7;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002249 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Ameroab439972019-02-15 14:12:05 +00002250 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002251 unsigned char iv[PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES)] = { 0 };
Ronald Cron5425a212020-08-04 14:58:35 +02002252 const uint8_t key_data[] = {
Jaeden Ameroab439972019-02-15 14:12:05 +00002253 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2254 0xaa, 0xaa, 0xaa, 0xaa };
2255 const uint8_t text[] = {
2256 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2257 0xbb, 0xbb, 0xbb, 0xbb };
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002258 uint8_t buffer[PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES)] = { 0 };
Jaeden Ameroab439972019-02-15 14:12:05 +00002259 size_t length = 0;
2260
2261 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002262 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
2263 psa_set_key_algorithm( &attributes, alg );
2264 psa_set_key_type( &attributes, key_type );
Ronald Cron5425a212020-08-04 14:58:35 +02002265 PSA_ASSERT( psa_import_key( &attributes, key_data, sizeof( key_data ),
2266 &key ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002267
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002268 /* Call encrypt setup twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002269 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002270 ASSERT_OPERATION_IS_ACTIVE( operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002271 TEST_EQUAL( psa_cipher_encrypt_setup( &operation, key, alg ),
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002272 PSA_ERROR_BAD_STATE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002273 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002274 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002275 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002276
2277 /* Call decrypt setup twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002278 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002279 ASSERT_OPERATION_IS_ACTIVE( operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002280 TEST_EQUAL( psa_cipher_decrypt_setup( &operation, key, alg ),
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002281 PSA_ERROR_BAD_STATE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002282 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002283 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002284 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002285
Jaeden Ameroab439972019-02-15 14:12:05 +00002286 /* Generate an IV without calling setup beforehand. */
2287 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2288 buffer, sizeof( buffer ),
2289 &length ),
2290 PSA_ERROR_BAD_STATE );
2291 PSA_ASSERT( psa_cipher_abort( &operation ) );
2292
2293 /* Generate an IV twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002294 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002295 PSA_ASSERT( psa_cipher_generate_iv( &operation,
2296 buffer, sizeof( buffer ),
2297 &length ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002298 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002299 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2300 buffer, sizeof( buffer ),
2301 &length ),
2302 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01002303 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002304 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002305 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002306
2307 /* Generate an IV after it's already set. */
Ronald Cron5425a212020-08-04 14:58:35 +02002308 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002309 PSA_ASSERT( psa_cipher_set_iv( &operation,
2310 iv, sizeof( iv ) ) );
2311 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2312 buffer, sizeof( buffer ),
2313 &length ),
2314 PSA_ERROR_BAD_STATE );
2315 PSA_ASSERT( psa_cipher_abort( &operation ) );
2316
2317 /* Set an IV without calling setup beforehand. */
2318 TEST_EQUAL( psa_cipher_set_iv( &operation,
2319 iv, sizeof( iv ) ),
2320 PSA_ERROR_BAD_STATE );
2321 PSA_ASSERT( psa_cipher_abort( &operation ) );
2322
2323 /* Set an IV after it's already set. */
Ronald Cron5425a212020-08-04 14:58:35 +02002324 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002325 PSA_ASSERT( psa_cipher_set_iv( &operation,
2326 iv, sizeof( iv ) ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002327 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002328 TEST_EQUAL( psa_cipher_set_iv( &operation,
2329 iv, sizeof( iv ) ),
2330 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01002331 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002332 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002333 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002334
2335 /* Set an IV after it's already generated. */
Ronald Cron5425a212020-08-04 14:58:35 +02002336 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002337 PSA_ASSERT( psa_cipher_generate_iv( &operation,
2338 buffer, sizeof( buffer ),
2339 &length ) );
2340 TEST_EQUAL( psa_cipher_set_iv( &operation,
2341 iv, sizeof( iv ) ),
2342 PSA_ERROR_BAD_STATE );
2343 PSA_ASSERT( psa_cipher_abort( &operation ) );
2344
2345 /* Call update without calling setup beforehand. */
2346 TEST_EQUAL( psa_cipher_update( &operation,
2347 text, sizeof( text ),
2348 buffer, sizeof( buffer ),
2349 &length ),
2350 PSA_ERROR_BAD_STATE );
2351 PSA_ASSERT( psa_cipher_abort( &operation ) );
2352
2353 /* Call update without an IV where an IV is required. */
Dave Rodgman095dadc2021-06-23 12:48:52 +01002354 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002355 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002356 TEST_EQUAL( psa_cipher_update( &operation,
2357 text, sizeof( text ),
2358 buffer, sizeof( buffer ),
2359 &length ),
2360 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01002361 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002362 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002363 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002364
2365 /* Call update after finish. */
Ronald Cron5425a212020-08-04 14:58:35 +02002366 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002367 PSA_ASSERT( psa_cipher_set_iv( &operation,
2368 iv, sizeof( iv ) ) );
2369 PSA_ASSERT( psa_cipher_finish( &operation,
2370 buffer, sizeof( buffer ), &length ) );
2371 TEST_EQUAL( psa_cipher_update( &operation,
2372 text, sizeof( text ),
2373 buffer, sizeof( buffer ),
2374 &length ),
2375 PSA_ERROR_BAD_STATE );
2376 PSA_ASSERT( psa_cipher_abort( &operation ) );
2377
2378 /* Call finish without calling setup beforehand. */
2379 TEST_EQUAL( psa_cipher_finish( &operation,
2380 buffer, sizeof( buffer ), &length ),
2381 PSA_ERROR_BAD_STATE );
2382 PSA_ASSERT( psa_cipher_abort( &operation ) );
2383
2384 /* Call finish without an IV where an IV is required. */
Ronald Cron5425a212020-08-04 14:58:35 +02002385 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002386 /* Not calling update means we are encrypting an empty buffer, which is OK
2387 * for cipher modes with padding. */
Dave Rodgman647791d2021-06-23 12:49:59 +01002388 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002389 TEST_EQUAL( psa_cipher_finish( &operation,
2390 buffer, sizeof( buffer ), &length ),
2391 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01002392 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002393 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002394 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002395
2396 /* Call finish twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002397 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002398 PSA_ASSERT( psa_cipher_set_iv( &operation,
2399 iv, sizeof( iv ) ) );
2400 PSA_ASSERT( psa_cipher_finish( &operation,
2401 buffer, sizeof( buffer ), &length ) );
2402 TEST_EQUAL( psa_cipher_finish( &operation,
2403 buffer, sizeof( buffer ), &length ),
2404 PSA_ERROR_BAD_STATE );
2405 PSA_ASSERT( psa_cipher_abort( &operation ) );
2406
Ronald Cron5425a212020-08-04 14:58:35 +02002407 PSA_ASSERT( psa_destroy_key( key ) );
Gilles Peskine76b29a72019-05-28 14:08:50 +02002408
Jaeden Ameroab439972019-02-15 14:12:05 +00002409exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002410 psa_cipher_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002411 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002412}
2413/* END_CASE */
2414
2415/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002416void cipher_encrypt( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002417 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002418 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002419 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002420{
Ronald Cron5425a212020-08-04 14:58:35 +02002421 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002422 psa_status_t status;
2423 psa_key_type_t key_type = key_type_arg;
2424 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002425 psa_status_t expected_status = expected_status_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002426 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002427 size_t output_buffer_size = 0;
2428 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002429 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002430 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002431 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002432
Gilles Peskine8817f612018-12-18 00:18:46 +01002433 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002434
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002435 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2436 psa_set_key_algorithm( &attributes, alg );
2437 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002438
Ronald Cron5425a212020-08-04 14:58:35 +02002439 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2440 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002441
Ronald Cron5425a212020-08-04 14:58:35 +02002442 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002443
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002444 if( iv->len > 0 )
2445 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002446 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002447 }
2448
gabor-mezei-armceface22021-01-21 12:26:17 +01002449 output_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2450 TEST_ASSERT( output_buffer_size <=
2451 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002452 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002453
Gilles Peskine8817f612018-12-18 00:18:46 +01002454 PSA_ASSERT( psa_cipher_update( &operation,
2455 input->x, input->len,
2456 output, output_buffer_size,
2457 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002458 TEST_ASSERT( function_output_length <=
2459 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) );
2460 TEST_ASSERT( function_output_length <=
2461 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002462 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002463
Gilles Peskine50e586b2018-06-08 14:28:46 +02002464 status = psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002465 ( output_buffer_size == 0 ? NULL :
2466 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002467 output_buffer_size - total_output_length,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002468 &function_output_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002469 TEST_ASSERT( function_output_length <=
2470 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2471 TEST_ASSERT( function_output_length <=
2472 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002473 total_output_length += function_output_length;
2474
Gilles Peskinefe11b722018-12-18 00:24:04 +01002475 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002476 if( expected_status == PSA_SUCCESS )
2477 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002478 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002479 ASSERT_COMPARE( expected_output->x, expected_output->len,
2480 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002481 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002482
Gilles Peskine50e586b2018-06-08 14:28:46 +02002483exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002484 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002485 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002486 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002487 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002488}
2489/* END_CASE */
2490
2491/* BEGIN_CASE */
2492void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002493 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002494 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002495 int first_part_size_arg,
2496 int output1_length_arg, int output2_length_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002497 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002498{
Ronald Cron5425a212020-08-04 14:58:35 +02002499 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002500 psa_key_type_t key_type = key_type_arg;
2501 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002502 size_t first_part_size = first_part_size_arg;
2503 size_t output1_length = output1_length_arg;
2504 size_t output2_length = output2_length_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002505 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002506 size_t output_buffer_size = 0;
2507 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002508 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002509 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002510 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002511
Gilles Peskine8817f612018-12-18 00:18:46 +01002512 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002513
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002514 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2515 psa_set_key_algorithm( &attributes, alg );
2516 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002517
Ronald Cron5425a212020-08-04 14:58:35 +02002518 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2519 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002520
Ronald Cron5425a212020-08-04 14:58:35 +02002521 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002522
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002523 if( iv->len > 0 )
2524 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002525 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002526 }
2527
gabor-mezei-armceface22021-01-21 12:26:17 +01002528 output_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2529 TEST_ASSERT( output_buffer_size <=
2530 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002531 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002532
Gilles Peskinee0866522019-02-19 19:44:00 +01002533 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002534 PSA_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
2535 output, output_buffer_size,
2536 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002537 TEST_ASSERT( function_output_length == output1_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002538 TEST_ASSERT( function_output_length <=
2539 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2540 TEST_ASSERT( function_output_length <=
2541 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002542 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002543
Gilles Peskine8817f612018-12-18 00:18:46 +01002544 PSA_ASSERT( psa_cipher_update( &operation,
2545 input->x + first_part_size,
2546 input->len - first_part_size,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002547 ( output_buffer_size == 0 ? NULL :
2548 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002549 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002550 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002551 TEST_ASSERT( function_output_length == output2_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002552 TEST_ASSERT( function_output_length <=
2553 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2554 alg,
2555 input->len - first_part_size ) );
2556 TEST_ASSERT( function_output_length <=
2557 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002558 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002559
Gilles Peskine8817f612018-12-18 00:18:46 +01002560 PSA_ASSERT( psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002561 ( output_buffer_size == 0 ? NULL :
2562 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002563 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002564 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002565 TEST_ASSERT( function_output_length <=
2566 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2567 TEST_ASSERT( function_output_length <=
2568 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002569 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002570 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002571
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002572 ASSERT_COMPARE( expected_output->x, expected_output->len,
2573 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002574
2575exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002576 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002577 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002578 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002579 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002580}
2581/* END_CASE */
2582
2583/* BEGIN_CASE */
2584void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002585 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002586 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002587 int first_part_size_arg,
2588 int output1_length_arg, int output2_length_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002589 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002590{
Ronald Cron5425a212020-08-04 14:58:35 +02002591 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002592 psa_key_type_t key_type = key_type_arg;
2593 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002594 size_t first_part_size = first_part_size_arg;
2595 size_t output1_length = output1_length_arg;
2596 size_t output2_length = output2_length_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002597 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002598 size_t output_buffer_size = 0;
2599 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002600 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002601 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002602 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002603
Gilles Peskine8817f612018-12-18 00:18:46 +01002604 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002605
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002606 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2607 psa_set_key_algorithm( &attributes, alg );
2608 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002609
Ronald Cron5425a212020-08-04 14:58:35 +02002610 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2611 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002612
Ronald Cron5425a212020-08-04 14:58:35 +02002613 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002614
Steven Cooreman177deba2020-09-07 17:14:14 +02002615 if( iv->len > 0 )
2616 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002617 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002618 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02002619
gabor-mezei-armceface22021-01-21 12:26:17 +01002620 output_buffer_size = PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2621 TEST_ASSERT( output_buffer_size <=
2622 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002623 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002624
Gilles Peskinee0866522019-02-19 19:44:00 +01002625 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002626 PSA_ASSERT( psa_cipher_update( &operation,
2627 input->x, first_part_size,
2628 output, output_buffer_size,
2629 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002630 TEST_ASSERT( function_output_length == output1_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002631 TEST_ASSERT( function_output_length <=
2632 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2633 TEST_ASSERT( function_output_length <=
2634 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002635 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002636
Gilles Peskine8817f612018-12-18 00:18:46 +01002637 PSA_ASSERT( psa_cipher_update( &operation,
2638 input->x + first_part_size,
2639 input->len - first_part_size,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002640 ( output_buffer_size == 0 ? NULL :
2641 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002642 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002643 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002644 TEST_ASSERT( function_output_length == output2_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002645 TEST_ASSERT( function_output_length <=
2646 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2647 alg,
2648 input->len - first_part_size ) );
2649 TEST_ASSERT( function_output_length <=
2650 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002651 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002652
Gilles Peskine8817f612018-12-18 00:18:46 +01002653 PSA_ASSERT( psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002654 ( output_buffer_size == 0 ? NULL :
2655 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002656 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002657 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002658 TEST_ASSERT( function_output_length <=
2659 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2660 TEST_ASSERT( function_output_length <=
2661 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002662 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002663 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002664
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002665 ASSERT_COMPARE( expected_output->x, expected_output->len,
2666 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002667
2668exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002669 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002670 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002671 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002672 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002673}
2674/* END_CASE */
2675
Gilles Peskine50e586b2018-06-08 14:28:46 +02002676/* BEGIN_CASE */
2677void cipher_decrypt( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002678 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002679 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002680 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002681{
Ronald Cron5425a212020-08-04 14:58:35 +02002682 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002683 psa_status_t status;
2684 psa_key_type_t key_type = key_type_arg;
2685 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002686 psa_status_t expected_status = expected_status_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002687 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002688 size_t output_buffer_size = 0;
2689 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002690 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002691 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002692 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002693
Gilles Peskine8817f612018-12-18 00:18:46 +01002694 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002695
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002696 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2697 psa_set_key_algorithm( &attributes, alg );
2698 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002699
Ronald Cron5425a212020-08-04 14:58:35 +02002700 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2701 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002702
Ronald Cron5425a212020-08-04 14:58:35 +02002703 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002704
Steven Cooreman177deba2020-09-07 17:14:14 +02002705 if( iv->len > 0 )
2706 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002707 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002708 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02002709
gabor-mezei-armceface22021-01-21 12:26:17 +01002710 output_buffer_size = PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2711 TEST_ASSERT( output_buffer_size <=
2712 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002713 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002714
Gilles Peskine8817f612018-12-18 00:18:46 +01002715 PSA_ASSERT( psa_cipher_update( &operation,
2716 input->x, input->len,
2717 output, output_buffer_size,
2718 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002719 TEST_ASSERT( function_output_length <=
2720 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) );
2721 TEST_ASSERT( function_output_length <=
2722 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002723 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002724
Gilles Peskine50e586b2018-06-08 14:28:46 +02002725 status = psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002726 ( output_buffer_size == 0 ? NULL :
2727 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002728 output_buffer_size - total_output_length,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002729 &function_output_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002730 TEST_ASSERT( function_output_length <=
2731 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2732 TEST_ASSERT( function_output_length <=
2733 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002734 total_output_length += function_output_length;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002735 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002736
2737 if( expected_status == PSA_SUCCESS )
2738 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002739 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002740 ASSERT_COMPARE( expected_output->x, expected_output->len,
2741 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002742 }
2743
Gilles Peskine50e586b2018-06-08 14:28:46 +02002744exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002745 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002746 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002747 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002748 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002749}
2750/* END_CASE */
2751
Gilles Peskine50e586b2018-06-08 14:28:46 +02002752/* BEGIN_CASE */
2753void cipher_verify_output( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002754 data_t *key_data,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002755 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02002756{
Ronald Cron5425a212020-08-04 14:58:35 +02002757 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002758 psa_key_type_t key_type = key_type_arg;
2759 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -07002760 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +02002761 size_t iv_size = 16;
2762 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002763 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002764 size_t output1_size = 0;
2765 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002766 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002767 size_t output2_size = 0;
2768 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002769 size_t function_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002770 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
2771 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002772 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002773
Gilles Peskine8817f612018-12-18 00:18:46 +01002774 PSA_ASSERT( psa_crypto_init( ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002775
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002776 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
2777 psa_set_key_algorithm( &attributes, alg );
2778 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002779
Ronald Cron5425a212020-08-04 14:58:35 +02002780 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2781 &key ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002782
Ronald Cron5425a212020-08-04 14:58:35 +02002783 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1, key, alg ) );
2784 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2, key, alg ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002785
Steven Cooreman177deba2020-09-07 17:14:14 +02002786 if( alg != PSA_ALG_ECB_NO_PADDING )
2787 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002788 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
2789 iv, iv_size,
2790 &iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002791 }
gabor-mezei-armceface22021-01-21 12:26:17 +01002792 output1_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2793 TEST_ASSERT( output1_size <=
2794 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002795 ASSERT_ALLOC( output1, output1_size );
Moran Pekerded84402018-06-06 16:36:50 +03002796
Gilles Peskine8817f612018-12-18 00:18:46 +01002797 PSA_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
2798 output1, output1_size,
2799 &output1_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002800 TEST_ASSERT( output1_length <=
2801 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) );
2802 TEST_ASSERT( output1_length <=
2803 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
2804
Gilles Peskine8817f612018-12-18 00:18:46 +01002805 PSA_ASSERT( psa_cipher_finish( &operation1,
Gilles Peskineee46fe72019-02-19 19:05:33 +01002806 output1 + output1_length,
2807 output1_size - output1_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002808 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002809 TEST_ASSERT( function_output_length <=
2810 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2811 TEST_ASSERT( function_output_length <=
2812 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002813
Gilles Peskine048b7f02018-06-08 14:20:49 +02002814 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002815
Gilles Peskine8817f612018-12-18 00:18:46 +01002816 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
Moran Pekerded84402018-06-06 16:36:50 +03002817
2818 output2_size = output1_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002819 TEST_ASSERT( output2_size <=
2820 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, output1_length ) );
2821 TEST_ASSERT( output2_size <=
2822 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( output1_length ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002823 ASSERT_ALLOC( output2, output2_size );
Moran Pekerded84402018-06-06 16:36:50 +03002824
Steven Cooreman177deba2020-09-07 17:14:14 +02002825 if( iv_length > 0 )
2826 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002827 PSA_ASSERT( psa_cipher_set_iv( &operation2,
2828 iv, iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002829 }
2830
Gilles Peskine8817f612018-12-18 00:18:46 +01002831 PSA_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
2832 output2, output2_size,
2833 &output2_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002834 TEST_ASSERT( output2_length <=
2835 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, output1_length ) );
2836 TEST_ASSERT( output2_length <=
2837 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( output1_length ) );
2838
Gilles Peskine048b7f02018-06-08 14:20:49 +02002839 function_output_length = 0;
Gilles Peskine8817f612018-12-18 00:18:46 +01002840 PSA_ASSERT( psa_cipher_finish( &operation2,
2841 output2 + output2_length,
Gilles Peskineee46fe72019-02-19 19:05:33 +01002842 output2_size - output2_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002843 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002844 TEST_ASSERT( function_output_length <=
2845 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2846 TEST_ASSERT( function_output_length <=
2847 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Moran Pekerded84402018-06-06 16:36:50 +03002848
Gilles Peskine048b7f02018-06-08 14:20:49 +02002849 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002850
Gilles Peskine8817f612018-12-18 00:18:46 +01002851 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
Moran Pekerded84402018-06-06 16:36:50 +03002852
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002853 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
Moran Pekerded84402018-06-06 16:36:50 +03002854
2855exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002856 psa_cipher_abort( &operation1 );
2857 psa_cipher_abort( &operation2 );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002858 mbedtls_free( output1 );
2859 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02002860 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002861 PSA_DONE( );
Moran Pekerded84402018-06-06 16:36:50 +03002862}
2863/* END_CASE */
2864
2865/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002866void cipher_verify_output_multipart( int alg_arg,
2867 int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002868 data_t *key_data,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002869 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002870 int first_part_size_arg )
Moran Pekerded84402018-06-06 16:36:50 +03002871{
Ronald Cron5425a212020-08-04 14:58:35 +02002872 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03002873 psa_key_type_t key_type = key_type_arg;
2874 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002875 size_t first_part_size = first_part_size_arg;
Moran Pekerded84402018-06-06 16:36:50 +03002876 unsigned char iv[16] = {0};
2877 size_t iv_size = 16;
2878 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002879 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002880 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002881 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002882 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002883 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002884 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002885 size_t function_output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002886 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
2887 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002888 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03002889
Gilles Peskine8817f612018-12-18 00:18:46 +01002890 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerded84402018-06-06 16:36:50 +03002891
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002892 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
2893 psa_set_key_algorithm( &attributes, alg );
2894 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002895
Ronald Cron5425a212020-08-04 14:58:35 +02002896 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2897 &key ) );
Moran Pekerded84402018-06-06 16:36:50 +03002898
Ronald Cron5425a212020-08-04 14:58:35 +02002899 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1, key, alg ) );
2900 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2, key, alg ) );
Moran Pekerded84402018-06-06 16:36:50 +03002901
Steven Cooreman177deba2020-09-07 17:14:14 +02002902 if( alg != PSA_ALG_ECB_NO_PADDING )
2903 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002904 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
2905 iv, iv_size,
2906 &iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002907 }
2908
gabor-mezei-armceface22021-01-21 12:26:17 +01002909 output1_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2910 TEST_ASSERT( output1_buffer_size <=
2911 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002912 ASSERT_ALLOC( output1, output1_buffer_size );
Moran Pekerded84402018-06-06 16:36:50 +03002913
Gilles Peskinee0866522019-02-19 19:44:00 +01002914 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002915
Gilles Peskine8817f612018-12-18 00:18:46 +01002916 PSA_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
2917 output1, output1_buffer_size,
2918 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002919 TEST_ASSERT( function_output_length <=
2920 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2921 TEST_ASSERT( function_output_length <=
2922 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002923 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002924
Gilles Peskine8817f612018-12-18 00:18:46 +01002925 PSA_ASSERT( psa_cipher_update( &operation1,
2926 input->x + first_part_size,
2927 input->len - first_part_size,
2928 output1, output1_buffer_size,
2929 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002930 TEST_ASSERT( function_output_length <=
2931 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2932 alg,
2933 input->len - first_part_size ) );
2934 TEST_ASSERT( function_output_length <=
2935 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len - first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002936 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002937
Gilles Peskine8817f612018-12-18 00:18:46 +01002938 PSA_ASSERT( psa_cipher_finish( &operation1,
2939 output1 + output1_length,
2940 output1_buffer_size - output1_length,
2941 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002942 TEST_ASSERT( function_output_length <=
2943 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2944 TEST_ASSERT( function_output_length <=
2945 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002946 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002947
Gilles Peskine8817f612018-12-18 00:18:46 +01002948 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002949
Gilles Peskine048b7f02018-06-08 14:20:49 +02002950 output2_buffer_size = output1_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002951 TEST_ASSERT( output2_buffer_size <=
2952 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, output1_length ) );
2953 TEST_ASSERT( output2_buffer_size <=
2954 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( output1_length ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002955 ASSERT_ALLOC( output2, output2_buffer_size );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002956
Steven Cooreman177deba2020-09-07 17:14:14 +02002957 if( iv_length > 0 )
2958 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002959 PSA_ASSERT( psa_cipher_set_iv( &operation2,
2960 iv, iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002961 }
Moran Pekerded84402018-06-06 16:36:50 +03002962
Gilles Peskine8817f612018-12-18 00:18:46 +01002963 PSA_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
2964 output2, output2_buffer_size,
2965 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002966 TEST_ASSERT( function_output_length <=
2967 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2968 TEST_ASSERT( function_output_length <=
2969 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002970 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002971
Gilles Peskine8817f612018-12-18 00:18:46 +01002972 PSA_ASSERT( psa_cipher_update( &operation2,
2973 output1 + first_part_size,
2974 output1_length - first_part_size,
2975 output2, output2_buffer_size,
2976 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002977 TEST_ASSERT( function_output_length <=
2978 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2979 alg,
2980 output1_length - first_part_size ) );
2981 TEST_ASSERT( function_output_length <=
2982 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( output1_length - first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002983 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002984
Gilles Peskine8817f612018-12-18 00:18:46 +01002985 PSA_ASSERT( psa_cipher_finish( &operation2,
2986 output2 + output2_length,
2987 output2_buffer_size - output2_length,
2988 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002989 TEST_ASSERT( function_output_length <=
2990 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2991 TEST_ASSERT( function_output_length <=
2992 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002993 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002994
Gilles Peskine8817f612018-12-18 00:18:46 +01002995 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002996
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002997 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002998
2999exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02003000 psa_cipher_abort( &operation1 );
3001 psa_cipher_abort( &operation2 );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003002 mbedtls_free( output1 );
3003 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02003004 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003005 PSA_DONE( );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003006}
3007/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02003008
Gilles Peskine20035e32018-02-03 22:44:14 +01003009/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003010void aead_encrypt_decrypt( int key_type_arg, data_t *key_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003011 int alg_arg,
Gilles Peskine7da96b02018-08-17 18:45:42 +02003012 data_t *nonce,
3013 data_t *additional_data,
3014 data_t *input_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003015 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003016{
Ronald Cron5425a212020-08-04 14:58:35 +02003017 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003018 psa_key_type_t key_type = key_type_arg;
3019 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003020 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003021 unsigned char *output_data = NULL;
3022 size_t output_size = 0;
3023 size_t output_length = 0;
3024 unsigned char *output_data2 = NULL;
3025 size_t output_length2 = 0;
Steven Cooremanf49478b2021-02-15 15:19:25 +01003026 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003027 psa_status_t expected_result = expected_result_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003028 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003029
Gilles Peskine8817f612018-12-18 00:18:46 +01003030 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003031
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003032 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3033 psa_set_key_algorithm( &attributes, alg );
3034 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003035
Gilles Peskine049c7532019-05-15 20:22:09 +02003036 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003037 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003038 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3039 key_bits = psa_get_key_bits( &attributes );
3040
3041 output_size = input_data->len + PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3042 alg );
3043 /* For all currently defined algorithms, PSA_AEAD_ENCRYPT_OUTPUT_SIZE
3044 * should be exact. */
3045 if( expected_result != PSA_ERROR_INVALID_ARGUMENT &&
3046 expected_result != PSA_ERROR_NOT_SUPPORTED )
3047 {
3048 TEST_EQUAL( output_size,
3049 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3050 TEST_ASSERT( output_size <=
3051 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3052 }
3053 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003054
Steven Cooremanf49478b2021-02-15 15:19:25 +01003055 status = psa_aead_encrypt( key, alg,
3056 nonce->x, nonce->len,
3057 additional_data->x,
3058 additional_data->len,
3059 input_data->x, input_data->len,
3060 output_data, output_size,
3061 &output_length );
3062
3063 /* If the operation is not supported, just skip and not fail in case the
3064 * encryption involves a common limitation of cryptography hardwares and
3065 * an alternative implementation. */
3066 if( status == PSA_ERROR_NOT_SUPPORTED )
3067 {
3068 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3069 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
3070 }
3071
3072 TEST_EQUAL( status, expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003073
3074 if( PSA_SUCCESS == expected_result )
3075 {
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003076 ASSERT_ALLOC( output_data2, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003077
Gilles Peskine003a4a92019-05-14 16:09:40 +02003078 /* For all currently defined algorithms, PSA_AEAD_DECRYPT_OUTPUT_SIZE
3079 * should be exact. */
3080 TEST_EQUAL( input_data->len,
Bence Szépkútiec174e22021-03-19 18:46:15 +01003081 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg, output_length ) );
Gilles Peskine003a4a92019-05-14 16:09:40 +02003082
gabor-mezei-armceface22021-01-21 12:26:17 +01003083 TEST_ASSERT( input_data->len <=
3084 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( output_length ) );
3085
Ronald Cron5425a212020-08-04 14:58:35 +02003086 TEST_EQUAL( psa_aead_decrypt( key, alg,
Gilles Peskinefe11b722018-12-18 00:24:04 +01003087 nonce->x, nonce->len,
3088 additional_data->x,
3089 additional_data->len,
3090 output_data, output_length,
3091 output_data2, output_length,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003092 &output_length2 ),
3093 expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02003094
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003095 ASSERT_COMPARE( input_data->x, input_data->len,
3096 output_data2, output_length2 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003097 }
Gilles Peskine2d277862018-06-18 15:41:12 +02003098
Gilles Peskinea1cac842018-06-11 19:33:02 +02003099exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003100 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003101 mbedtls_free( output_data );
3102 mbedtls_free( output_data2 );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003103 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003104}
3105/* END_CASE */
3106
3107/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003108void aead_encrypt( int key_type_arg, data_t *key_data,
3109 int alg_arg,
3110 data_t *nonce,
3111 data_t *additional_data,
3112 data_t *input_data,
3113 data_t *expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003114{
Ronald Cron5425a212020-08-04 14:58:35 +02003115 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003116 psa_key_type_t key_type = key_type_arg;
3117 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003118 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003119 unsigned char *output_data = NULL;
3120 size_t output_size = 0;
3121 size_t output_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003122 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Steven Cooremand588ea12021-01-11 19:36:04 +01003123 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003124
Gilles Peskine8817f612018-12-18 00:18:46 +01003125 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003126
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003127 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3128 psa_set_key_algorithm( &attributes, alg );
3129 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003130
Gilles Peskine049c7532019-05-15 20:22:09 +02003131 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003132 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003133 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3134 key_bits = psa_get_key_bits( &attributes );
3135
3136 output_size = input_data->len + PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3137 alg );
3138 /* For all currently defined algorithms, PSA_AEAD_ENCRYPT_OUTPUT_SIZE
3139 * should be exact. */
3140 TEST_EQUAL( output_size,
3141 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3142 TEST_ASSERT( output_size <=
3143 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3144 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003145
Steven Cooremand588ea12021-01-11 19:36:04 +01003146 status = psa_aead_encrypt( key, alg,
3147 nonce->x, nonce->len,
3148 additional_data->x, additional_data->len,
3149 input_data->x, input_data->len,
3150 output_data, output_size,
3151 &output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003152
Ronald Cron28a45ed2021-02-09 20:35:42 +01003153 /* If the operation is not supported, just skip and not fail in case the
3154 * encryption involves a common limitation of cryptography hardwares and
3155 * an alternative implementation. */
3156 if( status == PSA_ERROR_NOT_SUPPORTED )
Steven Cooremand588ea12021-01-11 19:36:04 +01003157 {
Ronald Cron28a45ed2021-02-09 20:35:42 +01003158 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3159 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
Steven Cooremand588ea12021-01-11 19:36:04 +01003160 }
Steven Cooremand588ea12021-01-11 19:36:04 +01003161
3162 PSA_ASSERT( status );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003163 ASSERT_COMPARE( expected_result->x, expected_result->len,
3164 output_data, output_length );
Gilles Peskine2d277862018-06-18 15:41:12 +02003165
Gilles Peskinea1cac842018-06-11 19:33:02 +02003166exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003167 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003168 mbedtls_free( output_data );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003169 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003170}
3171/* END_CASE */
3172
3173/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003174void aead_decrypt( int key_type_arg, data_t *key_data,
3175 int alg_arg,
3176 data_t *nonce,
3177 data_t *additional_data,
3178 data_t *input_data,
3179 data_t *expected_data,
3180 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003181{
Ronald Cron5425a212020-08-04 14:58:35 +02003182 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003183 psa_key_type_t key_type = key_type_arg;
3184 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003185 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003186 unsigned char *output_data = NULL;
3187 size_t output_size = 0;
3188 size_t output_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003189 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003190 psa_status_t expected_result = expected_result_arg;
Steven Cooremand588ea12021-01-11 19:36:04 +01003191 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003192
Gilles Peskine8817f612018-12-18 00:18:46 +01003193 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003194
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003195 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3196 psa_set_key_algorithm( &attributes, alg );
3197 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003198
Gilles Peskine049c7532019-05-15 20:22:09 +02003199 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003200 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003201 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3202 key_bits = psa_get_key_bits( &attributes );
3203
3204 output_size = input_data->len - PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3205 alg );
3206 if( expected_result != PSA_ERROR_INVALID_ARGUMENT &&
3207 expected_result != PSA_ERROR_NOT_SUPPORTED )
3208 {
3209 /* For all currently defined algorithms, PSA_AEAD_DECRYPT_OUTPUT_SIZE
3210 * should be exact. */
3211 TEST_EQUAL( output_size,
3212 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3213 TEST_ASSERT( output_size <=
3214 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3215 }
3216 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003217
Steven Cooremand588ea12021-01-11 19:36:04 +01003218 status = psa_aead_decrypt( key, alg,
3219 nonce->x, nonce->len,
3220 additional_data->x,
3221 additional_data->len,
3222 input_data->x, input_data->len,
3223 output_data, output_size,
3224 &output_length );
3225
Ronald Cron28a45ed2021-02-09 20:35:42 +01003226 /* If the operation is not supported, just skip and not fail in case the
3227 * decryption involves a common limitation of cryptography hardwares and
3228 * an alternative implementation. */
3229 if( status == PSA_ERROR_NOT_SUPPORTED )
Steven Cooremand588ea12021-01-11 19:36:04 +01003230 {
Ronald Cron28a45ed2021-02-09 20:35:42 +01003231 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3232 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
Steven Cooremand588ea12021-01-11 19:36:04 +01003233 }
Steven Cooremand588ea12021-01-11 19:36:04 +01003234
3235 TEST_EQUAL( status, expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003236
Gilles Peskine2d277862018-06-18 15:41:12 +02003237 if( expected_result == PSA_SUCCESS )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003238 ASSERT_COMPARE( expected_data->x, expected_data->len,
3239 output_data, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003240
Gilles Peskinea1cac842018-06-11 19:33:02 +02003241exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003242 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003243 mbedtls_free( output_data );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003244 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003245}
3246/* END_CASE */
3247
3248/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003249void signature_size( int type_arg,
3250 int bits,
3251 int alg_arg,
3252 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003253{
3254 psa_key_type_t type = type_arg;
3255 psa_algorithm_t alg = alg_arg;
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003256 size_t actual_size = PSA_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskine841b14b2019-11-26 17:37:37 +01003257
Gilles Peskinefe11b722018-12-18 00:24:04 +01003258 TEST_EQUAL( actual_size, (size_t) expected_size_arg );
Gilles Peskine841b14b2019-11-26 17:37:37 +01003259
Gilles Peskinee59236f2018-01-27 23:32:46 +01003260exit:
3261 ;
3262}
3263/* END_CASE */
3264
3265/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003266void sign_hash_deterministic( int key_type_arg, data_t *key_data,
3267 int alg_arg, data_t *input_data,
3268 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003269{
Ronald Cron5425a212020-08-04 14:58:35 +02003270 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinee59236f2018-01-27 23:32:46 +01003271 psa_key_type_t key_type = key_type_arg;
3272 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003273 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01003274 unsigned char *signature = NULL;
3275 size_t signature_size;
3276 size_t signature_length = 0xdeadbeef;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003277 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003278
Gilles Peskine8817f612018-12-18 00:18:46 +01003279 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003280
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003281 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003282 psa_set_key_algorithm( &attributes, alg );
3283 psa_set_key_type( &attributes, key_type );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003284
Gilles Peskine049c7532019-05-15 20:22:09 +02003285 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003286 &key ) );
3287 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003288 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine20035e32018-02-03 22:44:14 +01003289
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003290 /* Allocate a buffer which has the size advertized by the
3291 * library. */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003292 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003293 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01003294 TEST_ASSERT( signature_size != 0 );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003295 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003296 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003297
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003298 /* Perform the signature. */
Ronald Cron5425a212020-08-04 14:58:35 +02003299 PSA_ASSERT( psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003300 input_data->x, input_data->len,
3301 signature, signature_size,
3302 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003303 /* Verify that the signature is what is expected. */
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003304 ASSERT_COMPARE( output_data->x, output_data->len,
3305 signature, signature_length );
Gilles Peskine20035e32018-02-03 22:44:14 +01003306
3307exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003308 /*
3309 * Key attributes may have been returned by psa_get_key_attributes()
3310 * thus reset them as required.
3311 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003312 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003313
Ronald Cron5425a212020-08-04 14:58:35 +02003314 psa_destroy_key( key );
Gilles Peskine0189e752018-02-03 23:57:22 +01003315 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003316 PSA_DONE( );
Gilles Peskine20035e32018-02-03 22:44:14 +01003317}
3318/* END_CASE */
3319
3320/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003321void sign_hash_fail( int key_type_arg, data_t *key_data,
3322 int alg_arg, data_t *input_data,
3323 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01003324{
Ronald Cron5425a212020-08-04 14:58:35 +02003325 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003326 psa_key_type_t key_type = key_type_arg;
3327 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003328 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003329 psa_status_t actual_status;
3330 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01003331 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01003332 size_t signature_length = 0xdeadbeef;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003333 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003334
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003335 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003336
Gilles Peskine8817f612018-12-18 00:18:46 +01003337 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003338
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003339 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003340 psa_set_key_algorithm( &attributes, alg );
3341 psa_set_key_type( &attributes, key_type );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003342
Gilles Peskine049c7532019-05-15 20:22:09 +02003343 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003344 &key ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003345
Ronald Cron5425a212020-08-04 14:58:35 +02003346 actual_status = psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003347 input_data->x, input_data->len,
3348 signature, signature_size,
3349 &signature_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003350 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003351 /* The value of *signature_length is unspecified on error, but
3352 * whatever it is, it should be less than signature_size, so that
3353 * if the caller tries to read *signature_length bytes without
3354 * checking the error code then they don't overflow a buffer. */
3355 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003356
3357exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003358 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003359 psa_destroy_key( key );
Gilles Peskine20035e32018-02-03 22:44:14 +01003360 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003361 PSA_DONE( );
Gilles Peskine20035e32018-02-03 22:44:14 +01003362}
3363/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03003364
3365/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003366void sign_verify_hash( int key_type_arg, data_t *key_data,
3367 int alg_arg, data_t *input_data )
Gilles Peskine9911b022018-06-29 17:30:48 +02003368{
Ronald Cron5425a212020-08-04 14:58:35 +02003369 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003370 psa_key_type_t key_type = key_type_arg;
3371 psa_algorithm_t alg = alg_arg;
3372 size_t key_bits;
3373 unsigned char *signature = NULL;
3374 size_t signature_size;
3375 size_t signature_length = 0xdeadbeef;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003376 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003377
Gilles Peskine8817f612018-12-18 00:18:46 +01003378 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003379
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003380 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003381 psa_set_key_algorithm( &attributes, alg );
3382 psa_set_key_type( &attributes, key_type );
Gilles Peskine9911b022018-06-29 17:30:48 +02003383
Gilles Peskine049c7532019-05-15 20:22:09 +02003384 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003385 &key ) );
3386 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003387 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine9911b022018-06-29 17:30:48 +02003388
3389 /* Allocate a buffer which has the size advertized by the
3390 * library. */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003391 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type,
Gilles Peskine9911b022018-06-29 17:30:48 +02003392 key_bits, alg );
3393 TEST_ASSERT( signature_size != 0 );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003394 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003395 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine9911b022018-06-29 17:30:48 +02003396
3397 /* Perform the signature. */
Ronald Cron5425a212020-08-04 14:58:35 +02003398 PSA_ASSERT( psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003399 input_data->x, input_data->len,
3400 signature, signature_size,
3401 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003402 /* Check that the signature length looks sensible. */
3403 TEST_ASSERT( signature_length <= signature_size );
3404 TEST_ASSERT( signature_length > 0 );
3405
3406 /* Use the library to verify that the signature is correct. */
Ronald Cron5425a212020-08-04 14:58:35 +02003407 PSA_ASSERT( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003408 input_data->x, input_data->len,
3409 signature, signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003410
3411 if( input_data->len != 0 )
3412 {
3413 /* Flip a bit in the input and verify that the signature is now
3414 * detected as invalid. Flip a bit at the beginning, not at the end,
3415 * because ECDSA may ignore the last few bits of the input. */
3416 input_data->x[0] ^= 1;
Ronald Cron5425a212020-08-04 14:58:35 +02003417 TEST_EQUAL( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003418 input_data->x, input_data->len,
3419 signature, signature_length ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003420 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine9911b022018-06-29 17:30:48 +02003421 }
3422
3423exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003424 /*
3425 * Key attributes may have been returned by psa_get_key_attributes()
3426 * thus reset them as required.
3427 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003428 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003429
Ronald Cron5425a212020-08-04 14:58:35 +02003430 psa_destroy_key( key );
Gilles Peskine9911b022018-06-29 17:30:48 +02003431 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003432 PSA_DONE( );
Gilles Peskine9911b022018-06-29 17:30:48 +02003433}
3434/* END_CASE */
3435
3436/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003437void verify_hash( int key_type_arg, data_t *key_data,
3438 int alg_arg, data_t *hash_data,
3439 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03003440{
Ronald Cron5425a212020-08-04 14:58:35 +02003441 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003442 psa_key_type_t key_type = key_type_arg;
3443 psa_algorithm_t alg = alg_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003444 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003445
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003446 TEST_ASSERT( signature_data->len <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine69c12672018-06-28 00:07:19 +02003447
Gilles Peskine8817f612018-12-18 00:18:46 +01003448 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir5c753392018-05-08 11:18:38 +03003449
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003450 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003451 psa_set_key_algorithm( &attributes, alg );
3452 psa_set_key_type( &attributes, key_type );
itayzafrir5c753392018-05-08 11:18:38 +03003453
Gilles Peskine049c7532019-05-15 20:22:09 +02003454 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003455 &key ) );
itayzafrir5c753392018-05-08 11:18:38 +03003456
Ronald Cron5425a212020-08-04 14:58:35 +02003457 PSA_ASSERT( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003458 hash_data->x, hash_data->len,
3459 signature_data->x, signature_data->len ) );
Gilles Peskine0627f982019-11-26 19:12:16 +01003460
itayzafrir5c753392018-05-08 11:18:38 +03003461exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003462 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003463 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003464 PSA_DONE( );
itayzafrir5c753392018-05-08 11:18:38 +03003465}
3466/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003467
3468/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003469void verify_hash_fail( int key_type_arg, data_t *key_data,
3470 int alg_arg, data_t *hash_data,
3471 data_t *signature_data,
3472 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003473{
Ronald Cron5425a212020-08-04 14:58:35 +02003474 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003475 psa_key_type_t key_type = key_type_arg;
3476 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003477 psa_status_t actual_status;
3478 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003479 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003480
Gilles Peskine8817f612018-12-18 00:18:46 +01003481 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003482
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003483 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003484 psa_set_key_algorithm( &attributes, alg );
3485 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003486
Gilles Peskine049c7532019-05-15 20:22:09 +02003487 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003488 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003489
Ronald Cron5425a212020-08-04 14:58:35 +02003490 actual_status = psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003491 hash_data->x, hash_data->len,
3492 signature_data->x, signature_data->len );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003493 TEST_EQUAL( actual_status, expected_status );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003494
3495exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003496 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003497 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003498 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003499}
3500/* END_CASE */
3501
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003502/* BEGIN_CASE */
gabor-mezei-arm53028482021-04-15 18:19:50 +02003503void sign_message_deterministic( int key_type_arg,
3504 data_t *key_data,
3505 int alg_arg,
3506 data_t *input_data,
3507 data_t *output_data )
3508{
3509 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3510 psa_key_type_t key_type = key_type_arg;
3511 psa_algorithm_t alg = alg_arg;
3512 size_t key_bits;
3513 unsigned char *signature = NULL;
3514 size_t signature_size;
3515 size_t signature_length = 0xdeadbeef;
3516 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3517
3518 PSA_ASSERT( psa_crypto_init( ) );
3519
3520 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
3521 psa_set_key_algorithm( &attributes, alg );
3522 psa_set_key_type( &attributes, key_type );
3523
3524 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3525 &key ) );
3526 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3527 key_bits = psa_get_key_bits( &attributes );
3528
3529 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
3530 TEST_ASSERT( signature_size != 0 );
3531 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
3532 ASSERT_ALLOC( signature, signature_size );
3533
3534 PSA_ASSERT( psa_sign_message( key, alg,
3535 input_data->x, input_data->len,
3536 signature, signature_size,
3537 &signature_length ) );
3538
3539 ASSERT_COMPARE( output_data->x, output_data->len,
3540 signature, signature_length );
3541
3542exit:
3543 psa_reset_key_attributes( &attributes );
3544
3545 psa_destroy_key( key );
3546 mbedtls_free( signature );
3547 PSA_DONE( );
3548
3549}
3550/* END_CASE */
3551
3552/* BEGIN_CASE */
3553void sign_message_fail( int key_type_arg,
3554 data_t *key_data,
3555 int alg_arg,
3556 data_t *input_data,
3557 int signature_size_arg,
3558 int expected_status_arg )
3559{
3560 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3561 psa_key_type_t key_type = key_type_arg;
3562 psa_algorithm_t alg = alg_arg;
3563 size_t signature_size = signature_size_arg;
3564 psa_status_t actual_status;
3565 psa_status_t expected_status = expected_status_arg;
3566 unsigned char *signature = NULL;
3567 size_t signature_length = 0xdeadbeef;
3568 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3569
3570 ASSERT_ALLOC( signature, signature_size );
3571
3572 PSA_ASSERT( psa_crypto_init( ) );
3573
3574 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
3575 psa_set_key_algorithm( &attributes, alg );
3576 psa_set_key_type( &attributes, key_type );
3577
3578 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3579 &key ) );
3580
3581 actual_status = psa_sign_message( key, alg,
3582 input_data->x, input_data->len,
3583 signature, signature_size,
3584 &signature_length );
3585 TEST_EQUAL( actual_status, expected_status );
3586 /* The value of *signature_length is unspecified on error, but
3587 * whatever it is, it should be less than signature_size, so that
3588 * if the caller tries to read *signature_length bytes without
3589 * checking the error code then they don't overflow a buffer. */
3590 TEST_ASSERT( signature_length <= signature_size );
3591
3592exit:
3593 psa_reset_key_attributes( &attributes );
3594 psa_destroy_key( key );
3595 mbedtls_free( signature );
3596 PSA_DONE( );
3597}
3598/* END_CASE */
3599
3600/* BEGIN_CASE */
3601void sign_verify_message( int key_type_arg,
3602 data_t *key_data,
3603 int alg_arg,
3604 data_t *input_data )
3605{
3606 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3607 psa_key_type_t key_type = key_type_arg;
3608 psa_algorithm_t alg = alg_arg;
3609 size_t key_bits;
3610 unsigned char *signature = NULL;
3611 size_t signature_size;
3612 size_t signature_length = 0xdeadbeef;
3613 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3614
3615 PSA_ASSERT( psa_crypto_init( ) );
3616
3617 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE |
3618 PSA_KEY_USAGE_VERIFY_MESSAGE );
3619 psa_set_key_algorithm( &attributes, alg );
3620 psa_set_key_type( &attributes, key_type );
3621
3622 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3623 &key ) );
3624 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3625 key_bits = psa_get_key_bits( &attributes );
3626
3627 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
3628 TEST_ASSERT( signature_size != 0 );
3629 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
3630 ASSERT_ALLOC( signature, signature_size );
3631
3632 PSA_ASSERT( psa_sign_message( key, alg,
3633 input_data->x, input_data->len,
3634 signature, signature_size,
3635 &signature_length ) );
3636 TEST_ASSERT( signature_length <= signature_size );
3637 TEST_ASSERT( signature_length > 0 );
3638
3639 PSA_ASSERT( psa_verify_message( key, alg,
3640 input_data->x, input_data->len,
3641 signature, signature_length ) );
3642
3643 if( input_data->len != 0 )
3644 {
3645 /* Flip a bit in the input and verify that the signature is now
3646 * detected as invalid. Flip a bit at the beginning, not at the end,
3647 * because ECDSA may ignore the last few bits of the input. */
3648 input_data->x[0] ^= 1;
3649 TEST_EQUAL( psa_verify_message( key, alg,
3650 input_data->x, input_data->len,
3651 signature, signature_length ),
3652 PSA_ERROR_INVALID_SIGNATURE );
3653 }
3654
3655exit:
3656 psa_reset_key_attributes( &attributes );
3657
3658 psa_destroy_key( key );
3659 mbedtls_free( signature );
3660 PSA_DONE( );
3661}
3662/* END_CASE */
3663
3664/* BEGIN_CASE */
3665void verify_message( int key_type_arg,
3666 data_t *key_data,
3667 int alg_arg,
3668 data_t *input_data,
3669 data_t *signature_data )
3670{
3671 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3672 psa_key_type_t key_type = key_type_arg;
3673 psa_algorithm_t alg = alg_arg;
3674 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3675
3676 TEST_ASSERT( signature_data->len <= PSA_SIGNATURE_MAX_SIZE );
3677
3678 PSA_ASSERT( psa_crypto_init( ) );
3679
3680 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_MESSAGE );
3681 psa_set_key_algorithm( &attributes, alg );
3682 psa_set_key_type( &attributes, key_type );
3683
3684 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3685 &key ) );
3686
3687 PSA_ASSERT( psa_verify_message( key, alg,
3688 input_data->x, input_data->len,
3689 signature_data->x, signature_data->len ) );
3690
3691exit:
3692 psa_reset_key_attributes( &attributes );
3693 psa_destroy_key( key );
3694 PSA_DONE( );
3695}
3696/* END_CASE */
3697
3698/* BEGIN_CASE */
3699void verify_message_fail( int key_type_arg,
3700 data_t *key_data,
3701 int alg_arg,
3702 data_t *hash_data,
3703 data_t *signature_data,
3704 int expected_status_arg )
3705{
3706 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3707 psa_key_type_t key_type = key_type_arg;
3708 psa_algorithm_t alg = alg_arg;
3709 psa_status_t actual_status;
3710 psa_status_t expected_status = expected_status_arg;
3711 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3712
3713 PSA_ASSERT( psa_crypto_init( ) );
3714
3715 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_MESSAGE );
3716 psa_set_key_algorithm( &attributes, alg );
3717 psa_set_key_type( &attributes, key_type );
3718
3719 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3720 &key ) );
3721
3722 actual_status = psa_verify_message( key, alg,
3723 hash_data->x, hash_data->len,
3724 signature_data->x,
3725 signature_data->len );
3726 TEST_EQUAL( actual_status, expected_status );
3727
3728exit:
3729 psa_reset_key_attributes( &attributes );
3730 psa_destroy_key( key );
3731 PSA_DONE( );
3732}
3733/* END_CASE */
3734
3735/* BEGIN_CASE */
Gilles Peskine656896e2018-06-29 19:12:28 +02003736void asymmetric_encrypt( int key_type_arg,
3737 data_t *key_data,
3738 int alg_arg,
3739 data_t *input_data,
Gilles Peskine68428122018-06-30 18:42:41 +02003740 data_t *label,
Gilles Peskine656896e2018-06-29 19:12:28 +02003741 int expected_output_length_arg,
3742 int expected_status_arg )
3743{
Ronald Cron5425a212020-08-04 14:58:35 +02003744 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003745 psa_key_type_t key_type = key_type_arg;
3746 psa_algorithm_t alg = alg_arg;
3747 size_t expected_output_length = expected_output_length_arg;
3748 size_t key_bits;
3749 unsigned char *output = NULL;
3750 size_t output_size;
3751 size_t output_length = ~0;
3752 psa_status_t actual_status;
3753 psa_status_t expected_status = expected_status_arg;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003754 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003755
Gilles Peskine8817f612018-12-18 00:18:46 +01003756 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003757
Gilles Peskine656896e2018-06-29 19:12:28 +02003758 /* Import the key */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003759 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3760 psa_set_key_algorithm( &attributes, alg );
3761 psa_set_key_type( &attributes, key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02003762 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003763 &key ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003764
3765 /* Determine the maximum output length */
Ronald Cron5425a212020-08-04 14:58:35 +02003766 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003767 key_bits = psa_get_key_bits( &attributes );
gabor-mezei-armceface22021-01-21 12:26:17 +01003768
Gilles Peskine656896e2018-06-29 19:12:28 +02003769 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
gabor-mezei-armceface22021-01-21 12:26:17 +01003770 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003771 ASSERT_ALLOC( output, output_size );
Gilles Peskine656896e2018-06-29 19:12:28 +02003772
3773 /* Encrypt the input */
Ronald Cron5425a212020-08-04 14:58:35 +02003774 actual_status = psa_asymmetric_encrypt( key, alg,
Gilles Peskine656896e2018-06-29 19:12:28 +02003775 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003776 label->x, label->len,
Gilles Peskine656896e2018-06-29 19:12:28 +02003777 output, output_size,
3778 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003779 TEST_EQUAL( actual_status, expected_status );
3780 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine656896e2018-06-29 19:12:28 +02003781
Gilles Peskine68428122018-06-30 18:42:41 +02003782 /* If the label is empty, the test framework puts a non-null pointer
3783 * in label->x. Test that a null pointer works as well. */
3784 if( label->len == 0 )
3785 {
3786 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003787 if( output_size != 0 )
3788 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02003789 actual_status = psa_asymmetric_encrypt( key, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02003790 input_data->x, input_data->len,
3791 NULL, label->len,
3792 output, output_size,
3793 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003794 TEST_EQUAL( actual_status, expected_status );
3795 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003796 }
3797
Gilles Peskine656896e2018-06-29 19:12:28 +02003798exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003799 /*
3800 * Key attributes may have been returned by psa_get_key_attributes()
3801 * thus reset them as required.
3802 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003803 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003804
Ronald Cron5425a212020-08-04 14:58:35 +02003805 psa_destroy_key( key );
Gilles Peskine656896e2018-06-29 19:12:28 +02003806 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003807 PSA_DONE( );
Gilles Peskine656896e2018-06-29 19:12:28 +02003808}
3809/* END_CASE */
3810
3811/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003812void asymmetric_encrypt_decrypt( int key_type_arg,
3813 data_t *key_data,
3814 int alg_arg,
3815 data_t *input_data,
3816 data_t *label )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003817{
Ronald Cron5425a212020-08-04 14:58:35 +02003818 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003819 psa_key_type_t key_type = key_type_arg;
3820 psa_algorithm_t alg = alg_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003821 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003822 unsigned char *output = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003823 size_t output_size;
3824 size_t output_length = ~0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003825 unsigned char *output2 = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003826 size_t output2_size;
3827 size_t output2_length = ~0;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003828 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003829
Gilles Peskine8817f612018-12-18 00:18:46 +01003830 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003831
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003832 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3833 psa_set_key_algorithm( &attributes, alg );
3834 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003835
Gilles Peskine049c7532019-05-15 20:22:09 +02003836 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003837 &key ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003838
3839 /* Determine the maximum ciphertext length */
Ronald Cron5425a212020-08-04 14:58:35 +02003840 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003841 key_bits = psa_get_key_bits( &attributes );
gabor-mezei-armceface22021-01-21 12:26:17 +01003842
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003843 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
gabor-mezei-armceface22021-01-21 12:26:17 +01003844 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003845 ASSERT_ALLOC( output, output_size );
gabor-mezei-armceface22021-01-21 12:26:17 +01003846
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003847 output2_size = input_data->len;
gabor-mezei-armceface22021-01-21 12:26:17 +01003848 TEST_ASSERT( output2_size <=
3849 PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE( key_type, key_bits, alg ) );
3850 TEST_ASSERT( output2_size <= PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003851 ASSERT_ALLOC( output2, output2_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003852
Gilles Peskineeebd7382018-06-08 18:11:54 +02003853 /* We test encryption by checking that encrypt-then-decrypt gives back
3854 * the original plaintext because of the non-optional random
3855 * part of encryption process which prevents using fixed vectors. */
Ronald Cron5425a212020-08-04 14:58:35 +02003856 PSA_ASSERT( psa_asymmetric_encrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01003857 input_data->x, input_data->len,
3858 label->x, label->len,
3859 output, output_size,
3860 &output_length ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003861 /* We don't know what ciphertext length to expect, but check that
3862 * it looks sensible. */
3863 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003864
Ronald Cron5425a212020-08-04 14:58:35 +02003865 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01003866 output, output_length,
3867 label->x, label->len,
3868 output2, output2_size,
3869 &output2_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003870 ASSERT_COMPARE( input_data->x, input_data->len,
3871 output2, output2_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003872
3873exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003874 /*
3875 * Key attributes may have been returned by psa_get_key_attributes()
3876 * thus reset them as required.
3877 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003878 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003879
Ronald Cron5425a212020-08-04 14:58:35 +02003880 psa_destroy_key( key );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003881 mbedtls_free( output );
3882 mbedtls_free( output2 );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003883 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003884}
3885/* END_CASE */
3886
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003887/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003888void asymmetric_decrypt( int key_type_arg,
3889 data_t *key_data,
3890 int alg_arg,
3891 data_t *input_data,
3892 data_t *label,
Gilles Peskine66763a02018-06-29 21:54:10 +02003893 data_t *expected_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003894{
Ronald Cron5425a212020-08-04 14:58:35 +02003895 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003896 psa_key_type_t key_type = key_type_arg;
3897 psa_algorithm_t alg = alg_arg;
gabor-mezei-armceface22021-01-21 12:26:17 +01003898 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003899 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03003900 size_t output_size = 0;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003901 size_t output_length = ~0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003902 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003903
Gilles Peskine8817f612018-12-18 00:18:46 +01003904 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003905
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003906 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3907 psa_set_key_algorithm( &attributes, alg );
3908 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003909
Gilles Peskine049c7532019-05-15 20:22:09 +02003910 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003911 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003912
gabor-mezei-armceface22021-01-21 12:26:17 +01003913 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3914 key_bits = psa_get_key_bits( &attributes );
3915
3916 /* Determine the maximum ciphertext length */
3917 output_size = PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
3918 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE );
3919 ASSERT_ALLOC( output, output_size );
3920
Ronald Cron5425a212020-08-04 14:58:35 +02003921 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01003922 input_data->x, input_data->len,
3923 label->x, label->len,
3924 output,
3925 output_size,
3926 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003927 ASSERT_COMPARE( expected_data->x, expected_data->len,
3928 output, output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003929
Gilles Peskine68428122018-06-30 18:42:41 +02003930 /* If the label is empty, the test framework puts a non-null pointer
3931 * in label->x. Test that a null pointer works as well. */
3932 if( label->len == 0 )
3933 {
3934 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003935 if( output_size != 0 )
3936 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02003937 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01003938 input_data->x, input_data->len,
3939 NULL, label->len,
3940 output,
3941 output_size,
3942 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003943 ASSERT_COMPARE( expected_data->x, expected_data->len,
3944 output, output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003945 }
3946
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003947exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003948 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003949 psa_destroy_key( key );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003950 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003951 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003952}
3953/* END_CASE */
3954
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003955/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003956void asymmetric_decrypt_fail( int key_type_arg,
3957 data_t *key_data,
3958 int alg_arg,
3959 data_t *input_data,
3960 data_t *label,
Jaeden Amerof8daab72019-02-06 12:57:46 +00003961 int output_size_arg,
Gilles Peskine2d277862018-06-18 15:41:12 +02003962 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003963{
Ronald Cron5425a212020-08-04 14:58:35 +02003964 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003965 psa_key_type_t key_type = key_type_arg;
3966 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003967 unsigned char *output = NULL;
Jaeden Amerof8daab72019-02-06 12:57:46 +00003968 size_t output_size = output_size_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003969 size_t output_length = ~0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003970 psa_status_t actual_status;
3971 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003972 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003973
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003974 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003975
Gilles Peskine8817f612018-12-18 00:18:46 +01003976 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003977
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003978 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3979 psa_set_key_algorithm( &attributes, alg );
3980 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003981
Gilles Peskine049c7532019-05-15 20:22:09 +02003982 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003983 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003984
Ronald Cron5425a212020-08-04 14:58:35 +02003985 actual_status = psa_asymmetric_decrypt( key, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003986 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003987 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003988 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02003989 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003990 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003991 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003992
Gilles Peskine68428122018-06-30 18:42:41 +02003993 /* If the label is empty, the test framework puts a non-null pointer
3994 * in label->x. Test that a null pointer works as well. */
3995 if( label->len == 0 )
3996 {
3997 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003998 if( output_size != 0 )
3999 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02004000 actual_status = psa_asymmetric_decrypt( key, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02004001 input_data->x, input_data->len,
4002 NULL, label->len,
4003 output, output_size,
4004 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004005 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004006 TEST_ASSERT( output_length <= output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02004007 }
4008
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004009exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004010 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02004011 psa_destroy_key( key );
Gilles Peskine2d277862018-06-18 15:41:12 +02004012 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004013 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004014}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02004015/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02004016
4017/* BEGIN_CASE */
Gilles Peskinecbe66502019-05-16 16:59:18 +02004018void key_derivation_init( )
Jaeden Amerod94d6712019-01-04 14:11:48 +00004019{
4020 /* Test each valid way of initializing the object, except for `= {0}`, as
4021 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
4022 * though it's OK by the C standard. We could test for this, but we'd need
4023 * to supress the Clang warning for the test. */
Jaeden Amero5229bbb2019-02-07 16:33:37 +00004024 size_t capacity;
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004025 psa_key_derivation_operation_t func = psa_key_derivation_operation_init( );
4026 psa_key_derivation_operation_t init = PSA_KEY_DERIVATION_OPERATION_INIT;
4027 psa_key_derivation_operation_t zero;
Jaeden Amerod94d6712019-01-04 14:11:48 +00004028
4029 memset( &zero, 0, sizeof( zero ) );
4030
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004031 /* A default operation should not be able to report its capacity. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004032 TEST_EQUAL( psa_key_derivation_get_capacity( &func, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004033 PSA_ERROR_BAD_STATE );
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004034 TEST_EQUAL( psa_key_derivation_get_capacity( &init, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004035 PSA_ERROR_BAD_STATE );
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004036 TEST_EQUAL( psa_key_derivation_get_capacity( &zero, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004037 PSA_ERROR_BAD_STATE );
Jaeden Amero5229bbb2019-02-07 16:33:37 +00004038
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004039 /* A default operation should be abortable without error. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004040 PSA_ASSERT( psa_key_derivation_abort(&func) );
4041 PSA_ASSERT( psa_key_derivation_abort(&init) );
4042 PSA_ASSERT( psa_key_derivation_abort(&zero) );
Jaeden Amerod94d6712019-01-04 14:11:48 +00004043}
4044/* END_CASE */
4045
Janos Follath16de4a42019-06-13 16:32:24 +01004046/* BEGIN_CASE */
4047void derive_setup( int alg_arg, int expected_status_arg )
Gilles Peskineea0fb492018-07-12 17:17:20 +02004048{
Gilles Peskineea0fb492018-07-12 17:17:20 +02004049 psa_algorithm_t alg = alg_arg;
Gilles Peskineea0fb492018-07-12 17:17:20 +02004050 psa_status_t expected_status = expected_status_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004051 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02004052
Gilles Peskine8817f612018-12-18 00:18:46 +01004053 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004054
Janos Follath16de4a42019-06-13 16:32:24 +01004055 TEST_EQUAL( psa_key_derivation_setup( &operation, alg ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004056 expected_status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004057
4058exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004059 psa_key_derivation_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004060 PSA_DONE( );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004061}
4062/* END_CASE */
4063
Janos Follathaf3c2a02019-06-12 12:34:34 +01004064/* BEGIN_CASE */
Janos Follatha27c9272019-06-14 09:59:36 +01004065void derive_set_capacity( int alg_arg, int capacity_arg,
4066 int expected_status_arg )
4067{
4068 psa_algorithm_t alg = alg_arg;
4069 size_t capacity = capacity_arg;
4070 psa_status_t expected_status = expected_status_arg;
4071 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4072
4073 PSA_ASSERT( psa_crypto_init( ) );
4074
4075 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4076
4077 TEST_EQUAL( psa_key_derivation_set_capacity( &operation, capacity ),
4078 expected_status );
4079
4080exit:
4081 psa_key_derivation_abort( &operation );
4082 PSA_DONE( );
4083}
4084/* END_CASE */
4085
4086/* BEGIN_CASE */
Janos Follathaf3c2a02019-06-12 12:34:34 +01004087void derive_input( int alg_arg,
Gilles Peskine6842ba42019-09-23 13:49:33 +02004088 int step_arg1, int key_type_arg1, data_t *input1,
Janos Follathaf3c2a02019-06-12 12:34:34 +01004089 int expected_status_arg1,
Gilles Peskine2058c072019-09-24 17:19:33 +02004090 int step_arg2, int key_type_arg2, data_t *input2,
Janos Follathaf3c2a02019-06-12 12:34:34 +01004091 int expected_status_arg2,
Gilles Peskine2058c072019-09-24 17:19:33 +02004092 int step_arg3, int key_type_arg3, data_t *input3,
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004093 int expected_status_arg3,
4094 int output_key_type_arg, int expected_output_status_arg )
Janos Follathaf3c2a02019-06-12 12:34:34 +01004095{
4096 psa_algorithm_t alg = alg_arg;
Gilles Peskine6842ba42019-09-23 13:49:33 +02004097 psa_key_derivation_step_t steps[] = {step_arg1, step_arg2, step_arg3};
4098 psa_key_type_t key_types[] = {key_type_arg1, key_type_arg2, key_type_arg3};
Janos Follathaf3c2a02019-06-12 12:34:34 +01004099 psa_status_t expected_statuses[] = {expected_status_arg1,
4100 expected_status_arg2,
4101 expected_status_arg3};
4102 data_t *inputs[] = {input1, input2, input3};
Ronald Cron5425a212020-08-04 14:58:35 +02004103 mbedtls_svc_key_id_t keys[] = { MBEDTLS_SVC_KEY_ID_INIT,
4104 MBEDTLS_SVC_KEY_ID_INIT,
4105 MBEDTLS_SVC_KEY_ID_INIT };
Janos Follathaf3c2a02019-06-12 12:34:34 +01004106 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4107 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4108 size_t i;
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004109 psa_key_type_t output_key_type = output_key_type_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02004110 mbedtls_svc_key_id_t output_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004111 psa_status_t expected_output_status = expected_output_status_arg;
4112 psa_status_t actual_output_status;
Janos Follathaf3c2a02019-06-12 12:34:34 +01004113
4114 PSA_ASSERT( psa_crypto_init( ) );
4115
4116 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4117 psa_set_key_algorithm( &attributes, alg );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004118
4119 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4120
4121 for( i = 0; i < ARRAY_LENGTH( steps ); i++ )
4122 {
Gilles Peskine4023c012021-05-27 13:21:20 +02004123 mbedtls_test_set_step( i );
4124 if( steps[i] == 0 )
4125 {
4126 /* Skip this step */
4127 }
4128 else if( key_types[i] != PSA_KEY_TYPE_NONE )
Janos Follathaf3c2a02019-06-12 12:34:34 +01004129 {
Gilles Peskine6842ba42019-09-23 13:49:33 +02004130 psa_set_key_type( &attributes, key_types[i] );
4131 PSA_ASSERT( psa_import_key( &attributes,
4132 inputs[i]->x, inputs[i]->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004133 &keys[i] ) );
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004134 if( PSA_KEY_TYPE_IS_KEY_PAIR( key_types[i] ) &&
4135 steps[i] == PSA_KEY_DERIVATION_INPUT_SECRET )
4136 {
4137 // When taking a private key as secret input, use key agreement
4138 // to add the shared secret to the derivation
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004139 TEST_EQUAL( mbedtls_test_psa_key_agreement_with_self(
4140 &operation, keys[i] ),
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004141 expected_statuses[i] );
4142 }
4143 else
4144 {
4145 TEST_EQUAL( psa_key_derivation_input_key( &operation, steps[i],
Ronald Cron5425a212020-08-04 14:58:35 +02004146 keys[i] ),
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004147 expected_statuses[i] );
4148 }
Gilles Peskine6842ba42019-09-23 13:49:33 +02004149 }
4150 else
4151 {
4152 TEST_EQUAL( psa_key_derivation_input_bytes(
4153 &operation, steps[i],
4154 inputs[i]->x, inputs[i]->len ),
4155 expected_statuses[i] );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004156 }
4157 }
4158
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004159 if( output_key_type != PSA_KEY_TYPE_NONE )
4160 {
4161 psa_reset_key_attributes( &attributes );
4162 psa_set_key_type( &attributes, PSA_KEY_TYPE_RAW_DATA );
4163 psa_set_key_bits( &attributes, 8 );
4164 actual_output_status =
4165 psa_key_derivation_output_key( &attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004166 &output_key );
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004167 }
4168 else
4169 {
4170 uint8_t buffer[1];
4171 actual_output_status =
4172 psa_key_derivation_output_bytes( &operation,
4173 buffer, sizeof( buffer ) );
4174 }
4175 TEST_EQUAL( actual_output_status, expected_output_status );
4176
Janos Follathaf3c2a02019-06-12 12:34:34 +01004177exit:
4178 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004179 for( i = 0; i < ARRAY_LENGTH( keys ); i++ )
4180 psa_destroy_key( keys[i] );
4181 psa_destroy_key( output_key );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004182 PSA_DONE( );
4183}
4184/* END_CASE */
4185
Janos Follathd958bb72019-07-03 15:02:16 +01004186/* BEGIN_CASE */
Gilles Peskine1c77edd2021-05-27 11:55:02 +02004187void derive_over_capacity( int alg_arg )
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004188{
Janos Follathd958bb72019-07-03 15:02:16 +01004189 psa_algorithm_t alg = alg_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02004190 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein4eda37b2018-10-31 12:15:58 +02004191 size_t key_type = PSA_KEY_TYPE_DERIVE;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004192 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Janos Follathd958bb72019-07-03 15:02:16 +01004193 unsigned char input1[] = "Input 1";
4194 size_t input1_length = sizeof( input1 );
4195 unsigned char input2[] = "Input 2";
4196 size_t input2_length = sizeof( input2 );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004197 uint8_t buffer[42];
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02004198 size_t capacity = sizeof( buffer );
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02004199 const uint8_t key_data[22] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
4200 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
4201 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004202 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004203
Gilles Peskine8817f612018-12-18 00:18:46 +01004204 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004205
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004206 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4207 psa_set_key_algorithm( &attributes, alg );
4208 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004209
Gilles Peskine73676cb2019-05-15 20:15:10 +02004210 PSA_ASSERT( psa_import_key( &attributes,
4211 key_data, sizeof( key_data ),
Ronald Cron5425a212020-08-04 14:58:35 +02004212 &key ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004213
4214 /* valid key derivation */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004215 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, key, alg,
4216 input1, input1_length,
4217 input2, input2_length,
4218 capacity ) )
Janos Follathd958bb72019-07-03 15:02:16 +01004219 goto exit;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004220
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004221 /* state of operation shouldn't allow additional generation */
Janos Follathd958bb72019-07-03 15:02:16 +01004222 TEST_EQUAL( psa_key_derivation_setup( &operation, alg ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004223 PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004224
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004225 PSA_ASSERT( psa_key_derivation_output_bytes( &operation, buffer, capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004226
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004227 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, buffer, capacity ),
David Saadab4ecc272019-02-14 13:48:10 +02004228 PSA_ERROR_INSUFFICIENT_DATA );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004229
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004230exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004231 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004232 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004233 PSA_DONE( );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004234}
4235/* END_CASE */
4236
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004237/* BEGIN_CASE */
Gilles Peskine1c77edd2021-05-27 11:55:02 +02004238void derive_actions_without_setup( )
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004239{
4240 uint8_t output_buffer[16];
4241 size_t buffer_size = 16;
4242 size_t capacity = 0;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004243 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004244
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004245 TEST_ASSERT( psa_key_derivation_output_bytes( &operation,
4246 output_buffer, buffer_size )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004247 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004248
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004249 TEST_ASSERT( psa_key_derivation_get_capacity( &operation, &capacity )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004250 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004251
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004252 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004253
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004254 TEST_ASSERT( psa_key_derivation_output_bytes( &operation,
4255 output_buffer, buffer_size )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004256 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004257
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004258 TEST_ASSERT( psa_key_derivation_get_capacity( &operation, &capacity )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004259 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004260
4261exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004262 psa_key_derivation_abort( &operation );
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004263}
4264/* END_CASE */
4265
4266/* BEGIN_CASE */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004267void derive_output( int alg_arg,
Gilles Peskine1468da72019-05-29 17:35:49 +02004268 int step1_arg, data_t *input1,
4269 int step2_arg, data_t *input2,
4270 int step3_arg, data_t *input3,
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004271 int requested_capacity_arg,
4272 data_t *expected_output1,
4273 data_t *expected_output2 )
4274{
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004275 psa_algorithm_t alg = alg_arg;
Gilles Peskine1468da72019-05-29 17:35:49 +02004276 psa_key_derivation_step_t steps[] = {step1_arg, step2_arg, step3_arg};
4277 data_t *inputs[] = {input1, input2, input3};
Ronald Cron5425a212020-08-04 14:58:35 +02004278 mbedtls_svc_key_id_t keys[] = { MBEDTLS_SVC_KEY_ID_INIT,
4279 MBEDTLS_SVC_KEY_ID_INIT,
4280 MBEDTLS_SVC_KEY_ID_INIT };
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004281 size_t requested_capacity = requested_capacity_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004282 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004283 uint8_t *expected_outputs[2] =
4284 {expected_output1->x, expected_output2->x};
4285 size_t output_sizes[2] =
4286 {expected_output1->len, expected_output2->len};
4287 size_t output_buffer_size = 0;
4288 uint8_t *output_buffer = NULL;
4289 size_t expected_capacity;
4290 size_t current_capacity;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004291 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004292 psa_status_t status;
Gilles Peskine1468da72019-05-29 17:35:49 +02004293 size_t i;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004294
4295 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4296 {
4297 if( output_sizes[i] > output_buffer_size )
4298 output_buffer_size = output_sizes[i];
4299 if( output_sizes[i] == 0 )
4300 expected_outputs[i] = NULL;
4301 }
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004302 ASSERT_ALLOC( output_buffer, output_buffer_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01004303 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004304
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004305 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4306 psa_set_key_algorithm( &attributes, alg );
4307 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004308
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004309 /* Extraction phase. */
Gilles Peskine1468da72019-05-29 17:35:49 +02004310 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4311 PSA_ASSERT( psa_key_derivation_set_capacity( &operation,
4312 requested_capacity ) );
4313 for( i = 0; i < ARRAY_LENGTH( steps ); i++ )
Gilles Peskineb70a0fd2019-01-07 22:59:38 +01004314 {
Gilles Peskine1468da72019-05-29 17:35:49 +02004315 switch( steps[i] )
4316 {
4317 case 0:
4318 break;
4319 case PSA_KEY_DERIVATION_INPUT_SECRET:
4320 PSA_ASSERT( psa_import_key( &attributes,
4321 inputs[i]->x, inputs[i]->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004322 &keys[i] ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01004323
4324 if ( PSA_ALG_IS_TLS12_PSK_TO_MS( alg ) )
4325 {
4326 PSA_ASSERT( psa_get_key_attributes( keys[i], &attributes ) );
4327 TEST_ASSERT( PSA_BITS_TO_BYTES( psa_get_key_bits( &attributes ) ) <=
4328 PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE );
4329 }
4330
Gilles Peskine1468da72019-05-29 17:35:49 +02004331 PSA_ASSERT( psa_key_derivation_input_key(
Ronald Cron5425a212020-08-04 14:58:35 +02004332 &operation, steps[i], keys[i] ) );
Gilles Peskine1468da72019-05-29 17:35:49 +02004333 break;
4334 default:
4335 PSA_ASSERT( psa_key_derivation_input_bytes(
4336 &operation, steps[i],
4337 inputs[i]->x, inputs[i]->len ) );
4338 break;
4339 }
Gilles Peskineb70a0fd2019-01-07 22:59:38 +01004340 }
Gilles Peskine1468da72019-05-29 17:35:49 +02004341
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004342 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004343 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004344 TEST_EQUAL( current_capacity, requested_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004345 expected_capacity = requested_capacity;
4346
4347 /* Expansion phase. */
4348 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4349 {
4350 /* Read some bytes. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004351 status = psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004352 output_buffer, output_sizes[i] );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004353 if( expected_capacity == 0 && output_sizes[i] == 0 )
4354 {
4355 /* Reading 0 bytes when 0 bytes are available can go either way. */
4356 TEST_ASSERT( status == PSA_SUCCESS ||
David Saadab4ecc272019-02-14 13:48:10 +02004357 status == PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004358 continue;
4359 }
4360 else if( expected_capacity == 0 ||
4361 output_sizes[i] > expected_capacity )
4362 {
4363 /* Capacity exceeded. */
David Saadab4ecc272019-02-14 13:48:10 +02004364 TEST_EQUAL( status, PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004365 expected_capacity = 0;
4366 continue;
4367 }
4368 /* Success. Check the read data. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004369 PSA_ASSERT( status );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004370 if( output_sizes[i] != 0 )
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004371 ASSERT_COMPARE( output_buffer, output_sizes[i],
4372 expected_outputs[i], output_sizes[i] );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004373 /* Check the operation status. */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004374 expected_capacity -= output_sizes[i];
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004375 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004376 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004377 TEST_EQUAL( expected_capacity, current_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004378 }
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004379 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004380
4381exit:
4382 mbedtls_free( output_buffer );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004383 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004384 for( i = 0; i < ARRAY_LENGTH( keys ); i++ )
4385 psa_destroy_key( keys[i] );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004386 PSA_DONE( );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004387}
4388/* END_CASE */
4389
4390/* BEGIN_CASE */
Gilles Peskined54931c2018-07-17 21:06:59 +02004391void derive_full( int alg_arg,
4392 data_t *key_data,
Janos Follath47f27ed2019-06-25 13:24:52 +01004393 data_t *input1,
4394 data_t *input2,
Gilles Peskined54931c2018-07-17 21:06:59 +02004395 int requested_capacity_arg )
4396{
Ronald Cron5425a212020-08-04 14:58:35 +02004397 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004398 psa_algorithm_t alg = alg_arg;
4399 size_t requested_capacity = requested_capacity_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004400 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004401 unsigned char output_buffer[16];
4402 size_t expected_capacity = requested_capacity;
4403 size_t current_capacity;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004404 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004405
Gilles Peskine8817f612018-12-18 00:18:46 +01004406 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004407
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004408 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4409 psa_set_key_algorithm( &attributes, alg );
4410 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskined54931c2018-07-17 21:06:59 +02004411
Gilles Peskine049c7532019-05-15 20:22:09 +02004412 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004413 &key ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004414
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004415 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, key, alg,
4416 input1->x, input1->len,
4417 input2->x, input2->len,
4418 requested_capacity ) )
Janos Follathf2815ea2019-07-03 12:41:36 +01004419 goto exit;
Janos Follath47f27ed2019-06-25 13:24:52 +01004420
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004421 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004422 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004423 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004424
4425 /* Expansion phase. */
4426 while( current_capacity > 0 )
4427 {
4428 size_t read_size = sizeof( output_buffer );
4429 if( read_size > current_capacity )
4430 read_size = current_capacity;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004431 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004432 output_buffer,
4433 read_size ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004434 expected_capacity -= read_size;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004435 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004436 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004437 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004438 }
4439
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004440 /* Check that the operation refuses to go over capacity. */
4441 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, output_buffer, 1 ),
David Saadab4ecc272019-02-14 13:48:10 +02004442 PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskined54931c2018-07-17 21:06:59 +02004443
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004444 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004445
4446exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004447 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004448 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004449 PSA_DONE( );
Gilles Peskined54931c2018-07-17 21:06:59 +02004450}
4451/* END_CASE */
4452
Janos Follathe60c9052019-07-03 13:51:30 +01004453/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02004454void derive_key_exercise( int alg_arg,
4455 data_t *key_data,
Janos Follathe60c9052019-07-03 13:51:30 +01004456 data_t *input1,
4457 data_t *input2,
Gilles Peskine0386fba2018-07-12 17:29:22 +02004458 int derived_type_arg,
4459 int derived_bits_arg,
4460 int derived_usage_arg,
4461 int derived_alg_arg )
4462{
Ronald Cron5425a212020-08-04 14:58:35 +02004463 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4464 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004465 psa_algorithm_t alg = alg_arg;
4466 psa_key_type_t derived_type = derived_type_arg;
4467 size_t derived_bits = derived_bits_arg;
4468 psa_key_usage_t derived_usage = derived_usage_arg;
4469 psa_algorithm_t derived_alg = derived_alg_arg;
4470 size_t capacity = PSA_BITS_TO_BYTES( derived_bits );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004471 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004472 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004473 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004474
Gilles Peskine8817f612018-12-18 00:18:46 +01004475 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004476
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004477 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4478 psa_set_key_algorithm( &attributes, alg );
4479 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02004480 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004481 &base_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004482
4483 /* Derive a key. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004484 if ( mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4485 input1->x, input1->len,
4486 input2->x, input2->len,
4487 capacity ) )
Janos Follathe60c9052019-07-03 13:51:30 +01004488 goto exit;
4489
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004490 psa_set_key_usage_flags( &attributes, derived_usage );
4491 psa_set_key_algorithm( &attributes, derived_alg );
4492 psa_set_key_type( &attributes, derived_type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004493 psa_set_key_bits( &attributes, derived_bits );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004494 PSA_ASSERT( psa_key_derivation_output_key( &attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004495 &derived_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004496
4497 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02004498 PSA_ASSERT( psa_get_key_attributes( derived_key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004499 TEST_EQUAL( psa_get_key_type( &got_attributes ), derived_type );
4500 TEST_EQUAL( psa_get_key_bits( &got_attributes ), derived_bits );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004501
4502 /* Exercise the derived key. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004503 if( ! mbedtls_test_psa_exercise_key( derived_key, derived_usage, derived_alg ) )
Gilles Peskine0386fba2018-07-12 17:29:22 +02004504 goto exit;
4505
4506exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004507 /*
4508 * Key attributes may have been returned by psa_get_key_attributes()
4509 * thus reset them as required.
4510 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004511 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004512
4513 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004514 psa_destroy_key( base_key );
4515 psa_destroy_key( derived_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004516 PSA_DONE( );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004517}
4518/* END_CASE */
4519
Janos Follath42fd8882019-07-03 14:17:09 +01004520/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02004521void derive_key_export( int alg_arg,
4522 data_t *key_data,
Janos Follath42fd8882019-07-03 14:17:09 +01004523 data_t *input1,
4524 data_t *input2,
Gilles Peskine0386fba2018-07-12 17:29:22 +02004525 int bytes1_arg,
4526 int bytes2_arg )
4527{
Ronald Cron5425a212020-08-04 14:58:35 +02004528 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4529 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004530 psa_algorithm_t alg = alg_arg;
4531 size_t bytes1 = bytes1_arg;
4532 size_t bytes2 = bytes2_arg;
4533 size_t capacity = bytes1 + bytes2;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004534 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004535 uint8_t *output_buffer = NULL;
4536 uint8_t *export_buffer = NULL;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004537 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
4538 psa_key_attributes_t derived_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004539 size_t length;
4540
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004541 ASSERT_ALLOC( output_buffer, capacity );
4542 ASSERT_ALLOC( export_buffer, capacity );
Gilles Peskine8817f612018-12-18 00:18:46 +01004543 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004544
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004545 psa_set_key_usage_flags( &base_attributes, PSA_KEY_USAGE_DERIVE );
4546 psa_set_key_algorithm( &base_attributes, alg );
4547 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02004548 PSA_ASSERT( psa_import_key( &base_attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004549 &base_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004550
4551 /* Derive some material and output it. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004552 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4553 input1->x, input1->len,
4554 input2->x, input2->len,
4555 capacity ) )
Janos Follath42fd8882019-07-03 14:17:09 +01004556 goto exit;
4557
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004558 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004559 output_buffer,
4560 capacity ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004561 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004562
4563 /* Derive the same output again, but this time store it in key objects. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004564 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4565 input1->x, input1->len,
4566 input2->x, input2->len,
4567 capacity ) )
Janos Follath42fd8882019-07-03 14:17:09 +01004568 goto exit;
4569
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004570 psa_set_key_usage_flags( &derived_attributes, PSA_KEY_USAGE_EXPORT );
4571 psa_set_key_algorithm( &derived_attributes, 0 );
4572 psa_set_key_type( &derived_attributes, PSA_KEY_TYPE_RAW_DATA );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004573 psa_set_key_bits( &derived_attributes, PSA_BYTES_TO_BITS( bytes1 ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004574 PSA_ASSERT( psa_key_derivation_output_key( &derived_attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004575 &derived_key ) );
4576 PSA_ASSERT( psa_export_key( derived_key,
Gilles Peskine8817f612018-12-18 00:18:46 +01004577 export_buffer, bytes1,
4578 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004579 TEST_EQUAL( length, bytes1 );
Ronald Cron5425a212020-08-04 14:58:35 +02004580 PSA_ASSERT( psa_destroy_key( derived_key ) );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004581 psa_set_key_bits( &derived_attributes, PSA_BYTES_TO_BITS( bytes2 ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004582 PSA_ASSERT( psa_key_derivation_output_key( &derived_attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004583 &derived_key ) );
4584 PSA_ASSERT( psa_export_key( derived_key,
Gilles Peskine8817f612018-12-18 00:18:46 +01004585 export_buffer + bytes1, bytes2,
4586 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004587 TEST_EQUAL( length, bytes2 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004588
4589 /* Compare the outputs from the two runs. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004590 ASSERT_COMPARE( output_buffer, bytes1 + bytes2,
4591 export_buffer, capacity );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004592
4593exit:
4594 mbedtls_free( output_buffer );
4595 mbedtls_free( export_buffer );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004596 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004597 psa_destroy_key( base_key );
4598 psa_destroy_key( derived_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004599 PSA_DONE( );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004600}
4601/* END_CASE */
4602
4603/* BEGIN_CASE */
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004604void derive_key( int alg_arg,
4605 data_t *key_data, data_t *input1, data_t *input2,
4606 int type_arg, int bits_arg,
Steven Cooreman83fdb702021-01-21 14:24:39 +01004607 int expected_status_arg,
4608 int is_large_output )
Gilles Peskinec744d992019-07-30 17:26:54 +02004609{
Ronald Cron5425a212020-08-04 14:58:35 +02004610 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4611 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec744d992019-07-30 17:26:54 +02004612 psa_algorithm_t alg = alg_arg;
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004613 psa_key_type_t type = type_arg;
Gilles Peskinec744d992019-07-30 17:26:54 +02004614 size_t bits = bits_arg;
4615 psa_status_t expected_status = expected_status_arg;
4616 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4617 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
4618 psa_key_attributes_t derived_attributes = PSA_KEY_ATTRIBUTES_INIT;
4619
4620 PSA_ASSERT( psa_crypto_init( ) );
4621
4622 psa_set_key_usage_flags( &base_attributes, PSA_KEY_USAGE_DERIVE );
4623 psa_set_key_algorithm( &base_attributes, alg );
4624 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
4625 PSA_ASSERT( psa_import_key( &base_attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004626 &base_key ) );
Gilles Peskinec744d992019-07-30 17:26:54 +02004627
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004628 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4629 input1->x, input1->len,
4630 input2->x, input2->len,
4631 SIZE_MAX ) )
Gilles Peskinec744d992019-07-30 17:26:54 +02004632 goto exit;
4633
4634 psa_set_key_usage_flags( &derived_attributes, PSA_KEY_USAGE_EXPORT );
4635 psa_set_key_algorithm( &derived_attributes, 0 );
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004636 psa_set_key_type( &derived_attributes, type );
Gilles Peskinec744d992019-07-30 17:26:54 +02004637 psa_set_key_bits( &derived_attributes, bits );
Steven Cooreman83fdb702021-01-21 14:24:39 +01004638
4639 psa_status_t status =
4640 psa_key_derivation_output_key( &derived_attributes,
4641 &operation,
4642 &derived_key );
4643 if( is_large_output > 0 )
4644 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
4645 TEST_EQUAL( status, expected_status );
Gilles Peskinec744d992019-07-30 17:26:54 +02004646
4647exit:
4648 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004649 psa_destroy_key( base_key );
4650 psa_destroy_key( derived_key );
Gilles Peskinec744d992019-07-30 17:26:54 +02004651 PSA_DONE( );
4652}
4653/* END_CASE */
4654
4655/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02004656void key_agreement_setup( int alg_arg,
Steven Cooremance48e852020-10-05 16:02:45 +02004657 int our_key_type_arg, int our_key_alg_arg,
4658 data_t *our_key_data, data_t *peer_key_data,
Gilles Peskine01d718c2018-09-18 12:01:02 +02004659 int expected_status_arg )
4660{
Ronald Cron5425a212020-08-04 14:58:35 +02004661 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004662 psa_algorithm_t alg = alg_arg;
Steven Cooremanfa5e6312020-10-15 17:07:12 +02004663 psa_algorithm_t our_key_alg = our_key_alg_arg;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004664 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004665 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004666 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine77f40d82019-04-11 21:27:06 +02004667 psa_status_t expected_status = expected_status_arg;
4668 psa_status_t status;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004669
Gilles Peskine8817f612018-12-18 00:18:46 +01004670 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004671
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004672 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
Steven Cooremanfa5e6312020-10-15 17:07:12 +02004673 psa_set_key_algorithm( &attributes, our_key_alg );
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004674 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004675 PSA_ASSERT( psa_import_key( &attributes,
4676 our_key_data->x, our_key_data->len,
4677 &our_key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004678
Gilles Peskine77f40d82019-04-11 21:27:06 +02004679 /* The tests currently include inputs that should fail at either step.
4680 * Test cases that fail at the setup step should be changed to call
4681 * key_derivation_setup instead, and this function should be renamed
4682 * to key_agreement_fail. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004683 status = psa_key_derivation_setup( &operation, alg );
Gilles Peskine77f40d82019-04-11 21:27:06 +02004684 if( status == PSA_SUCCESS )
4685 {
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004686 TEST_EQUAL( psa_key_derivation_key_agreement(
4687 &operation, PSA_KEY_DERIVATION_INPUT_SECRET,
4688 our_key,
4689 peer_key_data->x, peer_key_data->len ),
Gilles Peskine77f40d82019-04-11 21:27:06 +02004690 expected_status );
4691 }
4692 else
4693 {
4694 TEST_ASSERT( status == expected_status );
4695 }
Gilles Peskine01d718c2018-09-18 12:01:02 +02004696
4697exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004698 psa_key_derivation_abort( &operation );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004699 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004700 PSA_DONE( );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004701}
4702/* END_CASE */
4703
4704/* BEGIN_CASE */
Gilles Peskinef0cba732019-04-11 22:12:38 +02004705void raw_key_agreement( int alg_arg,
4706 int our_key_type_arg, data_t *our_key_data,
4707 data_t *peer_key_data,
4708 data_t *expected_output )
4709{
Ronald Cron5425a212020-08-04 14:58:35 +02004710 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004711 psa_algorithm_t alg = alg_arg;
4712 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004713 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004714 unsigned char *output = NULL;
4715 size_t output_length = ~0;
gabor-mezei-armceface22021-01-21 12:26:17 +01004716 size_t key_bits;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004717
4718 ASSERT_ALLOC( output, expected_output->len );
4719 PSA_ASSERT( psa_crypto_init( ) );
4720
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004721 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4722 psa_set_key_algorithm( &attributes, alg );
4723 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004724 PSA_ASSERT( psa_import_key( &attributes,
4725 our_key_data->x, our_key_data->len,
4726 &our_key ) );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004727
gabor-mezei-armceface22021-01-21 12:26:17 +01004728 PSA_ASSERT( psa_get_key_attributes( our_key, &attributes ) );
4729 key_bits = psa_get_key_bits( &attributes );
4730
Gilles Peskinebe697d82019-05-16 18:00:41 +02004731 PSA_ASSERT( psa_raw_key_agreement( alg, our_key,
4732 peer_key_data->x, peer_key_data->len,
4733 output, expected_output->len,
4734 &output_length ) );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004735 ASSERT_COMPARE( output, output_length,
4736 expected_output->x, expected_output->len );
gabor-mezei-armceface22021-01-21 12:26:17 +01004737 TEST_ASSERT( output_length <=
4738 PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE( our_key_type, key_bits ) );
4739 TEST_ASSERT( output_length <=
4740 PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004741
4742exit:
4743 mbedtls_free( output );
4744 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004745 PSA_DONE( );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004746}
4747/* END_CASE */
4748
4749/* BEGIN_CASE */
Gilles Peskine59685592018-09-18 12:11:34 +02004750void key_agreement_capacity( int alg_arg,
4751 int our_key_type_arg, data_t *our_key_data,
4752 data_t *peer_key_data,
4753 int expected_capacity_arg )
4754{
Ronald Cron5425a212020-08-04 14:58:35 +02004755 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004756 psa_algorithm_t alg = alg_arg;
4757 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004758 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004759 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004760 size_t actual_capacity;
Gilles Peskinebf491972018-10-25 22:36:12 +02004761 unsigned char output[16];
Gilles Peskine59685592018-09-18 12:11:34 +02004762
Gilles Peskine8817f612018-12-18 00:18:46 +01004763 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004764
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004765 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4766 psa_set_key_algorithm( &attributes, alg );
4767 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004768 PSA_ASSERT( psa_import_key( &attributes,
4769 our_key_data->x, our_key_data->len,
4770 &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004771
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004772 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004773 PSA_ASSERT( psa_key_derivation_key_agreement(
4774 &operation,
4775 PSA_KEY_DERIVATION_INPUT_SECRET, our_key,
4776 peer_key_data->x, peer_key_data->len ) );
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004777 if( PSA_ALG_IS_HKDF( PSA_ALG_KEY_AGREEMENT_GET_KDF( alg ) ) )
4778 {
4779 /* The test data is for info="" */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004780 PSA_ASSERT( psa_key_derivation_input_bytes( &operation,
Gilles Peskine03410b52019-05-16 16:05:19 +02004781 PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004782 NULL, 0 ) );
4783 }
Gilles Peskine59685592018-09-18 12:11:34 +02004784
Gilles Peskinebf491972018-10-25 22:36:12 +02004785 /* Test the advertized capacity. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004786 PSA_ASSERT( psa_key_derivation_get_capacity(
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004787 &operation, &actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004788 TEST_EQUAL( actual_capacity, (size_t) expected_capacity_arg );
Gilles Peskine59685592018-09-18 12:11:34 +02004789
Gilles Peskinebf491972018-10-25 22:36:12 +02004790 /* Test the actual capacity by reading the output. */
4791 while( actual_capacity > sizeof( output ) )
4792 {
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004793 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004794 output, sizeof( output ) ) );
Gilles Peskinebf491972018-10-25 22:36:12 +02004795 actual_capacity -= sizeof( output );
4796 }
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004797 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004798 output, actual_capacity ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004799 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, output, 1 ),
David Saadab4ecc272019-02-14 13:48:10 +02004800 PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskinebf491972018-10-25 22:36:12 +02004801
Gilles Peskine59685592018-09-18 12:11:34 +02004802exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004803 psa_key_derivation_abort( &operation );
Gilles Peskine59685592018-09-18 12:11:34 +02004804 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004805 PSA_DONE( );
Gilles Peskine59685592018-09-18 12:11:34 +02004806}
4807/* END_CASE */
4808
4809/* BEGIN_CASE */
4810void key_agreement_output( int alg_arg,
4811 int our_key_type_arg, data_t *our_key_data,
4812 data_t *peer_key_data,
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004813 data_t *expected_output1, data_t *expected_output2 )
Gilles Peskine59685592018-09-18 12:11:34 +02004814{
Ronald Cron5425a212020-08-04 14:58:35 +02004815 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004816 psa_algorithm_t alg = alg_arg;
4817 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004818 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004819 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004820 uint8_t *actual_output = NULL;
Gilles Peskine59685592018-09-18 12:11:34 +02004821
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004822 ASSERT_ALLOC( actual_output, MAX( expected_output1->len,
4823 expected_output2->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004824
Gilles Peskine8817f612018-12-18 00:18:46 +01004825 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004826
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004827 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4828 psa_set_key_algorithm( &attributes, alg );
4829 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004830 PSA_ASSERT( psa_import_key( &attributes,
4831 our_key_data->x, our_key_data->len,
4832 &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004833
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004834 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004835 PSA_ASSERT( psa_key_derivation_key_agreement(
4836 &operation,
4837 PSA_KEY_DERIVATION_INPUT_SECRET, our_key,
4838 peer_key_data->x, peer_key_data->len ) );
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004839 if( PSA_ALG_IS_HKDF( PSA_ALG_KEY_AGREEMENT_GET_KDF( alg ) ) )
4840 {
4841 /* The test data is for info="" */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004842 PSA_ASSERT( psa_key_derivation_input_bytes( &operation,
Gilles Peskine03410b52019-05-16 16:05:19 +02004843 PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004844 NULL, 0 ) );
4845 }
Gilles Peskine59685592018-09-18 12:11:34 +02004846
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004847 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004848 actual_output,
4849 expected_output1->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004850 ASSERT_COMPARE( actual_output, expected_output1->len,
4851 expected_output1->x, expected_output1->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004852 if( expected_output2->len != 0 )
4853 {
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004854 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004855 actual_output,
4856 expected_output2->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004857 ASSERT_COMPARE( actual_output, expected_output2->len,
4858 expected_output2->x, expected_output2->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004859 }
Gilles Peskine59685592018-09-18 12:11:34 +02004860
4861exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004862 psa_key_derivation_abort( &operation );
Gilles Peskine59685592018-09-18 12:11:34 +02004863 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004864 PSA_DONE( );
Gilles Peskine59685592018-09-18 12:11:34 +02004865 mbedtls_free( actual_output );
4866}
4867/* END_CASE */
4868
4869/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02004870void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02004871{
Gilles Peskinea50d7392018-06-21 10:22:13 +02004872 size_t bytes = bytes_arg;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004873 unsigned char *output = NULL;
4874 unsigned char *changed = NULL;
Gilles Peskinea50d7392018-06-21 10:22:13 +02004875 size_t i;
4876 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02004877
Simon Butcher49f8e312020-03-03 15:51:50 +00004878 TEST_ASSERT( bytes_arg >= 0 );
4879
Gilles Peskine91892022021-02-08 19:50:26 +01004880 ASSERT_ALLOC( output, bytes );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004881 ASSERT_ALLOC( changed, bytes );
Gilles Peskine05d69892018-06-19 22:00:52 +02004882
Gilles Peskine8817f612018-12-18 00:18:46 +01004883 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02004884
Gilles Peskinea50d7392018-06-21 10:22:13 +02004885 /* Run several times, to ensure that every output byte will be
4886 * nonzero at least once with overwhelming probability
4887 * (2^(-8*number_of_runs)). */
4888 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02004889 {
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004890 if( bytes != 0 )
4891 memset( output, 0, bytes );
Gilles Peskine8817f612018-12-18 00:18:46 +01004892 PSA_ASSERT( psa_generate_random( output, bytes ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004893
Gilles Peskinea50d7392018-06-21 10:22:13 +02004894 for( i = 0; i < bytes; i++ )
4895 {
4896 if( output[i] != 0 )
4897 ++changed[i];
4898 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004899 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02004900
4901 /* Check that every byte was changed to nonzero at least once. This
4902 * validates that psa_generate_random is overwriting every byte of
4903 * the output buffer. */
4904 for( i = 0; i < bytes; i++ )
4905 {
4906 TEST_ASSERT( changed[i] != 0 );
4907 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004908
4909exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004910 PSA_DONE( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004911 mbedtls_free( output );
4912 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02004913}
4914/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02004915
4916/* BEGIN_CASE */
4917void generate_key( int type_arg,
4918 int bits_arg,
4919 int usage_arg,
4920 int alg_arg,
Steven Cooreman83fdb702021-01-21 14:24:39 +01004921 int expected_status_arg,
4922 int is_large_key )
Gilles Peskine12313cd2018-06-20 00:20:32 +02004923{
Ronald Cron5425a212020-08-04 14:58:35 +02004924 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004925 psa_key_type_t type = type_arg;
4926 psa_key_usage_t usage = usage_arg;
4927 size_t bits = bits_arg;
4928 psa_algorithm_t alg = alg_arg;
4929 psa_status_t expected_status = expected_status_arg;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004930 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004931 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004932
Gilles Peskine8817f612018-12-18 00:18:46 +01004933 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004934
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004935 psa_set_key_usage_flags( &attributes, usage );
4936 psa_set_key_algorithm( &attributes, alg );
4937 psa_set_key_type( &attributes, type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004938 psa_set_key_bits( &attributes, bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004939
4940 /* Generate a key */
Steven Cooreman83fdb702021-01-21 14:24:39 +01004941 psa_status_t status = psa_generate_key( &attributes, &key );
4942
4943 if( is_large_key > 0 )
4944 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
4945 TEST_EQUAL( status , expected_status );
Gilles Peskinee56e8782019-04-26 17:34:02 +02004946 if( expected_status != PSA_SUCCESS )
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004947 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004948
4949 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02004950 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004951 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
4952 TEST_EQUAL( psa_get_key_bits( &got_attributes ), bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004953
Gilles Peskine818ca122018-06-20 18:16:48 +02004954 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004955 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +02004956 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004957
4958exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004959 /*
4960 * Key attributes may have been returned by psa_get_key_attributes()
4961 * thus reset them as required.
4962 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004963 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004964
Ronald Cron5425a212020-08-04 14:58:35 +02004965 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004966 PSA_DONE( );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004967}
4968/* END_CASE */
itayzafrir0adf0fc2018-09-06 16:24:41 +03004969
Ronald Cronee414c72021-03-18 18:50:08 +01004970/* BEGIN_CASE depends_on:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR:PSA_WANT_ALG_RSA_PKCS1V15_CRYPT:PSA_WANT_ALG_RSA_PKCS1V15_SIGN:MBEDTLS_GENPRIME */
Gilles Peskinee56e8782019-04-26 17:34:02 +02004971void generate_key_rsa( int bits_arg,
4972 data_t *e_arg,
4973 int expected_status_arg )
4974{
Ronald Cron5425a212020-08-04 14:58:35 +02004975 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec93b80c2019-05-16 19:39:54 +02004976 psa_key_type_t type = PSA_KEY_TYPE_RSA_KEY_PAIR;
Gilles Peskinee56e8782019-04-26 17:34:02 +02004977 size_t bits = bits_arg;
4978 psa_key_usage_t usage = PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT;
4979 psa_algorithm_t alg = PSA_ALG_RSA_PKCS1V15_SIGN_RAW;
4980 psa_status_t expected_status = expected_status_arg;
4981 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4982 uint8_t *exported = NULL;
4983 size_t exported_size =
gabor-mezei-armcbcec212020-12-18 14:23:51 +01004984 PSA_EXPORT_KEY_OUTPUT_SIZE( PSA_KEY_TYPE_RSA_PUBLIC_KEY, bits );
Gilles Peskinee56e8782019-04-26 17:34:02 +02004985 size_t exported_length = SIZE_MAX;
4986 uint8_t *e_read_buffer = NULL;
4987 int is_default_public_exponent = 0;
Gilles Peskineaa02c172019-04-28 11:44:17 +02004988 size_t e_read_size = PSA_KEY_DOMAIN_PARAMETERS_SIZE( type, bits );
Gilles Peskinee56e8782019-04-26 17:34:02 +02004989 size_t e_read_length = SIZE_MAX;
4990
4991 if( e_arg->len == 0 ||
4992 ( e_arg->len == 3 &&
4993 e_arg->x[0] == 1 && e_arg->x[1] == 0 && e_arg->x[2] == 1 ) )
4994 {
4995 is_default_public_exponent = 1;
4996 e_read_size = 0;
4997 }
4998 ASSERT_ALLOC( e_read_buffer, e_read_size );
4999 ASSERT_ALLOC( exported, exported_size );
5000
5001 PSA_ASSERT( psa_crypto_init( ) );
5002
5003 psa_set_key_usage_flags( &attributes, usage );
5004 psa_set_key_algorithm( &attributes, alg );
5005 PSA_ASSERT( psa_set_key_domain_parameters( &attributes, type,
5006 e_arg->x, e_arg->len ) );
5007 psa_set_key_bits( &attributes, bits );
5008
5009 /* Generate a key */
Ronald Cron5425a212020-08-04 14:58:35 +02005010 TEST_EQUAL( psa_generate_key( &attributes, &key ), expected_status );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005011 if( expected_status != PSA_SUCCESS )
5012 goto exit;
5013
5014 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02005015 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005016 TEST_EQUAL( psa_get_key_type( &attributes ), type );
5017 TEST_EQUAL( psa_get_key_bits( &attributes ), bits );
5018 PSA_ASSERT( psa_get_key_domain_parameters( &attributes,
5019 e_read_buffer, e_read_size,
5020 &e_read_length ) );
5021 if( is_default_public_exponent )
5022 TEST_EQUAL( e_read_length, 0 );
5023 else
5024 ASSERT_COMPARE( e_read_buffer, e_read_length, e_arg->x, e_arg->len );
5025
5026 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01005027 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskinee56e8782019-04-26 17:34:02 +02005028 goto exit;
5029
5030 /* Export the key and check the public exponent. */
Ronald Cron5425a212020-08-04 14:58:35 +02005031 PSA_ASSERT( psa_export_public_key( key,
Gilles Peskinee56e8782019-04-26 17:34:02 +02005032 exported, exported_size,
5033 &exported_length ) );
5034 {
5035 uint8_t *p = exported;
5036 uint8_t *end = exported + exported_length;
5037 size_t len;
5038 /* RSAPublicKey ::= SEQUENCE {
5039 * modulus INTEGER, -- n
5040 * publicExponent INTEGER } -- e
5041 */
5042 TEST_EQUAL( 0, mbedtls_asn1_get_tag( &p, end, &len,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005043 MBEDTLS_ASN1_SEQUENCE |
5044 MBEDTLS_ASN1_CONSTRUCTED ) );
Gilles Peskine8e94efe2021-02-13 00:25:53 +01005045 TEST_ASSERT( mbedtls_test_asn1_skip_integer( &p, end, bits, bits, 1 ) );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005046 TEST_EQUAL( 0, mbedtls_asn1_get_tag( &p, end, &len,
5047 MBEDTLS_ASN1_INTEGER ) );
5048 if( len >= 1 && p[0] == 0 )
5049 {
5050 ++p;
5051 --len;
5052 }
5053 if( e_arg->len == 0 )
5054 {
5055 TEST_EQUAL( len, 3 );
5056 TEST_EQUAL( p[0], 1 );
5057 TEST_EQUAL( p[1], 0 );
5058 TEST_EQUAL( p[2], 1 );
5059 }
5060 else
5061 ASSERT_COMPARE( p, len, e_arg->x, e_arg->len );
5062 }
5063
5064exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005065 /*
5066 * Key attributes may have been returned by psa_get_key_attributes() or
5067 * set by psa_set_key_domain_parameters() thus reset them as required.
5068 */
Gilles Peskinee56e8782019-04-26 17:34:02 +02005069 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005070
Ronald Cron5425a212020-08-04 14:58:35 +02005071 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005072 PSA_DONE( );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005073 mbedtls_free( e_read_buffer );
5074 mbedtls_free( exported );
5075}
5076/* END_CASE */
5077
Darryl Greend49a4992018-06-18 17:27:26 +01005078/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C */
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005079void persistent_key_load_key_from_storage( data_t *data,
5080 int type_arg, int bits_arg,
5081 int usage_flags_arg, int alg_arg,
5082 int generation_method )
Darryl Greend49a4992018-06-18 17:27:26 +01005083{
Ronald Cron71016a92020-08-28 19:01:50 +02005084 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, 1 );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005085 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +02005086 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
5087 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005088 psa_key_type_t type = type_arg;
5089 size_t bits = bits_arg;
5090 psa_key_usage_t usage_flags = usage_flags_arg;
5091 psa_algorithm_t alg = alg_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005092 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01005093 unsigned char *first_export = NULL;
5094 unsigned char *second_export = NULL;
gabor-mezei-armcbcec212020-12-18 14:23:51 +01005095 size_t export_size = PSA_EXPORT_KEY_OUTPUT_SIZE( type, bits );
Darryl Greend49a4992018-06-18 17:27:26 +01005096 size_t first_exported_length;
5097 size_t second_exported_length;
5098
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005099 if( usage_flags & PSA_KEY_USAGE_EXPORT )
5100 {
5101 ASSERT_ALLOC( first_export, export_size );
5102 ASSERT_ALLOC( second_export, export_size );
5103 }
Darryl Greend49a4992018-06-18 17:27:26 +01005104
Gilles Peskine8817f612018-12-18 00:18:46 +01005105 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01005106
Gilles Peskinec87af662019-05-15 16:12:22 +02005107 psa_set_key_id( &attributes, key_id );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005108 psa_set_key_usage_flags( &attributes, usage_flags );
5109 psa_set_key_algorithm( &attributes, alg );
5110 psa_set_key_type( &attributes, type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02005111 psa_set_key_bits( &attributes, bits );
Darryl Greend49a4992018-06-18 17:27:26 +01005112
Darryl Green0c6575a2018-11-07 16:05:30 +00005113 switch( generation_method )
5114 {
5115 case IMPORT_KEY:
5116 /* Import the key */
Gilles Peskine049c7532019-05-15 20:22:09 +02005117 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02005118 &key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005119 break;
Darryl Greend49a4992018-06-18 17:27:26 +01005120
Darryl Green0c6575a2018-11-07 16:05:30 +00005121 case GENERATE_KEY:
5122 /* Generate a key */
Ronald Cron5425a212020-08-04 14:58:35 +02005123 PSA_ASSERT( psa_generate_key( &attributes, &key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005124 break;
5125
5126 case DERIVE_KEY:
Steven Cooreman70f654a2021-02-15 10:51:43 +01005127#if defined(PSA_WANT_ALG_HKDF) && defined(PSA_WANT_ALG_SHA_256)
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005128 {
5129 /* Create base key */
5130 psa_algorithm_t derive_alg = PSA_ALG_HKDF( PSA_ALG_SHA_256 );
5131 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
5132 psa_set_key_usage_flags( &base_attributes,
5133 PSA_KEY_USAGE_DERIVE );
5134 psa_set_key_algorithm( &base_attributes, derive_alg );
5135 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02005136 PSA_ASSERT( psa_import_key( &base_attributes,
5137 data->x, data->len,
5138 &base_key ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005139 /* Derive a key. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005140 PSA_ASSERT( psa_key_derivation_setup( &operation, derive_alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005141 PSA_ASSERT( psa_key_derivation_input_key(
5142 &operation,
5143 PSA_KEY_DERIVATION_INPUT_SECRET, base_key ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005144 PSA_ASSERT( psa_key_derivation_input_bytes(
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005145 &operation, PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005146 NULL, 0 ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005147 PSA_ASSERT( psa_key_derivation_output_key( &attributes,
5148 &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02005149 &key ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005150 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005151 PSA_ASSERT( psa_destroy_key( base_key ) );
Ronald Cron5425a212020-08-04 14:58:35 +02005152 base_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005153 }
Gilles Peskine6fea21d2021-01-12 00:02:15 +01005154#else
5155 TEST_ASSUME( ! "KDF not supported in this configuration" );
5156#endif
5157 break;
5158
5159 default:
5160 TEST_ASSERT( ! "generation_method not implemented in test" );
5161 break;
Darryl Green0c6575a2018-11-07 16:05:30 +00005162 }
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005163 psa_reset_key_attributes( &attributes );
Darryl Greend49a4992018-06-18 17:27:26 +01005164
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005165 /* Export the key if permitted by the key policy. */
5166 if( usage_flags & PSA_KEY_USAGE_EXPORT )
5167 {
Ronald Cron5425a212020-08-04 14:58:35 +02005168 PSA_ASSERT( psa_export_key( key,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005169 first_export, export_size,
5170 &first_exported_length ) );
5171 if( generation_method == IMPORT_KEY )
5172 ASSERT_COMPARE( data->x, data->len,
5173 first_export, first_exported_length );
5174 }
Darryl Greend49a4992018-06-18 17:27:26 +01005175
5176 /* Shutdown and restart */
Ronald Cron5425a212020-08-04 14:58:35 +02005177 PSA_ASSERT( psa_purge_key( key ) );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005178 PSA_DONE();
Gilles Peskine8817f612018-12-18 00:18:46 +01005179 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01005180
Darryl Greend49a4992018-06-18 17:27:26 +01005181 /* Check key slot still contains key data */
Ronald Cron5425a212020-08-04 14:58:35 +02005182 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Ronald Cronecfb2372020-07-23 17:13:42 +02005183 TEST_ASSERT( mbedtls_svc_key_id_equal(
5184 psa_get_key_id( &attributes ), key_id ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005185 TEST_EQUAL( psa_get_key_lifetime( &attributes ),
5186 PSA_KEY_LIFETIME_PERSISTENT );
5187 TEST_EQUAL( psa_get_key_type( &attributes ), type );
5188 TEST_EQUAL( psa_get_key_bits( &attributes ), bits );
5189 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), usage_flags );
5190 TEST_EQUAL( psa_get_key_algorithm( &attributes ), alg );
Darryl Greend49a4992018-06-18 17:27:26 +01005191
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005192 /* Export the key again if permitted by the key policy. */
5193 if( usage_flags & PSA_KEY_USAGE_EXPORT )
Darryl Green0c6575a2018-11-07 16:05:30 +00005194 {
Ronald Cron5425a212020-08-04 14:58:35 +02005195 PSA_ASSERT( psa_export_key( key,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005196 second_export, export_size,
5197 &second_exported_length ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005198 ASSERT_COMPARE( first_export, first_exported_length,
5199 second_export, second_exported_length );
Darryl Green0c6575a2018-11-07 16:05:30 +00005200 }
5201
5202 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01005203 if( ! mbedtls_test_psa_exercise_key( key, usage_flags, alg ) )
Darryl Green0c6575a2018-11-07 16:05:30 +00005204 goto exit;
Darryl Greend49a4992018-06-18 17:27:26 +01005205
5206exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005207 /*
5208 * Key attributes may have been returned by psa_get_key_attributes()
5209 * thus reset them as required.
5210 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005211 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005212
Darryl Greend49a4992018-06-18 17:27:26 +01005213 mbedtls_free( first_export );
5214 mbedtls_free( second_export );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005215 psa_key_derivation_abort( &operation );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005216 psa_destroy_key( base_key );
Ronald Cron5425a212020-08-04 14:58:35 +02005217 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005218 PSA_DONE();
Darryl Greend49a4992018-06-18 17:27:26 +01005219}
5220/* END_CASE */