blob: a380bee0e8b99d31702d935f35ff654d97314985 [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 */
gabor-mezei-arma56756e2021-06-25 15:49:14 +02002416void cipher_encrypt_fail( int alg_arg,
2417 int key_type_arg,
2418 data_t *key_data,
2419 data_t *input,
2420 int expected_status_arg )
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002421{
2422 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
2423 psa_status_t status;
2424 psa_key_type_t key_type = key_type_arg;
2425 psa_algorithm_t alg = alg_arg;
2426 psa_status_t expected_status = expected_status_arg;
2427 unsigned char *output = NULL;
2428 size_t output_buffer_size = 0;
2429 size_t output_length = 0;
2430 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2431
2432 if ( PSA_ERROR_BAD_STATE != expected_status )
2433 {
2434 PSA_ASSERT( psa_crypto_init( ) );
2435
2436 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2437 psa_set_key_algorithm( &attributes, alg );
2438 psa_set_key_type( &attributes, key_type );
2439
2440 output_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg,
2441 input->len );
2442 ASSERT_ALLOC( output, output_buffer_size );
2443
2444 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2445 &key ) );
2446 }
2447
2448 status = psa_cipher_encrypt( key, alg, input->x, input->len, output,
2449 output_buffer_size, &output_length );
2450
2451 TEST_EQUAL( status, expected_status );
2452
2453exit:
2454 mbedtls_free( output );
2455 psa_destroy_key( key );
2456 PSA_DONE( );
2457}
2458/* END_CASE */
2459
2460/* BEGIN_CASE */
gabor-mezei-arma56756e2021-06-25 15:49:14 +02002461void cipher_encrypt_alg_without_iv( int alg_arg,
2462 int key_type_arg,
2463 data_t *key_data,
2464 data_t *input,
2465 data_t *expected_output )
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002466{
2467 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
2468 psa_key_type_t key_type = key_type_arg;
2469 psa_algorithm_t alg = alg_arg;
2470 unsigned char *output = NULL;
2471 size_t output_buffer_size = 0;
2472 size_t output_length = 0;
2473 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2474
2475 PSA_ASSERT( psa_crypto_init( ) );
2476
2477 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2478 psa_set_key_algorithm( &attributes, alg );
2479 psa_set_key_type( &attributes, key_type );
2480
2481 output_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2482 ASSERT_ALLOC( output, output_buffer_size );
2483
2484 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2485 &key ) );
2486
2487 PSA_ASSERT( psa_cipher_encrypt( key, alg, input->x, input->len, output,
2488 output_buffer_size, &output_length ) );
2489 TEST_ASSERT( output_length <=
2490 PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len ) );
2491 TEST_ASSERT( output_length <=
2492 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
2493
2494 ASSERT_COMPARE( expected_output->x, expected_output->len,
2495 output, output_length );
2496exit:
2497 mbedtls_free( output );
2498 psa_destroy_key( key );
2499 PSA_DONE( );
2500}
2501/* END_CASE */
2502
2503/* BEGIN_CASE */
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002504void cipher_encrypt_validation( int alg_arg,
2505 int key_type_arg,
2506 data_t *key_data,
2507 data_t *input )
2508{
2509 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
2510 psa_key_type_t key_type = key_type_arg;
2511 psa_algorithm_t alg = alg_arg;
2512 size_t iv_size = PSA_CIPHER_IV_LENGTH ( key_type, alg );
2513 unsigned char *output1 = NULL;
2514 size_t output1_buffer_size = 0;
2515 size_t output1_length = 0;
2516 unsigned char *output2 = NULL;
2517 size_t output2_buffer_size = 0;
2518 size_t output2_length = 0;
2519 size_t function_output_length = 0;
2520 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
2521 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2522
2523 PSA_ASSERT( psa_crypto_init( ) );
2524
2525 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2526 psa_set_key_algorithm( &attributes, alg );
2527 psa_set_key_type( &attributes, key_type );
2528
2529 output1_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2530 output2_buffer_size = PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) +
2531 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg );
2532 ASSERT_ALLOC( output1, output1_buffer_size );
2533 ASSERT_ALLOC( output2, output2_buffer_size );
2534
2535 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2536 &key ) );
2537
gabor-mezei-arm50c86cf2021-06-25 15:47:50 +02002538 /* The one-shot cipher encryption uses generated iv so validating
2539 the output is not possible. Validating with multipart encryption. */
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002540 PSA_ASSERT( psa_cipher_encrypt( key, alg, input->x, input->len, output1,
2541 output1_buffer_size, &output1_length ) );
2542 TEST_ASSERT( output1_length <=
2543 PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len ) );
2544 TEST_ASSERT( output1_length <=
2545 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
2546
2547 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
2548 PSA_ASSERT( psa_cipher_set_iv( &operation, output1, iv_size ) );
2549
2550 PSA_ASSERT( psa_cipher_update( &operation,
2551 input->x, input->len,
2552 output2, output2_buffer_size,
2553 &function_output_length ) );
2554 TEST_ASSERT( function_output_length <=
2555 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) );
2556 TEST_ASSERT( function_output_length <=
2557 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
2558 output2_length += function_output_length;
2559
2560 PSA_ASSERT( psa_cipher_finish( &operation,
2561 output2 + output2_length,
2562 output2_buffer_size - output2_length,
2563 &function_output_length ) );
2564 TEST_ASSERT( function_output_length <=
2565 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2566 TEST_ASSERT( function_output_length <=
2567 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
2568 output2_length += function_output_length;
2569
2570 PSA_ASSERT( psa_cipher_abort( &operation ) );
2571 ASSERT_COMPARE( output1 + iv_size, output1_length - iv_size,
2572 output2, output2_length );
2573
2574exit:
2575 psa_cipher_abort( &operation );
2576 mbedtls_free( output1 );
2577 mbedtls_free( output2 );
2578 psa_destroy_key( key );
2579 PSA_DONE( );
2580}
2581/* END_CASE */
2582
2583/* BEGIN_CASE */
2584void cipher_encrypt_simple_multipart( int alg_arg,
2585 int key_type_arg,
2586 data_t *key_data,
2587 data_t *iv,
2588 data_t *input,
2589 data_t *expected_output,
2590 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002591{
Ronald Cron5425a212020-08-04 14:58:35 +02002592 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002593 psa_status_t status;
2594 psa_key_type_t key_type = key_type_arg;
2595 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002596 psa_status_t expected_status = expected_status_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_ENCRYPT );
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_encrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002614
Steven Cooremaned3c9ec2020-07-06 14:08:59 +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 }
2619
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002620 output_buffer_size = PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) +
2621 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002622 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002623
Gilles Peskine8817f612018-12-18 00:18:46 +01002624 PSA_ASSERT( psa_cipher_update( &operation,
2625 input->x, input->len,
2626 output, output_buffer_size,
2627 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002628 TEST_ASSERT( function_output_length <=
2629 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) );
2630 TEST_ASSERT( function_output_length <=
2631 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002632 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002633
Gilles Peskine50e586b2018-06-08 14:28:46 +02002634 status = psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002635 ( output_buffer_size == 0 ? NULL :
2636 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002637 output_buffer_size - total_output_length,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002638 &function_output_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002639 TEST_ASSERT( function_output_length <=
2640 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2641 TEST_ASSERT( function_output_length <=
2642 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002643 total_output_length += function_output_length;
2644
Gilles Peskinefe11b722018-12-18 00:24:04 +01002645 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002646 if( expected_status == PSA_SUCCESS )
2647 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002648 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002649 ASSERT_COMPARE( expected_output->x, expected_output->len,
2650 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002651 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002652
Gilles Peskine50e586b2018-06-08 14:28:46 +02002653exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002654 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002655 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002656 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002657 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002658}
2659/* END_CASE */
2660
2661/* BEGIN_CASE */
2662void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002663 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002664 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002665 int first_part_size_arg,
2666 int output1_length_arg, int output2_length_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002667 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002668{
Ronald Cron5425a212020-08-04 14:58:35 +02002669 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002670 psa_key_type_t key_type = key_type_arg;
2671 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002672 size_t first_part_size = first_part_size_arg;
2673 size_t output1_length = output1_length_arg;
2674 size_t output2_length = output2_length_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002675 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002676 size_t output_buffer_size = 0;
2677 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002678 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002679 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002680 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002681
Gilles Peskine8817f612018-12-18 00:18:46 +01002682 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002683
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002684 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2685 psa_set_key_algorithm( &attributes, alg );
2686 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002687
Ronald Cron5425a212020-08-04 14:58:35 +02002688 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2689 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002690
Ronald Cron5425a212020-08-04 14:58:35 +02002691 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002692
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002693 if( iv->len > 0 )
2694 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002695 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002696 }
2697
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002698 output_buffer_size = PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) +
2699 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002700 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002701
Gilles Peskinee0866522019-02-19 19:44:00 +01002702 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002703 PSA_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
2704 output, output_buffer_size,
2705 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002706 TEST_ASSERT( function_output_length == output1_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002707 TEST_ASSERT( function_output_length <=
2708 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2709 TEST_ASSERT( function_output_length <=
2710 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002711 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002712
Gilles Peskine8817f612018-12-18 00:18:46 +01002713 PSA_ASSERT( psa_cipher_update( &operation,
2714 input->x + first_part_size,
2715 input->len - first_part_size,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002716 ( output_buffer_size == 0 ? NULL :
2717 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002718 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002719 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002720 TEST_ASSERT( function_output_length == output2_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002721 TEST_ASSERT( function_output_length <=
2722 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2723 alg,
2724 input->len - first_part_size ) );
2725 TEST_ASSERT( function_output_length <=
2726 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002727 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002728
Gilles Peskine8817f612018-12-18 00:18:46 +01002729 PSA_ASSERT( psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002730 ( output_buffer_size == 0 ? NULL :
2731 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002732 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002733 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002734 TEST_ASSERT( function_output_length <=
2735 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2736 TEST_ASSERT( function_output_length <=
2737 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002738 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002739 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002740
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002741 ASSERT_COMPARE( expected_output->x, expected_output->len,
2742 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002743
2744exit:
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
2752/* BEGIN_CASE */
2753void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002754 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002755 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002756 int first_part_size_arg,
2757 int output1_length_arg, int output2_length_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002758 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002759{
Ronald Cron5425a212020-08-04 14:58:35 +02002760 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002761 psa_key_type_t key_type = key_type_arg;
2762 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002763 size_t first_part_size = first_part_size_arg;
2764 size_t output1_length = output1_length_arg;
2765 size_t output2_length = output2_length_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002766 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002767 size_t output_buffer_size = 0;
2768 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002769 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002770 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002771 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002772
Gilles Peskine8817f612018-12-18 00:18:46 +01002773 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002774
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002775 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2776 psa_set_key_algorithm( &attributes, alg );
2777 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002778
Ronald Cron5425a212020-08-04 14:58:35 +02002779 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2780 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002781
Ronald Cron5425a212020-08-04 14:58:35 +02002782 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002783
Steven Cooreman177deba2020-09-07 17:14:14 +02002784 if( iv->len > 0 )
2785 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002786 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002787 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02002788
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002789 output_buffer_size = PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) +
2790 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002791 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002792
Gilles Peskinee0866522019-02-19 19:44:00 +01002793 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002794 PSA_ASSERT( psa_cipher_update( &operation,
2795 input->x, first_part_size,
2796 output, output_buffer_size,
2797 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002798 TEST_ASSERT( function_output_length == output1_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002799 TEST_ASSERT( function_output_length <=
2800 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2801 TEST_ASSERT( function_output_length <=
2802 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002803 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002804
Gilles Peskine8817f612018-12-18 00:18:46 +01002805 PSA_ASSERT( psa_cipher_update( &operation,
2806 input->x + first_part_size,
2807 input->len - first_part_size,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002808 ( output_buffer_size == 0 ? NULL :
2809 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002810 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002811 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002812 TEST_ASSERT( function_output_length == output2_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002813 TEST_ASSERT( function_output_length <=
2814 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2815 alg,
2816 input->len - first_part_size ) );
2817 TEST_ASSERT( function_output_length <=
2818 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002819 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002820
Gilles Peskine8817f612018-12-18 00:18:46 +01002821 PSA_ASSERT( psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002822 ( output_buffer_size == 0 ? NULL :
2823 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002824 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002825 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002826 TEST_ASSERT( function_output_length <=
2827 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2828 TEST_ASSERT( function_output_length <=
2829 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002830 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002831 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002832
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002833 ASSERT_COMPARE( expected_output->x, expected_output->len,
2834 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002835
2836exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002837 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002838 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002839 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002840 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002841}
2842/* END_CASE */
2843
Gilles Peskine50e586b2018-06-08 14:28:46 +02002844/* BEGIN_CASE */
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002845void cipher_decrypt_simple_multipart( int alg_arg,
2846 int key_type_arg,
2847 data_t *key_data,
2848 data_t *iv,
2849 data_t *input,
2850 data_t *expected_output,
2851 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002852{
Ronald Cron5425a212020-08-04 14:58:35 +02002853 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002854 psa_status_t status;
2855 psa_key_type_t key_type = key_type_arg;
2856 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002857 psa_status_t expected_status = expected_status_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002858 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002859 size_t output_buffer_size = 0;
2860 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002861 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002862 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002863 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002864
Gilles Peskine8817f612018-12-18 00:18:46 +01002865 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002866
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002867 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2868 psa_set_key_algorithm( &attributes, alg );
2869 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002870
Ronald Cron5425a212020-08-04 14:58:35 +02002871 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2872 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002873
Ronald Cron5425a212020-08-04 14:58:35 +02002874 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002875
Steven Cooreman177deba2020-09-07 17:14:14 +02002876 if( iv->len > 0 )
2877 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002878 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002879 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02002880
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002881 output_buffer_size = PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) +
2882 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002883 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002884
Gilles Peskine8817f612018-12-18 00:18:46 +01002885 PSA_ASSERT( psa_cipher_update( &operation,
2886 input->x, input->len,
2887 output, output_buffer_size,
2888 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002889 TEST_ASSERT( function_output_length <=
2890 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) );
2891 TEST_ASSERT( function_output_length <=
2892 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002893 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002894
Gilles Peskine50e586b2018-06-08 14:28:46 +02002895 status = psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002896 ( output_buffer_size == 0 ? NULL :
2897 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002898 output_buffer_size - total_output_length,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002899 &function_output_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002900 TEST_ASSERT( function_output_length <=
2901 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2902 TEST_ASSERT( function_output_length <=
2903 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002904 total_output_length += function_output_length;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002905 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002906
2907 if( expected_status == PSA_SUCCESS )
2908 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002909 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002910 ASSERT_COMPARE( expected_output->x, expected_output->len,
2911 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002912 }
2913
Gilles Peskine50e586b2018-06-08 14:28:46 +02002914exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002915 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002916 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002917 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002918 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002919}
2920/* END_CASE */
2921
Gilles Peskine50e586b2018-06-08 14:28:46 +02002922/* BEGIN_CASE */
gabor-mezei-arma56756e2021-06-25 15:49:14 +02002923void cipher_decrypt_fail( int alg_arg,
2924 int key_type_arg,
2925 data_t *key_data,
2926 data_t *iv,
2927 data_t *input_arg,
2928 int expected_status_arg )
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002929{
2930 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
2931 psa_status_t status;
2932 psa_key_type_t key_type = key_type_arg;
2933 psa_algorithm_t alg = alg_arg;
2934 psa_status_t expected_status = expected_status_arg;
2935 unsigned char *input = NULL;
2936 size_t input_buffer_size = 0;
2937 unsigned char *output = NULL;
2938 size_t output_buffer_size = 0;
2939 size_t output_length = 0;
2940 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2941
2942 if ( PSA_ERROR_BAD_STATE != expected_status )
2943 {
2944 PSA_ASSERT( psa_crypto_init( ) );
2945
2946 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2947 psa_set_key_algorithm( &attributes, alg );
2948 psa_set_key_type( &attributes, key_type );
2949
2950 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2951 &key ) );
2952 }
2953
2954 /* Allocate input buffer and copy the iv and the plaintext */
2955 input_buffer_size = ( (size_t) input_arg->len + (size_t) iv->len );
2956 if ( input_buffer_size > 0 )
2957 {
2958 ASSERT_ALLOC( input, input_buffer_size );
2959 memcpy( input, iv->x, iv->len );
2960 memcpy( input + iv->len, input_arg->x, input_arg->len );
2961 }
2962
2963 output_buffer_size = PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input_buffer_size );
2964 ASSERT_ALLOC( output, output_buffer_size );
2965
2966 status = psa_cipher_decrypt( key, alg, input, input_buffer_size, output,
2967 output_buffer_size, &output_length );
2968 TEST_EQUAL( status, expected_status );
2969
2970exit:
2971 mbedtls_free( input );
2972 mbedtls_free( output );
2973 psa_destroy_key( key );
2974 PSA_DONE( );
2975}
2976/* END_CASE */
2977
2978/* BEGIN_CASE */
2979void cipher_decrypt( int alg_arg,
2980 int key_type_arg,
2981 data_t *key_data,
2982 data_t *iv,
2983 data_t *input_arg,
2984 data_t *expected_output )
2985{
2986 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
2987 psa_key_type_t key_type = key_type_arg;
2988 psa_algorithm_t alg = alg_arg;
2989 unsigned char *input = NULL;
2990 size_t input_buffer_size = 0;
2991 unsigned char *output = NULL;
2992 size_t output_buffer_size = 0;
2993 size_t output_length = 0;
2994 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2995
2996 PSA_ASSERT( psa_crypto_init( ) );
2997
2998 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2999 psa_set_key_algorithm( &attributes, alg );
3000 psa_set_key_type( &attributes, key_type );
3001
3002 /* Allocate input buffer and copy the iv and the plaintext */
3003 input_buffer_size = ( (size_t) input_arg->len + (size_t) iv->len );
3004 if ( input_buffer_size > 0 )
3005 {
3006 ASSERT_ALLOC( input, input_buffer_size );
3007 memcpy( input, iv->x, iv->len );
3008 memcpy( input + iv->len, input_arg->x, input_arg->len );
3009 }
3010
3011 output_buffer_size = PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input_buffer_size );
3012 ASSERT_ALLOC( output, output_buffer_size );
3013
3014 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3015 &key ) );
3016
3017 PSA_ASSERT( psa_cipher_decrypt( key, alg, input, input_buffer_size, output,
3018 output_buffer_size, &output_length ) );
3019 TEST_ASSERT( output_length <=
3020 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input_buffer_size ) );
3021 TEST_ASSERT( output_length <=
3022 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( input_buffer_size ) );
3023
3024 ASSERT_COMPARE( expected_output->x, expected_output->len,
3025 output, output_length );
3026exit:
3027 mbedtls_free( input );
3028 mbedtls_free( output );
3029 psa_destroy_key( key );
3030 PSA_DONE( );
3031}
3032/* END_CASE */
3033
3034/* BEGIN_CASE */
3035void cipher_verify_output( int alg_arg,
3036 int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02003037 data_t *key_data,
itayzafrir3e02b3b2018-06-12 17:06:52 +03003038 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02003039{
Ronald Cron5425a212020-08-04 14:58:35 +02003040 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003041 psa_key_type_t key_type = key_type_arg;
3042 psa_algorithm_t alg = alg_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003043 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003044 size_t output1_size = 0;
3045 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003046 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003047 size_t output2_size = 0;
3048 size_t output2_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003049 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003050
Gilles Peskine8817f612018-12-18 00:18:46 +01003051 PSA_ASSERT( psa_crypto_init( ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003052
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003053 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3054 psa_set_key_algorithm( &attributes, alg );
3055 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03003056
Ronald Cron5425a212020-08-04 14:58:35 +02003057 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3058 &key ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003059 output1_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003060 ASSERT_ALLOC( output1, output1_size );
Moran Pekerded84402018-06-06 16:36:50 +03003061
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003062 PSA_ASSERT( psa_cipher_encrypt( key, alg, input->x, input->len,
3063 output1, output1_size,
3064 &output1_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003065 TEST_ASSERT( output1_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003066 PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003067 TEST_ASSERT( output1_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003068 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Moran Pekerded84402018-06-06 16:36:50 +03003069
3070 output2_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003071 ASSERT_ALLOC( output2, output2_size );
Moran Pekerded84402018-06-06 16:36:50 +03003072
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003073 PSA_ASSERT( psa_cipher_decrypt( key, alg, output1, output1_length,
3074 output2, output2_size,
3075 &output2_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003076 TEST_ASSERT( output2_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003077 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, output1_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003078 TEST_ASSERT( output2_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003079 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( output1_length ) );
Moran Pekerded84402018-06-06 16:36:50 +03003080
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003081 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
Moran Pekerded84402018-06-06 16:36:50 +03003082
3083exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03003084 mbedtls_free( output1 );
3085 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02003086 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003087 PSA_DONE( );
Moran Pekerded84402018-06-06 16:36:50 +03003088}
3089/* END_CASE */
3090
3091/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02003092void cipher_verify_output_multipart( int alg_arg,
3093 int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02003094 data_t *key_data,
itayzafrir3e02b3b2018-06-12 17:06:52 +03003095 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01003096 int first_part_size_arg )
Moran Pekerded84402018-06-06 16:36:50 +03003097{
Ronald Cron5425a212020-08-04 14:58:35 +02003098 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03003099 psa_key_type_t key_type = key_type_arg;
3100 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01003101 size_t first_part_size = first_part_size_arg;
Moran Pekerded84402018-06-06 16:36:50 +03003102 unsigned char iv[16] = {0};
3103 size_t iv_size = 16;
3104 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003105 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003106 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03003107 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003108 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003109 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03003110 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003111 size_t function_output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00003112 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
3113 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003114 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03003115
Gilles Peskine8817f612018-12-18 00:18:46 +01003116 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerded84402018-06-06 16:36:50 +03003117
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003118 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3119 psa_set_key_algorithm( &attributes, alg );
3120 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03003121
Ronald Cron5425a212020-08-04 14:58:35 +02003122 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3123 &key ) );
Moran Pekerded84402018-06-06 16:36:50 +03003124
Ronald Cron5425a212020-08-04 14:58:35 +02003125 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1, key, alg ) );
3126 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2, key, alg ) );
Moran Pekerded84402018-06-06 16:36:50 +03003127
Steven Cooreman177deba2020-09-07 17:14:14 +02003128 if( alg != PSA_ALG_ECB_NO_PADDING )
3129 {
Steven Cooremana6033e92020-08-25 11:47:50 +02003130 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
3131 iv, iv_size,
3132 &iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02003133 }
3134
gabor-mezei-armceface22021-01-21 12:26:17 +01003135 output1_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
3136 TEST_ASSERT( output1_buffer_size <=
3137 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003138 ASSERT_ALLOC( output1, output1_buffer_size );
Moran Pekerded84402018-06-06 16:36:50 +03003139
Gilles Peskinee0866522019-02-19 19:44:00 +01003140 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003141
Gilles Peskine8817f612018-12-18 00:18:46 +01003142 PSA_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
3143 output1, output1_buffer_size,
3144 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003145 TEST_ASSERT( function_output_length <=
3146 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
3147 TEST_ASSERT( function_output_length <=
3148 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003149 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003150
Gilles Peskine8817f612018-12-18 00:18:46 +01003151 PSA_ASSERT( psa_cipher_update( &operation1,
3152 input->x + first_part_size,
3153 input->len - first_part_size,
3154 output1, output1_buffer_size,
3155 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003156 TEST_ASSERT( function_output_length <=
3157 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
3158 alg,
3159 input->len - first_part_size ) );
3160 TEST_ASSERT( function_output_length <=
3161 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len - first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003162 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003163
Gilles Peskine8817f612018-12-18 00:18:46 +01003164 PSA_ASSERT( psa_cipher_finish( &operation1,
3165 output1 + output1_length,
3166 output1_buffer_size - output1_length,
3167 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003168 TEST_ASSERT( function_output_length <=
3169 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
3170 TEST_ASSERT( function_output_length <=
3171 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003172 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003173
Gilles Peskine8817f612018-12-18 00:18:46 +01003174 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003175
Gilles Peskine048b7f02018-06-08 14:20:49 +02003176 output2_buffer_size = output1_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01003177 TEST_ASSERT( output2_buffer_size <=
3178 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, output1_length ) );
3179 TEST_ASSERT( output2_buffer_size <=
3180 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( output1_length ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003181 ASSERT_ALLOC( output2, output2_buffer_size );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003182
Steven Cooreman177deba2020-09-07 17:14:14 +02003183 if( iv_length > 0 )
3184 {
Steven Cooremana6033e92020-08-25 11:47:50 +02003185 PSA_ASSERT( psa_cipher_set_iv( &operation2,
3186 iv, iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02003187 }
Moran Pekerded84402018-06-06 16:36:50 +03003188
Gilles Peskine8817f612018-12-18 00:18:46 +01003189 PSA_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
3190 output2, output2_buffer_size,
3191 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003192 TEST_ASSERT( function_output_length <=
3193 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
3194 TEST_ASSERT( function_output_length <=
3195 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003196 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003197
Gilles Peskine8817f612018-12-18 00:18:46 +01003198 PSA_ASSERT( psa_cipher_update( &operation2,
3199 output1 + first_part_size,
3200 output1_length - first_part_size,
3201 output2, output2_buffer_size,
3202 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003203 TEST_ASSERT( function_output_length <=
3204 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
3205 alg,
3206 output1_length - first_part_size ) );
3207 TEST_ASSERT( function_output_length <=
3208 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( output1_length - first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003209 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003210
Gilles Peskine8817f612018-12-18 00:18:46 +01003211 PSA_ASSERT( psa_cipher_finish( &operation2,
3212 output2 + output2_length,
3213 output2_buffer_size - output2_length,
3214 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003215 TEST_ASSERT( function_output_length <=
3216 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
3217 TEST_ASSERT( function_output_length <=
3218 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003219 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003220
Gilles Peskine8817f612018-12-18 00:18:46 +01003221 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003222
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003223 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003224
3225exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02003226 psa_cipher_abort( &operation1 );
3227 psa_cipher_abort( &operation2 );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003228 mbedtls_free( output1 );
3229 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02003230 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003231 PSA_DONE( );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003232}
3233/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02003234
Gilles Peskine20035e32018-02-03 22:44:14 +01003235/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003236void aead_encrypt_decrypt( int key_type_arg, data_t *key_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003237 int alg_arg,
Gilles Peskine7da96b02018-08-17 18:45:42 +02003238 data_t *nonce,
3239 data_t *additional_data,
3240 data_t *input_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003241 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003242{
Ronald Cron5425a212020-08-04 14:58:35 +02003243 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003244 psa_key_type_t key_type = key_type_arg;
3245 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003246 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003247 unsigned char *output_data = NULL;
3248 size_t output_size = 0;
3249 size_t output_length = 0;
3250 unsigned char *output_data2 = NULL;
3251 size_t output_length2 = 0;
Steven Cooremanf49478b2021-02-15 15:19:25 +01003252 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003253 psa_status_t expected_result = expected_result_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003254 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003255
Gilles Peskine8817f612018-12-18 00:18:46 +01003256 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003257
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003258 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3259 psa_set_key_algorithm( &attributes, alg );
3260 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003261
Gilles Peskine049c7532019-05-15 20:22:09 +02003262 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003263 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003264 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3265 key_bits = psa_get_key_bits( &attributes );
3266
3267 output_size = input_data->len + PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3268 alg );
3269 /* For all currently defined algorithms, PSA_AEAD_ENCRYPT_OUTPUT_SIZE
3270 * should be exact. */
3271 if( expected_result != PSA_ERROR_INVALID_ARGUMENT &&
3272 expected_result != PSA_ERROR_NOT_SUPPORTED )
3273 {
3274 TEST_EQUAL( output_size,
3275 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3276 TEST_ASSERT( output_size <=
3277 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3278 }
3279 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003280
Steven Cooremanf49478b2021-02-15 15:19:25 +01003281 status = psa_aead_encrypt( key, alg,
3282 nonce->x, nonce->len,
3283 additional_data->x,
3284 additional_data->len,
3285 input_data->x, input_data->len,
3286 output_data, output_size,
3287 &output_length );
3288
3289 /* If the operation is not supported, just skip and not fail in case the
3290 * encryption involves a common limitation of cryptography hardwares and
3291 * an alternative implementation. */
3292 if( status == PSA_ERROR_NOT_SUPPORTED )
3293 {
3294 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3295 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
3296 }
3297
3298 TEST_EQUAL( status, expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003299
3300 if( PSA_SUCCESS == expected_result )
3301 {
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003302 ASSERT_ALLOC( output_data2, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003303
Gilles Peskine003a4a92019-05-14 16:09:40 +02003304 /* For all currently defined algorithms, PSA_AEAD_DECRYPT_OUTPUT_SIZE
3305 * should be exact. */
3306 TEST_EQUAL( input_data->len,
Bence Szépkútiec174e22021-03-19 18:46:15 +01003307 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg, output_length ) );
Gilles Peskine003a4a92019-05-14 16:09:40 +02003308
gabor-mezei-armceface22021-01-21 12:26:17 +01003309 TEST_ASSERT( input_data->len <=
3310 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( output_length ) );
3311
Ronald Cron5425a212020-08-04 14:58:35 +02003312 TEST_EQUAL( psa_aead_decrypt( key, alg,
Gilles Peskinefe11b722018-12-18 00:24:04 +01003313 nonce->x, nonce->len,
3314 additional_data->x,
3315 additional_data->len,
3316 output_data, output_length,
3317 output_data2, output_length,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003318 &output_length2 ),
3319 expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02003320
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003321 ASSERT_COMPARE( input_data->x, input_data->len,
3322 output_data2, output_length2 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003323 }
Gilles Peskine2d277862018-06-18 15:41:12 +02003324
Gilles Peskinea1cac842018-06-11 19:33:02 +02003325exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003326 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003327 mbedtls_free( output_data );
3328 mbedtls_free( output_data2 );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003329 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003330}
3331/* END_CASE */
3332
3333/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003334void aead_encrypt( int key_type_arg, data_t *key_data,
3335 int alg_arg,
3336 data_t *nonce,
3337 data_t *additional_data,
3338 data_t *input_data,
3339 data_t *expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003340{
Ronald Cron5425a212020-08-04 14:58:35 +02003341 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003342 psa_key_type_t key_type = key_type_arg;
3343 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003344 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003345 unsigned char *output_data = NULL;
3346 size_t output_size = 0;
3347 size_t output_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003348 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Steven Cooremand588ea12021-01-11 19:36:04 +01003349 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003350
Gilles Peskine8817f612018-12-18 00:18:46 +01003351 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003352
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003353 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3354 psa_set_key_algorithm( &attributes, alg );
3355 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003356
Gilles Peskine049c7532019-05-15 20:22:09 +02003357 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003358 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003359 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3360 key_bits = psa_get_key_bits( &attributes );
3361
3362 output_size = input_data->len + PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3363 alg );
3364 /* For all currently defined algorithms, PSA_AEAD_ENCRYPT_OUTPUT_SIZE
3365 * should be exact. */
3366 TEST_EQUAL( output_size,
3367 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3368 TEST_ASSERT( output_size <=
3369 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3370 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003371
Steven Cooremand588ea12021-01-11 19:36:04 +01003372 status = psa_aead_encrypt( key, alg,
3373 nonce->x, nonce->len,
3374 additional_data->x, additional_data->len,
3375 input_data->x, input_data->len,
3376 output_data, output_size,
3377 &output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003378
Ronald Cron28a45ed2021-02-09 20:35:42 +01003379 /* If the operation is not supported, just skip and not fail in case the
3380 * encryption involves a common limitation of cryptography hardwares and
3381 * an alternative implementation. */
3382 if( status == PSA_ERROR_NOT_SUPPORTED )
Steven Cooremand588ea12021-01-11 19:36:04 +01003383 {
Ronald Cron28a45ed2021-02-09 20:35:42 +01003384 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3385 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
Steven Cooremand588ea12021-01-11 19:36:04 +01003386 }
Steven Cooremand588ea12021-01-11 19:36:04 +01003387
3388 PSA_ASSERT( status );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003389 ASSERT_COMPARE( expected_result->x, expected_result->len,
3390 output_data, output_length );
Gilles Peskine2d277862018-06-18 15:41:12 +02003391
Gilles Peskinea1cac842018-06-11 19:33:02 +02003392exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003393 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003394 mbedtls_free( output_data );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003395 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003396}
3397/* END_CASE */
3398
3399/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003400void aead_decrypt( int key_type_arg, data_t *key_data,
3401 int alg_arg,
3402 data_t *nonce,
3403 data_t *additional_data,
3404 data_t *input_data,
3405 data_t *expected_data,
3406 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003407{
Ronald Cron5425a212020-08-04 14:58:35 +02003408 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003409 psa_key_type_t key_type = key_type_arg;
3410 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003411 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003412 unsigned char *output_data = NULL;
3413 size_t output_size = 0;
3414 size_t output_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003415 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003416 psa_status_t expected_result = expected_result_arg;
Steven Cooremand588ea12021-01-11 19:36:04 +01003417 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003418
Gilles Peskine8817f612018-12-18 00:18:46 +01003419 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003420
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003421 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3422 psa_set_key_algorithm( &attributes, alg );
3423 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003424
Gilles Peskine049c7532019-05-15 20:22:09 +02003425 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003426 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003427 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3428 key_bits = psa_get_key_bits( &attributes );
3429
3430 output_size = input_data->len - PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3431 alg );
3432 if( expected_result != PSA_ERROR_INVALID_ARGUMENT &&
3433 expected_result != PSA_ERROR_NOT_SUPPORTED )
3434 {
3435 /* For all currently defined algorithms, PSA_AEAD_DECRYPT_OUTPUT_SIZE
3436 * should be exact. */
3437 TEST_EQUAL( output_size,
3438 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3439 TEST_ASSERT( output_size <=
3440 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3441 }
3442 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003443
Steven Cooremand588ea12021-01-11 19:36:04 +01003444 status = psa_aead_decrypt( key, alg,
3445 nonce->x, nonce->len,
3446 additional_data->x,
3447 additional_data->len,
3448 input_data->x, input_data->len,
3449 output_data, output_size,
3450 &output_length );
3451
Ronald Cron28a45ed2021-02-09 20:35:42 +01003452 /* If the operation is not supported, just skip and not fail in case the
3453 * decryption involves a common limitation of cryptography hardwares and
3454 * an alternative implementation. */
3455 if( status == PSA_ERROR_NOT_SUPPORTED )
Steven Cooremand588ea12021-01-11 19:36:04 +01003456 {
Ronald Cron28a45ed2021-02-09 20:35:42 +01003457 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3458 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
Steven Cooremand588ea12021-01-11 19:36:04 +01003459 }
Steven Cooremand588ea12021-01-11 19:36:04 +01003460
3461 TEST_EQUAL( status, expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003462
Gilles Peskine2d277862018-06-18 15:41:12 +02003463 if( expected_result == PSA_SUCCESS )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003464 ASSERT_COMPARE( expected_data->x, expected_data->len,
3465 output_data, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003466
Gilles Peskinea1cac842018-06-11 19:33:02 +02003467exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003468 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003469 mbedtls_free( output_data );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003470 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003471}
3472/* END_CASE */
3473
3474/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003475void signature_size( int type_arg,
3476 int bits,
3477 int alg_arg,
3478 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003479{
3480 psa_key_type_t type = type_arg;
3481 psa_algorithm_t alg = alg_arg;
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003482 size_t actual_size = PSA_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskine841b14b2019-11-26 17:37:37 +01003483
Gilles Peskinefe11b722018-12-18 00:24:04 +01003484 TEST_EQUAL( actual_size, (size_t) expected_size_arg );
Gilles Peskine841b14b2019-11-26 17:37:37 +01003485
Gilles Peskinee59236f2018-01-27 23:32:46 +01003486exit:
3487 ;
3488}
3489/* END_CASE */
3490
3491/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003492void sign_hash_deterministic( int key_type_arg, data_t *key_data,
3493 int alg_arg, data_t *input_data,
3494 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003495{
Ronald Cron5425a212020-08-04 14:58:35 +02003496 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinee59236f2018-01-27 23:32:46 +01003497 psa_key_type_t key_type = key_type_arg;
3498 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003499 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01003500 unsigned char *signature = NULL;
3501 size_t signature_size;
3502 size_t signature_length = 0xdeadbeef;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003503 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003504
Gilles Peskine8817f612018-12-18 00:18:46 +01003505 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003506
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003507 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003508 psa_set_key_algorithm( &attributes, alg );
3509 psa_set_key_type( &attributes, key_type );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003510
Gilles Peskine049c7532019-05-15 20:22:09 +02003511 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003512 &key ) );
3513 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003514 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine20035e32018-02-03 22:44:14 +01003515
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003516 /* Allocate a buffer which has the size advertized by the
3517 * library. */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003518 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003519 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01003520 TEST_ASSERT( signature_size != 0 );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003521 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003522 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003523
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003524 /* Perform the signature. */
Ronald Cron5425a212020-08-04 14:58:35 +02003525 PSA_ASSERT( psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003526 input_data->x, input_data->len,
3527 signature, signature_size,
3528 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003529 /* Verify that the signature is what is expected. */
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003530 ASSERT_COMPARE( output_data->x, output_data->len,
3531 signature, signature_length );
Gilles Peskine20035e32018-02-03 22:44:14 +01003532
3533exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003534 /*
3535 * Key attributes may have been returned by psa_get_key_attributes()
3536 * thus reset them as required.
3537 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003538 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003539
Ronald Cron5425a212020-08-04 14:58:35 +02003540 psa_destroy_key( key );
Gilles Peskine0189e752018-02-03 23:57:22 +01003541 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003542 PSA_DONE( );
Gilles Peskine20035e32018-02-03 22:44:14 +01003543}
3544/* END_CASE */
3545
3546/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003547void sign_hash_fail( int key_type_arg, data_t *key_data,
3548 int alg_arg, data_t *input_data,
3549 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01003550{
Ronald Cron5425a212020-08-04 14:58:35 +02003551 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003552 psa_key_type_t key_type = key_type_arg;
3553 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003554 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003555 psa_status_t actual_status;
3556 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01003557 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01003558 size_t signature_length = 0xdeadbeef;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003559 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003560
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003561 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003562
Gilles Peskine8817f612018-12-18 00:18:46 +01003563 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003564
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003565 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003566 psa_set_key_algorithm( &attributes, alg );
3567 psa_set_key_type( &attributes, key_type );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003568
Gilles Peskine049c7532019-05-15 20:22:09 +02003569 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003570 &key ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003571
Ronald Cron5425a212020-08-04 14:58:35 +02003572 actual_status = psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003573 input_data->x, input_data->len,
3574 signature, signature_size,
3575 &signature_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003576 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003577 /* The value of *signature_length is unspecified on error, but
3578 * whatever it is, it should be less than signature_size, so that
3579 * if the caller tries to read *signature_length bytes without
3580 * checking the error code then they don't overflow a buffer. */
3581 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003582
3583exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003584 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003585 psa_destroy_key( key );
Gilles Peskine20035e32018-02-03 22:44:14 +01003586 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003587 PSA_DONE( );
Gilles Peskine20035e32018-02-03 22:44:14 +01003588}
3589/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03003590
3591/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003592void sign_verify_hash( int key_type_arg, data_t *key_data,
3593 int alg_arg, data_t *input_data )
Gilles Peskine9911b022018-06-29 17:30:48 +02003594{
Ronald Cron5425a212020-08-04 14:58:35 +02003595 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003596 psa_key_type_t key_type = key_type_arg;
3597 psa_algorithm_t alg = alg_arg;
3598 size_t key_bits;
3599 unsigned char *signature = NULL;
3600 size_t signature_size;
3601 size_t signature_length = 0xdeadbeef;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003602 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003603
Gilles Peskine8817f612018-12-18 00:18:46 +01003604 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003605
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003606 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003607 psa_set_key_algorithm( &attributes, alg );
3608 psa_set_key_type( &attributes, key_type );
Gilles Peskine9911b022018-06-29 17:30:48 +02003609
Gilles Peskine049c7532019-05-15 20:22:09 +02003610 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003611 &key ) );
3612 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003613 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine9911b022018-06-29 17:30:48 +02003614
3615 /* Allocate a buffer which has the size advertized by the
3616 * library. */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003617 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type,
Gilles Peskine9911b022018-06-29 17:30:48 +02003618 key_bits, alg );
3619 TEST_ASSERT( signature_size != 0 );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003620 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003621 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine9911b022018-06-29 17:30:48 +02003622
3623 /* Perform the signature. */
Ronald Cron5425a212020-08-04 14:58:35 +02003624 PSA_ASSERT( psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003625 input_data->x, input_data->len,
3626 signature, signature_size,
3627 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003628 /* Check that the signature length looks sensible. */
3629 TEST_ASSERT( signature_length <= signature_size );
3630 TEST_ASSERT( signature_length > 0 );
3631
3632 /* Use the library to verify that the signature is correct. */
Ronald Cron5425a212020-08-04 14:58:35 +02003633 PSA_ASSERT( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003634 input_data->x, input_data->len,
3635 signature, signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003636
3637 if( input_data->len != 0 )
3638 {
3639 /* Flip a bit in the input and verify that the signature is now
3640 * detected as invalid. Flip a bit at the beginning, not at the end,
3641 * because ECDSA may ignore the last few bits of the input. */
3642 input_data->x[0] ^= 1;
Ronald Cron5425a212020-08-04 14:58:35 +02003643 TEST_EQUAL( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003644 input_data->x, input_data->len,
3645 signature, signature_length ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003646 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine9911b022018-06-29 17:30:48 +02003647 }
3648
3649exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003650 /*
3651 * Key attributes may have been returned by psa_get_key_attributes()
3652 * thus reset them as required.
3653 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003654 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003655
Ronald Cron5425a212020-08-04 14:58:35 +02003656 psa_destroy_key( key );
Gilles Peskine9911b022018-06-29 17:30:48 +02003657 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003658 PSA_DONE( );
Gilles Peskine9911b022018-06-29 17:30:48 +02003659}
3660/* END_CASE */
3661
3662/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003663void verify_hash( int key_type_arg, data_t *key_data,
3664 int alg_arg, data_t *hash_data,
3665 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03003666{
Ronald Cron5425a212020-08-04 14:58:35 +02003667 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003668 psa_key_type_t key_type = key_type_arg;
3669 psa_algorithm_t alg = alg_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003670 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003671
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003672 TEST_ASSERT( signature_data->len <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine69c12672018-06-28 00:07:19 +02003673
Gilles Peskine8817f612018-12-18 00:18:46 +01003674 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir5c753392018-05-08 11:18:38 +03003675
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003676 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003677 psa_set_key_algorithm( &attributes, alg );
3678 psa_set_key_type( &attributes, key_type );
itayzafrir5c753392018-05-08 11:18:38 +03003679
Gilles Peskine049c7532019-05-15 20:22:09 +02003680 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003681 &key ) );
itayzafrir5c753392018-05-08 11:18:38 +03003682
Ronald Cron5425a212020-08-04 14:58:35 +02003683 PSA_ASSERT( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003684 hash_data->x, hash_data->len,
3685 signature_data->x, signature_data->len ) );
Gilles Peskine0627f982019-11-26 19:12:16 +01003686
itayzafrir5c753392018-05-08 11:18:38 +03003687exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003688 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003689 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003690 PSA_DONE( );
itayzafrir5c753392018-05-08 11:18:38 +03003691}
3692/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003693
3694/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003695void verify_hash_fail( int key_type_arg, data_t *key_data,
3696 int alg_arg, data_t *hash_data,
3697 data_t *signature_data,
3698 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003699{
Ronald Cron5425a212020-08-04 14:58:35 +02003700 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003701 psa_key_type_t key_type = key_type_arg;
3702 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003703 psa_status_t actual_status;
3704 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003705 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003706
Gilles Peskine8817f612018-12-18 00:18:46 +01003707 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003708
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003709 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003710 psa_set_key_algorithm( &attributes, alg );
3711 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003712
Gilles Peskine049c7532019-05-15 20:22:09 +02003713 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003714 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003715
Ronald Cron5425a212020-08-04 14:58:35 +02003716 actual_status = psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003717 hash_data->x, hash_data->len,
3718 signature_data->x, signature_data->len );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003719 TEST_EQUAL( actual_status, expected_status );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003720
3721exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003722 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003723 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003724 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003725}
3726/* END_CASE */
3727
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003728/* BEGIN_CASE */
gabor-mezei-arm53028482021-04-15 18:19:50 +02003729void sign_message_deterministic( int key_type_arg,
3730 data_t *key_data,
3731 int alg_arg,
3732 data_t *input_data,
3733 data_t *output_data )
3734{
3735 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3736 psa_key_type_t key_type = key_type_arg;
3737 psa_algorithm_t alg = alg_arg;
3738 size_t key_bits;
3739 unsigned char *signature = NULL;
3740 size_t signature_size;
3741 size_t signature_length = 0xdeadbeef;
3742 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3743
3744 PSA_ASSERT( psa_crypto_init( ) );
3745
3746 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
3747 psa_set_key_algorithm( &attributes, alg );
3748 psa_set_key_type( &attributes, key_type );
3749
3750 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3751 &key ) );
3752 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3753 key_bits = psa_get_key_bits( &attributes );
3754
3755 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
3756 TEST_ASSERT( signature_size != 0 );
3757 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
3758 ASSERT_ALLOC( signature, signature_size );
3759
3760 PSA_ASSERT( psa_sign_message( key, alg,
3761 input_data->x, input_data->len,
3762 signature, signature_size,
3763 &signature_length ) );
3764
3765 ASSERT_COMPARE( output_data->x, output_data->len,
3766 signature, signature_length );
3767
3768exit:
3769 psa_reset_key_attributes( &attributes );
3770
3771 psa_destroy_key( key );
3772 mbedtls_free( signature );
3773 PSA_DONE( );
3774
3775}
3776/* END_CASE */
3777
3778/* BEGIN_CASE */
3779void sign_message_fail( int key_type_arg,
3780 data_t *key_data,
3781 int alg_arg,
3782 data_t *input_data,
3783 int signature_size_arg,
3784 int expected_status_arg )
3785{
3786 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3787 psa_key_type_t key_type = key_type_arg;
3788 psa_algorithm_t alg = alg_arg;
3789 size_t signature_size = signature_size_arg;
3790 psa_status_t actual_status;
3791 psa_status_t expected_status = expected_status_arg;
3792 unsigned char *signature = NULL;
3793 size_t signature_length = 0xdeadbeef;
3794 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3795
3796 ASSERT_ALLOC( signature, signature_size );
3797
3798 PSA_ASSERT( psa_crypto_init( ) );
3799
3800 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
3801 psa_set_key_algorithm( &attributes, alg );
3802 psa_set_key_type( &attributes, key_type );
3803
3804 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3805 &key ) );
3806
3807 actual_status = psa_sign_message( key, alg,
3808 input_data->x, input_data->len,
3809 signature, signature_size,
3810 &signature_length );
3811 TEST_EQUAL( actual_status, expected_status );
3812 /* The value of *signature_length is unspecified on error, but
3813 * whatever it is, it should be less than signature_size, so that
3814 * if the caller tries to read *signature_length bytes without
3815 * checking the error code then they don't overflow a buffer. */
3816 TEST_ASSERT( signature_length <= signature_size );
3817
3818exit:
3819 psa_reset_key_attributes( &attributes );
3820 psa_destroy_key( key );
3821 mbedtls_free( signature );
3822 PSA_DONE( );
3823}
3824/* END_CASE */
3825
3826/* BEGIN_CASE */
3827void sign_verify_message( int key_type_arg,
3828 data_t *key_data,
3829 int alg_arg,
3830 data_t *input_data )
3831{
3832 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3833 psa_key_type_t key_type = key_type_arg;
3834 psa_algorithm_t alg = alg_arg;
3835 size_t key_bits;
3836 unsigned char *signature = NULL;
3837 size_t signature_size;
3838 size_t signature_length = 0xdeadbeef;
3839 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3840
3841 PSA_ASSERT( psa_crypto_init( ) );
3842
3843 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE |
3844 PSA_KEY_USAGE_VERIFY_MESSAGE );
3845 psa_set_key_algorithm( &attributes, alg );
3846 psa_set_key_type( &attributes, key_type );
3847
3848 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3849 &key ) );
3850 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3851 key_bits = psa_get_key_bits( &attributes );
3852
3853 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
3854 TEST_ASSERT( signature_size != 0 );
3855 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
3856 ASSERT_ALLOC( signature, signature_size );
3857
3858 PSA_ASSERT( psa_sign_message( key, alg,
3859 input_data->x, input_data->len,
3860 signature, signature_size,
3861 &signature_length ) );
3862 TEST_ASSERT( signature_length <= signature_size );
3863 TEST_ASSERT( signature_length > 0 );
3864
3865 PSA_ASSERT( psa_verify_message( key, alg,
3866 input_data->x, input_data->len,
3867 signature, signature_length ) );
3868
3869 if( input_data->len != 0 )
3870 {
3871 /* Flip a bit in the input and verify that the signature is now
3872 * detected as invalid. Flip a bit at the beginning, not at the end,
3873 * because ECDSA may ignore the last few bits of the input. */
3874 input_data->x[0] ^= 1;
3875 TEST_EQUAL( psa_verify_message( key, alg,
3876 input_data->x, input_data->len,
3877 signature, signature_length ),
3878 PSA_ERROR_INVALID_SIGNATURE );
3879 }
3880
3881exit:
3882 psa_reset_key_attributes( &attributes );
3883
3884 psa_destroy_key( key );
3885 mbedtls_free( signature );
3886 PSA_DONE( );
3887}
3888/* END_CASE */
3889
3890/* BEGIN_CASE */
3891void verify_message( int key_type_arg,
3892 data_t *key_data,
3893 int alg_arg,
3894 data_t *input_data,
3895 data_t *signature_data )
3896{
3897 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3898 psa_key_type_t key_type = key_type_arg;
3899 psa_algorithm_t alg = alg_arg;
3900 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3901
3902 TEST_ASSERT( signature_data->len <= PSA_SIGNATURE_MAX_SIZE );
3903
3904 PSA_ASSERT( psa_crypto_init( ) );
3905
3906 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_MESSAGE );
3907 psa_set_key_algorithm( &attributes, alg );
3908 psa_set_key_type( &attributes, key_type );
3909
3910 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3911 &key ) );
3912
3913 PSA_ASSERT( psa_verify_message( key, alg,
3914 input_data->x, input_data->len,
3915 signature_data->x, signature_data->len ) );
3916
3917exit:
3918 psa_reset_key_attributes( &attributes );
3919 psa_destroy_key( key );
3920 PSA_DONE( );
3921}
3922/* END_CASE */
3923
3924/* BEGIN_CASE */
3925void verify_message_fail( int key_type_arg,
3926 data_t *key_data,
3927 int alg_arg,
3928 data_t *hash_data,
3929 data_t *signature_data,
3930 int expected_status_arg )
3931{
3932 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3933 psa_key_type_t key_type = key_type_arg;
3934 psa_algorithm_t alg = alg_arg;
3935 psa_status_t actual_status;
3936 psa_status_t expected_status = expected_status_arg;
3937 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3938
3939 PSA_ASSERT( psa_crypto_init( ) );
3940
3941 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_MESSAGE );
3942 psa_set_key_algorithm( &attributes, alg );
3943 psa_set_key_type( &attributes, key_type );
3944
3945 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3946 &key ) );
3947
3948 actual_status = psa_verify_message( key, alg,
3949 hash_data->x, hash_data->len,
3950 signature_data->x,
3951 signature_data->len );
3952 TEST_EQUAL( actual_status, expected_status );
3953
3954exit:
3955 psa_reset_key_attributes( &attributes );
3956 psa_destroy_key( key );
3957 PSA_DONE( );
3958}
3959/* END_CASE */
3960
3961/* BEGIN_CASE */
Gilles Peskine656896e2018-06-29 19:12:28 +02003962void asymmetric_encrypt( int key_type_arg,
3963 data_t *key_data,
3964 int alg_arg,
3965 data_t *input_data,
Gilles Peskine68428122018-06-30 18:42:41 +02003966 data_t *label,
Gilles Peskine656896e2018-06-29 19:12:28 +02003967 int expected_output_length_arg,
3968 int expected_status_arg )
3969{
Ronald Cron5425a212020-08-04 14:58:35 +02003970 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003971 psa_key_type_t key_type = key_type_arg;
3972 psa_algorithm_t alg = alg_arg;
3973 size_t expected_output_length = expected_output_length_arg;
3974 size_t key_bits;
3975 unsigned char *output = NULL;
3976 size_t output_size;
3977 size_t output_length = ~0;
3978 psa_status_t actual_status;
3979 psa_status_t expected_status = expected_status_arg;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003980 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003981
Gilles Peskine8817f612018-12-18 00:18:46 +01003982 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003983
Gilles Peskine656896e2018-06-29 19:12:28 +02003984 /* Import the key */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003985 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3986 psa_set_key_algorithm( &attributes, alg );
3987 psa_set_key_type( &attributes, key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02003988 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003989 &key ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003990
3991 /* Determine the maximum output length */
Ronald Cron5425a212020-08-04 14:58:35 +02003992 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003993 key_bits = psa_get_key_bits( &attributes );
gabor-mezei-armceface22021-01-21 12:26:17 +01003994
Gilles Peskine656896e2018-06-29 19:12:28 +02003995 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
gabor-mezei-armceface22021-01-21 12:26:17 +01003996 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003997 ASSERT_ALLOC( output, output_size );
Gilles Peskine656896e2018-06-29 19:12:28 +02003998
3999 /* Encrypt the input */
Ronald Cron5425a212020-08-04 14:58:35 +02004000 actual_status = psa_asymmetric_encrypt( key, alg,
Gilles Peskine656896e2018-06-29 19:12:28 +02004001 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02004002 label->x, label->len,
Gilles Peskine656896e2018-06-29 19:12:28 +02004003 output, output_size,
4004 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004005 TEST_EQUAL( actual_status, expected_status );
4006 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine656896e2018-06-29 19:12:28 +02004007
Gilles Peskine68428122018-06-30 18:42:41 +02004008 /* If the label is empty, the test framework puts a non-null pointer
4009 * in label->x. Test that a null pointer works as well. */
4010 if( label->len == 0 )
4011 {
4012 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004013 if( output_size != 0 )
4014 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02004015 actual_status = psa_asymmetric_encrypt( key, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02004016 input_data->x, input_data->len,
4017 NULL, label->len,
4018 output, output_size,
4019 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004020 TEST_EQUAL( actual_status, expected_status );
4021 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02004022 }
4023
Gilles Peskine656896e2018-06-29 19:12:28 +02004024exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004025 /*
4026 * Key attributes may have been returned by psa_get_key_attributes()
4027 * thus reset them as required.
4028 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004029 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004030
Ronald Cron5425a212020-08-04 14:58:35 +02004031 psa_destroy_key( key );
Gilles Peskine656896e2018-06-29 19:12:28 +02004032 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004033 PSA_DONE( );
Gilles Peskine656896e2018-06-29 19:12:28 +02004034}
4035/* END_CASE */
4036
4037/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02004038void asymmetric_encrypt_decrypt( int key_type_arg,
4039 data_t *key_data,
4040 int alg_arg,
4041 data_t *input_data,
4042 data_t *label )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004043{
Ronald Cron5425a212020-08-04 14:58:35 +02004044 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004045 psa_key_type_t key_type = key_type_arg;
4046 psa_algorithm_t alg = alg_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004047 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004048 unsigned char *output = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004049 size_t output_size;
4050 size_t output_length = ~0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03004051 unsigned char *output2 = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004052 size_t output2_size;
4053 size_t output2_length = ~0;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004054 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004055
Gilles Peskine8817f612018-12-18 00:18:46 +01004056 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004057
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004058 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
4059 psa_set_key_algorithm( &attributes, alg );
4060 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03004061
Gilles Peskine049c7532019-05-15 20:22:09 +02004062 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004063 &key ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004064
4065 /* Determine the maximum ciphertext length */
Ronald Cron5425a212020-08-04 14:58:35 +02004066 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004067 key_bits = psa_get_key_bits( &attributes );
gabor-mezei-armceface22021-01-21 12:26:17 +01004068
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004069 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
gabor-mezei-armceface22021-01-21 12:26:17 +01004070 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004071 ASSERT_ALLOC( output, output_size );
gabor-mezei-armceface22021-01-21 12:26:17 +01004072
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004073 output2_size = input_data->len;
gabor-mezei-armceface22021-01-21 12:26:17 +01004074 TEST_ASSERT( output2_size <=
4075 PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE( key_type, key_bits, alg ) );
4076 TEST_ASSERT( output2_size <= PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004077 ASSERT_ALLOC( output2, output2_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004078
Gilles Peskineeebd7382018-06-08 18:11:54 +02004079 /* We test encryption by checking that encrypt-then-decrypt gives back
4080 * the original plaintext because of the non-optional random
4081 * part of encryption process which prevents using fixed vectors. */
Ronald Cron5425a212020-08-04 14:58:35 +02004082 PSA_ASSERT( psa_asymmetric_encrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01004083 input_data->x, input_data->len,
4084 label->x, label->len,
4085 output, output_size,
4086 &output_length ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004087 /* We don't know what ciphertext length to expect, but check that
4088 * it looks sensible. */
4089 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03004090
Ronald Cron5425a212020-08-04 14:58:35 +02004091 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01004092 output, output_length,
4093 label->x, label->len,
4094 output2, output2_size,
4095 &output2_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02004096 ASSERT_COMPARE( input_data->x, input_data->len,
4097 output2, output2_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004098
4099exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004100 /*
4101 * Key attributes may have been returned by psa_get_key_attributes()
4102 * thus reset them as required.
4103 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004104 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004105
Ronald Cron5425a212020-08-04 14:58:35 +02004106 psa_destroy_key( key );
itayzafrir3e02b3b2018-06-12 17:06:52 +03004107 mbedtls_free( output );
4108 mbedtls_free( output2 );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004109 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004110}
4111/* END_CASE */
4112
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004113/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02004114void asymmetric_decrypt( int key_type_arg,
4115 data_t *key_data,
4116 int alg_arg,
4117 data_t *input_data,
4118 data_t *label,
Gilles Peskine66763a02018-06-29 21:54:10 +02004119 data_t *expected_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004120{
Ronald Cron5425a212020-08-04 14:58:35 +02004121 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004122 psa_key_type_t key_type = key_type_arg;
4123 psa_algorithm_t alg = alg_arg;
gabor-mezei-armceface22021-01-21 12:26:17 +01004124 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004125 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03004126 size_t output_size = 0;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004127 size_t output_length = ~0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004128 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004129
Gilles Peskine8817f612018-12-18 00:18:46 +01004130 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004131
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004132 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
4133 psa_set_key_algorithm( &attributes, alg );
4134 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03004135
Gilles Peskine049c7532019-05-15 20:22:09 +02004136 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004137 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004138
gabor-mezei-armceface22021-01-21 12:26:17 +01004139 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
4140 key_bits = psa_get_key_bits( &attributes );
4141
4142 /* Determine the maximum ciphertext length */
4143 output_size = PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
4144 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE );
4145 ASSERT_ALLOC( output, output_size );
4146
Ronald Cron5425a212020-08-04 14:58:35 +02004147 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01004148 input_data->x, input_data->len,
4149 label->x, label->len,
4150 output,
4151 output_size,
4152 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02004153 ASSERT_COMPARE( expected_data->x, expected_data->len,
4154 output, output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004155
Gilles Peskine68428122018-06-30 18:42:41 +02004156 /* If the label is empty, the test framework puts a non-null pointer
4157 * in label->x. Test that a null pointer works as well. */
4158 if( label->len == 0 )
4159 {
4160 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004161 if( output_size != 0 )
4162 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02004163 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01004164 input_data->x, input_data->len,
4165 NULL, label->len,
4166 output,
4167 output_size,
4168 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02004169 ASSERT_COMPARE( expected_data->x, expected_data->len,
4170 output, output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02004171 }
4172
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004173exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004174 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02004175 psa_destroy_key( key );
itayzafrir3e02b3b2018-06-12 17:06:52 +03004176 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004177 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004178}
4179/* END_CASE */
4180
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004181/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02004182void asymmetric_decrypt_fail( int key_type_arg,
4183 data_t *key_data,
4184 int alg_arg,
4185 data_t *input_data,
4186 data_t *label,
Jaeden Amerof8daab72019-02-06 12:57:46 +00004187 int output_size_arg,
Gilles Peskine2d277862018-06-18 15:41:12 +02004188 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004189{
Ronald Cron5425a212020-08-04 14:58:35 +02004190 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004191 psa_key_type_t key_type = key_type_arg;
4192 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004193 unsigned char *output = NULL;
Jaeden Amerof8daab72019-02-06 12:57:46 +00004194 size_t output_size = output_size_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004195 size_t output_length = ~0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004196 psa_status_t actual_status;
4197 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004198 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004199
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004200 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02004201
Gilles Peskine8817f612018-12-18 00:18:46 +01004202 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004203
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004204 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
4205 psa_set_key_algorithm( &attributes, alg );
4206 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03004207
Gilles Peskine049c7532019-05-15 20:22:09 +02004208 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004209 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004210
Ronald Cron5425a212020-08-04 14:58:35 +02004211 actual_status = psa_asymmetric_decrypt( key, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02004212 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02004213 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02004214 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02004215 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004216 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004217 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004218
Gilles Peskine68428122018-06-30 18:42:41 +02004219 /* If the label is empty, the test framework puts a non-null pointer
4220 * in label->x. Test that a null pointer works as well. */
4221 if( label->len == 0 )
4222 {
4223 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004224 if( output_size != 0 )
4225 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02004226 actual_status = psa_asymmetric_decrypt( key, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02004227 input_data->x, input_data->len,
4228 NULL, label->len,
4229 output, output_size,
4230 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004231 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004232 TEST_ASSERT( output_length <= output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02004233 }
4234
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004235exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004236 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02004237 psa_destroy_key( key );
Gilles Peskine2d277862018-06-18 15:41:12 +02004238 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004239 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004240}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02004241/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02004242
4243/* BEGIN_CASE */
Gilles Peskinecbe66502019-05-16 16:59:18 +02004244void key_derivation_init( )
Jaeden Amerod94d6712019-01-04 14:11:48 +00004245{
4246 /* Test each valid way of initializing the object, except for `= {0}`, as
4247 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
4248 * though it's OK by the C standard. We could test for this, but we'd need
4249 * to supress the Clang warning for the test. */
Jaeden Amero5229bbb2019-02-07 16:33:37 +00004250 size_t capacity;
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004251 psa_key_derivation_operation_t func = psa_key_derivation_operation_init( );
4252 psa_key_derivation_operation_t init = PSA_KEY_DERIVATION_OPERATION_INIT;
4253 psa_key_derivation_operation_t zero;
Jaeden Amerod94d6712019-01-04 14:11:48 +00004254
4255 memset( &zero, 0, sizeof( zero ) );
4256
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004257 /* A default operation should not be able to report its capacity. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004258 TEST_EQUAL( psa_key_derivation_get_capacity( &func, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004259 PSA_ERROR_BAD_STATE );
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004260 TEST_EQUAL( psa_key_derivation_get_capacity( &init, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004261 PSA_ERROR_BAD_STATE );
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004262 TEST_EQUAL( psa_key_derivation_get_capacity( &zero, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004263 PSA_ERROR_BAD_STATE );
Jaeden Amero5229bbb2019-02-07 16:33:37 +00004264
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004265 /* A default operation should be abortable without error. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004266 PSA_ASSERT( psa_key_derivation_abort(&func) );
4267 PSA_ASSERT( psa_key_derivation_abort(&init) );
4268 PSA_ASSERT( psa_key_derivation_abort(&zero) );
Jaeden Amerod94d6712019-01-04 14:11:48 +00004269}
4270/* END_CASE */
4271
Janos Follath16de4a42019-06-13 16:32:24 +01004272/* BEGIN_CASE */
4273void derive_setup( int alg_arg, int expected_status_arg )
Gilles Peskineea0fb492018-07-12 17:17:20 +02004274{
Gilles Peskineea0fb492018-07-12 17:17:20 +02004275 psa_algorithm_t alg = alg_arg;
Gilles Peskineea0fb492018-07-12 17:17:20 +02004276 psa_status_t expected_status = expected_status_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004277 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02004278
Gilles Peskine8817f612018-12-18 00:18:46 +01004279 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004280
Janos Follath16de4a42019-06-13 16:32:24 +01004281 TEST_EQUAL( psa_key_derivation_setup( &operation, alg ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004282 expected_status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004283
4284exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004285 psa_key_derivation_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004286 PSA_DONE( );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004287}
4288/* END_CASE */
4289
Janos Follathaf3c2a02019-06-12 12:34:34 +01004290/* BEGIN_CASE */
Janos Follatha27c9272019-06-14 09:59:36 +01004291void derive_set_capacity( int alg_arg, int capacity_arg,
4292 int expected_status_arg )
4293{
4294 psa_algorithm_t alg = alg_arg;
4295 size_t capacity = capacity_arg;
4296 psa_status_t expected_status = expected_status_arg;
4297 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4298
4299 PSA_ASSERT( psa_crypto_init( ) );
4300
4301 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4302
4303 TEST_EQUAL( psa_key_derivation_set_capacity( &operation, capacity ),
4304 expected_status );
4305
4306exit:
4307 psa_key_derivation_abort( &operation );
4308 PSA_DONE( );
4309}
4310/* END_CASE */
4311
4312/* BEGIN_CASE */
Janos Follathaf3c2a02019-06-12 12:34:34 +01004313void derive_input( int alg_arg,
Gilles Peskine6842ba42019-09-23 13:49:33 +02004314 int step_arg1, int key_type_arg1, data_t *input1,
Janos Follathaf3c2a02019-06-12 12:34:34 +01004315 int expected_status_arg1,
Gilles Peskine2058c072019-09-24 17:19:33 +02004316 int step_arg2, int key_type_arg2, data_t *input2,
Janos Follathaf3c2a02019-06-12 12:34:34 +01004317 int expected_status_arg2,
Gilles Peskine2058c072019-09-24 17:19:33 +02004318 int step_arg3, int key_type_arg3, data_t *input3,
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004319 int expected_status_arg3,
4320 int output_key_type_arg, int expected_output_status_arg )
Janos Follathaf3c2a02019-06-12 12:34:34 +01004321{
4322 psa_algorithm_t alg = alg_arg;
Gilles Peskine6842ba42019-09-23 13:49:33 +02004323 psa_key_derivation_step_t steps[] = {step_arg1, step_arg2, step_arg3};
4324 psa_key_type_t key_types[] = {key_type_arg1, key_type_arg2, key_type_arg3};
Janos Follathaf3c2a02019-06-12 12:34:34 +01004325 psa_status_t expected_statuses[] = {expected_status_arg1,
4326 expected_status_arg2,
4327 expected_status_arg3};
4328 data_t *inputs[] = {input1, input2, input3};
Ronald Cron5425a212020-08-04 14:58:35 +02004329 mbedtls_svc_key_id_t keys[] = { MBEDTLS_SVC_KEY_ID_INIT,
4330 MBEDTLS_SVC_KEY_ID_INIT,
4331 MBEDTLS_SVC_KEY_ID_INIT };
Janos Follathaf3c2a02019-06-12 12:34:34 +01004332 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4333 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4334 size_t i;
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004335 psa_key_type_t output_key_type = output_key_type_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02004336 mbedtls_svc_key_id_t output_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004337 psa_status_t expected_output_status = expected_output_status_arg;
4338 psa_status_t actual_output_status;
Janos Follathaf3c2a02019-06-12 12:34:34 +01004339
4340 PSA_ASSERT( psa_crypto_init( ) );
4341
4342 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4343 psa_set_key_algorithm( &attributes, alg );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004344
4345 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4346
4347 for( i = 0; i < ARRAY_LENGTH( steps ); i++ )
4348 {
Gilles Peskine4023c012021-05-27 13:21:20 +02004349 mbedtls_test_set_step( i );
4350 if( steps[i] == 0 )
4351 {
4352 /* Skip this step */
4353 }
4354 else if( key_types[i] != PSA_KEY_TYPE_NONE )
Janos Follathaf3c2a02019-06-12 12:34:34 +01004355 {
Gilles Peskine6842ba42019-09-23 13:49:33 +02004356 psa_set_key_type( &attributes, key_types[i] );
4357 PSA_ASSERT( psa_import_key( &attributes,
4358 inputs[i]->x, inputs[i]->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004359 &keys[i] ) );
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004360 if( PSA_KEY_TYPE_IS_KEY_PAIR( key_types[i] ) &&
4361 steps[i] == PSA_KEY_DERIVATION_INPUT_SECRET )
4362 {
4363 // When taking a private key as secret input, use key agreement
4364 // to add the shared secret to the derivation
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004365 TEST_EQUAL( mbedtls_test_psa_key_agreement_with_self(
4366 &operation, keys[i] ),
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004367 expected_statuses[i] );
4368 }
4369 else
4370 {
4371 TEST_EQUAL( psa_key_derivation_input_key( &operation, steps[i],
Ronald Cron5425a212020-08-04 14:58:35 +02004372 keys[i] ),
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004373 expected_statuses[i] );
4374 }
Gilles Peskine6842ba42019-09-23 13:49:33 +02004375 }
4376 else
4377 {
4378 TEST_EQUAL( psa_key_derivation_input_bytes(
4379 &operation, steps[i],
4380 inputs[i]->x, inputs[i]->len ),
4381 expected_statuses[i] );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004382 }
4383 }
4384
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004385 if( output_key_type != PSA_KEY_TYPE_NONE )
4386 {
4387 psa_reset_key_attributes( &attributes );
4388 psa_set_key_type( &attributes, PSA_KEY_TYPE_RAW_DATA );
4389 psa_set_key_bits( &attributes, 8 );
4390 actual_output_status =
4391 psa_key_derivation_output_key( &attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004392 &output_key );
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004393 }
4394 else
4395 {
4396 uint8_t buffer[1];
4397 actual_output_status =
4398 psa_key_derivation_output_bytes( &operation,
4399 buffer, sizeof( buffer ) );
4400 }
4401 TEST_EQUAL( actual_output_status, expected_output_status );
4402
Janos Follathaf3c2a02019-06-12 12:34:34 +01004403exit:
4404 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004405 for( i = 0; i < ARRAY_LENGTH( keys ); i++ )
4406 psa_destroy_key( keys[i] );
4407 psa_destroy_key( output_key );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004408 PSA_DONE( );
4409}
4410/* END_CASE */
4411
Janos Follathd958bb72019-07-03 15:02:16 +01004412/* BEGIN_CASE */
Gilles Peskine1c77edd2021-05-27 11:55:02 +02004413void derive_over_capacity( int alg_arg )
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004414{
Janos Follathd958bb72019-07-03 15:02:16 +01004415 psa_algorithm_t alg = alg_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02004416 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein4eda37b2018-10-31 12:15:58 +02004417 size_t key_type = PSA_KEY_TYPE_DERIVE;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004418 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Janos Follathd958bb72019-07-03 15:02:16 +01004419 unsigned char input1[] = "Input 1";
4420 size_t input1_length = sizeof( input1 );
4421 unsigned char input2[] = "Input 2";
4422 size_t input2_length = sizeof( input2 );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004423 uint8_t buffer[42];
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02004424 size_t capacity = sizeof( buffer );
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02004425 const uint8_t key_data[22] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
4426 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
4427 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004428 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004429
Gilles Peskine8817f612018-12-18 00:18:46 +01004430 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004431
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004432 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4433 psa_set_key_algorithm( &attributes, alg );
4434 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004435
Gilles Peskine73676cb2019-05-15 20:15:10 +02004436 PSA_ASSERT( psa_import_key( &attributes,
4437 key_data, sizeof( key_data ),
Ronald Cron5425a212020-08-04 14:58:35 +02004438 &key ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004439
4440 /* valid key derivation */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004441 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, key, alg,
4442 input1, input1_length,
4443 input2, input2_length,
4444 capacity ) )
Janos Follathd958bb72019-07-03 15:02:16 +01004445 goto exit;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004446
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004447 /* state of operation shouldn't allow additional generation */
Janos Follathd958bb72019-07-03 15:02:16 +01004448 TEST_EQUAL( psa_key_derivation_setup( &operation, alg ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004449 PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004450
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004451 PSA_ASSERT( psa_key_derivation_output_bytes( &operation, buffer, capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004452
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004453 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, buffer, capacity ),
David Saadab4ecc272019-02-14 13:48:10 +02004454 PSA_ERROR_INSUFFICIENT_DATA );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004455
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004456exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004457 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004458 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004459 PSA_DONE( );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004460}
4461/* END_CASE */
4462
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004463/* BEGIN_CASE */
Gilles Peskine1c77edd2021-05-27 11:55:02 +02004464void derive_actions_without_setup( )
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004465{
4466 uint8_t output_buffer[16];
4467 size_t buffer_size = 16;
4468 size_t capacity = 0;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004469 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004470
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004471 TEST_ASSERT( psa_key_derivation_output_bytes( &operation,
4472 output_buffer, buffer_size )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004473 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004474
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004475 TEST_ASSERT( psa_key_derivation_get_capacity( &operation, &capacity )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004476 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004477
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004478 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004479
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004480 TEST_ASSERT( psa_key_derivation_output_bytes( &operation,
4481 output_buffer, buffer_size )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004482 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004483
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004484 TEST_ASSERT( psa_key_derivation_get_capacity( &operation, &capacity )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004485 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004486
4487exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004488 psa_key_derivation_abort( &operation );
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004489}
4490/* END_CASE */
4491
4492/* BEGIN_CASE */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004493void derive_output( int alg_arg,
Gilles Peskine1468da72019-05-29 17:35:49 +02004494 int step1_arg, data_t *input1,
4495 int step2_arg, data_t *input2,
4496 int step3_arg, data_t *input3,
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004497 int requested_capacity_arg,
4498 data_t *expected_output1,
4499 data_t *expected_output2 )
4500{
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004501 psa_algorithm_t alg = alg_arg;
Gilles Peskine1468da72019-05-29 17:35:49 +02004502 psa_key_derivation_step_t steps[] = {step1_arg, step2_arg, step3_arg};
4503 data_t *inputs[] = {input1, input2, input3};
Ronald Cron5425a212020-08-04 14:58:35 +02004504 mbedtls_svc_key_id_t keys[] = { MBEDTLS_SVC_KEY_ID_INIT,
4505 MBEDTLS_SVC_KEY_ID_INIT,
4506 MBEDTLS_SVC_KEY_ID_INIT };
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004507 size_t requested_capacity = requested_capacity_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004508 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004509 uint8_t *expected_outputs[2] =
4510 {expected_output1->x, expected_output2->x};
4511 size_t output_sizes[2] =
4512 {expected_output1->len, expected_output2->len};
4513 size_t output_buffer_size = 0;
4514 uint8_t *output_buffer = NULL;
4515 size_t expected_capacity;
4516 size_t current_capacity;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004517 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004518 psa_status_t status;
Gilles Peskine1468da72019-05-29 17:35:49 +02004519 size_t i;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004520
4521 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4522 {
4523 if( output_sizes[i] > output_buffer_size )
4524 output_buffer_size = output_sizes[i];
4525 if( output_sizes[i] == 0 )
4526 expected_outputs[i] = NULL;
4527 }
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004528 ASSERT_ALLOC( output_buffer, output_buffer_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01004529 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004530
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004531 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4532 psa_set_key_algorithm( &attributes, alg );
4533 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004534
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004535 /* Extraction phase. */
Gilles Peskine1468da72019-05-29 17:35:49 +02004536 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4537 PSA_ASSERT( psa_key_derivation_set_capacity( &operation,
4538 requested_capacity ) );
4539 for( i = 0; i < ARRAY_LENGTH( steps ); i++ )
Gilles Peskineb70a0fd2019-01-07 22:59:38 +01004540 {
Gilles Peskine1468da72019-05-29 17:35:49 +02004541 switch( steps[i] )
4542 {
4543 case 0:
4544 break;
4545 case PSA_KEY_DERIVATION_INPUT_SECRET:
4546 PSA_ASSERT( psa_import_key( &attributes,
4547 inputs[i]->x, inputs[i]->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004548 &keys[i] ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01004549
4550 if ( PSA_ALG_IS_TLS12_PSK_TO_MS( alg ) )
4551 {
4552 PSA_ASSERT( psa_get_key_attributes( keys[i], &attributes ) );
4553 TEST_ASSERT( PSA_BITS_TO_BYTES( psa_get_key_bits( &attributes ) ) <=
4554 PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE );
4555 }
4556
Gilles Peskine1468da72019-05-29 17:35:49 +02004557 PSA_ASSERT( psa_key_derivation_input_key(
Ronald Cron5425a212020-08-04 14:58:35 +02004558 &operation, steps[i], keys[i] ) );
Gilles Peskine1468da72019-05-29 17:35:49 +02004559 break;
4560 default:
4561 PSA_ASSERT( psa_key_derivation_input_bytes(
4562 &operation, steps[i],
4563 inputs[i]->x, inputs[i]->len ) );
4564 break;
4565 }
Gilles Peskineb70a0fd2019-01-07 22:59:38 +01004566 }
Gilles Peskine1468da72019-05-29 17:35:49 +02004567
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004568 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004569 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004570 TEST_EQUAL( current_capacity, requested_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004571 expected_capacity = requested_capacity;
4572
4573 /* Expansion phase. */
4574 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4575 {
4576 /* Read some bytes. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004577 status = psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004578 output_buffer, output_sizes[i] );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004579 if( expected_capacity == 0 && output_sizes[i] == 0 )
4580 {
4581 /* Reading 0 bytes when 0 bytes are available can go either way. */
4582 TEST_ASSERT( status == PSA_SUCCESS ||
David Saadab4ecc272019-02-14 13:48:10 +02004583 status == PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004584 continue;
4585 }
4586 else if( expected_capacity == 0 ||
4587 output_sizes[i] > expected_capacity )
4588 {
4589 /* Capacity exceeded. */
David Saadab4ecc272019-02-14 13:48:10 +02004590 TEST_EQUAL( status, PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004591 expected_capacity = 0;
4592 continue;
4593 }
4594 /* Success. Check the read data. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004595 PSA_ASSERT( status );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004596 if( output_sizes[i] != 0 )
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004597 ASSERT_COMPARE( output_buffer, output_sizes[i],
4598 expected_outputs[i], output_sizes[i] );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004599 /* Check the operation status. */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004600 expected_capacity -= output_sizes[i];
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004601 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004602 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004603 TEST_EQUAL( expected_capacity, current_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004604 }
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004605 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004606
4607exit:
4608 mbedtls_free( output_buffer );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004609 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004610 for( i = 0; i < ARRAY_LENGTH( keys ); i++ )
4611 psa_destroy_key( keys[i] );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004612 PSA_DONE( );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004613}
4614/* END_CASE */
4615
4616/* BEGIN_CASE */
Gilles Peskined54931c2018-07-17 21:06:59 +02004617void derive_full( int alg_arg,
4618 data_t *key_data,
Janos Follath47f27ed2019-06-25 13:24:52 +01004619 data_t *input1,
4620 data_t *input2,
Gilles Peskined54931c2018-07-17 21:06:59 +02004621 int requested_capacity_arg )
4622{
Ronald Cron5425a212020-08-04 14:58:35 +02004623 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004624 psa_algorithm_t alg = alg_arg;
4625 size_t requested_capacity = requested_capacity_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004626 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004627 unsigned char output_buffer[16];
4628 size_t expected_capacity = requested_capacity;
4629 size_t current_capacity;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004630 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004631
Gilles Peskine8817f612018-12-18 00:18:46 +01004632 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004633
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004634 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4635 psa_set_key_algorithm( &attributes, alg );
4636 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskined54931c2018-07-17 21:06:59 +02004637
Gilles Peskine049c7532019-05-15 20:22:09 +02004638 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004639 &key ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004640
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004641 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, key, alg,
4642 input1->x, input1->len,
4643 input2->x, input2->len,
4644 requested_capacity ) )
Janos Follathf2815ea2019-07-03 12:41:36 +01004645 goto exit;
Janos Follath47f27ed2019-06-25 13:24:52 +01004646
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004647 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004648 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004649 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004650
4651 /* Expansion phase. */
4652 while( current_capacity > 0 )
4653 {
4654 size_t read_size = sizeof( output_buffer );
4655 if( read_size > current_capacity )
4656 read_size = current_capacity;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004657 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004658 output_buffer,
4659 read_size ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004660 expected_capacity -= read_size;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004661 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004662 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004663 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004664 }
4665
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004666 /* Check that the operation refuses to go over capacity. */
4667 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, output_buffer, 1 ),
David Saadab4ecc272019-02-14 13:48:10 +02004668 PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskined54931c2018-07-17 21:06:59 +02004669
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004670 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004671
4672exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004673 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004674 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004675 PSA_DONE( );
Gilles Peskined54931c2018-07-17 21:06:59 +02004676}
4677/* END_CASE */
4678
Janos Follathe60c9052019-07-03 13:51:30 +01004679/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02004680void derive_key_exercise( int alg_arg,
4681 data_t *key_data,
Janos Follathe60c9052019-07-03 13:51:30 +01004682 data_t *input1,
4683 data_t *input2,
Gilles Peskine0386fba2018-07-12 17:29:22 +02004684 int derived_type_arg,
4685 int derived_bits_arg,
4686 int derived_usage_arg,
4687 int derived_alg_arg )
4688{
Ronald Cron5425a212020-08-04 14:58:35 +02004689 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4690 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004691 psa_algorithm_t alg = alg_arg;
4692 psa_key_type_t derived_type = derived_type_arg;
4693 size_t derived_bits = derived_bits_arg;
4694 psa_key_usage_t derived_usage = derived_usage_arg;
4695 psa_algorithm_t derived_alg = derived_alg_arg;
4696 size_t capacity = PSA_BITS_TO_BYTES( derived_bits );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004697 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004698 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004699 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004700
Gilles Peskine8817f612018-12-18 00:18:46 +01004701 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004702
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004703 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4704 psa_set_key_algorithm( &attributes, alg );
4705 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02004706 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004707 &base_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004708
4709 /* Derive a key. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004710 if ( mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4711 input1->x, input1->len,
4712 input2->x, input2->len,
4713 capacity ) )
Janos Follathe60c9052019-07-03 13:51:30 +01004714 goto exit;
4715
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004716 psa_set_key_usage_flags( &attributes, derived_usage );
4717 psa_set_key_algorithm( &attributes, derived_alg );
4718 psa_set_key_type( &attributes, derived_type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004719 psa_set_key_bits( &attributes, derived_bits );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004720 PSA_ASSERT( psa_key_derivation_output_key( &attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004721 &derived_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004722
4723 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02004724 PSA_ASSERT( psa_get_key_attributes( derived_key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004725 TEST_EQUAL( psa_get_key_type( &got_attributes ), derived_type );
4726 TEST_EQUAL( psa_get_key_bits( &got_attributes ), derived_bits );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004727
4728 /* Exercise the derived key. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004729 if( ! mbedtls_test_psa_exercise_key( derived_key, derived_usage, derived_alg ) )
Gilles Peskine0386fba2018-07-12 17:29:22 +02004730 goto exit;
4731
4732exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004733 /*
4734 * Key attributes may have been returned by psa_get_key_attributes()
4735 * thus reset them as required.
4736 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004737 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004738
4739 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004740 psa_destroy_key( base_key );
4741 psa_destroy_key( derived_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004742 PSA_DONE( );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004743}
4744/* END_CASE */
4745
Janos Follath42fd8882019-07-03 14:17:09 +01004746/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02004747void derive_key_export( int alg_arg,
4748 data_t *key_data,
Janos Follath42fd8882019-07-03 14:17:09 +01004749 data_t *input1,
4750 data_t *input2,
Gilles Peskine0386fba2018-07-12 17:29:22 +02004751 int bytes1_arg,
4752 int bytes2_arg )
4753{
Ronald Cron5425a212020-08-04 14:58:35 +02004754 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4755 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004756 psa_algorithm_t alg = alg_arg;
4757 size_t bytes1 = bytes1_arg;
4758 size_t bytes2 = bytes2_arg;
4759 size_t capacity = bytes1 + bytes2;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004760 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004761 uint8_t *output_buffer = NULL;
4762 uint8_t *export_buffer = NULL;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004763 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
4764 psa_key_attributes_t derived_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004765 size_t length;
4766
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004767 ASSERT_ALLOC( output_buffer, capacity );
4768 ASSERT_ALLOC( export_buffer, capacity );
Gilles Peskine8817f612018-12-18 00:18:46 +01004769 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004770
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004771 psa_set_key_usage_flags( &base_attributes, PSA_KEY_USAGE_DERIVE );
4772 psa_set_key_algorithm( &base_attributes, alg );
4773 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02004774 PSA_ASSERT( psa_import_key( &base_attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004775 &base_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004776
4777 /* Derive some material and output it. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004778 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4779 input1->x, input1->len,
4780 input2->x, input2->len,
4781 capacity ) )
Janos Follath42fd8882019-07-03 14:17:09 +01004782 goto exit;
4783
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004784 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004785 output_buffer,
4786 capacity ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004787 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004788
4789 /* Derive the same output again, but this time store it in key objects. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004790 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4791 input1->x, input1->len,
4792 input2->x, input2->len,
4793 capacity ) )
Janos Follath42fd8882019-07-03 14:17:09 +01004794 goto exit;
4795
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004796 psa_set_key_usage_flags( &derived_attributes, PSA_KEY_USAGE_EXPORT );
4797 psa_set_key_algorithm( &derived_attributes, 0 );
4798 psa_set_key_type( &derived_attributes, PSA_KEY_TYPE_RAW_DATA );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004799 psa_set_key_bits( &derived_attributes, PSA_BYTES_TO_BITS( bytes1 ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004800 PSA_ASSERT( psa_key_derivation_output_key( &derived_attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004801 &derived_key ) );
4802 PSA_ASSERT( psa_export_key( derived_key,
Gilles Peskine8817f612018-12-18 00:18:46 +01004803 export_buffer, bytes1,
4804 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004805 TEST_EQUAL( length, bytes1 );
Ronald Cron5425a212020-08-04 14:58:35 +02004806 PSA_ASSERT( psa_destroy_key( derived_key ) );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004807 psa_set_key_bits( &derived_attributes, PSA_BYTES_TO_BITS( bytes2 ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004808 PSA_ASSERT( psa_key_derivation_output_key( &derived_attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004809 &derived_key ) );
4810 PSA_ASSERT( psa_export_key( derived_key,
Gilles Peskine8817f612018-12-18 00:18:46 +01004811 export_buffer + bytes1, bytes2,
4812 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004813 TEST_EQUAL( length, bytes2 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004814
4815 /* Compare the outputs from the two runs. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004816 ASSERT_COMPARE( output_buffer, bytes1 + bytes2,
4817 export_buffer, capacity );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004818
4819exit:
4820 mbedtls_free( output_buffer );
4821 mbedtls_free( export_buffer );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004822 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004823 psa_destroy_key( base_key );
4824 psa_destroy_key( derived_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004825 PSA_DONE( );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004826}
4827/* END_CASE */
4828
4829/* BEGIN_CASE */
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004830void derive_key( int alg_arg,
4831 data_t *key_data, data_t *input1, data_t *input2,
4832 int type_arg, int bits_arg,
Steven Cooreman83fdb702021-01-21 14:24:39 +01004833 int expected_status_arg,
4834 int is_large_output )
Gilles Peskinec744d992019-07-30 17:26:54 +02004835{
Ronald Cron5425a212020-08-04 14:58:35 +02004836 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4837 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec744d992019-07-30 17:26:54 +02004838 psa_algorithm_t alg = alg_arg;
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004839 psa_key_type_t type = type_arg;
Gilles Peskinec744d992019-07-30 17:26:54 +02004840 size_t bits = bits_arg;
4841 psa_status_t expected_status = expected_status_arg;
4842 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4843 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
4844 psa_key_attributes_t derived_attributes = PSA_KEY_ATTRIBUTES_INIT;
4845
4846 PSA_ASSERT( psa_crypto_init( ) );
4847
4848 psa_set_key_usage_flags( &base_attributes, PSA_KEY_USAGE_DERIVE );
4849 psa_set_key_algorithm( &base_attributes, alg );
4850 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
4851 PSA_ASSERT( psa_import_key( &base_attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004852 &base_key ) );
Gilles Peskinec744d992019-07-30 17:26:54 +02004853
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004854 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4855 input1->x, input1->len,
4856 input2->x, input2->len,
4857 SIZE_MAX ) )
Gilles Peskinec744d992019-07-30 17:26:54 +02004858 goto exit;
4859
4860 psa_set_key_usage_flags( &derived_attributes, PSA_KEY_USAGE_EXPORT );
4861 psa_set_key_algorithm( &derived_attributes, 0 );
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004862 psa_set_key_type( &derived_attributes, type );
Gilles Peskinec744d992019-07-30 17:26:54 +02004863 psa_set_key_bits( &derived_attributes, bits );
Steven Cooreman83fdb702021-01-21 14:24:39 +01004864
4865 psa_status_t status =
4866 psa_key_derivation_output_key( &derived_attributes,
4867 &operation,
4868 &derived_key );
4869 if( is_large_output > 0 )
4870 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
4871 TEST_EQUAL( status, expected_status );
Gilles Peskinec744d992019-07-30 17:26:54 +02004872
4873exit:
4874 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004875 psa_destroy_key( base_key );
4876 psa_destroy_key( derived_key );
Gilles Peskinec744d992019-07-30 17:26:54 +02004877 PSA_DONE( );
4878}
4879/* END_CASE */
4880
4881/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02004882void key_agreement_setup( int alg_arg,
Steven Cooremance48e852020-10-05 16:02:45 +02004883 int our_key_type_arg, int our_key_alg_arg,
4884 data_t *our_key_data, data_t *peer_key_data,
Gilles Peskine01d718c2018-09-18 12:01:02 +02004885 int expected_status_arg )
4886{
Ronald Cron5425a212020-08-04 14:58:35 +02004887 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004888 psa_algorithm_t alg = alg_arg;
Steven Cooremanfa5e6312020-10-15 17:07:12 +02004889 psa_algorithm_t our_key_alg = our_key_alg_arg;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004890 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004891 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004892 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine77f40d82019-04-11 21:27:06 +02004893 psa_status_t expected_status = expected_status_arg;
4894 psa_status_t status;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004895
Gilles Peskine8817f612018-12-18 00:18:46 +01004896 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004897
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004898 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
Steven Cooremanfa5e6312020-10-15 17:07:12 +02004899 psa_set_key_algorithm( &attributes, our_key_alg );
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004900 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004901 PSA_ASSERT( psa_import_key( &attributes,
4902 our_key_data->x, our_key_data->len,
4903 &our_key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004904
Gilles Peskine77f40d82019-04-11 21:27:06 +02004905 /* The tests currently include inputs that should fail at either step.
4906 * Test cases that fail at the setup step should be changed to call
4907 * key_derivation_setup instead, and this function should be renamed
4908 * to key_agreement_fail. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004909 status = psa_key_derivation_setup( &operation, alg );
Gilles Peskine77f40d82019-04-11 21:27:06 +02004910 if( status == PSA_SUCCESS )
4911 {
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004912 TEST_EQUAL( psa_key_derivation_key_agreement(
4913 &operation, PSA_KEY_DERIVATION_INPUT_SECRET,
4914 our_key,
4915 peer_key_data->x, peer_key_data->len ),
Gilles Peskine77f40d82019-04-11 21:27:06 +02004916 expected_status );
4917 }
4918 else
4919 {
4920 TEST_ASSERT( status == expected_status );
4921 }
Gilles Peskine01d718c2018-09-18 12:01:02 +02004922
4923exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004924 psa_key_derivation_abort( &operation );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004925 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004926 PSA_DONE( );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004927}
4928/* END_CASE */
4929
4930/* BEGIN_CASE */
Gilles Peskinef0cba732019-04-11 22:12:38 +02004931void raw_key_agreement( int alg_arg,
4932 int our_key_type_arg, data_t *our_key_data,
4933 data_t *peer_key_data,
4934 data_t *expected_output )
4935{
Ronald Cron5425a212020-08-04 14:58:35 +02004936 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004937 psa_algorithm_t alg = alg_arg;
4938 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004939 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004940 unsigned char *output = NULL;
4941 size_t output_length = ~0;
gabor-mezei-armceface22021-01-21 12:26:17 +01004942 size_t key_bits;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004943
4944 ASSERT_ALLOC( output, expected_output->len );
4945 PSA_ASSERT( psa_crypto_init( ) );
4946
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004947 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4948 psa_set_key_algorithm( &attributes, alg );
4949 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004950 PSA_ASSERT( psa_import_key( &attributes,
4951 our_key_data->x, our_key_data->len,
4952 &our_key ) );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004953
gabor-mezei-armceface22021-01-21 12:26:17 +01004954 PSA_ASSERT( psa_get_key_attributes( our_key, &attributes ) );
4955 key_bits = psa_get_key_bits( &attributes );
4956
Gilles Peskinebe697d82019-05-16 18:00:41 +02004957 PSA_ASSERT( psa_raw_key_agreement( alg, our_key,
4958 peer_key_data->x, peer_key_data->len,
4959 output, expected_output->len,
4960 &output_length ) );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004961 ASSERT_COMPARE( output, output_length,
4962 expected_output->x, expected_output->len );
gabor-mezei-armceface22021-01-21 12:26:17 +01004963 TEST_ASSERT( output_length <=
4964 PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE( our_key_type, key_bits ) );
4965 TEST_ASSERT( output_length <=
4966 PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004967
4968exit:
4969 mbedtls_free( output );
4970 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004971 PSA_DONE( );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004972}
4973/* END_CASE */
4974
4975/* BEGIN_CASE */
Gilles Peskine59685592018-09-18 12:11:34 +02004976void key_agreement_capacity( int alg_arg,
4977 int our_key_type_arg, data_t *our_key_data,
4978 data_t *peer_key_data,
4979 int expected_capacity_arg )
4980{
Ronald Cron5425a212020-08-04 14:58:35 +02004981 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004982 psa_algorithm_t alg = alg_arg;
4983 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004984 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004985 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004986 size_t actual_capacity;
Gilles Peskinebf491972018-10-25 22:36:12 +02004987 unsigned char output[16];
Gilles Peskine59685592018-09-18 12:11:34 +02004988
Gilles Peskine8817f612018-12-18 00:18:46 +01004989 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004990
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004991 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4992 psa_set_key_algorithm( &attributes, alg );
4993 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004994 PSA_ASSERT( psa_import_key( &attributes,
4995 our_key_data->x, our_key_data->len,
4996 &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004997
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004998 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004999 PSA_ASSERT( psa_key_derivation_key_agreement(
5000 &operation,
5001 PSA_KEY_DERIVATION_INPUT_SECRET, our_key,
5002 peer_key_data->x, peer_key_data->len ) );
Gilles Peskinef8a9d942019-04-11 22:13:20 +02005003 if( PSA_ALG_IS_HKDF( PSA_ALG_KEY_AGREEMENT_GET_KDF( alg ) ) )
5004 {
5005 /* The test data is for info="" */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005006 PSA_ASSERT( psa_key_derivation_input_bytes( &operation,
Gilles Peskine03410b52019-05-16 16:05:19 +02005007 PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskinef8a9d942019-04-11 22:13:20 +02005008 NULL, 0 ) );
5009 }
Gilles Peskine59685592018-09-18 12:11:34 +02005010
Gilles Peskinebf491972018-10-25 22:36:12 +02005011 /* Test the advertized capacity. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02005012 PSA_ASSERT( psa_key_derivation_get_capacity(
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005013 &operation, &actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01005014 TEST_EQUAL( actual_capacity, (size_t) expected_capacity_arg );
Gilles Peskine59685592018-09-18 12:11:34 +02005015
Gilles Peskinebf491972018-10-25 22:36:12 +02005016 /* Test the actual capacity by reading the output. */
5017 while( actual_capacity > sizeof( output ) )
5018 {
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005019 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005020 output, sizeof( output ) ) );
Gilles Peskinebf491972018-10-25 22:36:12 +02005021 actual_capacity -= sizeof( output );
5022 }
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005023 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005024 output, actual_capacity ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005025 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, output, 1 ),
David Saadab4ecc272019-02-14 13:48:10 +02005026 PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskinebf491972018-10-25 22:36:12 +02005027
Gilles Peskine59685592018-09-18 12:11:34 +02005028exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005029 psa_key_derivation_abort( &operation );
Gilles Peskine59685592018-09-18 12:11:34 +02005030 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005031 PSA_DONE( );
Gilles Peskine59685592018-09-18 12:11:34 +02005032}
5033/* END_CASE */
5034
5035/* BEGIN_CASE */
5036void key_agreement_output( int alg_arg,
5037 int our_key_type_arg, data_t *our_key_data,
5038 data_t *peer_key_data,
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02005039 data_t *expected_output1, data_t *expected_output2 )
Gilles Peskine59685592018-09-18 12:11:34 +02005040{
Ronald Cron5425a212020-08-04 14:58:35 +02005041 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02005042 psa_algorithm_t alg = alg_arg;
5043 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005044 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02005045 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02005046 uint8_t *actual_output = NULL;
Gilles Peskine59685592018-09-18 12:11:34 +02005047
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02005048 ASSERT_ALLOC( actual_output, MAX( expected_output1->len,
5049 expected_output2->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02005050
Gilles Peskine8817f612018-12-18 00:18:46 +01005051 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02005052
Gilles Peskineff5f0e72019-04-18 12:53:30 +02005053 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
5054 psa_set_key_algorithm( &attributes, alg );
5055 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02005056 PSA_ASSERT( psa_import_key( &attributes,
5057 our_key_data->x, our_key_data->len,
5058 &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02005059
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005060 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005061 PSA_ASSERT( psa_key_derivation_key_agreement(
5062 &operation,
5063 PSA_KEY_DERIVATION_INPUT_SECRET, our_key,
5064 peer_key_data->x, peer_key_data->len ) );
Gilles Peskinef8a9d942019-04-11 22:13:20 +02005065 if( PSA_ALG_IS_HKDF( PSA_ALG_KEY_AGREEMENT_GET_KDF( alg ) ) )
5066 {
5067 /* The test data is for info="" */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005068 PSA_ASSERT( psa_key_derivation_input_bytes( &operation,
Gilles Peskine03410b52019-05-16 16:05:19 +02005069 PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskinef8a9d942019-04-11 22:13:20 +02005070 NULL, 0 ) );
5071 }
Gilles Peskine59685592018-09-18 12:11:34 +02005072
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005073 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005074 actual_output,
5075 expected_output1->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01005076 ASSERT_COMPARE( actual_output, expected_output1->len,
5077 expected_output1->x, expected_output1->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02005078 if( expected_output2->len != 0 )
5079 {
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005080 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005081 actual_output,
5082 expected_output2->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01005083 ASSERT_COMPARE( actual_output, expected_output2->len,
5084 expected_output2->x, expected_output2->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02005085 }
Gilles Peskine59685592018-09-18 12:11:34 +02005086
5087exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005088 psa_key_derivation_abort( &operation );
Gilles Peskine59685592018-09-18 12:11:34 +02005089 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005090 PSA_DONE( );
Gilles Peskine59685592018-09-18 12:11:34 +02005091 mbedtls_free( actual_output );
5092}
5093/* END_CASE */
5094
5095/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02005096void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02005097{
Gilles Peskinea50d7392018-06-21 10:22:13 +02005098 size_t bytes = bytes_arg;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02005099 unsigned char *output = NULL;
5100 unsigned char *changed = NULL;
Gilles Peskinea50d7392018-06-21 10:22:13 +02005101 size_t i;
5102 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02005103
Simon Butcher49f8e312020-03-03 15:51:50 +00005104 TEST_ASSERT( bytes_arg >= 0 );
5105
Gilles Peskine91892022021-02-08 19:50:26 +01005106 ASSERT_ALLOC( output, bytes );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02005107 ASSERT_ALLOC( changed, bytes );
Gilles Peskine05d69892018-06-19 22:00:52 +02005108
Gilles Peskine8817f612018-12-18 00:18:46 +01005109 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02005110
Gilles Peskinea50d7392018-06-21 10:22:13 +02005111 /* Run several times, to ensure that every output byte will be
5112 * nonzero at least once with overwhelming probability
5113 * (2^(-8*number_of_runs)). */
5114 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02005115 {
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02005116 if( bytes != 0 )
5117 memset( output, 0, bytes );
Gilles Peskine8817f612018-12-18 00:18:46 +01005118 PSA_ASSERT( psa_generate_random( output, bytes ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02005119
Gilles Peskinea50d7392018-06-21 10:22:13 +02005120 for( i = 0; i < bytes; i++ )
5121 {
5122 if( output[i] != 0 )
5123 ++changed[i];
5124 }
Gilles Peskine05d69892018-06-19 22:00:52 +02005125 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02005126
5127 /* Check that every byte was changed to nonzero at least once. This
5128 * validates that psa_generate_random is overwriting every byte of
5129 * the output buffer. */
5130 for( i = 0; i < bytes; i++ )
5131 {
5132 TEST_ASSERT( changed[i] != 0 );
5133 }
Gilles Peskine05d69892018-06-19 22:00:52 +02005134
5135exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005136 PSA_DONE( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02005137 mbedtls_free( output );
5138 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02005139}
5140/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02005141
5142/* BEGIN_CASE */
5143void generate_key( int type_arg,
5144 int bits_arg,
5145 int usage_arg,
5146 int alg_arg,
Steven Cooreman83fdb702021-01-21 14:24:39 +01005147 int expected_status_arg,
5148 int is_large_key )
Gilles Peskine12313cd2018-06-20 00:20:32 +02005149{
Ronald Cron5425a212020-08-04 14:58:35 +02005150 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02005151 psa_key_type_t type = type_arg;
5152 psa_key_usage_t usage = usage_arg;
5153 size_t bits = bits_arg;
5154 psa_algorithm_t alg = alg_arg;
5155 psa_status_t expected_status = expected_status_arg;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02005156 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02005157 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02005158
Gilles Peskine8817f612018-12-18 00:18:46 +01005159 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02005160
Gilles Peskineff5f0e72019-04-18 12:53:30 +02005161 psa_set_key_usage_flags( &attributes, usage );
5162 psa_set_key_algorithm( &attributes, alg );
5163 psa_set_key_type( &attributes, type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02005164 psa_set_key_bits( &attributes, bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02005165
5166 /* Generate a key */
Steven Cooreman83fdb702021-01-21 14:24:39 +01005167 psa_status_t status = psa_generate_key( &attributes, &key );
5168
5169 if( is_large_key > 0 )
5170 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
5171 TEST_EQUAL( status , expected_status );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005172 if( expected_status != PSA_SUCCESS )
Gilles Peskineff5f0e72019-04-18 12:53:30 +02005173 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02005174
5175 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02005176 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02005177 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
5178 TEST_EQUAL( psa_get_key_bits( &got_attributes ), bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02005179
Gilles Peskine818ca122018-06-20 18:16:48 +02005180 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01005181 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +02005182 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02005183
5184exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005185 /*
5186 * Key attributes may have been returned by psa_get_key_attributes()
5187 * thus reset them as required.
5188 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005189 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005190
Ronald Cron5425a212020-08-04 14:58:35 +02005191 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005192 PSA_DONE( );
Gilles Peskine12313cd2018-06-20 00:20:32 +02005193}
5194/* END_CASE */
itayzafrir0adf0fc2018-09-06 16:24:41 +03005195
Ronald Cronee414c72021-03-18 18:50:08 +01005196/* 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 +02005197void generate_key_rsa( int bits_arg,
5198 data_t *e_arg,
5199 int expected_status_arg )
5200{
Ronald Cron5425a212020-08-04 14:58:35 +02005201 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec93b80c2019-05-16 19:39:54 +02005202 psa_key_type_t type = PSA_KEY_TYPE_RSA_KEY_PAIR;
Gilles Peskinee56e8782019-04-26 17:34:02 +02005203 size_t bits = bits_arg;
5204 psa_key_usage_t usage = PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT;
5205 psa_algorithm_t alg = PSA_ALG_RSA_PKCS1V15_SIGN_RAW;
5206 psa_status_t expected_status = expected_status_arg;
5207 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
5208 uint8_t *exported = NULL;
5209 size_t exported_size =
gabor-mezei-armcbcec212020-12-18 14:23:51 +01005210 PSA_EXPORT_KEY_OUTPUT_SIZE( PSA_KEY_TYPE_RSA_PUBLIC_KEY, bits );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005211 size_t exported_length = SIZE_MAX;
5212 uint8_t *e_read_buffer = NULL;
5213 int is_default_public_exponent = 0;
Gilles Peskineaa02c172019-04-28 11:44:17 +02005214 size_t e_read_size = PSA_KEY_DOMAIN_PARAMETERS_SIZE( type, bits );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005215 size_t e_read_length = SIZE_MAX;
5216
5217 if( e_arg->len == 0 ||
5218 ( e_arg->len == 3 &&
5219 e_arg->x[0] == 1 && e_arg->x[1] == 0 && e_arg->x[2] == 1 ) )
5220 {
5221 is_default_public_exponent = 1;
5222 e_read_size = 0;
5223 }
5224 ASSERT_ALLOC( e_read_buffer, e_read_size );
5225 ASSERT_ALLOC( exported, exported_size );
5226
5227 PSA_ASSERT( psa_crypto_init( ) );
5228
5229 psa_set_key_usage_flags( &attributes, usage );
5230 psa_set_key_algorithm( &attributes, alg );
5231 PSA_ASSERT( psa_set_key_domain_parameters( &attributes, type,
5232 e_arg->x, e_arg->len ) );
5233 psa_set_key_bits( &attributes, bits );
5234
5235 /* Generate a key */
Ronald Cron5425a212020-08-04 14:58:35 +02005236 TEST_EQUAL( psa_generate_key( &attributes, &key ), expected_status );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005237 if( expected_status != PSA_SUCCESS )
5238 goto exit;
5239
5240 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02005241 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005242 TEST_EQUAL( psa_get_key_type( &attributes ), type );
5243 TEST_EQUAL( psa_get_key_bits( &attributes ), bits );
5244 PSA_ASSERT( psa_get_key_domain_parameters( &attributes,
5245 e_read_buffer, e_read_size,
5246 &e_read_length ) );
5247 if( is_default_public_exponent )
5248 TEST_EQUAL( e_read_length, 0 );
5249 else
5250 ASSERT_COMPARE( e_read_buffer, e_read_length, e_arg->x, e_arg->len );
5251
5252 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01005253 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskinee56e8782019-04-26 17:34:02 +02005254 goto exit;
5255
5256 /* Export the key and check the public exponent. */
Ronald Cron5425a212020-08-04 14:58:35 +02005257 PSA_ASSERT( psa_export_public_key( key,
Gilles Peskinee56e8782019-04-26 17:34:02 +02005258 exported, exported_size,
5259 &exported_length ) );
5260 {
5261 uint8_t *p = exported;
5262 uint8_t *end = exported + exported_length;
5263 size_t len;
5264 /* RSAPublicKey ::= SEQUENCE {
5265 * modulus INTEGER, -- n
5266 * publicExponent INTEGER } -- e
5267 */
5268 TEST_EQUAL( 0, mbedtls_asn1_get_tag( &p, end, &len,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005269 MBEDTLS_ASN1_SEQUENCE |
5270 MBEDTLS_ASN1_CONSTRUCTED ) );
Gilles Peskine8e94efe2021-02-13 00:25:53 +01005271 TEST_ASSERT( mbedtls_test_asn1_skip_integer( &p, end, bits, bits, 1 ) );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005272 TEST_EQUAL( 0, mbedtls_asn1_get_tag( &p, end, &len,
5273 MBEDTLS_ASN1_INTEGER ) );
5274 if( len >= 1 && p[0] == 0 )
5275 {
5276 ++p;
5277 --len;
5278 }
5279 if( e_arg->len == 0 )
5280 {
5281 TEST_EQUAL( len, 3 );
5282 TEST_EQUAL( p[0], 1 );
5283 TEST_EQUAL( p[1], 0 );
5284 TEST_EQUAL( p[2], 1 );
5285 }
5286 else
5287 ASSERT_COMPARE( p, len, e_arg->x, e_arg->len );
5288 }
5289
5290exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005291 /*
5292 * Key attributes may have been returned by psa_get_key_attributes() or
5293 * set by psa_set_key_domain_parameters() thus reset them as required.
5294 */
Gilles Peskinee56e8782019-04-26 17:34:02 +02005295 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005296
Ronald Cron5425a212020-08-04 14:58:35 +02005297 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005298 PSA_DONE( );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005299 mbedtls_free( e_read_buffer );
5300 mbedtls_free( exported );
5301}
5302/* END_CASE */
5303
Darryl Greend49a4992018-06-18 17:27:26 +01005304/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C */
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005305void persistent_key_load_key_from_storage( data_t *data,
5306 int type_arg, int bits_arg,
5307 int usage_flags_arg, int alg_arg,
5308 int generation_method )
Darryl Greend49a4992018-06-18 17:27:26 +01005309{
Ronald Cron71016a92020-08-28 19:01:50 +02005310 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, 1 );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005311 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +02005312 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
5313 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005314 psa_key_type_t type = type_arg;
5315 size_t bits = bits_arg;
5316 psa_key_usage_t usage_flags = usage_flags_arg;
5317 psa_algorithm_t alg = alg_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005318 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01005319 unsigned char *first_export = NULL;
5320 unsigned char *second_export = NULL;
gabor-mezei-armcbcec212020-12-18 14:23:51 +01005321 size_t export_size = PSA_EXPORT_KEY_OUTPUT_SIZE( type, bits );
Darryl Greend49a4992018-06-18 17:27:26 +01005322 size_t first_exported_length;
5323 size_t second_exported_length;
5324
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005325 if( usage_flags & PSA_KEY_USAGE_EXPORT )
5326 {
5327 ASSERT_ALLOC( first_export, export_size );
5328 ASSERT_ALLOC( second_export, export_size );
5329 }
Darryl Greend49a4992018-06-18 17:27:26 +01005330
Gilles Peskine8817f612018-12-18 00:18:46 +01005331 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01005332
Gilles Peskinec87af662019-05-15 16:12:22 +02005333 psa_set_key_id( &attributes, key_id );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005334 psa_set_key_usage_flags( &attributes, usage_flags );
5335 psa_set_key_algorithm( &attributes, alg );
5336 psa_set_key_type( &attributes, type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02005337 psa_set_key_bits( &attributes, bits );
Darryl Greend49a4992018-06-18 17:27:26 +01005338
Darryl Green0c6575a2018-11-07 16:05:30 +00005339 switch( generation_method )
5340 {
5341 case IMPORT_KEY:
5342 /* Import the key */
Gilles Peskine049c7532019-05-15 20:22:09 +02005343 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02005344 &key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005345 break;
Darryl Greend49a4992018-06-18 17:27:26 +01005346
Darryl Green0c6575a2018-11-07 16:05:30 +00005347 case GENERATE_KEY:
5348 /* Generate a key */
Ronald Cron5425a212020-08-04 14:58:35 +02005349 PSA_ASSERT( psa_generate_key( &attributes, &key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005350 break;
5351
5352 case DERIVE_KEY:
Steven Cooreman70f654a2021-02-15 10:51:43 +01005353#if defined(PSA_WANT_ALG_HKDF) && defined(PSA_WANT_ALG_SHA_256)
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005354 {
5355 /* Create base key */
5356 psa_algorithm_t derive_alg = PSA_ALG_HKDF( PSA_ALG_SHA_256 );
5357 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
5358 psa_set_key_usage_flags( &base_attributes,
5359 PSA_KEY_USAGE_DERIVE );
5360 psa_set_key_algorithm( &base_attributes, derive_alg );
5361 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02005362 PSA_ASSERT( psa_import_key( &base_attributes,
5363 data->x, data->len,
5364 &base_key ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005365 /* Derive a key. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005366 PSA_ASSERT( psa_key_derivation_setup( &operation, derive_alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005367 PSA_ASSERT( psa_key_derivation_input_key(
5368 &operation,
5369 PSA_KEY_DERIVATION_INPUT_SECRET, base_key ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005370 PSA_ASSERT( psa_key_derivation_input_bytes(
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005371 &operation, PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005372 NULL, 0 ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005373 PSA_ASSERT( psa_key_derivation_output_key( &attributes,
5374 &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02005375 &key ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005376 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005377 PSA_ASSERT( psa_destroy_key( base_key ) );
Ronald Cron5425a212020-08-04 14:58:35 +02005378 base_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005379 }
Gilles Peskine6fea21d2021-01-12 00:02:15 +01005380#else
5381 TEST_ASSUME( ! "KDF not supported in this configuration" );
5382#endif
5383 break;
5384
5385 default:
5386 TEST_ASSERT( ! "generation_method not implemented in test" );
5387 break;
Darryl Green0c6575a2018-11-07 16:05:30 +00005388 }
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005389 psa_reset_key_attributes( &attributes );
Darryl Greend49a4992018-06-18 17:27:26 +01005390
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005391 /* Export the key if permitted by the key policy. */
5392 if( usage_flags & PSA_KEY_USAGE_EXPORT )
5393 {
Ronald Cron5425a212020-08-04 14:58:35 +02005394 PSA_ASSERT( psa_export_key( key,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005395 first_export, export_size,
5396 &first_exported_length ) );
5397 if( generation_method == IMPORT_KEY )
5398 ASSERT_COMPARE( data->x, data->len,
5399 first_export, first_exported_length );
5400 }
Darryl Greend49a4992018-06-18 17:27:26 +01005401
5402 /* Shutdown and restart */
Ronald Cron5425a212020-08-04 14:58:35 +02005403 PSA_ASSERT( psa_purge_key( key ) );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005404 PSA_DONE();
Gilles Peskine8817f612018-12-18 00:18:46 +01005405 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01005406
Darryl Greend49a4992018-06-18 17:27:26 +01005407 /* Check key slot still contains key data */
Ronald Cron5425a212020-08-04 14:58:35 +02005408 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Ronald Cronecfb2372020-07-23 17:13:42 +02005409 TEST_ASSERT( mbedtls_svc_key_id_equal(
5410 psa_get_key_id( &attributes ), key_id ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005411 TEST_EQUAL( psa_get_key_lifetime( &attributes ),
5412 PSA_KEY_LIFETIME_PERSISTENT );
5413 TEST_EQUAL( psa_get_key_type( &attributes ), type );
5414 TEST_EQUAL( psa_get_key_bits( &attributes ), bits );
5415 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), usage_flags );
5416 TEST_EQUAL( psa_get_key_algorithm( &attributes ), alg );
Darryl Greend49a4992018-06-18 17:27:26 +01005417
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005418 /* Export the key again if permitted by the key policy. */
5419 if( usage_flags & PSA_KEY_USAGE_EXPORT )
Darryl Green0c6575a2018-11-07 16:05:30 +00005420 {
Ronald Cron5425a212020-08-04 14:58:35 +02005421 PSA_ASSERT( psa_export_key( key,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005422 second_export, export_size,
5423 &second_exported_length ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005424 ASSERT_COMPARE( first_export, first_exported_length,
5425 second_export, second_exported_length );
Darryl Green0c6575a2018-11-07 16:05:30 +00005426 }
5427
5428 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01005429 if( ! mbedtls_test_psa_exercise_key( key, usage_flags, alg ) )
Darryl Green0c6575a2018-11-07 16:05:30 +00005430 goto exit;
Darryl Greend49a4992018-06-18 17:27:26 +01005431
5432exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005433 /*
5434 * Key attributes may have been returned by psa_get_key_attributes()
5435 * thus reset them as required.
5436 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005437 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005438
Darryl Greend49a4992018-06-18 17:27:26 +01005439 mbedtls_free( first_export );
5440 mbedtls_free( second_export );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005441 psa_key_derivation_abort( &operation );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005442 psa_destroy_key( base_key );
Ronald Cron5425a212020-08-04 14:58:35 +02005443 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005444 PSA_DONE();
Darryl Greend49a4992018-06-18 17:27:26 +01005445}
5446/* END_CASE */