blob: 0ed803723a1c68aecdd1aa239f5accb250c093a5 [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 */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002584void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002585 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002586 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002587 int first_part_size_arg,
2588 int output1_length_arg, int output2_length_arg,
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002589 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_key_type_t key_type = key_type_arg;
2594 psa_algorithm_t alg = alg_arg;
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002595 psa_status_t status;
2596 psa_status_t expected_status = expected_status_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002597 size_t first_part_size = first_part_size_arg;
2598 size_t output1_length = output1_length_arg;
2599 size_t output2_length = output2_length_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002600 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002601 size_t output_buffer_size = 0;
2602 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002603 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002604 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002605 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002606
Gilles Peskine8817f612018-12-18 00:18:46 +01002607 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002608
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002609 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2610 psa_set_key_algorithm( &attributes, alg );
2611 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002612
Ronald Cron5425a212020-08-04 14:58:35 +02002613 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2614 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002615
Ronald Cron5425a212020-08-04 14:58:35 +02002616 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002617
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002618 if( iv->len > 0 )
2619 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002620 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002621 }
2622
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002623 output_buffer_size = PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) +
2624 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002625 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002626
Gilles Peskinee0866522019-02-19 19:44:00 +01002627 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002628 PSA_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
2629 output, output_buffer_size,
2630 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002631 TEST_ASSERT( function_output_length == output1_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002632 TEST_ASSERT( function_output_length <=
2633 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2634 TEST_ASSERT( function_output_length <=
2635 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002636 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002637
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002638 if( first_part_size < input->len )
2639 {
2640 PSA_ASSERT( psa_cipher_update( &operation,
2641 input->x + first_part_size,
2642 input->len - first_part_size,
2643 ( output_buffer_size == 0 ? NULL :
2644 output + total_output_length ),
2645 output_buffer_size - total_output_length,
2646 &function_output_length ) );
2647 TEST_ASSERT( function_output_length == output2_length );
2648 TEST_ASSERT( function_output_length <=
2649 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2650 alg,
2651 input->len - first_part_size ) );
2652 TEST_ASSERT( function_output_length <=
2653 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
2654 total_output_length += function_output_length;
2655 }
gabor-mezei-armceface22021-01-21 12:26:17 +01002656
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002657 status = psa_cipher_finish( &operation,
2658 ( output_buffer_size == 0 ? NULL :
2659 output + total_output_length ),
2660 output_buffer_size - total_output_length,
2661 &function_output_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002662 TEST_ASSERT( function_output_length <=
2663 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2664 TEST_ASSERT( function_output_length <=
2665 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002666 total_output_length += function_output_length;
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002667 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002668
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002669 if( expected_status == PSA_SUCCESS )
2670 {
2671 PSA_ASSERT( psa_cipher_abort( &operation ) );
2672
2673 ASSERT_COMPARE( expected_output->x, expected_output->len,
2674 output, total_output_length );
2675 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02002676
2677exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002678 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002679 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002680 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002681 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002682}
2683/* END_CASE */
2684
2685/* BEGIN_CASE */
2686void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002687 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002688 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002689 int first_part_size_arg,
2690 int output1_length_arg, int output2_length_arg,
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002691 data_t *expected_output,
2692 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002693{
Ronald Cron5425a212020-08-04 14:58:35 +02002694 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002695 psa_key_type_t key_type = key_type_arg;
2696 psa_algorithm_t alg = alg_arg;
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002697 psa_status_t status;
2698 psa_status_t expected_status = expected_status_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002699 size_t first_part_size = first_part_size_arg;
2700 size_t output1_length = output1_length_arg;
2701 size_t output2_length = output2_length_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002702 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002703 size_t output_buffer_size = 0;
2704 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002705 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002706 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002707 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002708
Gilles Peskine8817f612018-12-18 00:18:46 +01002709 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002710
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002711 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2712 psa_set_key_algorithm( &attributes, alg );
2713 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002714
Ronald Cron5425a212020-08-04 14:58:35 +02002715 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2716 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002717
Ronald Cron5425a212020-08-04 14:58:35 +02002718 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002719
Steven Cooreman177deba2020-09-07 17:14:14 +02002720 if( iv->len > 0 )
2721 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002722 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002723 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02002724
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002725 output_buffer_size = PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) +
2726 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002727 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002728
Gilles Peskinee0866522019-02-19 19:44:00 +01002729 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002730 PSA_ASSERT( psa_cipher_update( &operation,
2731 input->x, first_part_size,
2732 output, output_buffer_size,
2733 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002734 TEST_ASSERT( function_output_length == output1_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002735 TEST_ASSERT( function_output_length <=
2736 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2737 TEST_ASSERT( function_output_length <=
2738 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002739 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002740
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002741 if( first_part_size < input->len )
Steven Cooreman177deba2020-09-07 17:14:14 +02002742 {
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002743 PSA_ASSERT( psa_cipher_update( &operation,
2744 input->x + first_part_size,
2745 input->len - first_part_size,
2746 ( output_buffer_size == 0 ? NULL :
2747 output + total_output_length ),
2748 output_buffer_size - total_output_length,
2749 &function_output_length ) );
2750 TEST_ASSERT( function_output_length == output2_length );
2751 TEST_ASSERT( function_output_length <=
2752 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2753 alg,
2754 input->len - first_part_size ) );
2755 TEST_ASSERT( function_output_length <=
2756 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
2757 total_output_length += function_output_length;
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002758 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02002759
Gilles Peskine50e586b2018-06-08 14:28:46 +02002760 status = psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002761 ( output_buffer_size == 0 ? NULL :
2762 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002763 output_buffer_size - total_output_length,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002764 &function_output_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002765 TEST_ASSERT( function_output_length <=
2766 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2767 TEST_ASSERT( function_output_length <=
2768 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002769 total_output_length += function_output_length;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002770 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002771
2772 if( expected_status == PSA_SUCCESS )
2773 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002774 PSA_ASSERT( psa_cipher_abort( &operation ) );
gabor-mezei-arm95aad832021-06-25 18:21:33 +02002775
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002776 ASSERT_COMPARE( expected_output->x, expected_output->len,
2777 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002778 }
2779
Gilles Peskine50e586b2018-06-08 14:28:46 +02002780exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002781 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002782 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002783 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002784 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002785}
2786/* END_CASE */
2787
Gilles Peskine50e586b2018-06-08 14:28:46 +02002788/* BEGIN_CASE */
gabor-mezei-arma56756e2021-06-25 15:49:14 +02002789void cipher_decrypt_fail( int alg_arg,
2790 int key_type_arg,
2791 data_t *key_data,
2792 data_t *iv,
2793 data_t *input_arg,
2794 int expected_status_arg )
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002795{
2796 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
2797 psa_status_t status;
2798 psa_key_type_t key_type = key_type_arg;
2799 psa_algorithm_t alg = alg_arg;
2800 psa_status_t expected_status = expected_status_arg;
2801 unsigned char *input = NULL;
2802 size_t input_buffer_size = 0;
2803 unsigned char *output = NULL;
2804 size_t output_buffer_size = 0;
2805 size_t output_length = 0;
2806 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2807
2808 if ( PSA_ERROR_BAD_STATE != expected_status )
2809 {
2810 PSA_ASSERT( psa_crypto_init( ) );
2811
2812 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2813 psa_set_key_algorithm( &attributes, alg );
2814 psa_set_key_type( &attributes, key_type );
2815
2816 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2817 &key ) );
2818 }
2819
2820 /* Allocate input buffer and copy the iv and the plaintext */
2821 input_buffer_size = ( (size_t) input_arg->len + (size_t) iv->len );
2822 if ( input_buffer_size > 0 )
2823 {
2824 ASSERT_ALLOC( input, input_buffer_size );
2825 memcpy( input, iv->x, iv->len );
2826 memcpy( input + iv->len, input_arg->x, input_arg->len );
2827 }
2828
2829 output_buffer_size = PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input_buffer_size );
2830 ASSERT_ALLOC( output, output_buffer_size );
2831
2832 status = psa_cipher_decrypt( key, alg, input, input_buffer_size, output,
2833 output_buffer_size, &output_length );
2834 TEST_EQUAL( status, expected_status );
2835
2836exit:
2837 mbedtls_free( input );
2838 mbedtls_free( output );
2839 psa_destroy_key( key );
2840 PSA_DONE( );
2841}
2842/* END_CASE */
2843
2844/* BEGIN_CASE */
2845void cipher_decrypt( int alg_arg,
2846 int key_type_arg,
2847 data_t *key_data,
2848 data_t *iv,
2849 data_t *input_arg,
2850 data_t *expected_output )
2851{
2852 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
2853 psa_key_type_t key_type = key_type_arg;
2854 psa_algorithm_t alg = alg_arg;
2855 unsigned char *input = NULL;
2856 size_t input_buffer_size = 0;
2857 unsigned char *output = NULL;
2858 size_t output_buffer_size = 0;
2859 size_t output_length = 0;
2860 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2861
2862 PSA_ASSERT( psa_crypto_init( ) );
2863
2864 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2865 psa_set_key_algorithm( &attributes, alg );
2866 psa_set_key_type( &attributes, key_type );
2867
2868 /* Allocate input buffer and copy the iv and the plaintext */
2869 input_buffer_size = ( (size_t) input_arg->len + (size_t) iv->len );
2870 if ( input_buffer_size > 0 )
2871 {
2872 ASSERT_ALLOC( input, input_buffer_size );
2873 memcpy( input, iv->x, iv->len );
2874 memcpy( input + iv->len, input_arg->x, input_arg->len );
2875 }
2876
2877 output_buffer_size = PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input_buffer_size );
2878 ASSERT_ALLOC( output, output_buffer_size );
2879
2880 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2881 &key ) );
2882
2883 PSA_ASSERT( psa_cipher_decrypt( key, alg, input, input_buffer_size, output,
2884 output_buffer_size, &output_length ) );
2885 TEST_ASSERT( output_length <=
2886 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input_buffer_size ) );
2887 TEST_ASSERT( output_length <=
2888 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( input_buffer_size ) );
2889
2890 ASSERT_COMPARE( expected_output->x, expected_output->len,
2891 output, output_length );
2892exit:
2893 mbedtls_free( input );
2894 mbedtls_free( output );
2895 psa_destroy_key( key );
2896 PSA_DONE( );
2897}
2898/* END_CASE */
2899
2900/* BEGIN_CASE */
2901void cipher_verify_output( int alg_arg,
2902 int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002903 data_t *key_data,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002904 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02002905{
Ronald Cron5425a212020-08-04 14:58:35 +02002906 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002907 psa_key_type_t key_type = key_type_arg;
2908 psa_algorithm_t alg = alg_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002909 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002910 size_t output1_size = 0;
2911 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002912 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002913 size_t output2_size = 0;
2914 size_t output2_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002915 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002916
Gilles Peskine8817f612018-12-18 00:18:46 +01002917 PSA_ASSERT( psa_crypto_init( ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002918
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002919 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
2920 psa_set_key_algorithm( &attributes, alg );
2921 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002922
Ronald Cron5425a212020-08-04 14:58:35 +02002923 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2924 &key ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002925 output1_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002926 ASSERT_ALLOC( output1, output1_size );
Moran Pekerded84402018-06-06 16:36:50 +03002927
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002928 PSA_ASSERT( psa_cipher_encrypt( key, alg, input->x, input->len,
2929 output1, output1_size,
2930 &output1_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002931 TEST_ASSERT( output1_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002932 PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002933 TEST_ASSERT( output1_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002934 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Moran Pekerded84402018-06-06 16:36:50 +03002935
2936 output2_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002937 ASSERT_ALLOC( output2, output2_size );
Moran Pekerded84402018-06-06 16:36:50 +03002938
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002939 PSA_ASSERT( psa_cipher_decrypt( key, alg, output1, output1_length,
2940 output2, output2_size,
2941 &output2_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002942 TEST_ASSERT( output2_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002943 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, output1_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002944 TEST_ASSERT( output2_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002945 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( output1_length ) );
Moran Pekerded84402018-06-06 16:36:50 +03002946
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002947 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
Moran Pekerded84402018-06-06 16:36:50 +03002948
2949exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03002950 mbedtls_free( output1 );
2951 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02002952 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002953 PSA_DONE( );
Moran Pekerded84402018-06-06 16:36:50 +03002954}
2955/* END_CASE */
2956
2957/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002958void cipher_verify_output_multipart( int alg_arg,
2959 int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002960 data_t *key_data,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002961 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002962 int first_part_size_arg )
Moran Pekerded84402018-06-06 16:36:50 +03002963{
Ronald Cron5425a212020-08-04 14:58:35 +02002964 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03002965 psa_key_type_t key_type = key_type_arg;
2966 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002967 size_t first_part_size = first_part_size_arg;
Moran Pekerded84402018-06-06 16:36:50 +03002968 unsigned char iv[16] = {0};
2969 size_t iv_size = 16;
2970 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002971 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002972 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002973 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002974 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002975 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002976 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002977 size_t function_output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002978 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
2979 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002980 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03002981
Gilles Peskine8817f612018-12-18 00:18:46 +01002982 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerded84402018-06-06 16:36:50 +03002983
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002984 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
2985 psa_set_key_algorithm( &attributes, alg );
2986 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002987
Ronald Cron5425a212020-08-04 14:58:35 +02002988 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2989 &key ) );
Moran Pekerded84402018-06-06 16:36:50 +03002990
Ronald Cron5425a212020-08-04 14:58:35 +02002991 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1, key, alg ) );
2992 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2, key, alg ) );
Moran Pekerded84402018-06-06 16:36:50 +03002993
Steven Cooreman177deba2020-09-07 17:14:14 +02002994 if( alg != PSA_ALG_ECB_NO_PADDING )
2995 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002996 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
2997 iv, iv_size,
2998 &iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002999 }
3000
gabor-mezei-armceface22021-01-21 12:26:17 +01003001 output1_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
3002 TEST_ASSERT( output1_buffer_size <=
3003 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003004 ASSERT_ALLOC( output1, output1_buffer_size );
Moran Pekerded84402018-06-06 16:36:50 +03003005
Gilles Peskinee0866522019-02-19 19:44:00 +01003006 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003007
Gilles Peskine8817f612018-12-18 00:18:46 +01003008 PSA_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
3009 output1, output1_buffer_size,
3010 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003011 TEST_ASSERT( function_output_length <=
3012 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
3013 TEST_ASSERT( function_output_length <=
3014 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003015 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003016
Gilles Peskine8817f612018-12-18 00:18:46 +01003017 PSA_ASSERT( psa_cipher_update( &operation1,
3018 input->x + first_part_size,
3019 input->len - first_part_size,
3020 output1, output1_buffer_size,
3021 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003022 TEST_ASSERT( function_output_length <=
3023 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
3024 alg,
3025 input->len - first_part_size ) );
3026 TEST_ASSERT( function_output_length <=
3027 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len - first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003028 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003029
Gilles Peskine8817f612018-12-18 00:18:46 +01003030 PSA_ASSERT( psa_cipher_finish( &operation1,
3031 output1 + output1_length,
3032 output1_buffer_size - output1_length,
3033 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003034 TEST_ASSERT( function_output_length <=
3035 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
3036 TEST_ASSERT( function_output_length <=
3037 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003038 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003039
Gilles Peskine8817f612018-12-18 00:18:46 +01003040 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003041
Gilles Peskine048b7f02018-06-08 14:20:49 +02003042 output2_buffer_size = output1_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01003043 TEST_ASSERT( output2_buffer_size <=
3044 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, output1_length ) );
3045 TEST_ASSERT( output2_buffer_size <=
3046 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( output1_length ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003047 ASSERT_ALLOC( output2, output2_buffer_size );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003048
Steven Cooreman177deba2020-09-07 17:14:14 +02003049 if( iv_length > 0 )
3050 {
Steven Cooremana6033e92020-08-25 11:47:50 +02003051 PSA_ASSERT( psa_cipher_set_iv( &operation2,
3052 iv, iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02003053 }
Moran Pekerded84402018-06-06 16:36:50 +03003054
Gilles Peskine8817f612018-12-18 00:18:46 +01003055 PSA_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
3056 output2, output2_buffer_size,
3057 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003058 TEST_ASSERT( function_output_length <=
3059 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
3060 TEST_ASSERT( function_output_length <=
3061 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003062 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003063
Gilles Peskine8817f612018-12-18 00:18:46 +01003064 PSA_ASSERT( psa_cipher_update( &operation2,
3065 output1 + first_part_size,
3066 output1_length - first_part_size,
3067 output2, output2_buffer_size,
3068 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003069 TEST_ASSERT( function_output_length <=
3070 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
3071 alg,
3072 output1_length - first_part_size ) );
3073 TEST_ASSERT( function_output_length <=
3074 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( output1_length - first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003075 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003076
Gilles Peskine8817f612018-12-18 00:18:46 +01003077 PSA_ASSERT( psa_cipher_finish( &operation2,
3078 output2 + output2_length,
3079 output2_buffer_size - output2_length,
3080 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003081 TEST_ASSERT( function_output_length <=
3082 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
3083 TEST_ASSERT( function_output_length <=
3084 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003085 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003086
Gilles Peskine8817f612018-12-18 00:18:46 +01003087 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003088
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003089 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003090
3091exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02003092 psa_cipher_abort( &operation1 );
3093 psa_cipher_abort( &operation2 );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003094 mbedtls_free( output1 );
3095 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02003096 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003097 PSA_DONE( );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003098}
3099/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02003100
Gilles Peskine20035e32018-02-03 22:44:14 +01003101/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003102void aead_encrypt_decrypt( int key_type_arg, data_t *key_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003103 int alg_arg,
Gilles Peskine7da96b02018-08-17 18:45:42 +02003104 data_t *nonce,
3105 data_t *additional_data,
3106 data_t *input_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003107 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003108{
Ronald Cron5425a212020-08-04 14:58:35 +02003109 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003110 psa_key_type_t key_type = key_type_arg;
3111 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003112 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003113 unsigned char *output_data = NULL;
3114 size_t output_size = 0;
3115 size_t output_length = 0;
3116 unsigned char *output_data2 = NULL;
3117 size_t output_length2 = 0;
Steven Cooremanf49478b2021-02-15 15:19:25 +01003118 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003119 psa_status_t expected_result = expected_result_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003120 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003121
Gilles Peskine8817f612018-12-18 00:18:46 +01003122 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003123
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003124 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3125 psa_set_key_algorithm( &attributes, alg );
3126 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003127
Gilles Peskine049c7532019-05-15 20:22:09 +02003128 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003129 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003130 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3131 key_bits = psa_get_key_bits( &attributes );
3132
3133 output_size = input_data->len + PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3134 alg );
3135 /* For all currently defined algorithms, PSA_AEAD_ENCRYPT_OUTPUT_SIZE
3136 * should be exact. */
3137 if( expected_result != PSA_ERROR_INVALID_ARGUMENT &&
3138 expected_result != PSA_ERROR_NOT_SUPPORTED )
3139 {
3140 TEST_EQUAL( output_size,
3141 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3142 TEST_ASSERT( output_size <=
3143 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3144 }
3145 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003146
Steven Cooremanf49478b2021-02-15 15:19:25 +01003147 status = psa_aead_encrypt( key, alg,
3148 nonce->x, nonce->len,
3149 additional_data->x,
3150 additional_data->len,
3151 input_data->x, input_data->len,
3152 output_data, output_size,
3153 &output_length );
3154
3155 /* If the operation is not supported, just skip and not fail in case the
3156 * encryption involves a common limitation of cryptography hardwares and
3157 * an alternative implementation. */
3158 if( status == PSA_ERROR_NOT_SUPPORTED )
3159 {
3160 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3161 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
3162 }
3163
3164 TEST_EQUAL( status, expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003165
3166 if( PSA_SUCCESS == expected_result )
3167 {
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003168 ASSERT_ALLOC( output_data2, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003169
Gilles Peskine003a4a92019-05-14 16:09:40 +02003170 /* For all currently defined algorithms, PSA_AEAD_DECRYPT_OUTPUT_SIZE
3171 * should be exact. */
3172 TEST_EQUAL( input_data->len,
Bence Szépkútiec174e22021-03-19 18:46:15 +01003173 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg, output_length ) );
Gilles Peskine003a4a92019-05-14 16:09:40 +02003174
gabor-mezei-armceface22021-01-21 12:26:17 +01003175 TEST_ASSERT( input_data->len <=
3176 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( output_length ) );
3177
Ronald Cron5425a212020-08-04 14:58:35 +02003178 TEST_EQUAL( psa_aead_decrypt( key, alg,
Gilles Peskinefe11b722018-12-18 00:24:04 +01003179 nonce->x, nonce->len,
3180 additional_data->x,
3181 additional_data->len,
3182 output_data, output_length,
3183 output_data2, output_length,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003184 &output_length2 ),
3185 expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02003186
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003187 ASSERT_COMPARE( input_data->x, input_data->len,
3188 output_data2, output_length2 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003189 }
Gilles Peskine2d277862018-06-18 15:41:12 +02003190
Gilles Peskinea1cac842018-06-11 19:33:02 +02003191exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003192 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003193 mbedtls_free( output_data );
3194 mbedtls_free( output_data2 );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003195 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003196}
3197/* END_CASE */
3198
3199/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003200void aead_encrypt( int key_type_arg, data_t *key_data,
3201 int alg_arg,
3202 data_t *nonce,
3203 data_t *additional_data,
3204 data_t *input_data,
3205 data_t *expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003206{
Ronald Cron5425a212020-08-04 14:58:35 +02003207 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003208 psa_key_type_t key_type = key_type_arg;
3209 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003210 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003211 unsigned char *output_data = NULL;
3212 size_t output_size = 0;
3213 size_t output_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003214 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Steven Cooremand588ea12021-01-11 19:36:04 +01003215 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003216
Gilles Peskine8817f612018-12-18 00:18:46 +01003217 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003218
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003219 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3220 psa_set_key_algorithm( &attributes, alg );
3221 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003222
Gilles Peskine049c7532019-05-15 20:22:09 +02003223 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003224 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003225 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3226 key_bits = psa_get_key_bits( &attributes );
3227
3228 output_size = input_data->len + PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3229 alg );
3230 /* For all currently defined algorithms, PSA_AEAD_ENCRYPT_OUTPUT_SIZE
3231 * should be exact. */
3232 TEST_EQUAL( output_size,
3233 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3234 TEST_ASSERT( output_size <=
3235 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3236 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003237
Steven Cooremand588ea12021-01-11 19:36:04 +01003238 status = psa_aead_encrypt( key, alg,
3239 nonce->x, nonce->len,
3240 additional_data->x, additional_data->len,
3241 input_data->x, input_data->len,
3242 output_data, output_size,
3243 &output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003244
Ronald Cron28a45ed2021-02-09 20:35:42 +01003245 /* If the operation is not supported, just skip and not fail in case the
3246 * encryption involves a common limitation of cryptography hardwares and
3247 * an alternative implementation. */
3248 if( status == PSA_ERROR_NOT_SUPPORTED )
Steven Cooremand588ea12021-01-11 19:36:04 +01003249 {
Ronald Cron28a45ed2021-02-09 20:35:42 +01003250 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3251 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
Steven Cooremand588ea12021-01-11 19:36:04 +01003252 }
Steven Cooremand588ea12021-01-11 19:36:04 +01003253
3254 PSA_ASSERT( status );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003255 ASSERT_COMPARE( expected_result->x, expected_result->len,
3256 output_data, output_length );
Gilles Peskine2d277862018-06-18 15:41:12 +02003257
Gilles Peskinea1cac842018-06-11 19:33:02 +02003258exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003259 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003260 mbedtls_free( output_data );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003261 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003262}
3263/* END_CASE */
3264
3265/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003266void aead_decrypt( int key_type_arg, data_t *key_data,
3267 int alg_arg,
3268 data_t *nonce,
3269 data_t *additional_data,
3270 data_t *input_data,
3271 data_t *expected_data,
3272 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003273{
Ronald Cron5425a212020-08-04 14:58:35 +02003274 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003275 psa_key_type_t key_type = key_type_arg;
3276 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003277 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003278 unsigned char *output_data = NULL;
3279 size_t output_size = 0;
3280 size_t output_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003281 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003282 psa_status_t expected_result = expected_result_arg;
Steven Cooremand588ea12021-01-11 19:36:04 +01003283 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003284
Gilles Peskine8817f612018-12-18 00:18:46 +01003285 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003286
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003287 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3288 psa_set_key_algorithm( &attributes, alg );
3289 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003290
Gilles Peskine049c7532019-05-15 20:22:09 +02003291 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003292 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003293 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3294 key_bits = psa_get_key_bits( &attributes );
3295
3296 output_size = input_data->len - PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3297 alg );
3298 if( expected_result != PSA_ERROR_INVALID_ARGUMENT &&
3299 expected_result != PSA_ERROR_NOT_SUPPORTED )
3300 {
3301 /* For all currently defined algorithms, PSA_AEAD_DECRYPT_OUTPUT_SIZE
3302 * should be exact. */
3303 TEST_EQUAL( output_size,
3304 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3305 TEST_ASSERT( output_size <=
3306 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3307 }
3308 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003309
Steven Cooremand588ea12021-01-11 19:36:04 +01003310 status = psa_aead_decrypt( key, alg,
3311 nonce->x, nonce->len,
3312 additional_data->x,
3313 additional_data->len,
3314 input_data->x, input_data->len,
3315 output_data, output_size,
3316 &output_length );
3317
Ronald Cron28a45ed2021-02-09 20:35:42 +01003318 /* If the operation is not supported, just skip and not fail in case the
3319 * decryption involves a common limitation of cryptography hardwares and
3320 * an alternative implementation. */
3321 if( status == PSA_ERROR_NOT_SUPPORTED )
Steven Cooremand588ea12021-01-11 19:36:04 +01003322 {
Ronald Cron28a45ed2021-02-09 20:35:42 +01003323 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3324 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
Steven Cooremand588ea12021-01-11 19:36:04 +01003325 }
Steven Cooremand588ea12021-01-11 19:36:04 +01003326
3327 TEST_EQUAL( status, expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003328
Gilles Peskine2d277862018-06-18 15:41:12 +02003329 if( expected_result == PSA_SUCCESS )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003330 ASSERT_COMPARE( expected_data->x, expected_data->len,
3331 output_data, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003332
Gilles Peskinea1cac842018-06-11 19:33:02 +02003333exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003334 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003335 mbedtls_free( output_data );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003336 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003337}
3338/* END_CASE */
3339
3340/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003341void signature_size( int type_arg,
3342 int bits,
3343 int alg_arg,
3344 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003345{
3346 psa_key_type_t type = type_arg;
3347 psa_algorithm_t alg = alg_arg;
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003348 size_t actual_size = PSA_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskine841b14b2019-11-26 17:37:37 +01003349
Gilles Peskinefe11b722018-12-18 00:24:04 +01003350 TEST_EQUAL( actual_size, (size_t) expected_size_arg );
Gilles Peskine841b14b2019-11-26 17:37:37 +01003351
Gilles Peskinee59236f2018-01-27 23:32:46 +01003352exit:
3353 ;
3354}
3355/* END_CASE */
3356
3357/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003358void sign_hash_deterministic( int key_type_arg, data_t *key_data,
3359 int alg_arg, data_t *input_data,
3360 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003361{
Ronald Cron5425a212020-08-04 14:58:35 +02003362 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinee59236f2018-01-27 23:32:46 +01003363 psa_key_type_t key_type = key_type_arg;
3364 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003365 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01003366 unsigned char *signature = NULL;
3367 size_t signature_size;
3368 size_t signature_length = 0xdeadbeef;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003369 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003370
Gilles Peskine8817f612018-12-18 00:18:46 +01003371 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003372
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003373 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003374 psa_set_key_algorithm( &attributes, alg );
3375 psa_set_key_type( &attributes, key_type );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003376
Gilles Peskine049c7532019-05-15 20:22:09 +02003377 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003378 &key ) );
3379 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003380 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine20035e32018-02-03 22:44:14 +01003381
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003382 /* Allocate a buffer which has the size advertized by the
3383 * library. */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003384 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003385 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01003386 TEST_ASSERT( signature_size != 0 );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003387 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003388 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003389
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003390 /* Perform the signature. */
Ronald Cron5425a212020-08-04 14:58:35 +02003391 PSA_ASSERT( psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003392 input_data->x, input_data->len,
3393 signature, signature_size,
3394 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003395 /* Verify that the signature is what is expected. */
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003396 ASSERT_COMPARE( output_data->x, output_data->len,
3397 signature, signature_length );
Gilles Peskine20035e32018-02-03 22:44:14 +01003398
3399exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003400 /*
3401 * Key attributes may have been returned by psa_get_key_attributes()
3402 * thus reset them as required.
3403 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003404 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003405
Ronald Cron5425a212020-08-04 14:58:35 +02003406 psa_destroy_key( key );
Gilles Peskine0189e752018-02-03 23:57:22 +01003407 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003408 PSA_DONE( );
Gilles Peskine20035e32018-02-03 22:44:14 +01003409}
3410/* END_CASE */
3411
3412/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003413void sign_hash_fail( int key_type_arg, data_t *key_data,
3414 int alg_arg, data_t *input_data,
3415 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01003416{
Ronald Cron5425a212020-08-04 14:58:35 +02003417 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003418 psa_key_type_t key_type = key_type_arg;
3419 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003420 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003421 psa_status_t actual_status;
3422 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01003423 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01003424 size_t signature_length = 0xdeadbeef;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003425 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003426
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003427 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003428
Gilles Peskine8817f612018-12-18 00:18:46 +01003429 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003430
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003431 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003432 psa_set_key_algorithm( &attributes, alg );
3433 psa_set_key_type( &attributes, key_type );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003434
Gilles Peskine049c7532019-05-15 20:22:09 +02003435 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003436 &key ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003437
Ronald Cron5425a212020-08-04 14:58:35 +02003438 actual_status = psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003439 input_data->x, input_data->len,
3440 signature, signature_size,
3441 &signature_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003442 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003443 /* The value of *signature_length is unspecified on error, but
3444 * whatever it is, it should be less than signature_size, so that
3445 * if the caller tries to read *signature_length bytes without
3446 * checking the error code then they don't overflow a buffer. */
3447 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003448
3449exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003450 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003451 psa_destroy_key( key );
Gilles Peskine20035e32018-02-03 22:44:14 +01003452 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003453 PSA_DONE( );
Gilles Peskine20035e32018-02-03 22:44:14 +01003454}
3455/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03003456
3457/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003458void sign_verify_hash( int key_type_arg, data_t *key_data,
3459 int alg_arg, data_t *input_data )
Gilles Peskine9911b022018-06-29 17:30:48 +02003460{
Ronald Cron5425a212020-08-04 14:58:35 +02003461 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003462 psa_key_type_t key_type = key_type_arg;
3463 psa_algorithm_t alg = alg_arg;
3464 size_t key_bits;
3465 unsigned char *signature = NULL;
3466 size_t signature_size;
3467 size_t signature_length = 0xdeadbeef;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003468 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003469
Gilles Peskine8817f612018-12-18 00:18:46 +01003470 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003471
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003472 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003473 psa_set_key_algorithm( &attributes, alg );
3474 psa_set_key_type( &attributes, key_type );
Gilles Peskine9911b022018-06-29 17:30:48 +02003475
Gilles Peskine049c7532019-05-15 20:22:09 +02003476 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003477 &key ) );
3478 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003479 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine9911b022018-06-29 17:30:48 +02003480
3481 /* Allocate a buffer which has the size advertized by the
3482 * library. */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003483 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type,
Gilles Peskine9911b022018-06-29 17:30:48 +02003484 key_bits, alg );
3485 TEST_ASSERT( signature_size != 0 );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003486 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003487 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine9911b022018-06-29 17:30:48 +02003488
3489 /* Perform the signature. */
Ronald Cron5425a212020-08-04 14:58:35 +02003490 PSA_ASSERT( psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003491 input_data->x, input_data->len,
3492 signature, signature_size,
3493 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003494 /* Check that the signature length looks sensible. */
3495 TEST_ASSERT( signature_length <= signature_size );
3496 TEST_ASSERT( signature_length > 0 );
3497
3498 /* Use the library to verify that the signature is correct. */
Ronald Cron5425a212020-08-04 14:58:35 +02003499 PSA_ASSERT( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003500 input_data->x, input_data->len,
3501 signature, signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003502
3503 if( input_data->len != 0 )
3504 {
3505 /* Flip a bit in the input and verify that the signature is now
3506 * detected as invalid. Flip a bit at the beginning, not at the end,
3507 * because ECDSA may ignore the last few bits of the input. */
3508 input_data->x[0] ^= 1;
Ronald Cron5425a212020-08-04 14:58:35 +02003509 TEST_EQUAL( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003510 input_data->x, input_data->len,
3511 signature, signature_length ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003512 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine9911b022018-06-29 17:30:48 +02003513 }
3514
3515exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003516 /*
3517 * Key attributes may have been returned by psa_get_key_attributes()
3518 * thus reset them as required.
3519 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003520 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003521
Ronald Cron5425a212020-08-04 14:58:35 +02003522 psa_destroy_key( key );
Gilles Peskine9911b022018-06-29 17:30:48 +02003523 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003524 PSA_DONE( );
Gilles Peskine9911b022018-06-29 17:30:48 +02003525}
3526/* END_CASE */
3527
3528/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003529void verify_hash( int key_type_arg, data_t *key_data,
3530 int alg_arg, data_t *hash_data,
3531 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03003532{
Ronald Cron5425a212020-08-04 14:58:35 +02003533 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003534 psa_key_type_t key_type = key_type_arg;
3535 psa_algorithm_t alg = alg_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003536 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003537
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003538 TEST_ASSERT( signature_data->len <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine69c12672018-06-28 00:07:19 +02003539
Gilles Peskine8817f612018-12-18 00:18:46 +01003540 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir5c753392018-05-08 11:18:38 +03003541
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003542 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003543 psa_set_key_algorithm( &attributes, alg );
3544 psa_set_key_type( &attributes, key_type );
itayzafrir5c753392018-05-08 11:18:38 +03003545
Gilles Peskine049c7532019-05-15 20:22:09 +02003546 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003547 &key ) );
itayzafrir5c753392018-05-08 11:18:38 +03003548
Ronald Cron5425a212020-08-04 14:58:35 +02003549 PSA_ASSERT( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003550 hash_data->x, hash_data->len,
3551 signature_data->x, signature_data->len ) );
Gilles Peskine0627f982019-11-26 19:12:16 +01003552
itayzafrir5c753392018-05-08 11:18:38 +03003553exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003554 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003555 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003556 PSA_DONE( );
itayzafrir5c753392018-05-08 11:18:38 +03003557}
3558/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003559
3560/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003561void verify_hash_fail( int key_type_arg, data_t *key_data,
3562 int alg_arg, data_t *hash_data,
3563 data_t *signature_data,
3564 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003565{
Ronald Cron5425a212020-08-04 14:58:35 +02003566 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003567 psa_key_type_t key_type = key_type_arg;
3568 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003569 psa_status_t actual_status;
3570 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003571 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003572
Gilles Peskine8817f612018-12-18 00:18:46 +01003573 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003574
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003575 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003576 psa_set_key_algorithm( &attributes, alg );
3577 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003578
Gilles Peskine049c7532019-05-15 20:22:09 +02003579 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003580 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003581
Ronald Cron5425a212020-08-04 14:58:35 +02003582 actual_status = psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003583 hash_data->x, hash_data->len,
3584 signature_data->x, signature_data->len );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003585 TEST_EQUAL( actual_status, expected_status );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003586
3587exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003588 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003589 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003590 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003591}
3592/* END_CASE */
3593
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003594/* BEGIN_CASE */
gabor-mezei-arm53028482021-04-15 18:19:50 +02003595void sign_message_deterministic( int key_type_arg,
3596 data_t *key_data,
3597 int alg_arg,
3598 data_t *input_data,
3599 data_t *output_data )
3600{
3601 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3602 psa_key_type_t key_type = key_type_arg;
3603 psa_algorithm_t alg = alg_arg;
3604 size_t key_bits;
3605 unsigned char *signature = NULL;
3606 size_t signature_size;
3607 size_t signature_length = 0xdeadbeef;
3608 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3609
3610 PSA_ASSERT( psa_crypto_init( ) );
3611
3612 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
3613 psa_set_key_algorithm( &attributes, alg );
3614 psa_set_key_type( &attributes, key_type );
3615
3616 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3617 &key ) );
3618 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3619 key_bits = psa_get_key_bits( &attributes );
3620
3621 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
3622 TEST_ASSERT( signature_size != 0 );
3623 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
3624 ASSERT_ALLOC( signature, signature_size );
3625
3626 PSA_ASSERT( psa_sign_message( key, alg,
3627 input_data->x, input_data->len,
3628 signature, signature_size,
3629 &signature_length ) );
3630
3631 ASSERT_COMPARE( output_data->x, output_data->len,
3632 signature, signature_length );
3633
3634exit:
3635 psa_reset_key_attributes( &attributes );
3636
3637 psa_destroy_key( key );
3638 mbedtls_free( signature );
3639 PSA_DONE( );
3640
3641}
3642/* END_CASE */
3643
3644/* BEGIN_CASE */
3645void sign_message_fail( int key_type_arg,
3646 data_t *key_data,
3647 int alg_arg,
3648 data_t *input_data,
3649 int signature_size_arg,
3650 int expected_status_arg )
3651{
3652 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3653 psa_key_type_t key_type = key_type_arg;
3654 psa_algorithm_t alg = alg_arg;
3655 size_t signature_size = signature_size_arg;
3656 psa_status_t actual_status;
3657 psa_status_t expected_status = expected_status_arg;
3658 unsigned char *signature = NULL;
3659 size_t signature_length = 0xdeadbeef;
3660 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3661
3662 ASSERT_ALLOC( signature, signature_size );
3663
3664 PSA_ASSERT( psa_crypto_init( ) );
3665
3666 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
3667 psa_set_key_algorithm( &attributes, alg );
3668 psa_set_key_type( &attributes, key_type );
3669
3670 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3671 &key ) );
3672
3673 actual_status = psa_sign_message( key, alg,
3674 input_data->x, input_data->len,
3675 signature, signature_size,
3676 &signature_length );
3677 TEST_EQUAL( actual_status, expected_status );
3678 /* The value of *signature_length is unspecified on error, but
3679 * whatever it is, it should be less than signature_size, so that
3680 * if the caller tries to read *signature_length bytes without
3681 * checking the error code then they don't overflow a buffer. */
3682 TEST_ASSERT( signature_length <= signature_size );
3683
3684exit:
3685 psa_reset_key_attributes( &attributes );
3686 psa_destroy_key( key );
3687 mbedtls_free( signature );
3688 PSA_DONE( );
3689}
3690/* END_CASE */
3691
3692/* BEGIN_CASE */
3693void sign_verify_message( int key_type_arg,
3694 data_t *key_data,
3695 int alg_arg,
3696 data_t *input_data )
3697{
3698 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3699 psa_key_type_t key_type = key_type_arg;
3700 psa_algorithm_t alg = alg_arg;
3701 size_t key_bits;
3702 unsigned char *signature = NULL;
3703 size_t signature_size;
3704 size_t signature_length = 0xdeadbeef;
3705 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3706
3707 PSA_ASSERT( psa_crypto_init( ) );
3708
3709 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE |
3710 PSA_KEY_USAGE_VERIFY_MESSAGE );
3711 psa_set_key_algorithm( &attributes, alg );
3712 psa_set_key_type( &attributes, key_type );
3713
3714 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3715 &key ) );
3716 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3717 key_bits = psa_get_key_bits( &attributes );
3718
3719 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
3720 TEST_ASSERT( signature_size != 0 );
3721 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
3722 ASSERT_ALLOC( signature, signature_size );
3723
3724 PSA_ASSERT( psa_sign_message( key, alg,
3725 input_data->x, input_data->len,
3726 signature, signature_size,
3727 &signature_length ) );
3728 TEST_ASSERT( signature_length <= signature_size );
3729 TEST_ASSERT( signature_length > 0 );
3730
3731 PSA_ASSERT( psa_verify_message( key, alg,
3732 input_data->x, input_data->len,
3733 signature, signature_length ) );
3734
3735 if( input_data->len != 0 )
3736 {
3737 /* Flip a bit in the input and verify that the signature is now
3738 * detected as invalid. Flip a bit at the beginning, not at the end,
3739 * because ECDSA may ignore the last few bits of the input. */
3740 input_data->x[0] ^= 1;
3741 TEST_EQUAL( psa_verify_message( key, alg,
3742 input_data->x, input_data->len,
3743 signature, signature_length ),
3744 PSA_ERROR_INVALID_SIGNATURE );
3745 }
3746
3747exit:
3748 psa_reset_key_attributes( &attributes );
3749
3750 psa_destroy_key( key );
3751 mbedtls_free( signature );
3752 PSA_DONE( );
3753}
3754/* END_CASE */
3755
3756/* BEGIN_CASE */
3757void verify_message( int key_type_arg,
3758 data_t *key_data,
3759 int alg_arg,
3760 data_t *input_data,
3761 data_t *signature_data )
3762{
3763 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3764 psa_key_type_t key_type = key_type_arg;
3765 psa_algorithm_t alg = alg_arg;
3766 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3767
3768 TEST_ASSERT( signature_data->len <= PSA_SIGNATURE_MAX_SIZE );
3769
3770 PSA_ASSERT( psa_crypto_init( ) );
3771
3772 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_MESSAGE );
3773 psa_set_key_algorithm( &attributes, alg );
3774 psa_set_key_type( &attributes, key_type );
3775
3776 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3777 &key ) );
3778
3779 PSA_ASSERT( psa_verify_message( key, alg,
3780 input_data->x, input_data->len,
3781 signature_data->x, signature_data->len ) );
3782
3783exit:
3784 psa_reset_key_attributes( &attributes );
3785 psa_destroy_key( key );
3786 PSA_DONE( );
3787}
3788/* END_CASE */
3789
3790/* BEGIN_CASE */
3791void verify_message_fail( int key_type_arg,
3792 data_t *key_data,
3793 int alg_arg,
3794 data_t *hash_data,
3795 data_t *signature_data,
3796 int expected_status_arg )
3797{
3798 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3799 psa_key_type_t key_type = key_type_arg;
3800 psa_algorithm_t alg = alg_arg;
3801 psa_status_t actual_status;
3802 psa_status_t expected_status = expected_status_arg;
3803 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3804
3805 PSA_ASSERT( psa_crypto_init( ) );
3806
3807 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_MESSAGE );
3808 psa_set_key_algorithm( &attributes, alg );
3809 psa_set_key_type( &attributes, key_type );
3810
3811 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3812 &key ) );
3813
3814 actual_status = psa_verify_message( key, alg,
3815 hash_data->x, hash_data->len,
3816 signature_data->x,
3817 signature_data->len );
3818 TEST_EQUAL( actual_status, expected_status );
3819
3820exit:
3821 psa_reset_key_attributes( &attributes );
3822 psa_destroy_key( key );
3823 PSA_DONE( );
3824}
3825/* END_CASE */
3826
3827/* BEGIN_CASE */
Gilles Peskine656896e2018-06-29 19:12:28 +02003828void asymmetric_encrypt( int key_type_arg,
3829 data_t *key_data,
3830 int alg_arg,
3831 data_t *input_data,
Gilles Peskine68428122018-06-30 18:42:41 +02003832 data_t *label,
Gilles Peskine656896e2018-06-29 19:12:28 +02003833 int expected_output_length_arg,
3834 int expected_status_arg )
3835{
Ronald Cron5425a212020-08-04 14:58:35 +02003836 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003837 psa_key_type_t key_type = key_type_arg;
3838 psa_algorithm_t alg = alg_arg;
3839 size_t expected_output_length = expected_output_length_arg;
3840 size_t key_bits;
3841 unsigned char *output = NULL;
3842 size_t output_size;
3843 size_t output_length = ~0;
3844 psa_status_t actual_status;
3845 psa_status_t expected_status = expected_status_arg;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003846 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003847
Gilles Peskine8817f612018-12-18 00:18:46 +01003848 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003849
Gilles Peskine656896e2018-06-29 19:12:28 +02003850 /* Import the key */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003851 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3852 psa_set_key_algorithm( &attributes, alg );
3853 psa_set_key_type( &attributes, key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02003854 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003855 &key ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003856
3857 /* Determine the maximum output length */
Ronald Cron5425a212020-08-04 14:58:35 +02003858 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003859 key_bits = psa_get_key_bits( &attributes );
gabor-mezei-armceface22021-01-21 12:26:17 +01003860
Gilles Peskine656896e2018-06-29 19:12:28 +02003861 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
gabor-mezei-armceface22021-01-21 12:26:17 +01003862 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003863 ASSERT_ALLOC( output, output_size );
Gilles Peskine656896e2018-06-29 19:12:28 +02003864
3865 /* Encrypt the input */
Ronald Cron5425a212020-08-04 14:58:35 +02003866 actual_status = psa_asymmetric_encrypt( key, alg,
Gilles Peskine656896e2018-06-29 19:12:28 +02003867 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003868 label->x, label->len,
Gilles Peskine656896e2018-06-29 19:12:28 +02003869 output, output_size,
3870 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003871 TEST_EQUAL( actual_status, expected_status );
3872 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine656896e2018-06-29 19:12:28 +02003873
Gilles Peskine68428122018-06-30 18:42:41 +02003874 /* If the label is empty, the test framework puts a non-null pointer
3875 * in label->x. Test that a null pointer works as well. */
3876 if( label->len == 0 )
3877 {
3878 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003879 if( output_size != 0 )
3880 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02003881 actual_status = psa_asymmetric_encrypt( key, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02003882 input_data->x, input_data->len,
3883 NULL, label->len,
3884 output, output_size,
3885 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003886 TEST_EQUAL( actual_status, expected_status );
3887 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003888 }
3889
Gilles Peskine656896e2018-06-29 19:12:28 +02003890exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003891 /*
3892 * Key attributes may have been returned by psa_get_key_attributes()
3893 * thus reset them as required.
3894 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003895 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003896
Ronald Cron5425a212020-08-04 14:58:35 +02003897 psa_destroy_key( key );
Gilles Peskine656896e2018-06-29 19:12:28 +02003898 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003899 PSA_DONE( );
Gilles Peskine656896e2018-06-29 19:12:28 +02003900}
3901/* END_CASE */
3902
3903/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003904void asymmetric_encrypt_decrypt( int key_type_arg,
3905 data_t *key_data,
3906 int alg_arg,
3907 data_t *input_data,
3908 data_t *label )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003909{
Ronald Cron5425a212020-08-04 14:58:35 +02003910 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003911 psa_key_type_t key_type = key_type_arg;
3912 psa_algorithm_t alg = alg_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003913 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003914 unsigned char *output = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003915 size_t output_size;
3916 size_t output_length = ~0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003917 unsigned char *output2 = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003918 size_t output2_size;
3919 size_t output2_length = ~0;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003920 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003921
Gilles Peskine8817f612018-12-18 00:18:46 +01003922 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003923
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003924 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3925 psa_set_key_algorithm( &attributes, alg );
3926 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003927
Gilles Peskine049c7532019-05-15 20:22:09 +02003928 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003929 &key ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003930
3931 /* Determine the maximum ciphertext length */
Ronald Cron5425a212020-08-04 14:58:35 +02003932 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003933 key_bits = psa_get_key_bits( &attributes );
gabor-mezei-armceface22021-01-21 12:26:17 +01003934
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003935 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
gabor-mezei-armceface22021-01-21 12:26:17 +01003936 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003937 ASSERT_ALLOC( output, output_size );
gabor-mezei-armceface22021-01-21 12:26:17 +01003938
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003939 output2_size = input_data->len;
gabor-mezei-armceface22021-01-21 12:26:17 +01003940 TEST_ASSERT( output2_size <=
3941 PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE( key_type, key_bits, alg ) );
3942 TEST_ASSERT( output2_size <= PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003943 ASSERT_ALLOC( output2, output2_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003944
Gilles Peskineeebd7382018-06-08 18:11:54 +02003945 /* We test encryption by checking that encrypt-then-decrypt gives back
3946 * the original plaintext because of the non-optional random
3947 * part of encryption process which prevents using fixed vectors. */
Ronald Cron5425a212020-08-04 14:58:35 +02003948 PSA_ASSERT( psa_asymmetric_encrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01003949 input_data->x, input_data->len,
3950 label->x, label->len,
3951 output, output_size,
3952 &output_length ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003953 /* We don't know what ciphertext length to expect, but check that
3954 * it looks sensible. */
3955 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003956
Ronald Cron5425a212020-08-04 14:58:35 +02003957 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01003958 output, output_length,
3959 label->x, label->len,
3960 output2, output2_size,
3961 &output2_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003962 ASSERT_COMPARE( input_data->x, input_data->len,
3963 output2, output2_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003964
3965exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003966 /*
3967 * Key attributes may have been returned by psa_get_key_attributes()
3968 * thus reset them as required.
3969 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003970 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003971
Ronald Cron5425a212020-08-04 14:58:35 +02003972 psa_destroy_key( key );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003973 mbedtls_free( output );
3974 mbedtls_free( output2 );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003975 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003976}
3977/* END_CASE */
3978
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003979/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003980void asymmetric_decrypt( int key_type_arg,
3981 data_t *key_data,
3982 int alg_arg,
3983 data_t *input_data,
3984 data_t *label,
Gilles Peskine66763a02018-06-29 21:54:10 +02003985 data_t *expected_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003986{
Ronald Cron5425a212020-08-04 14:58:35 +02003987 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003988 psa_key_type_t key_type = key_type_arg;
3989 psa_algorithm_t alg = alg_arg;
gabor-mezei-armceface22021-01-21 12:26:17 +01003990 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003991 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03003992 size_t output_size = 0;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003993 size_t output_length = ~0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003994 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003995
Gilles Peskine8817f612018-12-18 00:18:46 +01003996 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003997
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003998 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3999 psa_set_key_algorithm( &attributes, alg );
4000 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03004001
Gilles Peskine049c7532019-05-15 20:22:09 +02004002 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004003 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004004
gabor-mezei-armceface22021-01-21 12:26:17 +01004005 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
4006 key_bits = psa_get_key_bits( &attributes );
4007
4008 /* Determine the maximum ciphertext length */
4009 output_size = PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
4010 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE );
4011 ASSERT_ALLOC( output, output_size );
4012
Ronald Cron5425a212020-08-04 14:58:35 +02004013 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01004014 input_data->x, input_data->len,
4015 label->x, label->len,
4016 output,
4017 output_size,
4018 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02004019 ASSERT_COMPARE( expected_data->x, expected_data->len,
4020 output, output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004021
Gilles Peskine68428122018-06-30 18:42:41 +02004022 /* If the label is empty, the test framework puts a non-null pointer
4023 * in label->x. Test that a null pointer works as well. */
4024 if( label->len == 0 )
4025 {
4026 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004027 if( output_size != 0 )
4028 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02004029 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01004030 input_data->x, input_data->len,
4031 NULL, label->len,
4032 output,
4033 output_size,
4034 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02004035 ASSERT_COMPARE( expected_data->x, expected_data->len,
4036 output, output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02004037 }
4038
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004039exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004040 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02004041 psa_destroy_key( key );
itayzafrir3e02b3b2018-06-12 17:06:52 +03004042 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004043 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004044}
4045/* END_CASE */
4046
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004047/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02004048void asymmetric_decrypt_fail( int key_type_arg,
4049 data_t *key_data,
4050 int alg_arg,
4051 data_t *input_data,
4052 data_t *label,
Jaeden Amerof8daab72019-02-06 12:57:46 +00004053 int output_size_arg,
Gilles Peskine2d277862018-06-18 15:41:12 +02004054 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004055{
Ronald Cron5425a212020-08-04 14:58:35 +02004056 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004057 psa_key_type_t key_type = key_type_arg;
4058 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004059 unsigned char *output = NULL;
Jaeden Amerof8daab72019-02-06 12:57:46 +00004060 size_t output_size = output_size_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004061 size_t output_length = ~0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004062 psa_status_t actual_status;
4063 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004064 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004065
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004066 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02004067
Gilles Peskine8817f612018-12-18 00:18:46 +01004068 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004069
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004070 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
4071 psa_set_key_algorithm( &attributes, alg );
4072 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03004073
Gilles Peskine049c7532019-05-15 20:22:09 +02004074 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004075 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004076
Ronald Cron5425a212020-08-04 14:58:35 +02004077 actual_status = psa_asymmetric_decrypt( key, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02004078 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02004079 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02004080 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02004081 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004082 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004083 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004084
Gilles Peskine68428122018-06-30 18:42:41 +02004085 /* If the label is empty, the test framework puts a non-null pointer
4086 * in label->x. Test that a null pointer works as well. */
4087 if( label->len == 0 )
4088 {
4089 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004090 if( output_size != 0 )
4091 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02004092 actual_status = psa_asymmetric_decrypt( key, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02004093 input_data->x, input_data->len,
4094 NULL, label->len,
4095 output, output_size,
4096 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004097 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02004098 TEST_ASSERT( output_length <= output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02004099 }
4100
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004101exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004102 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02004103 psa_destroy_key( key );
Gilles Peskine2d277862018-06-18 15:41:12 +02004104 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004105 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03004106}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02004107/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02004108
4109/* BEGIN_CASE */
Gilles Peskinecbe66502019-05-16 16:59:18 +02004110void key_derivation_init( )
Jaeden Amerod94d6712019-01-04 14:11:48 +00004111{
4112 /* Test each valid way of initializing the object, except for `= {0}`, as
4113 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
4114 * though it's OK by the C standard. We could test for this, but we'd need
4115 * to supress the Clang warning for the test. */
Jaeden Amero5229bbb2019-02-07 16:33:37 +00004116 size_t capacity;
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004117 psa_key_derivation_operation_t func = psa_key_derivation_operation_init( );
4118 psa_key_derivation_operation_t init = PSA_KEY_DERIVATION_OPERATION_INIT;
4119 psa_key_derivation_operation_t zero;
Jaeden Amerod94d6712019-01-04 14:11:48 +00004120
4121 memset( &zero, 0, sizeof( zero ) );
4122
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004123 /* A default operation should not be able to report its capacity. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004124 TEST_EQUAL( psa_key_derivation_get_capacity( &func, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004125 PSA_ERROR_BAD_STATE );
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004126 TEST_EQUAL( psa_key_derivation_get_capacity( &init, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004127 PSA_ERROR_BAD_STATE );
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004128 TEST_EQUAL( psa_key_derivation_get_capacity( &zero, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004129 PSA_ERROR_BAD_STATE );
Jaeden Amero5229bbb2019-02-07 16:33:37 +00004130
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004131 /* A default operation should be abortable without error. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004132 PSA_ASSERT( psa_key_derivation_abort(&func) );
4133 PSA_ASSERT( psa_key_derivation_abort(&init) );
4134 PSA_ASSERT( psa_key_derivation_abort(&zero) );
Jaeden Amerod94d6712019-01-04 14:11:48 +00004135}
4136/* END_CASE */
4137
Janos Follath16de4a42019-06-13 16:32:24 +01004138/* BEGIN_CASE */
4139void derive_setup( int alg_arg, int expected_status_arg )
Gilles Peskineea0fb492018-07-12 17:17:20 +02004140{
Gilles Peskineea0fb492018-07-12 17:17:20 +02004141 psa_algorithm_t alg = alg_arg;
Gilles Peskineea0fb492018-07-12 17:17:20 +02004142 psa_status_t expected_status = expected_status_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004143 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02004144
Gilles Peskine8817f612018-12-18 00:18:46 +01004145 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004146
Janos Follath16de4a42019-06-13 16:32:24 +01004147 TEST_EQUAL( psa_key_derivation_setup( &operation, alg ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004148 expected_status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004149
4150exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004151 psa_key_derivation_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004152 PSA_DONE( );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004153}
4154/* END_CASE */
4155
Janos Follathaf3c2a02019-06-12 12:34:34 +01004156/* BEGIN_CASE */
Janos Follatha27c9272019-06-14 09:59:36 +01004157void derive_set_capacity( int alg_arg, int capacity_arg,
4158 int expected_status_arg )
4159{
4160 psa_algorithm_t alg = alg_arg;
4161 size_t capacity = capacity_arg;
4162 psa_status_t expected_status = expected_status_arg;
4163 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4164
4165 PSA_ASSERT( psa_crypto_init( ) );
4166
4167 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4168
4169 TEST_EQUAL( psa_key_derivation_set_capacity( &operation, capacity ),
4170 expected_status );
4171
4172exit:
4173 psa_key_derivation_abort( &operation );
4174 PSA_DONE( );
4175}
4176/* END_CASE */
4177
4178/* BEGIN_CASE */
Janos Follathaf3c2a02019-06-12 12:34:34 +01004179void derive_input( int alg_arg,
Gilles Peskine6842ba42019-09-23 13:49:33 +02004180 int step_arg1, int key_type_arg1, data_t *input1,
Janos Follathaf3c2a02019-06-12 12:34:34 +01004181 int expected_status_arg1,
Gilles Peskine2058c072019-09-24 17:19:33 +02004182 int step_arg2, int key_type_arg2, data_t *input2,
Janos Follathaf3c2a02019-06-12 12:34:34 +01004183 int expected_status_arg2,
Gilles Peskine2058c072019-09-24 17:19:33 +02004184 int step_arg3, int key_type_arg3, data_t *input3,
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004185 int expected_status_arg3,
4186 int output_key_type_arg, int expected_output_status_arg )
Janos Follathaf3c2a02019-06-12 12:34:34 +01004187{
4188 psa_algorithm_t alg = alg_arg;
Gilles Peskine6842ba42019-09-23 13:49:33 +02004189 psa_key_derivation_step_t steps[] = {step_arg1, step_arg2, step_arg3};
4190 psa_key_type_t key_types[] = {key_type_arg1, key_type_arg2, key_type_arg3};
Janos Follathaf3c2a02019-06-12 12:34:34 +01004191 psa_status_t expected_statuses[] = {expected_status_arg1,
4192 expected_status_arg2,
4193 expected_status_arg3};
4194 data_t *inputs[] = {input1, input2, input3};
Ronald Cron5425a212020-08-04 14:58:35 +02004195 mbedtls_svc_key_id_t keys[] = { MBEDTLS_SVC_KEY_ID_INIT,
4196 MBEDTLS_SVC_KEY_ID_INIT,
4197 MBEDTLS_SVC_KEY_ID_INIT };
Janos Follathaf3c2a02019-06-12 12:34:34 +01004198 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4199 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4200 size_t i;
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004201 psa_key_type_t output_key_type = output_key_type_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02004202 mbedtls_svc_key_id_t output_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004203 psa_status_t expected_output_status = expected_output_status_arg;
4204 psa_status_t actual_output_status;
Janos Follathaf3c2a02019-06-12 12:34:34 +01004205
4206 PSA_ASSERT( psa_crypto_init( ) );
4207
4208 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4209 psa_set_key_algorithm( &attributes, alg );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004210
4211 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4212
4213 for( i = 0; i < ARRAY_LENGTH( steps ); i++ )
4214 {
Gilles Peskine4023c012021-05-27 13:21:20 +02004215 mbedtls_test_set_step( i );
4216 if( steps[i] == 0 )
4217 {
4218 /* Skip this step */
4219 }
4220 else if( key_types[i] != PSA_KEY_TYPE_NONE )
Janos Follathaf3c2a02019-06-12 12:34:34 +01004221 {
Gilles Peskine6842ba42019-09-23 13:49:33 +02004222 psa_set_key_type( &attributes, key_types[i] );
4223 PSA_ASSERT( psa_import_key( &attributes,
4224 inputs[i]->x, inputs[i]->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004225 &keys[i] ) );
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004226 if( PSA_KEY_TYPE_IS_KEY_PAIR( key_types[i] ) &&
4227 steps[i] == PSA_KEY_DERIVATION_INPUT_SECRET )
4228 {
4229 // When taking a private key as secret input, use key agreement
4230 // to add the shared secret to the derivation
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004231 TEST_EQUAL( mbedtls_test_psa_key_agreement_with_self(
4232 &operation, keys[i] ),
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004233 expected_statuses[i] );
4234 }
4235 else
4236 {
4237 TEST_EQUAL( psa_key_derivation_input_key( &operation, steps[i],
Ronald Cron5425a212020-08-04 14:58:35 +02004238 keys[i] ),
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004239 expected_statuses[i] );
4240 }
Gilles Peskine6842ba42019-09-23 13:49:33 +02004241 }
4242 else
4243 {
4244 TEST_EQUAL( psa_key_derivation_input_bytes(
4245 &operation, steps[i],
4246 inputs[i]->x, inputs[i]->len ),
4247 expected_statuses[i] );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004248 }
4249 }
4250
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004251 if( output_key_type != PSA_KEY_TYPE_NONE )
4252 {
4253 psa_reset_key_attributes( &attributes );
4254 psa_set_key_type( &attributes, PSA_KEY_TYPE_RAW_DATA );
4255 psa_set_key_bits( &attributes, 8 );
4256 actual_output_status =
4257 psa_key_derivation_output_key( &attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004258 &output_key );
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004259 }
4260 else
4261 {
4262 uint8_t buffer[1];
4263 actual_output_status =
4264 psa_key_derivation_output_bytes( &operation,
4265 buffer, sizeof( buffer ) );
4266 }
4267 TEST_EQUAL( actual_output_status, expected_output_status );
4268
Janos Follathaf3c2a02019-06-12 12:34:34 +01004269exit:
4270 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004271 for( i = 0; i < ARRAY_LENGTH( keys ); i++ )
4272 psa_destroy_key( keys[i] );
4273 psa_destroy_key( output_key );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004274 PSA_DONE( );
4275}
4276/* END_CASE */
4277
Janos Follathd958bb72019-07-03 15:02:16 +01004278/* BEGIN_CASE */
Gilles Peskine1c77edd2021-05-27 11:55:02 +02004279void derive_over_capacity( int alg_arg )
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004280{
Janos Follathd958bb72019-07-03 15:02:16 +01004281 psa_algorithm_t alg = alg_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02004282 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein4eda37b2018-10-31 12:15:58 +02004283 size_t key_type = PSA_KEY_TYPE_DERIVE;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004284 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Janos Follathd958bb72019-07-03 15:02:16 +01004285 unsigned char input1[] = "Input 1";
4286 size_t input1_length = sizeof( input1 );
4287 unsigned char input2[] = "Input 2";
4288 size_t input2_length = sizeof( input2 );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004289 uint8_t buffer[42];
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02004290 size_t capacity = sizeof( buffer );
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02004291 const uint8_t key_data[22] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
4292 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
4293 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004294 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004295
Gilles Peskine8817f612018-12-18 00:18:46 +01004296 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004297
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004298 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4299 psa_set_key_algorithm( &attributes, alg );
4300 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004301
Gilles Peskine73676cb2019-05-15 20:15:10 +02004302 PSA_ASSERT( psa_import_key( &attributes,
4303 key_data, sizeof( key_data ),
Ronald Cron5425a212020-08-04 14:58:35 +02004304 &key ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004305
4306 /* valid key derivation */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004307 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, key, alg,
4308 input1, input1_length,
4309 input2, input2_length,
4310 capacity ) )
Janos Follathd958bb72019-07-03 15:02:16 +01004311 goto exit;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004312
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004313 /* state of operation shouldn't allow additional generation */
Janos Follathd958bb72019-07-03 15:02:16 +01004314 TEST_EQUAL( psa_key_derivation_setup( &operation, alg ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004315 PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004316
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004317 PSA_ASSERT( psa_key_derivation_output_bytes( &operation, buffer, capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004318
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004319 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, buffer, capacity ),
David Saadab4ecc272019-02-14 13:48:10 +02004320 PSA_ERROR_INSUFFICIENT_DATA );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004321
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004322exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004323 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004324 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004325 PSA_DONE( );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004326}
4327/* END_CASE */
4328
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004329/* BEGIN_CASE */
Gilles Peskine1c77edd2021-05-27 11:55:02 +02004330void derive_actions_without_setup( )
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004331{
4332 uint8_t output_buffer[16];
4333 size_t buffer_size = 16;
4334 size_t capacity = 0;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004335 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004336
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004337 TEST_ASSERT( psa_key_derivation_output_bytes( &operation,
4338 output_buffer, buffer_size )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004339 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004340
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004341 TEST_ASSERT( psa_key_derivation_get_capacity( &operation, &capacity )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004342 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004343
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004344 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004345
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004346 TEST_ASSERT( psa_key_derivation_output_bytes( &operation,
4347 output_buffer, buffer_size )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004348 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004349
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004350 TEST_ASSERT( psa_key_derivation_get_capacity( &operation, &capacity )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004351 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004352
4353exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004354 psa_key_derivation_abort( &operation );
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004355}
4356/* END_CASE */
4357
4358/* BEGIN_CASE */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004359void derive_output( int alg_arg,
Gilles Peskine1468da72019-05-29 17:35:49 +02004360 int step1_arg, data_t *input1,
4361 int step2_arg, data_t *input2,
4362 int step3_arg, data_t *input3,
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004363 int requested_capacity_arg,
4364 data_t *expected_output1,
4365 data_t *expected_output2 )
4366{
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004367 psa_algorithm_t alg = alg_arg;
Gilles Peskine1468da72019-05-29 17:35:49 +02004368 psa_key_derivation_step_t steps[] = {step1_arg, step2_arg, step3_arg};
4369 data_t *inputs[] = {input1, input2, input3};
Ronald Cron5425a212020-08-04 14:58:35 +02004370 mbedtls_svc_key_id_t keys[] = { MBEDTLS_SVC_KEY_ID_INIT,
4371 MBEDTLS_SVC_KEY_ID_INIT,
4372 MBEDTLS_SVC_KEY_ID_INIT };
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004373 size_t requested_capacity = requested_capacity_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004374 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004375 uint8_t *expected_outputs[2] =
4376 {expected_output1->x, expected_output2->x};
4377 size_t output_sizes[2] =
4378 {expected_output1->len, expected_output2->len};
4379 size_t output_buffer_size = 0;
4380 uint8_t *output_buffer = NULL;
4381 size_t expected_capacity;
4382 size_t current_capacity;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004383 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004384 psa_status_t status;
Gilles Peskine1468da72019-05-29 17:35:49 +02004385 size_t i;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004386
4387 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4388 {
4389 if( output_sizes[i] > output_buffer_size )
4390 output_buffer_size = output_sizes[i];
4391 if( output_sizes[i] == 0 )
4392 expected_outputs[i] = NULL;
4393 }
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004394 ASSERT_ALLOC( output_buffer, output_buffer_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01004395 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004396
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004397 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4398 psa_set_key_algorithm( &attributes, alg );
4399 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004400
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004401 /* Extraction phase. */
Gilles Peskine1468da72019-05-29 17:35:49 +02004402 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4403 PSA_ASSERT( psa_key_derivation_set_capacity( &operation,
4404 requested_capacity ) );
4405 for( i = 0; i < ARRAY_LENGTH( steps ); i++ )
Gilles Peskineb70a0fd2019-01-07 22:59:38 +01004406 {
Gilles Peskine1468da72019-05-29 17:35:49 +02004407 switch( steps[i] )
4408 {
4409 case 0:
4410 break;
4411 case PSA_KEY_DERIVATION_INPUT_SECRET:
4412 PSA_ASSERT( psa_import_key( &attributes,
4413 inputs[i]->x, inputs[i]->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004414 &keys[i] ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01004415
4416 if ( PSA_ALG_IS_TLS12_PSK_TO_MS( alg ) )
4417 {
4418 PSA_ASSERT( psa_get_key_attributes( keys[i], &attributes ) );
4419 TEST_ASSERT( PSA_BITS_TO_BYTES( psa_get_key_bits( &attributes ) ) <=
4420 PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE );
4421 }
4422
Gilles Peskine1468da72019-05-29 17:35:49 +02004423 PSA_ASSERT( psa_key_derivation_input_key(
Ronald Cron5425a212020-08-04 14:58:35 +02004424 &operation, steps[i], keys[i] ) );
Gilles Peskine1468da72019-05-29 17:35:49 +02004425 break;
4426 default:
4427 PSA_ASSERT( psa_key_derivation_input_bytes(
4428 &operation, steps[i],
4429 inputs[i]->x, inputs[i]->len ) );
4430 break;
4431 }
Gilles Peskineb70a0fd2019-01-07 22:59:38 +01004432 }
Gilles Peskine1468da72019-05-29 17:35:49 +02004433
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004434 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004435 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004436 TEST_EQUAL( current_capacity, requested_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004437 expected_capacity = requested_capacity;
4438
4439 /* Expansion phase. */
4440 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4441 {
4442 /* Read some bytes. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004443 status = psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004444 output_buffer, output_sizes[i] );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004445 if( expected_capacity == 0 && output_sizes[i] == 0 )
4446 {
4447 /* Reading 0 bytes when 0 bytes are available can go either way. */
4448 TEST_ASSERT( status == PSA_SUCCESS ||
David Saadab4ecc272019-02-14 13:48:10 +02004449 status == PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004450 continue;
4451 }
4452 else if( expected_capacity == 0 ||
4453 output_sizes[i] > expected_capacity )
4454 {
4455 /* Capacity exceeded. */
David Saadab4ecc272019-02-14 13:48:10 +02004456 TEST_EQUAL( status, PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004457 expected_capacity = 0;
4458 continue;
4459 }
4460 /* Success. Check the read data. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004461 PSA_ASSERT( status );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004462 if( output_sizes[i] != 0 )
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004463 ASSERT_COMPARE( output_buffer, output_sizes[i],
4464 expected_outputs[i], output_sizes[i] );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004465 /* Check the operation status. */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004466 expected_capacity -= output_sizes[i];
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004467 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004468 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004469 TEST_EQUAL( expected_capacity, current_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004470 }
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004471 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004472
4473exit:
4474 mbedtls_free( output_buffer );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004475 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004476 for( i = 0; i < ARRAY_LENGTH( keys ); i++ )
4477 psa_destroy_key( keys[i] );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004478 PSA_DONE( );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004479}
4480/* END_CASE */
4481
4482/* BEGIN_CASE */
Gilles Peskined54931c2018-07-17 21:06:59 +02004483void derive_full( int alg_arg,
4484 data_t *key_data,
Janos Follath47f27ed2019-06-25 13:24:52 +01004485 data_t *input1,
4486 data_t *input2,
Gilles Peskined54931c2018-07-17 21:06:59 +02004487 int requested_capacity_arg )
4488{
Ronald Cron5425a212020-08-04 14:58:35 +02004489 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004490 psa_algorithm_t alg = alg_arg;
4491 size_t requested_capacity = requested_capacity_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004492 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004493 unsigned char output_buffer[16];
4494 size_t expected_capacity = requested_capacity;
4495 size_t current_capacity;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004496 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004497
Gilles Peskine8817f612018-12-18 00:18:46 +01004498 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004499
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004500 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4501 psa_set_key_algorithm( &attributes, alg );
4502 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskined54931c2018-07-17 21:06:59 +02004503
Gilles Peskine049c7532019-05-15 20:22:09 +02004504 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004505 &key ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004506
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004507 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, key, alg,
4508 input1->x, input1->len,
4509 input2->x, input2->len,
4510 requested_capacity ) )
Janos Follathf2815ea2019-07-03 12:41:36 +01004511 goto exit;
Janos Follath47f27ed2019-06-25 13:24:52 +01004512
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004513 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004514 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004515 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004516
4517 /* Expansion phase. */
4518 while( current_capacity > 0 )
4519 {
4520 size_t read_size = sizeof( output_buffer );
4521 if( read_size > current_capacity )
4522 read_size = current_capacity;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004523 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004524 output_buffer,
4525 read_size ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004526 expected_capacity -= read_size;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004527 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004528 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004529 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004530 }
4531
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004532 /* Check that the operation refuses to go over capacity. */
4533 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, output_buffer, 1 ),
David Saadab4ecc272019-02-14 13:48:10 +02004534 PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskined54931c2018-07-17 21:06:59 +02004535
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004536 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004537
4538exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004539 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004540 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004541 PSA_DONE( );
Gilles Peskined54931c2018-07-17 21:06:59 +02004542}
4543/* END_CASE */
4544
Janos Follathe60c9052019-07-03 13:51:30 +01004545/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02004546void derive_key_exercise( int alg_arg,
4547 data_t *key_data,
Janos Follathe60c9052019-07-03 13:51:30 +01004548 data_t *input1,
4549 data_t *input2,
Gilles Peskine0386fba2018-07-12 17:29:22 +02004550 int derived_type_arg,
4551 int derived_bits_arg,
4552 int derived_usage_arg,
4553 int derived_alg_arg )
4554{
Ronald Cron5425a212020-08-04 14:58:35 +02004555 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4556 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004557 psa_algorithm_t alg = alg_arg;
4558 psa_key_type_t derived_type = derived_type_arg;
4559 size_t derived_bits = derived_bits_arg;
4560 psa_key_usage_t derived_usage = derived_usage_arg;
4561 psa_algorithm_t derived_alg = derived_alg_arg;
4562 size_t capacity = PSA_BITS_TO_BYTES( derived_bits );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004563 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004564 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004565 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004566
Gilles Peskine8817f612018-12-18 00:18:46 +01004567 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004568
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004569 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4570 psa_set_key_algorithm( &attributes, alg );
4571 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02004572 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004573 &base_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004574
4575 /* Derive a key. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004576 if ( mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4577 input1->x, input1->len,
4578 input2->x, input2->len,
4579 capacity ) )
Janos Follathe60c9052019-07-03 13:51:30 +01004580 goto exit;
4581
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004582 psa_set_key_usage_flags( &attributes, derived_usage );
4583 psa_set_key_algorithm( &attributes, derived_alg );
4584 psa_set_key_type( &attributes, derived_type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004585 psa_set_key_bits( &attributes, derived_bits );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004586 PSA_ASSERT( psa_key_derivation_output_key( &attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004587 &derived_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004588
4589 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02004590 PSA_ASSERT( psa_get_key_attributes( derived_key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004591 TEST_EQUAL( psa_get_key_type( &got_attributes ), derived_type );
4592 TEST_EQUAL( psa_get_key_bits( &got_attributes ), derived_bits );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004593
4594 /* Exercise the derived key. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004595 if( ! mbedtls_test_psa_exercise_key( derived_key, derived_usage, derived_alg ) )
Gilles Peskine0386fba2018-07-12 17:29:22 +02004596 goto exit;
4597
4598exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004599 /*
4600 * Key attributes may have been returned by psa_get_key_attributes()
4601 * thus reset them as required.
4602 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004603 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004604
4605 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004606 psa_destroy_key( base_key );
4607 psa_destroy_key( derived_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004608 PSA_DONE( );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004609}
4610/* END_CASE */
4611
Janos Follath42fd8882019-07-03 14:17:09 +01004612/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02004613void derive_key_export( int alg_arg,
4614 data_t *key_data,
Janos Follath42fd8882019-07-03 14:17:09 +01004615 data_t *input1,
4616 data_t *input2,
Gilles Peskine0386fba2018-07-12 17:29:22 +02004617 int bytes1_arg,
4618 int bytes2_arg )
4619{
Ronald Cron5425a212020-08-04 14:58:35 +02004620 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4621 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004622 psa_algorithm_t alg = alg_arg;
4623 size_t bytes1 = bytes1_arg;
4624 size_t bytes2 = bytes2_arg;
4625 size_t capacity = bytes1 + bytes2;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004626 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004627 uint8_t *output_buffer = NULL;
4628 uint8_t *export_buffer = NULL;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004629 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
4630 psa_key_attributes_t derived_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004631 size_t length;
4632
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004633 ASSERT_ALLOC( output_buffer, capacity );
4634 ASSERT_ALLOC( export_buffer, capacity );
Gilles Peskine8817f612018-12-18 00:18:46 +01004635 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004636
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004637 psa_set_key_usage_flags( &base_attributes, PSA_KEY_USAGE_DERIVE );
4638 psa_set_key_algorithm( &base_attributes, alg );
4639 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02004640 PSA_ASSERT( psa_import_key( &base_attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004641 &base_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004642
4643 /* Derive some material and output it. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004644 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4645 input1->x, input1->len,
4646 input2->x, input2->len,
4647 capacity ) )
Janos Follath42fd8882019-07-03 14:17:09 +01004648 goto exit;
4649
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004650 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004651 output_buffer,
4652 capacity ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004653 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004654
4655 /* Derive the same output again, but this time store it in key objects. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004656 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4657 input1->x, input1->len,
4658 input2->x, input2->len,
4659 capacity ) )
Janos Follath42fd8882019-07-03 14:17:09 +01004660 goto exit;
4661
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004662 psa_set_key_usage_flags( &derived_attributes, PSA_KEY_USAGE_EXPORT );
4663 psa_set_key_algorithm( &derived_attributes, 0 );
4664 psa_set_key_type( &derived_attributes, PSA_KEY_TYPE_RAW_DATA );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004665 psa_set_key_bits( &derived_attributes, PSA_BYTES_TO_BITS( bytes1 ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004666 PSA_ASSERT( psa_key_derivation_output_key( &derived_attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004667 &derived_key ) );
4668 PSA_ASSERT( psa_export_key( derived_key,
Gilles Peskine8817f612018-12-18 00:18:46 +01004669 export_buffer, bytes1,
4670 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004671 TEST_EQUAL( length, bytes1 );
Ronald Cron5425a212020-08-04 14:58:35 +02004672 PSA_ASSERT( psa_destroy_key( derived_key ) );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004673 psa_set_key_bits( &derived_attributes, PSA_BYTES_TO_BITS( bytes2 ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004674 PSA_ASSERT( psa_key_derivation_output_key( &derived_attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004675 &derived_key ) );
4676 PSA_ASSERT( psa_export_key( derived_key,
Gilles Peskine8817f612018-12-18 00:18:46 +01004677 export_buffer + bytes1, bytes2,
4678 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004679 TEST_EQUAL( length, bytes2 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004680
4681 /* Compare the outputs from the two runs. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004682 ASSERT_COMPARE( output_buffer, bytes1 + bytes2,
4683 export_buffer, capacity );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004684
4685exit:
4686 mbedtls_free( output_buffer );
4687 mbedtls_free( export_buffer );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004688 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004689 psa_destroy_key( base_key );
4690 psa_destroy_key( derived_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004691 PSA_DONE( );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004692}
4693/* END_CASE */
4694
4695/* BEGIN_CASE */
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004696void derive_key( int alg_arg,
4697 data_t *key_data, data_t *input1, data_t *input2,
4698 int type_arg, int bits_arg,
Steven Cooreman83fdb702021-01-21 14:24:39 +01004699 int expected_status_arg,
4700 int is_large_output )
Gilles Peskinec744d992019-07-30 17:26:54 +02004701{
Ronald Cron5425a212020-08-04 14:58:35 +02004702 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4703 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec744d992019-07-30 17:26:54 +02004704 psa_algorithm_t alg = alg_arg;
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004705 psa_key_type_t type = type_arg;
Gilles Peskinec744d992019-07-30 17:26:54 +02004706 size_t bits = bits_arg;
4707 psa_status_t expected_status = expected_status_arg;
4708 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4709 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
4710 psa_key_attributes_t derived_attributes = PSA_KEY_ATTRIBUTES_INIT;
4711
4712 PSA_ASSERT( psa_crypto_init( ) );
4713
4714 psa_set_key_usage_flags( &base_attributes, PSA_KEY_USAGE_DERIVE );
4715 psa_set_key_algorithm( &base_attributes, alg );
4716 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
4717 PSA_ASSERT( psa_import_key( &base_attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004718 &base_key ) );
Gilles Peskinec744d992019-07-30 17:26:54 +02004719
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004720 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4721 input1->x, input1->len,
4722 input2->x, input2->len,
4723 SIZE_MAX ) )
Gilles Peskinec744d992019-07-30 17:26:54 +02004724 goto exit;
4725
4726 psa_set_key_usage_flags( &derived_attributes, PSA_KEY_USAGE_EXPORT );
4727 psa_set_key_algorithm( &derived_attributes, 0 );
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004728 psa_set_key_type( &derived_attributes, type );
Gilles Peskinec744d992019-07-30 17:26:54 +02004729 psa_set_key_bits( &derived_attributes, bits );
Steven Cooreman83fdb702021-01-21 14:24:39 +01004730
4731 psa_status_t status =
4732 psa_key_derivation_output_key( &derived_attributes,
4733 &operation,
4734 &derived_key );
4735 if( is_large_output > 0 )
4736 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
4737 TEST_EQUAL( status, expected_status );
Gilles Peskinec744d992019-07-30 17:26:54 +02004738
4739exit:
4740 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004741 psa_destroy_key( base_key );
4742 psa_destroy_key( derived_key );
Gilles Peskinec744d992019-07-30 17:26:54 +02004743 PSA_DONE( );
4744}
4745/* END_CASE */
4746
4747/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02004748void key_agreement_setup( int alg_arg,
Steven Cooremance48e852020-10-05 16:02:45 +02004749 int our_key_type_arg, int our_key_alg_arg,
4750 data_t *our_key_data, data_t *peer_key_data,
Gilles Peskine01d718c2018-09-18 12:01:02 +02004751 int expected_status_arg )
4752{
Ronald Cron5425a212020-08-04 14:58:35 +02004753 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004754 psa_algorithm_t alg = alg_arg;
Steven Cooremanfa5e6312020-10-15 17:07:12 +02004755 psa_algorithm_t our_key_alg = our_key_alg_arg;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004756 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004757 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004758 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine77f40d82019-04-11 21:27:06 +02004759 psa_status_t expected_status = expected_status_arg;
4760 psa_status_t status;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004761
Gilles Peskine8817f612018-12-18 00:18:46 +01004762 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004763
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004764 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
Steven Cooremanfa5e6312020-10-15 17:07:12 +02004765 psa_set_key_algorithm( &attributes, our_key_alg );
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004766 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004767 PSA_ASSERT( psa_import_key( &attributes,
4768 our_key_data->x, our_key_data->len,
4769 &our_key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004770
Gilles Peskine77f40d82019-04-11 21:27:06 +02004771 /* The tests currently include inputs that should fail at either step.
4772 * Test cases that fail at the setup step should be changed to call
4773 * key_derivation_setup instead, and this function should be renamed
4774 * to key_agreement_fail. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004775 status = psa_key_derivation_setup( &operation, alg );
Gilles Peskine77f40d82019-04-11 21:27:06 +02004776 if( status == PSA_SUCCESS )
4777 {
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004778 TEST_EQUAL( psa_key_derivation_key_agreement(
4779 &operation, PSA_KEY_DERIVATION_INPUT_SECRET,
4780 our_key,
4781 peer_key_data->x, peer_key_data->len ),
Gilles Peskine77f40d82019-04-11 21:27:06 +02004782 expected_status );
4783 }
4784 else
4785 {
4786 TEST_ASSERT( status == expected_status );
4787 }
Gilles Peskine01d718c2018-09-18 12:01:02 +02004788
4789exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004790 psa_key_derivation_abort( &operation );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004791 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004792 PSA_DONE( );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004793}
4794/* END_CASE */
4795
4796/* BEGIN_CASE */
Gilles Peskinef0cba732019-04-11 22:12:38 +02004797void raw_key_agreement( int alg_arg,
4798 int our_key_type_arg, data_t *our_key_data,
4799 data_t *peer_key_data,
4800 data_t *expected_output )
4801{
Ronald Cron5425a212020-08-04 14:58:35 +02004802 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004803 psa_algorithm_t alg = alg_arg;
4804 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004805 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004806 unsigned char *output = NULL;
4807 size_t output_length = ~0;
gabor-mezei-armceface22021-01-21 12:26:17 +01004808 size_t key_bits;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004809
4810 ASSERT_ALLOC( output, expected_output->len );
4811 PSA_ASSERT( psa_crypto_init( ) );
4812
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004813 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4814 psa_set_key_algorithm( &attributes, alg );
4815 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004816 PSA_ASSERT( psa_import_key( &attributes,
4817 our_key_data->x, our_key_data->len,
4818 &our_key ) );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004819
gabor-mezei-armceface22021-01-21 12:26:17 +01004820 PSA_ASSERT( psa_get_key_attributes( our_key, &attributes ) );
4821 key_bits = psa_get_key_bits( &attributes );
4822
Gilles Peskinebe697d82019-05-16 18:00:41 +02004823 PSA_ASSERT( psa_raw_key_agreement( alg, our_key,
4824 peer_key_data->x, peer_key_data->len,
4825 output, expected_output->len,
4826 &output_length ) );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004827 ASSERT_COMPARE( output, output_length,
4828 expected_output->x, expected_output->len );
gabor-mezei-armceface22021-01-21 12:26:17 +01004829 TEST_ASSERT( output_length <=
4830 PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE( our_key_type, key_bits ) );
4831 TEST_ASSERT( output_length <=
4832 PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004833
4834exit:
4835 mbedtls_free( output );
4836 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004837 PSA_DONE( );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004838}
4839/* END_CASE */
4840
4841/* BEGIN_CASE */
Gilles Peskine59685592018-09-18 12:11:34 +02004842void key_agreement_capacity( int alg_arg,
4843 int our_key_type_arg, data_t *our_key_data,
4844 data_t *peer_key_data,
4845 int expected_capacity_arg )
4846{
Ronald Cron5425a212020-08-04 14:58:35 +02004847 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004848 psa_algorithm_t alg = alg_arg;
4849 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004850 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004851 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004852 size_t actual_capacity;
Gilles Peskinebf491972018-10-25 22:36:12 +02004853 unsigned char output[16];
Gilles Peskine59685592018-09-18 12:11:34 +02004854
Gilles Peskine8817f612018-12-18 00:18:46 +01004855 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004856
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004857 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4858 psa_set_key_algorithm( &attributes, alg );
4859 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004860 PSA_ASSERT( psa_import_key( &attributes,
4861 our_key_data->x, our_key_data->len,
4862 &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004863
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004864 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004865 PSA_ASSERT( psa_key_derivation_key_agreement(
4866 &operation,
4867 PSA_KEY_DERIVATION_INPUT_SECRET, our_key,
4868 peer_key_data->x, peer_key_data->len ) );
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004869 if( PSA_ALG_IS_HKDF( PSA_ALG_KEY_AGREEMENT_GET_KDF( alg ) ) )
4870 {
4871 /* The test data is for info="" */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004872 PSA_ASSERT( psa_key_derivation_input_bytes( &operation,
Gilles Peskine03410b52019-05-16 16:05:19 +02004873 PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004874 NULL, 0 ) );
4875 }
Gilles Peskine59685592018-09-18 12:11:34 +02004876
Gilles Peskinebf491972018-10-25 22:36:12 +02004877 /* Test the advertized capacity. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004878 PSA_ASSERT( psa_key_derivation_get_capacity(
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004879 &operation, &actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004880 TEST_EQUAL( actual_capacity, (size_t) expected_capacity_arg );
Gilles Peskine59685592018-09-18 12:11:34 +02004881
Gilles Peskinebf491972018-10-25 22:36:12 +02004882 /* Test the actual capacity by reading the output. */
4883 while( actual_capacity > sizeof( output ) )
4884 {
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004885 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004886 output, sizeof( output ) ) );
Gilles Peskinebf491972018-10-25 22:36:12 +02004887 actual_capacity -= sizeof( output );
4888 }
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004889 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004890 output, actual_capacity ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004891 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, output, 1 ),
David Saadab4ecc272019-02-14 13:48:10 +02004892 PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskinebf491972018-10-25 22:36:12 +02004893
Gilles Peskine59685592018-09-18 12:11:34 +02004894exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004895 psa_key_derivation_abort( &operation );
Gilles Peskine59685592018-09-18 12:11:34 +02004896 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004897 PSA_DONE( );
Gilles Peskine59685592018-09-18 12:11:34 +02004898}
4899/* END_CASE */
4900
4901/* BEGIN_CASE */
4902void key_agreement_output( int alg_arg,
4903 int our_key_type_arg, data_t *our_key_data,
4904 data_t *peer_key_data,
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004905 data_t *expected_output1, data_t *expected_output2 )
Gilles Peskine59685592018-09-18 12:11:34 +02004906{
Ronald Cron5425a212020-08-04 14:58:35 +02004907 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004908 psa_algorithm_t alg = alg_arg;
4909 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004910 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004911 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004912 uint8_t *actual_output = NULL;
Gilles Peskine59685592018-09-18 12:11:34 +02004913
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004914 ASSERT_ALLOC( actual_output, MAX( expected_output1->len,
4915 expected_output2->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004916
Gilles Peskine8817f612018-12-18 00:18:46 +01004917 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004918
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004919 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4920 psa_set_key_algorithm( &attributes, alg );
4921 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004922 PSA_ASSERT( psa_import_key( &attributes,
4923 our_key_data->x, our_key_data->len,
4924 &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004925
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004926 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004927 PSA_ASSERT( psa_key_derivation_key_agreement(
4928 &operation,
4929 PSA_KEY_DERIVATION_INPUT_SECRET, our_key,
4930 peer_key_data->x, peer_key_data->len ) );
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004931 if( PSA_ALG_IS_HKDF( PSA_ALG_KEY_AGREEMENT_GET_KDF( alg ) ) )
4932 {
4933 /* The test data is for info="" */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004934 PSA_ASSERT( psa_key_derivation_input_bytes( &operation,
Gilles Peskine03410b52019-05-16 16:05:19 +02004935 PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004936 NULL, 0 ) );
4937 }
Gilles Peskine59685592018-09-18 12:11:34 +02004938
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004939 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004940 actual_output,
4941 expected_output1->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004942 ASSERT_COMPARE( actual_output, expected_output1->len,
4943 expected_output1->x, expected_output1->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004944 if( expected_output2->len != 0 )
4945 {
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004946 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004947 actual_output,
4948 expected_output2->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004949 ASSERT_COMPARE( actual_output, expected_output2->len,
4950 expected_output2->x, expected_output2->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004951 }
Gilles Peskine59685592018-09-18 12:11:34 +02004952
4953exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004954 psa_key_derivation_abort( &operation );
Gilles Peskine59685592018-09-18 12:11:34 +02004955 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004956 PSA_DONE( );
Gilles Peskine59685592018-09-18 12:11:34 +02004957 mbedtls_free( actual_output );
4958}
4959/* END_CASE */
4960
4961/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02004962void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02004963{
Gilles Peskinea50d7392018-06-21 10:22:13 +02004964 size_t bytes = bytes_arg;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004965 unsigned char *output = NULL;
4966 unsigned char *changed = NULL;
Gilles Peskinea50d7392018-06-21 10:22:13 +02004967 size_t i;
4968 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02004969
Simon Butcher49f8e312020-03-03 15:51:50 +00004970 TEST_ASSERT( bytes_arg >= 0 );
4971
Gilles Peskine91892022021-02-08 19:50:26 +01004972 ASSERT_ALLOC( output, bytes );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004973 ASSERT_ALLOC( changed, bytes );
Gilles Peskine05d69892018-06-19 22:00:52 +02004974
Gilles Peskine8817f612018-12-18 00:18:46 +01004975 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02004976
Gilles Peskinea50d7392018-06-21 10:22:13 +02004977 /* Run several times, to ensure that every output byte will be
4978 * nonzero at least once with overwhelming probability
4979 * (2^(-8*number_of_runs)). */
4980 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02004981 {
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004982 if( bytes != 0 )
4983 memset( output, 0, bytes );
Gilles Peskine8817f612018-12-18 00:18:46 +01004984 PSA_ASSERT( psa_generate_random( output, bytes ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004985
Gilles Peskinea50d7392018-06-21 10:22:13 +02004986 for( i = 0; i < bytes; i++ )
4987 {
4988 if( output[i] != 0 )
4989 ++changed[i];
4990 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004991 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02004992
4993 /* Check that every byte was changed to nonzero at least once. This
4994 * validates that psa_generate_random is overwriting every byte of
4995 * the output buffer. */
4996 for( i = 0; i < bytes; i++ )
4997 {
4998 TEST_ASSERT( changed[i] != 0 );
4999 }
Gilles Peskine05d69892018-06-19 22:00:52 +02005000
5001exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005002 PSA_DONE( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02005003 mbedtls_free( output );
5004 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02005005}
5006/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02005007
5008/* BEGIN_CASE */
5009void generate_key( int type_arg,
5010 int bits_arg,
5011 int usage_arg,
5012 int alg_arg,
Steven Cooreman83fdb702021-01-21 14:24:39 +01005013 int expected_status_arg,
5014 int is_large_key )
Gilles Peskine12313cd2018-06-20 00:20:32 +02005015{
Ronald Cron5425a212020-08-04 14:58:35 +02005016 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02005017 psa_key_type_t type = type_arg;
5018 psa_key_usage_t usage = usage_arg;
5019 size_t bits = bits_arg;
5020 psa_algorithm_t alg = alg_arg;
5021 psa_status_t expected_status = expected_status_arg;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02005022 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02005023 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02005024
Gilles Peskine8817f612018-12-18 00:18:46 +01005025 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02005026
Gilles Peskineff5f0e72019-04-18 12:53:30 +02005027 psa_set_key_usage_flags( &attributes, usage );
5028 psa_set_key_algorithm( &attributes, alg );
5029 psa_set_key_type( &attributes, type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02005030 psa_set_key_bits( &attributes, bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02005031
5032 /* Generate a key */
Steven Cooreman83fdb702021-01-21 14:24:39 +01005033 psa_status_t status = psa_generate_key( &attributes, &key );
5034
5035 if( is_large_key > 0 )
5036 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
5037 TEST_EQUAL( status , expected_status );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005038 if( expected_status != PSA_SUCCESS )
Gilles Peskineff5f0e72019-04-18 12:53:30 +02005039 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02005040
5041 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02005042 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02005043 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
5044 TEST_EQUAL( psa_get_key_bits( &got_attributes ), bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02005045
Gilles Peskine818ca122018-06-20 18:16:48 +02005046 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01005047 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +02005048 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02005049
5050exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005051 /*
5052 * Key attributes may have been returned by psa_get_key_attributes()
5053 * thus reset them as required.
5054 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005055 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005056
Ronald Cron5425a212020-08-04 14:58:35 +02005057 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005058 PSA_DONE( );
Gilles Peskine12313cd2018-06-20 00:20:32 +02005059}
5060/* END_CASE */
itayzafrir0adf0fc2018-09-06 16:24:41 +03005061
Ronald Cronee414c72021-03-18 18:50:08 +01005062/* 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 +02005063void generate_key_rsa( int bits_arg,
5064 data_t *e_arg,
5065 int expected_status_arg )
5066{
Ronald Cron5425a212020-08-04 14:58:35 +02005067 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec93b80c2019-05-16 19:39:54 +02005068 psa_key_type_t type = PSA_KEY_TYPE_RSA_KEY_PAIR;
Gilles Peskinee56e8782019-04-26 17:34:02 +02005069 size_t bits = bits_arg;
5070 psa_key_usage_t usage = PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT;
5071 psa_algorithm_t alg = PSA_ALG_RSA_PKCS1V15_SIGN_RAW;
5072 psa_status_t expected_status = expected_status_arg;
5073 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
5074 uint8_t *exported = NULL;
5075 size_t exported_size =
gabor-mezei-armcbcec212020-12-18 14:23:51 +01005076 PSA_EXPORT_KEY_OUTPUT_SIZE( PSA_KEY_TYPE_RSA_PUBLIC_KEY, bits );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005077 size_t exported_length = SIZE_MAX;
5078 uint8_t *e_read_buffer = NULL;
5079 int is_default_public_exponent = 0;
Gilles Peskineaa02c172019-04-28 11:44:17 +02005080 size_t e_read_size = PSA_KEY_DOMAIN_PARAMETERS_SIZE( type, bits );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005081 size_t e_read_length = SIZE_MAX;
5082
5083 if( e_arg->len == 0 ||
5084 ( e_arg->len == 3 &&
5085 e_arg->x[0] == 1 && e_arg->x[1] == 0 && e_arg->x[2] == 1 ) )
5086 {
5087 is_default_public_exponent = 1;
5088 e_read_size = 0;
5089 }
5090 ASSERT_ALLOC( e_read_buffer, e_read_size );
5091 ASSERT_ALLOC( exported, exported_size );
5092
5093 PSA_ASSERT( psa_crypto_init( ) );
5094
5095 psa_set_key_usage_flags( &attributes, usage );
5096 psa_set_key_algorithm( &attributes, alg );
5097 PSA_ASSERT( psa_set_key_domain_parameters( &attributes, type,
5098 e_arg->x, e_arg->len ) );
5099 psa_set_key_bits( &attributes, bits );
5100
5101 /* Generate a key */
Ronald Cron5425a212020-08-04 14:58:35 +02005102 TEST_EQUAL( psa_generate_key( &attributes, &key ), expected_status );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005103 if( expected_status != PSA_SUCCESS )
5104 goto exit;
5105
5106 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02005107 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005108 TEST_EQUAL( psa_get_key_type( &attributes ), type );
5109 TEST_EQUAL( psa_get_key_bits( &attributes ), bits );
5110 PSA_ASSERT( psa_get_key_domain_parameters( &attributes,
5111 e_read_buffer, e_read_size,
5112 &e_read_length ) );
5113 if( is_default_public_exponent )
5114 TEST_EQUAL( e_read_length, 0 );
5115 else
5116 ASSERT_COMPARE( e_read_buffer, e_read_length, e_arg->x, e_arg->len );
5117
5118 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01005119 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskinee56e8782019-04-26 17:34:02 +02005120 goto exit;
5121
5122 /* Export the key and check the public exponent. */
Ronald Cron5425a212020-08-04 14:58:35 +02005123 PSA_ASSERT( psa_export_public_key( key,
Gilles Peskinee56e8782019-04-26 17:34:02 +02005124 exported, exported_size,
5125 &exported_length ) );
5126 {
5127 uint8_t *p = exported;
5128 uint8_t *end = exported + exported_length;
5129 size_t len;
5130 /* RSAPublicKey ::= SEQUENCE {
5131 * modulus INTEGER, -- n
5132 * publicExponent INTEGER } -- e
5133 */
5134 TEST_EQUAL( 0, mbedtls_asn1_get_tag( &p, end, &len,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005135 MBEDTLS_ASN1_SEQUENCE |
5136 MBEDTLS_ASN1_CONSTRUCTED ) );
Gilles Peskine8e94efe2021-02-13 00:25:53 +01005137 TEST_ASSERT( mbedtls_test_asn1_skip_integer( &p, end, bits, bits, 1 ) );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005138 TEST_EQUAL( 0, mbedtls_asn1_get_tag( &p, end, &len,
5139 MBEDTLS_ASN1_INTEGER ) );
5140 if( len >= 1 && p[0] == 0 )
5141 {
5142 ++p;
5143 --len;
5144 }
5145 if( e_arg->len == 0 )
5146 {
5147 TEST_EQUAL( len, 3 );
5148 TEST_EQUAL( p[0], 1 );
5149 TEST_EQUAL( p[1], 0 );
5150 TEST_EQUAL( p[2], 1 );
5151 }
5152 else
5153 ASSERT_COMPARE( p, len, e_arg->x, e_arg->len );
5154 }
5155
5156exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005157 /*
5158 * Key attributes may have been returned by psa_get_key_attributes() or
5159 * set by psa_set_key_domain_parameters() thus reset them as required.
5160 */
Gilles Peskinee56e8782019-04-26 17:34:02 +02005161 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005162
Ronald Cron5425a212020-08-04 14:58:35 +02005163 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005164 PSA_DONE( );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005165 mbedtls_free( e_read_buffer );
5166 mbedtls_free( exported );
5167}
5168/* END_CASE */
5169
Darryl Greend49a4992018-06-18 17:27:26 +01005170/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C */
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005171void persistent_key_load_key_from_storage( data_t *data,
5172 int type_arg, int bits_arg,
5173 int usage_flags_arg, int alg_arg,
5174 int generation_method )
Darryl Greend49a4992018-06-18 17:27:26 +01005175{
Ronald Cron71016a92020-08-28 19:01:50 +02005176 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, 1 );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005177 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +02005178 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
5179 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005180 psa_key_type_t type = type_arg;
5181 size_t bits = bits_arg;
5182 psa_key_usage_t usage_flags = usage_flags_arg;
5183 psa_algorithm_t alg = alg_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005184 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01005185 unsigned char *first_export = NULL;
5186 unsigned char *second_export = NULL;
gabor-mezei-armcbcec212020-12-18 14:23:51 +01005187 size_t export_size = PSA_EXPORT_KEY_OUTPUT_SIZE( type, bits );
Darryl Greend49a4992018-06-18 17:27:26 +01005188 size_t first_exported_length;
5189 size_t second_exported_length;
5190
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005191 if( usage_flags & PSA_KEY_USAGE_EXPORT )
5192 {
5193 ASSERT_ALLOC( first_export, export_size );
5194 ASSERT_ALLOC( second_export, export_size );
5195 }
Darryl Greend49a4992018-06-18 17:27:26 +01005196
Gilles Peskine8817f612018-12-18 00:18:46 +01005197 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01005198
Gilles Peskinec87af662019-05-15 16:12:22 +02005199 psa_set_key_id( &attributes, key_id );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005200 psa_set_key_usage_flags( &attributes, usage_flags );
5201 psa_set_key_algorithm( &attributes, alg );
5202 psa_set_key_type( &attributes, type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02005203 psa_set_key_bits( &attributes, bits );
Darryl Greend49a4992018-06-18 17:27:26 +01005204
Darryl Green0c6575a2018-11-07 16:05:30 +00005205 switch( generation_method )
5206 {
5207 case IMPORT_KEY:
5208 /* Import the key */
Gilles Peskine049c7532019-05-15 20:22:09 +02005209 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02005210 &key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005211 break;
Darryl Greend49a4992018-06-18 17:27:26 +01005212
Darryl Green0c6575a2018-11-07 16:05:30 +00005213 case GENERATE_KEY:
5214 /* Generate a key */
Ronald Cron5425a212020-08-04 14:58:35 +02005215 PSA_ASSERT( psa_generate_key( &attributes, &key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005216 break;
5217
5218 case DERIVE_KEY:
Steven Cooreman70f654a2021-02-15 10:51:43 +01005219#if defined(PSA_WANT_ALG_HKDF) && defined(PSA_WANT_ALG_SHA_256)
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005220 {
5221 /* Create base key */
5222 psa_algorithm_t derive_alg = PSA_ALG_HKDF( PSA_ALG_SHA_256 );
5223 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
5224 psa_set_key_usage_flags( &base_attributes,
5225 PSA_KEY_USAGE_DERIVE );
5226 psa_set_key_algorithm( &base_attributes, derive_alg );
5227 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02005228 PSA_ASSERT( psa_import_key( &base_attributes,
5229 data->x, data->len,
5230 &base_key ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005231 /* Derive a key. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005232 PSA_ASSERT( psa_key_derivation_setup( &operation, derive_alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005233 PSA_ASSERT( psa_key_derivation_input_key(
5234 &operation,
5235 PSA_KEY_DERIVATION_INPUT_SECRET, base_key ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005236 PSA_ASSERT( psa_key_derivation_input_bytes(
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005237 &operation, PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005238 NULL, 0 ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005239 PSA_ASSERT( psa_key_derivation_output_key( &attributes,
5240 &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02005241 &key ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005242 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005243 PSA_ASSERT( psa_destroy_key( base_key ) );
Ronald Cron5425a212020-08-04 14:58:35 +02005244 base_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005245 }
Gilles Peskine6fea21d2021-01-12 00:02:15 +01005246#else
5247 TEST_ASSUME( ! "KDF not supported in this configuration" );
5248#endif
5249 break;
5250
5251 default:
5252 TEST_ASSERT( ! "generation_method not implemented in test" );
5253 break;
Darryl Green0c6575a2018-11-07 16:05:30 +00005254 }
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005255 psa_reset_key_attributes( &attributes );
Darryl Greend49a4992018-06-18 17:27:26 +01005256
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005257 /* Export the key if permitted by the key policy. */
5258 if( usage_flags & PSA_KEY_USAGE_EXPORT )
5259 {
Ronald Cron5425a212020-08-04 14:58:35 +02005260 PSA_ASSERT( psa_export_key( key,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005261 first_export, export_size,
5262 &first_exported_length ) );
5263 if( generation_method == IMPORT_KEY )
5264 ASSERT_COMPARE( data->x, data->len,
5265 first_export, first_exported_length );
5266 }
Darryl Greend49a4992018-06-18 17:27:26 +01005267
5268 /* Shutdown and restart */
Ronald Cron5425a212020-08-04 14:58:35 +02005269 PSA_ASSERT( psa_purge_key( key ) );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005270 PSA_DONE();
Gilles Peskine8817f612018-12-18 00:18:46 +01005271 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01005272
Darryl Greend49a4992018-06-18 17:27:26 +01005273 /* Check key slot still contains key data */
Ronald Cron5425a212020-08-04 14:58:35 +02005274 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Ronald Cronecfb2372020-07-23 17:13:42 +02005275 TEST_ASSERT( mbedtls_svc_key_id_equal(
5276 psa_get_key_id( &attributes ), key_id ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005277 TEST_EQUAL( psa_get_key_lifetime( &attributes ),
5278 PSA_KEY_LIFETIME_PERSISTENT );
5279 TEST_EQUAL( psa_get_key_type( &attributes ), type );
5280 TEST_EQUAL( psa_get_key_bits( &attributes ), bits );
5281 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), usage_flags );
5282 TEST_EQUAL( psa_get_key_algorithm( &attributes ), alg );
Darryl Greend49a4992018-06-18 17:27:26 +01005283
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005284 /* Export the key again if permitted by the key policy. */
5285 if( usage_flags & PSA_KEY_USAGE_EXPORT )
Darryl Green0c6575a2018-11-07 16:05:30 +00005286 {
Ronald Cron5425a212020-08-04 14:58:35 +02005287 PSA_ASSERT( psa_export_key( key,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005288 second_export, export_size,
5289 &second_exported_length ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005290 ASSERT_COMPARE( first_export, first_exported_length,
5291 second_export, second_exported_length );
Darryl Green0c6575a2018-11-07 16:05:30 +00005292 }
5293
5294 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01005295 if( ! mbedtls_test_psa_exercise_key( key, usage_flags, alg ) )
Darryl Green0c6575a2018-11-07 16:05:30 +00005296 goto exit;
Darryl Greend49a4992018-06-18 17:27:26 +01005297
5298exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005299 /*
5300 * Key attributes may have been returned by psa_get_key_attributes()
5301 * thus reset them as required.
5302 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005303 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005304
Darryl Greend49a4992018-06-18 17:27:26 +01005305 mbedtls_free( first_export );
5306 mbedtls_free( second_export );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005307 psa_key_derivation_abort( &operation );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005308 psa_destroy_key( base_key );
Ronald Cron5425a212020-08-04 14:58:35 +02005309 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005310 PSA_DONE();
Darryl Greend49a4992018-06-18 17:27:26 +01005311}
5312/* END_CASE */