blob: 10426302dda9cb30637f69ca71154dcbcdb19c0c [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
Jaeden Amerof24c7f82018-06-27 17:20:43 +010019/** An invalid export length that will never be set by psa_export_key(). */
20static const size_t INVALID_EXPORT_LENGTH = ~0U;
21
Gilles Peskinea7aa4422018-08-14 15:17:54 +020022/** Test if a buffer contains a constant byte value.
23 *
24 * `mem_is_char(buffer, c, size)` is true after `memset(buffer, c, size)`.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020025 *
26 * \param buffer Pointer to the beginning of the buffer.
Gilles Peskinea7aa4422018-08-14 15:17:54 +020027 * \param c Expected value of every byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020028 * \param size Size of the buffer in bytes.
29 *
Gilles Peskine3f669c32018-06-21 09:21:51 +020030 * \return 1 if the buffer is all-bits-zero.
31 * \return 0 if there is at least one nonzero byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020032 */
Gilles Peskinea7aa4422018-08-14 15:17:54 +020033static int mem_is_char( void *buffer, unsigned char c, size_t size )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020034{
35 size_t i;
36 for( i = 0; i < size; i++ )
37 {
Gilles Peskinea7aa4422018-08-14 15:17:54 +020038 if( ( (unsigned char *) buffer )[i] != c )
Gilles Peskine3f669c32018-06-21 09:21:51 +020039 return( 0 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020040 }
Gilles Peskine3f669c32018-06-21 09:21:51 +020041 return( 1 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020042}
Gilles Peskine818ca122018-06-20 18:16:48 +020043
Gilles Peskine0b352bc2018-06-28 00:16:11 +020044/* Write the ASN.1 INTEGER with the value 2^(bits-1)+x backwards from *p. */
45static int asn1_write_10x( unsigned char **p,
46 unsigned char *start,
47 size_t bits,
48 unsigned char x )
49{
50 int ret;
51 int len = bits / 8 + 1;
Gilles Peskine480416a2018-06-28 19:04:07 +020052 if( bits == 0 )
53 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
54 if( bits <= 8 && x >= 1 << ( bits - 1 ) )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020055 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
Moran Pekercb088e72018-07-17 17:36:59 +030056 if( *p < start || *p - start < (ptrdiff_t) len )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020057 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
58 *p -= len;
59 ( *p )[len-1] = x;
60 if( bits % 8 == 0 )
61 ( *p )[1] |= 1;
62 else
63 ( *p )[0] |= 1 << ( bits % 8 );
64 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
65 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
66 MBEDTLS_ASN1_INTEGER ) );
67 return( len );
68}
69
70static int construct_fake_rsa_key( unsigned char *buffer,
71 size_t buffer_size,
72 unsigned char **p,
73 size_t bits,
74 int keypair )
75{
76 size_t half_bits = ( bits + 1 ) / 2;
77 int ret;
78 int len = 0;
79 /* Construct something that looks like a DER encoding of
80 * as defined by PKCS#1 v2.2 (RFC 8017) section A.1.2:
81 * RSAPrivateKey ::= SEQUENCE {
82 * version Version,
83 * modulus INTEGER, -- n
84 * publicExponent INTEGER, -- e
85 * privateExponent INTEGER, -- d
86 * prime1 INTEGER, -- p
87 * prime2 INTEGER, -- q
88 * exponent1 INTEGER, -- d mod (p-1)
89 * exponent2 INTEGER, -- d mod (q-1)
90 * coefficient INTEGER, -- (inverse of q) mod p
91 * otherPrimeInfos OtherPrimeInfos OPTIONAL
92 * }
93 * Or, for a public key, the same structure with only
94 * version, modulus and publicExponent.
95 */
96 *p = buffer + buffer_size;
97 if( keypair )
98 {
99 MBEDTLS_ASN1_CHK_ADD( len, /* pq */
100 asn1_write_10x( p, buffer, half_bits, 1 ) );
101 MBEDTLS_ASN1_CHK_ADD( len, /* dq */
102 asn1_write_10x( p, buffer, half_bits, 1 ) );
103 MBEDTLS_ASN1_CHK_ADD( len, /* dp */
104 asn1_write_10x( p, buffer, half_bits, 1 ) );
105 MBEDTLS_ASN1_CHK_ADD( len, /* q */
106 asn1_write_10x( p, buffer, half_bits, 1 ) );
107 MBEDTLS_ASN1_CHK_ADD( len, /* p != q to pass mbedtls sanity checks */
108 asn1_write_10x( p, buffer, half_bits, 3 ) );
109 MBEDTLS_ASN1_CHK_ADD( len, /* d */
110 asn1_write_10x( p, buffer, bits, 1 ) );
111 }
112 MBEDTLS_ASN1_CHK_ADD( len, /* e = 65537 */
113 asn1_write_10x( p, buffer, 17, 1 ) );
114 MBEDTLS_ASN1_CHK_ADD( len, /* n */
115 asn1_write_10x( p, buffer, bits, 1 ) );
116 if( keypair )
117 MBEDTLS_ASN1_CHK_ADD( len, /* version = 0 */
118 mbedtls_asn1_write_int( p, buffer, 0 ) );
119 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, buffer, len ) );
120 {
121 const unsigned char tag =
122 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE;
123 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, buffer, tag ) );
124 }
125 return( len );
126}
127
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100128int exercise_mac_setup( psa_key_type_t key_type,
129 const unsigned char *key_bytes,
130 size_t key_length,
131 psa_algorithm_t alg,
132 psa_mac_operation_t *operation,
133 psa_status_t *status )
134{
Ronald Cron5425a212020-08-04 14:58:35 +0200135 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200136 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100137
Gilles Peskine89d8c5c2019-11-26 17:01:59 +0100138 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200139 psa_set_key_algorithm( &attributes, alg );
140 psa_set_key_type( &attributes, key_type );
Ronald Cron5425a212020-08-04 14:58:35 +0200141 PSA_ASSERT( psa_import_key( &attributes, key_bytes, key_length, &key ) );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100142
Ronald Cron5425a212020-08-04 14:58:35 +0200143 *status = psa_mac_sign_setup( operation, key, alg );
Gilles Peskine9e0a4a52019-02-25 22:11:18 +0100144 /* Whether setup succeeded or failed, abort must succeed. */
145 PSA_ASSERT( psa_mac_abort( operation ) );
146 /* If setup failed, reproduce the failure, so that the caller can
147 * test the resulting state of the operation object. */
148 if( *status != PSA_SUCCESS )
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100149 {
Ronald Cron5425a212020-08-04 14:58:35 +0200150 TEST_EQUAL( psa_mac_sign_setup( operation, key, alg ), *status );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100151 }
152
Ronald Cron5425a212020-08-04 14:58:35 +0200153 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100154 return( 1 );
155
156exit:
Ronald Cron5425a212020-08-04 14:58:35 +0200157 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100158 return( 0 );
159}
160
161int exercise_cipher_setup( psa_key_type_t key_type,
162 const unsigned char *key_bytes,
163 size_t key_length,
164 psa_algorithm_t alg,
165 psa_cipher_operation_t *operation,
166 psa_status_t *status )
167{
Ronald Cron5425a212020-08-04 14:58:35 +0200168 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200169 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100170
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200171 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
172 psa_set_key_algorithm( &attributes, alg );
173 psa_set_key_type( &attributes, key_type );
Ronald Cron5425a212020-08-04 14:58:35 +0200174 PSA_ASSERT( psa_import_key( &attributes, key_bytes, key_length, &key ) );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100175
Ronald Cron5425a212020-08-04 14:58:35 +0200176 *status = psa_cipher_encrypt_setup( operation, key, alg );
Gilles Peskine9e0a4a52019-02-25 22:11:18 +0100177 /* Whether setup succeeded or failed, abort must succeed. */
178 PSA_ASSERT( psa_cipher_abort( operation ) );
179 /* If setup failed, reproduce the failure, so that the caller can
180 * test the resulting state of the operation object. */
181 if( *status != PSA_SUCCESS )
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100182 {
Ronald Cron5425a212020-08-04 14:58:35 +0200183 TEST_EQUAL( psa_cipher_encrypt_setup( operation, key, alg ),
Gilles Peskine9e0a4a52019-02-25 22:11:18 +0100184 *status );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100185 }
186
Ronald Cron5425a212020-08-04 14:58:35 +0200187 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100188 return( 1 );
189
190exit:
Ronald Cron5425a212020-08-04 14:58:35 +0200191 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100192 return( 0 );
193}
194
Ronald Cron5425a212020-08-04 14:58:35 +0200195static int test_operations_on_invalid_key( mbedtls_svc_key_id_t key )
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200196{
197 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cronecfb2372020-07-23 17:13:42 +0200198 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, 0x6964 );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200199 uint8_t buffer[1];
200 size_t length;
201 int ok = 0;
202
Ronald Cronecfb2372020-07-23 17:13:42 +0200203 psa_set_key_id( &attributes, key_id );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200204 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
205 psa_set_key_algorithm( &attributes, PSA_ALG_CTR );
206 psa_set_key_type( &attributes, PSA_KEY_TYPE_AES );
Ronald Cron5425a212020-08-04 14:58:35 +0200207 TEST_EQUAL( psa_get_key_attributes( key, &attributes ),
Maulik Patel3240c9d2021-03-17 16:11:05 +0000208 PSA_ERROR_INVALID_HANDLE );
Ronald Cronecfb2372020-07-23 17:13:42 +0200209 TEST_EQUAL(
210 MBEDTLS_SVC_KEY_ID_GET_KEY_ID( psa_get_key_id( &attributes ) ), 0 );
211 TEST_EQUAL(
212 MBEDTLS_SVC_KEY_ID_GET_OWNER_ID( psa_get_key_id( &attributes ) ), 0 );
Gilles Peskine5c648ab2019-04-19 14:06:53 +0200213 TEST_EQUAL( psa_get_key_lifetime( &attributes ), 0 );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200214 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), 0 );
215 TEST_EQUAL( psa_get_key_algorithm( &attributes ), 0 );
216 TEST_EQUAL( psa_get_key_type( &attributes ), 0 );
217 TEST_EQUAL( psa_get_key_bits( &attributes ), 0 );
218
Ronald Cron5425a212020-08-04 14:58:35 +0200219 TEST_EQUAL( psa_export_key( key, buffer, sizeof( buffer ), &length ),
Maulik Patel3240c9d2021-03-17 16:11:05 +0000220 PSA_ERROR_INVALID_HANDLE );
Ronald Cron5425a212020-08-04 14:58:35 +0200221 TEST_EQUAL( psa_export_public_key( key,
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200222 buffer, sizeof( buffer ), &length ),
Maulik Patel3240c9d2021-03-17 16:11:05 +0000223 PSA_ERROR_INVALID_HANDLE );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200224
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200225 ok = 1;
226
227exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100228 /*
229 * Key attributes may have been returned by psa_get_key_attributes()
230 * thus reset them as required.
231 */
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200232 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100233
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200234 return( ok );
235}
236
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200237/* Assert that a key isn't reported as having a slot number. */
238#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
239#define ASSERT_NO_SLOT_NUMBER( attributes ) \
240 do \
241 { \
242 psa_key_slot_number_t ASSERT_NO_SLOT_NUMBER_slot_number; \
243 TEST_EQUAL( psa_get_key_slot_number( \
244 attributes, \
245 &ASSERT_NO_SLOT_NUMBER_slot_number ), \
246 PSA_ERROR_INVALID_ARGUMENT ); \
247 } \
248 while( 0 )
249#else /* MBEDTLS_PSA_CRYPTO_SE_C */
250#define ASSERT_NO_SLOT_NUMBER( attributes ) \
251 ( (void) 0 )
252#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
253
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100254/* An overapproximation of the amount of storage needed for a key of the
255 * given type and with the given content. The API doesn't make it easy
256 * to find a good value for the size. The current implementation doesn't
257 * care about the value anyway. */
258#define KEY_BITS_FROM_DATA( type, data ) \
259 ( data )->len
260
Darryl Green0c6575a2018-11-07 16:05:30 +0000261typedef enum {
262 IMPORT_KEY = 0,
263 GENERATE_KEY = 1,
264 DERIVE_KEY = 2
265} generate_method;
266
Gilles Peskinee59236f2018-01-27 23:32:46 +0100267/* END_HEADER */
268
269/* BEGIN_DEPENDENCIES
270 * depends_on:MBEDTLS_PSA_CRYPTO_C
271 * END_DEPENDENCIES
272 */
273
274/* BEGIN_CASE */
Gilles Peskinee1f2d7d2018-08-21 14:54:54 +0200275void static_checks( )
276{
277 size_t max_truncated_mac_size =
278 PSA_ALG_MAC_TRUNCATION_MASK >> PSA_MAC_TRUNCATION_OFFSET;
279
280 /* Check that the length for a truncated MAC always fits in the algorithm
281 * encoding. The shifted mask is the maximum truncated value. The
282 * untruncated algorithm may be one byte larger. */
283 TEST_ASSERT( PSA_MAC_MAX_SIZE <= 1 + max_truncated_mac_size );
284}
285/* END_CASE */
286
287/* BEGIN_CASE */
Gilles Peskine6edfa292019-07-31 15:53:45 +0200288void import_with_policy( int type_arg,
289 int usage_arg, int alg_arg,
290 int expected_status_arg )
291{
292 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
293 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +0200294 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine6edfa292019-07-31 15:53:45 +0200295 psa_key_type_t type = type_arg;
296 psa_key_usage_t usage = usage_arg;
297 psa_algorithm_t alg = alg_arg;
298 psa_status_t expected_status = expected_status_arg;
299 const uint8_t key_material[16] = {0};
300 psa_status_t status;
301
302 PSA_ASSERT( psa_crypto_init( ) );
303
304 psa_set_key_type( &attributes, type );
305 psa_set_key_usage_flags( &attributes, usage );
306 psa_set_key_algorithm( &attributes, alg );
307
308 status = psa_import_key( &attributes,
309 key_material, sizeof( key_material ),
Ronald Cron5425a212020-08-04 14:58:35 +0200310 &key );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200311 TEST_EQUAL( status, expected_status );
312 if( status != PSA_SUCCESS )
313 goto exit;
314
Ronald Cron5425a212020-08-04 14:58:35 +0200315 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200316 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
317 TEST_EQUAL( psa_get_key_usage_flags( &got_attributes ), usage );
318 TEST_EQUAL( psa_get_key_algorithm( &got_attributes ), alg );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200319 ASSERT_NO_SLOT_NUMBER( &got_attributes );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200320
Ronald Cron5425a212020-08-04 14:58:35 +0200321 PSA_ASSERT( psa_destroy_key( key ) );
322 test_operations_on_invalid_key( key );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200323
324exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100325 /*
326 * Key attributes may have been returned by psa_get_key_attributes()
327 * thus reset them as required.
328 */
Gilles Peskine6edfa292019-07-31 15:53:45 +0200329 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100330
331 psa_destroy_key( key );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200332 PSA_DONE( );
333}
334/* END_CASE */
335
336/* BEGIN_CASE */
337void import_with_data( data_t *data, int type_arg,
338 int attr_bits_arg,
339 int expected_status_arg )
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200340{
341 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
342 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +0200343 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200344 psa_key_type_t type = type_arg;
Gilles Peskine8fb3a9e2019-05-03 16:59:21 +0200345 size_t attr_bits = attr_bits_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200346 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100347 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100348
Gilles Peskine8817f612018-12-18 00:18:46 +0100349 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100350
Gilles Peskine4747d192019-04-17 15:05:45 +0200351 psa_set_key_type( &attributes, type );
Gilles Peskine8fb3a9e2019-05-03 16:59:21 +0200352 psa_set_key_bits( &attributes, attr_bits );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200353
Ronald Cron5425a212020-08-04 14:58:35 +0200354 status = psa_import_key( &attributes, data->x, data->len, &key );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100355 TEST_EQUAL( status, expected_status );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200356 if( status != PSA_SUCCESS )
357 goto exit;
358
Ronald Cron5425a212020-08-04 14:58:35 +0200359 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200360 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
Gilles Peskine8fb3a9e2019-05-03 16:59:21 +0200361 if( attr_bits != 0 )
Gilles Peskine7e0cff92019-07-30 13:48:52 +0200362 TEST_EQUAL( attr_bits, psa_get_key_bits( &got_attributes ) );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200363 ASSERT_NO_SLOT_NUMBER( &got_attributes );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200364
Ronald Cron5425a212020-08-04 14:58:35 +0200365 PSA_ASSERT( psa_destroy_key( key ) );
366 test_operations_on_invalid_key( key );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100367
368exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100369 /*
370 * Key attributes may have been returned by psa_get_key_attributes()
371 * thus reset them as required.
372 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +0200373 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100374
375 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200376 PSA_DONE( );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100377}
378/* END_CASE */
379
380/* BEGIN_CASE */
Gilles Peskinec744d992019-07-30 17:26:54 +0200381void import_large_key( int type_arg, int byte_size_arg,
382 int expected_status_arg )
383{
384 psa_key_type_t type = type_arg;
385 size_t byte_size = byte_size_arg;
386 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
387 psa_status_t expected_status = expected_status_arg;
Ronald Cron5425a212020-08-04 14:58:35 +0200388 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec744d992019-07-30 17:26:54 +0200389 psa_status_t status;
390 uint8_t *buffer = NULL;
391 size_t buffer_size = byte_size + 1;
392 size_t n;
393
Steven Cooreman69967ce2021-01-18 18:01:08 +0100394 /* Skip the test case if the target running the test cannot
395 * accomodate large keys due to heap size constraints */
396 ASSERT_ALLOC_WEAK( buffer, buffer_size );
Gilles Peskinec744d992019-07-30 17:26:54 +0200397 memset( buffer, 'K', byte_size );
398
399 PSA_ASSERT( psa_crypto_init( ) );
400
401 /* Try importing the key */
402 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT );
403 psa_set_key_type( &attributes, type );
Ronald Cron5425a212020-08-04 14:58:35 +0200404 status = psa_import_key( &attributes, buffer, byte_size, &key );
Steven Cooreman83fdb702021-01-21 14:24:39 +0100405 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
Gilles Peskinec744d992019-07-30 17:26:54 +0200406 TEST_EQUAL( status, expected_status );
407
408 if( status == PSA_SUCCESS )
409 {
Ronald Cron5425a212020-08-04 14:58:35 +0200410 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskinec744d992019-07-30 17:26:54 +0200411 TEST_EQUAL( psa_get_key_type( &attributes ), type );
412 TEST_EQUAL( psa_get_key_bits( &attributes ),
413 PSA_BYTES_TO_BITS( byte_size ) );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200414 ASSERT_NO_SLOT_NUMBER( &attributes );
Gilles Peskinec744d992019-07-30 17:26:54 +0200415 memset( buffer, 0, byte_size + 1 );
Ronald Cron5425a212020-08-04 14:58:35 +0200416 PSA_ASSERT( psa_export_key( key, buffer, byte_size, &n ) );
Gilles Peskinec744d992019-07-30 17:26:54 +0200417 for( n = 0; n < byte_size; n++ )
418 TEST_EQUAL( buffer[n], 'K' );
419 for( n = byte_size; n < buffer_size; n++ )
420 TEST_EQUAL( buffer[n], 0 );
421 }
422
423exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100424 /*
425 * Key attributes may have been returned by psa_get_key_attributes()
426 * thus reset them as required.
427 */
428 psa_reset_key_attributes( &attributes );
429
Ronald Cron5425a212020-08-04 14:58:35 +0200430 psa_destroy_key( key );
Gilles Peskinec744d992019-07-30 17:26:54 +0200431 PSA_DONE( );
432 mbedtls_free( buffer );
433}
434/* END_CASE */
435
436/* BEGIN_CASE */
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200437void import_rsa_made_up( int bits_arg, int keypair, int expected_status_arg )
438{
Ronald Cron5425a212020-08-04 14:58:35 +0200439 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200440 size_t bits = bits_arg;
441 psa_status_t expected_status = expected_status_arg;
442 psa_status_t status;
443 psa_key_type_t type =
Gilles Peskinec93b80c2019-05-16 19:39:54 +0200444 keypair ? PSA_KEY_TYPE_RSA_KEY_PAIR : PSA_KEY_TYPE_RSA_PUBLIC_KEY;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200445 size_t buffer_size = /* Slight overapproximations */
446 keypair ? bits * 9 / 16 + 80 : bits / 8 + 20;
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200447 unsigned char *buffer = NULL;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200448 unsigned char *p;
449 int ret;
450 size_t length;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200451 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200452
Gilles Peskine8817f612018-12-18 00:18:46 +0100453 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200454 ASSERT_ALLOC( buffer, buffer_size );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200455
456 TEST_ASSERT( ( ret = construct_fake_rsa_key( buffer, buffer_size, &p,
457 bits, keypair ) ) >= 0 );
458 length = ret;
459
460 /* Try importing the key */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200461 psa_set_key_type( &attributes, type );
Ronald Cron5425a212020-08-04 14:58:35 +0200462 status = psa_import_key( &attributes, p, length, &key );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100463 TEST_EQUAL( status, expected_status );
Gilles Peskine76b29a72019-05-28 14:08:50 +0200464
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200465 if( status == PSA_SUCCESS )
Ronald Cron5425a212020-08-04 14:58:35 +0200466 PSA_ASSERT( psa_destroy_key( key ) );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200467
468exit:
469 mbedtls_free( buffer );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200470 PSA_DONE( );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200471}
472/* END_CASE */
473
474/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300475void import_export( data_t *data,
Moran Pekera964a8f2018-06-04 18:42:36 +0300476 int type_arg,
Gilles Peskine1ecf92c22019-05-24 15:00:06 +0200477 int usage_arg, int alg_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100478 int expected_bits,
479 int export_size_delta,
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200480 int expected_export_status_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100481 int canonical_input )
482{
Ronald Cron5425a212020-08-04 14:58:35 +0200483 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100484 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200485 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200486 psa_status_t expected_export_status = expected_export_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100487 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100488 unsigned char *exported = NULL;
489 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100490 size_t export_size;
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100491 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100492 size_t reexported_length;
Gilles Peskine4747d192019-04-17 15:05:45 +0200493 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200494 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100495
Moran Pekercb088e72018-07-17 17:36:59 +0300496 export_size = (ptrdiff_t) data->len + export_size_delta;
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200497 ASSERT_ALLOC( exported, export_size );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100498 if( ! canonical_input )
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200499 ASSERT_ALLOC( reexported, export_size );
Gilles Peskine8817f612018-12-18 00:18:46 +0100500 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100501
Gilles Peskine4747d192019-04-17 15:05:45 +0200502 psa_set_key_usage_flags( &attributes, usage_arg );
503 psa_set_key_algorithm( &attributes, alg );
504 psa_set_key_type( &attributes, type );
mohammad1603a97cb8c2018-03-28 03:46:26 -0700505
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100506 /* Import the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200507 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len, &key ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100508
509 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +0200510 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200511 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
512 TEST_EQUAL( psa_get_key_bits( &got_attributes ), (size_t) expected_bits );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200513 ASSERT_NO_SLOT_NUMBER( &got_attributes );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100514
515 /* Export the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200516 status = psa_export_key( key, exported, export_size, &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100517 TEST_EQUAL( status, expected_export_status );
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100518
519 /* The exported length must be set by psa_export_key() to a value between 0
520 * and export_size. On errors, the exported length must be 0. */
521 TEST_ASSERT( exported_length != INVALID_EXPORT_LENGTH );
522 TEST_ASSERT( status == PSA_SUCCESS || exported_length == 0 );
523 TEST_ASSERT( exported_length <= export_size );
524
Gilles Peskinea7aa4422018-08-14 15:17:54 +0200525 TEST_ASSERT( mem_is_char( exported + exported_length, 0,
Gilles Peskine3f669c32018-06-21 09:21:51 +0200526 export_size - exported_length ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100527 if( status != PSA_SUCCESS )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200528 {
Gilles Peskinefe11b722018-12-18 00:24:04 +0100529 TEST_EQUAL( exported_length, 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100530 goto destroy;
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200531 }
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100532
Gilles Peskineea38a922021-02-13 00:05:16 +0100533 /* Run sanity checks on the exported key. For non-canonical inputs,
534 * this validates the canonical representations. For canonical inputs,
535 * this doesn't directly validate the implementation, but it still helps
536 * by cross-validating the test data with the sanity check code. */
537 if( ! mbedtls_test_psa_exercise_key( key, usage_arg, 0 ) )
Gilles Peskine8f609232018-08-11 01:24:55 +0200538 goto exit;
539
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100540 if( canonical_input )
Gilles Peskinebd7dea92018-09-27 13:57:19 +0200541 ASSERT_COMPARE( data->x, data->len, exported, exported_length );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100542 else
543 {
Ronald Cron5425a212020-08-04 14:58:35 +0200544 mbedtls_svc_key_id_t key2 = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine049c7532019-05-15 20:22:09 +0200545 PSA_ASSERT( psa_import_key( &attributes, exported, exported_length,
Ronald Cron5425a212020-08-04 14:58:35 +0200546 &key2 ) );
547 PSA_ASSERT( psa_export_key( key2,
Gilles Peskine8817f612018-12-18 00:18:46 +0100548 reexported,
549 export_size,
550 &reexported_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +0200551 ASSERT_COMPARE( exported, exported_length,
552 reexported, reexported_length );
Ronald Cron5425a212020-08-04 14:58:35 +0200553 PSA_ASSERT( psa_destroy_key( key2 ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100554 }
gabor-mezei-armceface22021-01-21 12:26:17 +0100555 TEST_ASSERT( exported_length <=
556 PSA_EXPORT_KEY_OUTPUT_SIZE( type,
557 psa_get_key_bits( &got_attributes ) ) );
558 TEST_ASSERT( exported_length <= PSA_EXPORT_KEY_PAIR_MAX_SIZE );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100559
560destroy:
561 /* Destroy the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200562 PSA_ASSERT( psa_destroy_key( key ) );
563 test_operations_on_invalid_key( key );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100564
565exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100566 /*
567 * Key attributes may have been returned by psa_get_key_attributes()
568 * thus reset them as required.
569 */
570 psa_reset_key_attributes( &got_attributes );
571
itayzafrir3e02b3b2018-06-12 17:06:52 +0300572 mbedtls_free( exported );
573 mbedtls_free( reexported );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200574 PSA_DONE( );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100575}
576/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100577
Moran Pekerf709f4a2018-06-06 17:26:04 +0300578/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300579void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200580 int type_arg,
581 int alg_arg,
Gilles Peskine49c25912018-10-29 15:15:31 +0100582 int export_size_delta,
583 int expected_export_status_arg,
584 data_t *expected_public_key )
Moran Pekerf709f4a2018-06-06 17:26:04 +0300585{
Ronald Cron5425a212020-08-04 14:58:35 +0200586 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300587 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200588 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200589 psa_status_t expected_export_status = expected_export_status_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300590 psa_status_t status;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300591 unsigned char *exported = NULL;
Gilles Peskine49c25912018-10-29 15:15:31 +0100592 size_t export_size = expected_public_key->len + export_size_delta;
Jaeden Amero2a671e92018-06-27 17:47:40 +0100593 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine4747d192019-04-17 15:05:45 +0200594 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300595
Gilles Peskine8817f612018-12-18 00:18:46 +0100596 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300597
Gilles Peskine4747d192019-04-17 15:05:45 +0200598 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT );
599 psa_set_key_algorithm( &attributes, alg );
600 psa_set_key_type( &attributes, type );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300601
602 /* Import the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200603 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len, &key ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300604
Gilles Peskine49c25912018-10-29 15:15:31 +0100605 /* Export the public key */
606 ASSERT_ALLOC( exported, export_size );
Ronald Cron5425a212020-08-04 14:58:35 +0200607 status = psa_export_public_key( key,
Gilles Peskine2d277862018-06-18 15:41:12 +0200608 exported, export_size,
609 &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100610 TEST_EQUAL( status, expected_export_status );
Gilles Peskine49c25912018-10-29 15:15:31 +0100611 if( status == PSA_SUCCESS )
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100612 {
Gilles Peskinec93b80c2019-05-16 19:39:54 +0200613 psa_key_type_t public_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR( type );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100614 size_t bits;
Ronald Cron5425a212020-08-04 14:58:35 +0200615 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200616 bits = psa_get_key_bits( &attributes );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100617 TEST_ASSERT( expected_public_key->len <=
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100618 PSA_EXPORT_KEY_OUTPUT_SIZE( public_type, bits ) );
gabor-mezei-armceface22021-01-21 12:26:17 +0100619 TEST_ASSERT( expected_public_key->len <=
620 PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE( public_type, bits ) );
621 TEST_ASSERT( expected_public_key->len <=
622 PSA_EXPORT_PUBLIC_KEY_MAX_SIZE );
Gilles Peskine49c25912018-10-29 15:15:31 +0100623 ASSERT_COMPARE( expected_public_key->x, expected_public_key->len,
624 exported, exported_length );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100625 }
Moran Pekerf709f4a2018-06-06 17:26:04 +0300626
627exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100628 /*
629 * Key attributes may have been returned by psa_get_key_attributes()
630 * thus reset them as required.
631 */
632 psa_reset_key_attributes( &attributes );
633
itayzafrir3e02b3b2018-06-12 17:06:52 +0300634 mbedtls_free( exported );
Ronald Cron5425a212020-08-04 14:58:35 +0200635 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200636 PSA_DONE( );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300637}
638/* END_CASE */
639
Gilles Peskine20035e32018-02-03 22:44:14 +0100640/* BEGIN_CASE */
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200641void import_and_exercise_key( data_t *data,
642 int type_arg,
643 int bits_arg,
644 int alg_arg )
645{
Ronald Cron5425a212020-08-04 14:58:35 +0200646 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200647 psa_key_type_t type = type_arg;
648 size_t bits = bits_arg;
649 psa_algorithm_t alg = alg_arg;
Gilles Peskinec18e25f2021-02-12 23:48:20 +0100650 psa_key_usage_t usage = mbedtls_test_psa_usage_to_exercise( type, alg );
Gilles Peskine4747d192019-04-17 15:05:45 +0200651 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200652 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200653
Gilles Peskine8817f612018-12-18 00:18:46 +0100654 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200655
Gilles Peskine4747d192019-04-17 15:05:45 +0200656 psa_set_key_usage_flags( &attributes, usage );
657 psa_set_key_algorithm( &attributes, alg );
658 psa_set_key_type( &attributes, type );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200659
660 /* Import the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200661 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len, &key ) );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200662
663 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +0200664 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200665 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
666 TEST_EQUAL( psa_get_key_bits( &got_attributes ), bits );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200667
668 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +0100669 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +0200670 goto exit;
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200671
Ronald Cron5425a212020-08-04 14:58:35 +0200672 PSA_ASSERT( psa_destroy_key( key ) );
673 test_operations_on_invalid_key( key );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200674
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200675exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100676 /*
677 * Key attributes may have been returned by psa_get_key_attributes()
678 * thus reset them as required.
679 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +0200680 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100681
682 psa_reset_key_attributes( &attributes );
683 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200684 PSA_DONE( );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200685}
686/* END_CASE */
687
688/* BEGIN_CASE */
Gilles Peskine06c28892019-11-26 18:07:46 +0100689void effective_key_attributes( int type_arg, int expected_type_arg,
690 int bits_arg, int expected_bits_arg,
691 int usage_arg, int expected_usage_arg,
692 int alg_arg, int expected_alg_arg )
Gilles Peskined5b33222018-06-18 22:20:03 +0200693{
Ronald Cron5425a212020-08-04 14:58:35 +0200694 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine1a960492019-11-26 17:12:21 +0100695 psa_key_type_t key_type = type_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +0100696 psa_key_type_t expected_key_type = expected_type_arg;
Gilles Peskine1a960492019-11-26 17:12:21 +0100697 size_t bits = bits_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +0100698 size_t expected_bits = expected_bits_arg;
Gilles Peskined5b33222018-06-18 22:20:03 +0200699 psa_algorithm_t alg = alg_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +0100700 psa_algorithm_t expected_alg = expected_alg_arg;
Gilles Peskined5b33222018-06-18 22:20:03 +0200701 psa_key_usage_t usage = usage_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +0100702 psa_key_usage_t expected_usage = expected_usage_arg;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200703 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskined5b33222018-06-18 22:20:03 +0200704
Gilles Peskine8817f612018-12-18 00:18:46 +0100705 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined5b33222018-06-18 22:20:03 +0200706
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200707 psa_set_key_usage_flags( &attributes, usage );
708 psa_set_key_algorithm( &attributes, alg );
709 psa_set_key_type( &attributes, key_type );
Gilles Peskine1a960492019-11-26 17:12:21 +0100710 psa_set_key_bits( &attributes, bits );
Gilles Peskined5b33222018-06-18 22:20:03 +0200711
Ronald Cron5425a212020-08-04 14:58:35 +0200712 PSA_ASSERT( psa_generate_key( &attributes, &key ) );
Gilles Peskine1a960492019-11-26 17:12:21 +0100713 psa_reset_key_attributes( &attributes );
Gilles Peskined5b33222018-06-18 22:20:03 +0200714
Ronald Cron5425a212020-08-04 14:58:35 +0200715 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine06c28892019-11-26 18:07:46 +0100716 TEST_EQUAL( psa_get_key_type( &attributes ), expected_key_type );
717 TEST_EQUAL( psa_get_key_bits( &attributes ), expected_bits );
718 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), expected_usage );
719 TEST_EQUAL( psa_get_key_algorithm( &attributes ), expected_alg );
Gilles Peskined5b33222018-06-18 22:20:03 +0200720
721exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100722 /*
723 * Key attributes may have been returned by psa_get_key_attributes()
724 * thus reset them as required.
725 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +0200726 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100727
728 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200729 PSA_DONE( );
Gilles Peskined5b33222018-06-18 22:20:03 +0200730}
731/* END_CASE */
732
733/* BEGIN_CASE */
Gilles Peskine06c28892019-11-26 18:07:46 +0100734void check_key_policy( int type_arg, int bits_arg,
735 int usage_arg, int alg_arg )
736{
737 test_effective_key_attributes( type_arg, type_arg, bits_arg, bits_arg,
738 usage_arg, usage_arg, alg_arg, alg_arg );
739 goto exit;
740}
741/* END_CASE */
742
743/* BEGIN_CASE */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200744void key_attributes_init( )
Jaeden Amero70261c52019-01-04 11:47:20 +0000745{
746 /* Test each valid way of initializing the object, except for `= {0}`, as
747 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
748 * though it's OK by the C standard. We could test for this, but we'd need
749 * to supress the Clang warning for the test. */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200750 psa_key_attributes_t func = psa_key_attributes_init( );
751 psa_key_attributes_t init = PSA_KEY_ATTRIBUTES_INIT;
752 psa_key_attributes_t zero;
Jaeden Amero70261c52019-01-04 11:47:20 +0000753
754 memset( &zero, 0, sizeof( zero ) );
755
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200756 TEST_EQUAL( psa_get_key_lifetime( &func ), PSA_KEY_LIFETIME_VOLATILE );
757 TEST_EQUAL( psa_get_key_lifetime( &init ), PSA_KEY_LIFETIME_VOLATILE );
758 TEST_EQUAL( psa_get_key_lifetime( &zero ), PSA_KEY_LIFETIME_VOLATILE );
Jaeden Amero5229bbb2019-02-07 16:33:37 +0000759
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200760 TEST_EQUAL( psa_get_key_type( &func ), 0 );
761 TEST_EQUAL( psa_get_key_type( &init ), 0 );
762 TEST_EQUAL( psa_get_key_type( &zero ), 0 );
763
764 TEST_EQUAL( psa_get_key_bits( &func ), 0 );
765 TEST_EQUAL( psa_get_key_bits( &init ), 0 );
766 TEST_EQUAL( psa_get_key_bits( &zero ), 0 );
767
768 TEST_EQUAL( psa_get_key_usage_flags( &func ), 0 );
769 TEST_EQUAL( psa_get_key_usage_flags( &init ), 0 );
770 TEST_EQUAL( psa_get_key_usage_flags( &zero ), 0 );
771
772 TEST_EQUAL( psa_get_key_algorithm( &func ), 0 );
773 TEST_EQUAL( psa_get_key_algorithm( &init ), 0 );
774 TEST_EQUAL( psa_get_key_algorithm( &zero ), 0 );
Jaeden Amero70261c52019-01-04 11:47:20 +0000775}
776/* END_CASE */
777
778/* BEGIN_CASE */
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200779void mac_key_policy( int policy_usage,
780 int policy_alg,
781 int key_type,
782 data_t *key_data,
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100783 int exercise_alg,
784 int expected_status_arg )
Gilles Peskined5b33222018-06-18 22:20:03 +0200785{
Ronald Cron5425a212020-08-04 14:58:35 +0200786 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200787 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Amero769ce272019-01-04 11:48:03 +0000788 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200789 psa_status_t status;
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100790 psa_status_t expected_status = expected_status_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200791 unsigned char mac[PSA_MAC_MAX_SIZE];
Gilles Peskined5b33222018-06-18 22:20:03 +0200792
Gilles Peskine8817f612018-12-18 00:18:46 +0100793 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined5b33222018-06-18 22:20:03 +0200794
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200795 psa_set_key_usage_flags( &attributes, policy_usage );
796 psa_set_key_algorithm( &attributes, policy_alg );
797 psa_set_key_type( &attributes, key_type );
Gilles Peskined5b33222018-06-18 22:20:03 +0200798
Gilles Peskine049c7532019-05-15 20:22:09 +0200799 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +0200800 &key ) );
Gilles Peskined5b33222018-06-18 22:20:03 +0200801
Ronald Cron5425a212020-08-04 14:58:35 +0200802 status = psa_mac_sign_setup( &operation, key, exercise_alg );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100803 if( ( policy_usage & PSA_KEY_USAGE_SIGN_HASH ) == 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +0100804 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100805 else
806 TEST_EQUAL( status, expected_status );
807
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200808 psa_mac_abort( &operation );
Gilles Peskined5b33222018-06-18 22:20:03 +0200809
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200810 memset( mac, 0, sizeof( mac ) );
Ronald Cron5425a212020-08-04 14:58:35 +0200811 status = psa_mac_verify_setup( &operation, key, exercise_alg );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100812 if( ( policy_usage & PSA_KEY_USAGE_VERIFY_HASH ) == 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +0100813 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100814 else
815 TEST_EQUAL( status, expected_status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200816
817exit:
818 psa_mac_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +0200819 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200820 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200821}
822/* END_CASE */
823
824/* BEGIN_CASE */
825void cipher_key_policy( int policy_usage,
826 int policy_alg,
827 int key_type,
828 data_t *key_data,
829 int exercise_alg )
830{
Ronald Cron5425a212020-08-04 14:58:35 +0200831 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200832 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Amero5bae2272019-01-04 11:48:27 +0000833 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200834 psa_status_t status;
835
Gilles Peskine8817f612018-12-18 00:18:46 +0100836 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200837
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200838 psa_set_key_usage_flags( &attributes, policy_usage );
839 psa_set_key_algorithm( &attributes, policy_alg );
840 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200841
Gilles Peskine049c7532019-05-15 20:22:09 +0200842 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +0200843 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200844
Ronald Cron5425a212020-08-04 14:58:35 +0200845 status = psa_cipher_encrypt_setup( &operation, key, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200846 if( policy_alg == exercise_alg &&
847 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +0100848 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200849 else
Gilles Peskinefe11b722018-12-18 00:24:04 +0100850 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200851 psa_cipher_abort( &operation );
852
Ronald Cron5425a212020-08-04 14:58:35 +0200853 status = psa_cipher_decrypt_setup( &operation, key, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200854 if( policy_alg == exercise_alg &&
855 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 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
860exit:
861 psa_cipher_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +0200862 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200863 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200864}
865/* END_CASE */
866
867/* BEGIN_CASE */
868void aead_key_policy( int policy_usage,
869 int policy_alg,
870 int key_type,
871 data_t *key_data,
872 int nonce_length_arg,
873 int tag_length_arg,
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100874 int exercise_alg,
875 int expected_status_arg )
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200876{
Ronald Cron5425a212020-08-04 14:58:35 +0200877 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200878 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200879 psa_status_t status;
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100880 psa_status_t expected_status = expected_status_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200881 unsigned char nonce[16] = {0};
882 size_t nonce_length = nonce_length_arg;
883 unsigned char tag[16];
884 size_t tag_length = tag_length_arg;
885 size_t output_length;
886
887 TEST_ASSERT( nonce_length <= sizeof( nonce ) );
888 TEST_ASSERT( tag_length <= sizeof( tag ) );
889
Gilles Peskine8817f612018-12-18 00:18:46 +0100890 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200891
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200892 psa_set_key_usage_flags( &attributes, policy_usage );
893 psa_set_key_algorithm( &attributes, policy_alg );
894 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200895
Gilles Peskine049c7532019-05-15 20:22:09 +0200896 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +0200897 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200898
Ronald Cron5425a212020-08-04 14:58:35 +0200899 status = psa_aead_encrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200900 nonce, nonce_length,
901 NULL, 0,
902 NULL, 0,
903 tag, tag_length,
904 &output_length );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100905 if( ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
906 TEST_EQUAL( status, expected_status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200907 else
Gilles Peskinefe11b722018-12-18 00:24:04 +0100908 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200909
910 memset( tag, 0, sizeof( tag ) );
Ronald Cron5425a212020-08-04 14:58:35 +0200911 status = psa_aead_decrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200912 nonce, nonce_length,
913 NULL, 0,
914 tag, tag_length,
915 NULL, 0,
916 &output_length );
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100917 if( ( policy_usage & PSA_KEY_USAGE_DECRYPT ) == 0 )
918 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
919 else if( expected_status == PSA_SUCCESS )
Gilles Peskinefe11b722018-12-18 00:24:04 +0100920 TEST_EQUAL( status, PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200921 else
Steven Cooremanb3ce8152021-02-18 12:03:50 +0100922 TEST_EQUAL( status, expected_status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200923
924exit:
Ronald Cron5425a212020-08-04 14:58:35 +0200925 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200926 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200927}
928/* END_CASE */
929
930/* BEGIN_CASE */
931void asymmetric_encryption_key_policy( int policy_usage,
932 int policy_alg,
933 int key_type,
934 data_t *key_data,
935 int exercise_alg )
936{
Ronald Cron5425a212020-08-04 14:58:35 +0200937 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200938 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200939 psa_status_t status;
940 size_t key_bits;
941 size_t buffer_length;
942 unsigned char *buffer = NULL;
943 size_t output_length;
944
Gilles Peskine8817f612018-12-18 00:18:46 +0100945 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200946
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200947 psa_set_key_usage_flags( &attributes, policy_usage );
948 psa_set_key_algorithm( &attributes, policy_alg );
949 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200950
Gilles Peskine049c7532019-05-15 20:22:09 +0200951 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +0200952 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200953
Ronald Cron5425a212020-08-04 14:58:35 +0200954 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200955 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200956 buffer_length = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits,
957 exercise_alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200958 ASSERT_ALLOC( buffer, buffer_length );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200959
Ronald Cron5425a212020-08-04 14:58:35 +0200960 status = psa_asymmetric_encrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200961 NULL, 0,
962 NULL, 0,
963 buffer, buffer_length,
964 &output_length );
965 if( policy_alg == exercise_alg &&
966 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +0100967 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200968 else
Gilles Peskinefe11b722018-12-18 00:24:04 +0100969 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200970
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +0200971 if( buffer_length != 0 )
972 memset( buffer, 0, buffer_length );
Ronald Cron5425a212020-08-04 14:58:35 +0200973 status = psa_asymmetric_decrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200974 buffer, buffer_length,
975 NULL, 0,
976 buffer, buffer_length,
977 &output_length );
978 if( policy_alg == exercise_alg &&
979 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +0100980 TEST_EQUAL( status, PSA_ERROR_INVALID_PADDING );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200981 else
Gilles Peskinefe11b722018-12-18 00:24:04 +0100982 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200983
984exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100985 /*
986 * Key attributes may have been returned by psa_get_key_attributes()
987 * thus reset them as required.
988 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +0200989 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100990
991 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200992 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +0200993 mbedtls_free( buffer );
994}
995/* END_CASE */
996
997/* BEGIN_CASE */
998void asymmetric_signature_key_policy( int policy_usage,
999 int policy_alg,
1000 int key_type,
1001 data_t *key_data,
Gilles Peskine30f77cd2019-01-14 16:06:39 +01001002 int exercise_alg,
1003 int payload_length_arg )
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001004{
Ronald Cron5425a212020-08-04 14:58:35 +02001005 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001006 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001007 psa_status_t status;
Gilles Peskine30f77cd2019-01-14 16:06:39 +01001008 unsigned char payload[PSA_HASH_MAX_SIZE] = {1};
1009 /* If `payload_length_arg > 0`, `exercise_alg` is supposed to be
1010 * compatible with the policy and `payload_length_arg` is supposed to be
1011 * a valid input length to sign. If `payload_length_arg <= 0`,
1012 * `exercise_alg` is supposed to be forbidden by the policy. */
1013 int compatible_alg = payload_length_arg > 0;
1014 size_t payload_length = compatible_alg ? payload_length_arg : 0;
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001015 unsigned char signature[PSA_SIGNATURE_MAX_SIZE] = {0};
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001016 size_t signature_length;
1017
Gilles Peskine8817f612018-12-18 00:18:46 +01001018 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001019
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001020 psa_set_key_usage_flags( &attributes, policy_usage );
1021 psa_set_key_algorithm( &attributes, policy_alg );
1022 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001023
Gilles Peskine049c7532019-05-15 20:22:09 +02001024 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001025 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001026
Ronald Cron5425a212020-08-04 14:58:35 +02001027 status = psa_sign_hash( key, exercise_alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001028 payload, payload_length,
1029 signature, sizeof( signature ),
1030 &signature_length );
1031 if( compatible_alg && ( policy_usage & PSA_KEY_USAGE_SIGN_HASH ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001032 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001033 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001034 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001035
1036 memset( signature, 0, sizeof( signature ) );
Ronald Cron5425a212020-08-04 14:58:35 +02001037 status = psa_verify_hash( key, exercise_alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001038 payload, payload_length,
1039 signature, sizeof( signature ) );
1040 if( compatible_alg && ( policy_usage & PSA_KEY_USAGE_VERIFY_HASH ) != 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +01001041 TEST_EQUAL( status, PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001042 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001043 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskined5b33222018-06-18 22:20:03 +02001044
1045exit:
Ronald Cron5425a212020-08-04 14:58:35 +02001046 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001047 PSA_DONE( );
Gilles Peskined5b33222018-06-18 22:20:03 +02001048}
1049/* END_CASE */
1050
Janos Follathba3fab92019-06-11 14:50:16 +01001051/* BEGIN_CASE */
Gilles Peskineea0fb492018-07-12 17:17:20 +02001052void derive_key_policy( int policy_usage,
1053 int policy_alg,
1054 int key_type,
1055 data_t *key_data,
1056 int exercise_alg )
1057{
Ronald Cron5425a212020-08-04 14:58:35 +02001058 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001059 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001060 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02001061 psa_status_t status;
1062
Gilles Peskine8817f612018-12-18 00:18:46 +01001063 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001064
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001065 psa_set_key_usage_flags( &attributes, policy_usage );
1066 psa_set_key_algorithm( &attributes, policy_alg );
1067 psa_set_key_type( &attributes, key_type );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001068
Gilles Peskine049c7532019-05-15 20:22:09 +02001069 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001070 &key ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001071
Janos Follathba3fab92019-06-11 14:50:16 +01001072 PSA_ASSERT( psa_key_derivation_setup( &operation, exercise_alg ) );
1073
1074 if( PSA_ALG_IS_TLS12_PRF( exercise_alg ) ||
1075 PSA_ALG_IS_TLS12_PSK_TO_MS( exercise_alg ) )
Janos Follath0c1ed842019-06-28 13:35:36 +01001076 {
Janos Follathba3fab92019-06-11 14:50:16 +01001077 PSA_ASSERT( psa_key_derivation_input_bytes(
1078 &operation,
1079 PSA_KEY_DERIVATION_INPUT_SEED,
1080 (const uint8_t*) "", 0) );
Janos Follath0c1ed842019-06-28 13:35:36 +01001081 }
Janos Follathba3fab92019-06-11 14:50:16 +01001082
1083 status = psa_key_derivation_input_key( &operation,
1084 PSA_KEY_DERIVATION_INPUT_SECRET,
Ronald Cron5425a212020-08-04 14:58:35 +02001085 key );
Janos Follathba3fab92019-06-11 14:50:16 +01001086
Gilles Peskineea0fb492018-07-12 17:17:20 +02001087 if( policy_alg == exercise_alg &&
1088 ( policy_usage & PSA_KEY_USAGE_DERIVE ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001089 PSA_ASSERT( status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001090 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001091 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001092
1093exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001094 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001095 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001096 PSA_DONE( );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001097}
1098/* END_CASE */
1099
1100/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02001101void agreement_key_policy( int policy_usage,
1102 int policy_alg,
1103 int key_type_arg,
1104 data_t *key_data,
Steven Cooremance48e852020-10-05 16:02:45 +02001105 int exercise_alg,
1106 int expected_status_arg )
Gilles Peskine01d718c2018-09-18 12:01:02 +02001107{
Ronald Cron5425a212020-08-04 14:58:35 +02001108 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001109 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001110 psa_key_type_t key_type = key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001111 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001112 psa_status_t status;
Steven Cooremance48e852020-10-05 16:02:45 +02001113 psa_status_t expected_status = expected_status_arg;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001114
Gilles Peskine8817f612018-12-18 00:18:46 +01001115 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001116
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001117 psa_set_key_usage_flags( &attributes, policy_usage );
1118 psa_set_key_algorithm( &attributes, policy_alg );
1119 psa_set_key_type( &attributes, key_type );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001120
Gilles Peskine049c7532019-05-15 20:22:09 +02001121 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001122 &key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001123
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001124 PSA_ASSERT( psa_key_derivation_setup( &operation, exercise_alg ) );
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001125 status = mbedtls_test_psa_key_agreement_with_self( &operation, key );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001126
Steven Cooremance48e852020-10-05 16:02:45 +02001127 TEST_EQUAL( status, expected_status );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001128
1129exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001130 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001131 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001132 PSA_DONE( );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001133}
1134/* END_CASE */
1135
1136/* BEGIN_CASE */
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001137void key_policy_alg2( int key_type_arg, data_t *key_data,
1138 int usage_arg, int alg_arg, int alg2_arg )
1139{
Ronald Cron5425a212020-08-04 14:58:35 +02001140 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001141 psa_key_type_t key_type = key_type_arg;
1142 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1143 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
1144 psa_key_usage_t usage = usage_arg;
1145 psa_algorithm_t alg = alg_arg;
1146 psa_algorithm_t alg2 = alg2_arg;
1147
1148 PSA_ASSERT( psa_crypto_init( ) );
1149
1150 psa_set_key_usage_flags( &attributes, usage );
1151 psa_set_key_algorithm( &attributes, alg );
1152 psa_set_key_enrollment_algorithm( &attributes, alg2 );
1153 psa_set_key_type( &attributes, key_type );
1154 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001155 &key ) );
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001156
Ronald Cron5425a212020-08-04 14:58:35 +02001157 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001158 TEST_EQUAL( psa_get_key_usage_flags( &got_attributes ), usage );
1159 TEST_EQUAL( psa_get_key_algorithm( &got_attributes ), alg );
1160 TEST_EQUAL( psa_get_key_enrollment_algorithm( &got_attributes ), alg2 );
1161
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001162 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001163 goto exit;
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001164 if( ! mbedtls_test_psa_exercise_key( key, usage, alg2 ) )
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001165 goto exit;
1166
1167exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001168 /*
1169 * Key attributes may have been returned by psa_get_key_attributes()
1170 * thus reset them as required.
1171 */
1172 psa_reset_key_attributes( &got_attributes );
1173
Ronald Cron5425a212020-08-04 14:58:35 +02001174 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001175 PSA_DONE( );
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001176}
1177/* END_CASE */
1178
1179/* BEGIN_CASE */
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001180void raw_agreement_key_policy( int policy_usage,
1181 int policy_alg,
1182 int key_type_arg,
1183 data_t *key_data,
Steven Cooremance48e852020-10-05 16:02:45 +02001184 int exercise_alg,
1185 int expected_status_arg )
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001186{
Ronald Cron5425a212020-08-04 14:58:35 +02001187 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001188 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001189 psa_key_type_t key_type = key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001190 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001191 psa_status_t status;
Steven Cooremance48e852020-10-05 16:02:45 +02001192 psa_status_t expected_status = expected_status_arg;
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001193
1194 PSA_ASSERT( psa_crypto_init( ) );
1195
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001196 psa_set_key_usage_flags( &attributes, policy_usage );
1197 psa_set_key_algorithm( &attributes, policy_alg );
1198 psa_set_key_type( &attributes, key_type );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001199
Gilles Peskine049c7532019-05-15 20:22:09 +02001200 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001201 &key ) );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001202
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001203 status = mbedtls_test_psa_raw_key_agreement_with_self( exercise_alg, key );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001204
Steven Cooremance48e852020-10-05 16:02:45 +02001205 TEST_EQUAL( status, expected_status );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001206
1207exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001208 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001209 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001210 PSA_DONE( );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001211}
1212/* END_CASE */
1213
1214/* BEGIN_CASE */
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001215void copy_success( int source_usage_arg,
1216 int source_alg_arg, int source_alg2_arg,
Gilles Peskine4a644642019-05-03 17:14:08 +02001217 int type_arg, data_t *material,
1218 int copy_attributes,
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001219 int target_usage_arg,
1220 int target_alg_arg, int target_alg2_arg,
1221 int expected_usage_arg,
1222 int expected_alg_arg, int expected_alg2_arg )
Gilles Peskine57ab7212019-01-28 13:03:09 +01001223{
Gilles Peskineca25db92019-04-19 11:43:08 +02001224 psa_key_attributes_t source_attributes = PSA_KEY_ATTRIBUTES_INIT;
1225 psa_key_attributes_t target_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine57ab7212019-01-28 13:03:09 +01001226 psa_key_usage_t expected_usage = expected_usage_arg;
1227 psa_algorithm_t expected_alg = expected_alg_arg;
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001228 psa_algorithm_t expected_alg2 = expected_alg2_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02001229 mbedtls_svc_key_id_t source_key = MBEDTLS_SVC_KEY_ID_INIT;
1230 mbedtls_svc_key_id_t target_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine57ab7212019-01-28 13:03:09 +01001231 uint8_t *export_buffer = NULL;
1232
Gilles Peskine57ab7212019-01-28 13:03:09 +01001233 PSA_ASSERT( psa_crypto_init( ) );
1234
Gilles Peskineca25db92019-04-19 11:43:08 +02001235 /* Prepare the source key. */
1236 psa_set_key_usage_flags( &source_attributes, source_usage_arg );
1237 psa_set_key_algorithm( &source_attributes, source_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001238 psa_set_key_enrollment_algorithm( &source_attributes, source_alg2_arg );
Gilles Peskineca25db92019-04-19 11:43:08 +02001239 psa_set_key_type( &source_attributes, type_arg );
Gilles Peskine049c7532019-05-15 20:22:09 +02001240 PSA_ASSERT( psa_import_key( &source_attributes,
1241 material->x, material->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001242 &source_key ) );
1243 PSA_ASSERT( psa_get_key_attributes( source_key, &source_attributes ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001244
Gilles Peskineca25db92019-04-19 11:43:08 +02001245 /* Prepare the target attributes. */
1246 if( copy_attributes )
Ronald Cron65f38a32020-10-23 17:11:13 +02001247 {
Gilles Peskineca25db92019-04-19 11:43:08 +02001248 target_attributes = source_attributes;
Ronald Cron65f38a32020-10-23 17:11:13 +02001249 /* Set volatile lifetime to reset the key identifier to 0. */
1250 psa_set_key_lifetime( &target_attributes, PSA_KEY_LIFETIME_VOLATILE );
1251 }
1252
Gilles Peskineca25db92019-04-19 11:43:08 +02001253 if( target_usage_arg != -1 )
1254 psa_set_key_usage_flags( &target_attributes, target_usage_arg );
1255 if( target_alg_arg != -1 )
1256 psa_set_key_algorithm( &target_attributes, target_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001257 if( target_alg2_arg != -1 )
1258 psa_set_key_enrollment_algorithm( &target_attributes, target_alg2_arg );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001259
1260 /* Copy the key. */
Ronald Cron5425a212020-08-04 14:58:35 +02001261 PSA_ASSERT( psa_copy_key( source_key,
1262 &target_attributes, &target_key ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001263
1264 /* Destroy the source to ensure that this doesn't affect the target. */
Ronald Cron5425a212020-08-04 14:58:35 +02001265 PSA_ASSERT( psa_destroy_key( source_key ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001266
1267 /* Test that the target slot has the expected content and policy. */
Ronald Cron5425a212020-08-04 14:58:35 +02001268 PSA_ASSERT( psa_get_key_attributes( target_key, &target_attributes ) );
Gilles Peskineca25db92019-04-19 11:43:08 +02001269 TEST_EQUAL( psa_get_key_type( &source_attributes ),
1270 psa_get_key_type( &target_attributes ) );
1271 TEST_EQUAL( psa_get_key_bits( &source_attributes ),
1272 psa_get_key_bits( &target_attributes ) );
1273 TEST_EQUAL( expected_usage, psa_get_key_usage_flags( &target_attributes ) );
1274 TEST_EQUAL( expected_alg, psa_get_key_algorithm( &target_attributes ) );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001275 TEST_EQUAL( expected_alg2,
1276 psa_get_key_enrollment_algorithm( &target_attributes ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001277 if( expected_usage & PSA_KEY_USAGE_EXPORT )
1278 {
1279 size_t length;
1280 ASSERT_ALLOC( export_buffer, material->len );
Ronald Cron5425a212020-08-04 14:58:35 +02001281 PSA_ASSERT( psa_export_key( target_key, export_buffer,
Gilles Peskine57ab7212019-01-28 13:03:09 +01001282 material->len, &length ) );
1283 ASSERT_COMPARE( material->x, material->len,
1284 export_buffer, length );
1285 }
Steven Cooremanb3ce8152021-02-18 12:03:50 +01001286
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001287 if( ! mbedtls_test_psa_exercise_key( target_key, expected_usage, expected_alg ) )
Gilles Peskine57ab7212019-01-28 13:03:09 +01001288 goto exit;
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001289 if( ! mbedtls_test_psa_exercise_key( target_key, expected_usage, expected_alg2 ) )
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001290 goto exit;
Gilles Peskine57ab7212019-01-28 13:03:09 +01001291
Ronald Cron5425a212020-08-04 14:58:35 +02001292 PSA_ASSERT( psa_destroy_key( target_key ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001293
1294exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001295 /*
1296 * Source and target key attributes may have been returned by
1297 * psa_get_key_attributes() thus reset them as required.
1298 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02001299 psa_reset_key_attributes( &source_attributes );
1300 psa_reset_key_attributes( &target_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001301
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001302 PSA_DONE( );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001303 mbedtls_free( export_buffer );
1304}
1305/* END_CASE */
1306
1307/* BEGIN_CASE */
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001308void copy_fail( int source_usage_arg,
1309 int source_alg_arg, int source_alg2_arg,
Gilles Peskine4a644642019-05-03 17:14:08 +02001310 int type_arg, data_t *material,
1311 int target_type_arg, int target_bits_arg,
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001312 int target_usage_arg,
1313 int target_alg_arg, int target_alg2_arg,
Ronald Cron88a55462021-03-31 09:39:07 +02001314 int target_id_arg, int target_lifetime_arg,
Gilles Peskine4a644642019-05-03 17:14:08 +02001315 int expected_status_arg )
1316{
1317 psa_key_attributes_t source_attributes = PSA_KEY_ATTRIBUTES_INIT;
1318 psa_key_attributes_t target_attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +02001319 mbedtls_svc_key_id_t source_key = MBEDTLS_SVC_KEY_ID_INIT;
1320 mbedtls_svc_key_id_t target_key = MBEDTLS_SVC_KEY_ID_INIT;
Ronald Cron88a55462021-03-31 09:39:07 +02001321 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, target_id_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001322
1323 PSA_ASSERT( psa_crypto_init( ) );
1324
1325 /* Prepare the source key. */
1326 psa_set_key_usage_flags( &source_attributes, source_usage_arg );
1327 psa_set_key_algorithm( &source_attributes, source_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001328 psa_set_key_enrollment_algorithm( &source_attributes, source_alg2_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001329 psa_set_key_type( &source_attributes, type_arg );
Gilles Peskine049c7532019-05-15 20:22:09 +02001330 PSA_ASSERT( psa_import_key( &source_attributes,
1331 material->x, material->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001332 &source_key ) );
Gilles Peskine4a644642019-05-03 17:14:08 +02001333
1334 /* Prepare the target attributes. */
Ronald Cron88a55462021-03-31 09:39:07 +02001335 psa_set_key_id( &target_attributes, key_id );
1336 psa_set_key_lifetime( &target_attributes, target_lifetime_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001337 psa_set_key_type( &target_attributes, target_type_arg );
1338 psa_set_key_bits( &target_attributes, target_bits_arg );
1339 psa_set_key_usage_flags( &target_attributes, target_usage_arg );
1340 psa_set_key_algorithm( &target_attributes, target_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001341 psa_set_key_enrollment_algorithm( &target_attributes, target_alg2_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001342
1343 /* Try to copy the key. */
Ronald Cron5425a212020-08-04 14:58:35 +02001344 TEST_EQUAL( psa_copy_key( source_key,
1345 &target_attributes, &target_key ),
Gilles Peskine4a644642019-05-03 17:14:08 +02001346 expected_status_arg );
Gilles Peskine76b29a72019-05-28 14:08:50 +02001347
Ronald Cron5425a212020-08-04 14:58:35 +02001348 PSA_ASSERT( psa_destroy_key( source_key ) );
Gilles Peskine76b29a72019-05-28 14:08:50 +02001349
Gilles Peskine4a644642019-05-03 17:14:08 +02001350exit:
1351 psa_reset_key_attributes( &source_attributes );
1352 psa_reset_key_attributes( &target_attributes );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001353 PSA_DONE( );
Gilles Peskine4a644642019-05-03 17:14:08 +02001354}
1355/* END_CASE */
1356
1357/* BEGIN_CASE */
Jaeden Amero6a25b412019-01-04 11:47:44 +00001358void hash_operation_init( )
1359{
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001360 const uint8_t input[1] = { 0 };
Jaeden Amero6a25b412019-01-04 11:47:44 +00001361 /* Test each valid way of initializing the object, except for `= {0}`, as
1362 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
1363 * though it's OK by the C standard. We could test for this, but we'd need
1364 * to supress the Clang warning for the test. */
1365 psa_hash_operation_t func = psa_hash_operation_init( );
1366 psa_hash_operation_t init = PSA_HASH_OPERATION_INIT;
1367 psa_hash_operation_t zero;
1368
1369 memset( &zero, 0, sizeof( zero ) );
1370
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001371 /* A freshly-initialized hash operation should not be usable. */
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001372 TEST_EQUAL( psa_hash_update( &func, input, sizeof( input ) ),
1373 PSA_ERROR_BAD_STATE );
1374 TEST_EQUAL( psa_hash_update( &init, input, sizeof( input ) ),
1375 PSA_ERROR_BAD_STATE );
1376 TEST_EQUAL( psa_hash_update( &zero, input, sizeof( input ) ),
1377 PSA_ERROR_BAD_STATE );
1378
Jaeden Amero5229bbb2019-02-07 16:33:37 +00001379 /* A default hash operation should be abortable without error. */
1380 PSA_ASSERT( psa_hash_abort( &func ) );
1381 PSA_ASSERT( psa_hash_abort( &init ) );
1382 PSA_ASSERT( psa_hash_abort( &zero ) );
Jaeden Amero6a25b412019-01-04 11:47:44 +00001383}
1384/* END_CASE */
1385
1386/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001387void hash_setup( int alg_arg,
1388 int expected_status_arg )
1389{
1390 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001391 psa_status_t expected_status = expected_status_arg;
Jaeden Amero6a25b412019-01-04 11:47:44 +00001392 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001393 psa_status_t status;
1394
Gilles Peskine8817f612018-12-18 00:18:46 +01001395 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001396
Gilles Peskineda8191d1c2018-07-08 19:46:38 +02001397 status = psa_hash_setup( &operation, alg );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001398 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001399
Gilles Peskine9e0a4a52019-02-25 22:11:18 +01001400 /* Whether setup succeeded or failed, abort must succeed. */
1401 PSA_ASSERT( psa_hash_abort( &operation ) );
1402
1403 /* If setup failed, reproduce the failure, so as to
1404 * test the resulting state of the operation object. */
1405 if( status != PSA_SUCCESS )
1406 TEST_EQUAL( psa_hash_setup( &operation, alg ), status );
1407
Gilles Peskinef426e0f2019-02-25 17:42:03 +01001408 /* Now the operation object should be reusable. */
1409#if defined(KNOWN_SUPPORTED_HASH_ALG)
1410 PSA_ASSERT( psa_hash_setup( &operation, KNOWN_SUPPORTED_HASH_ALG ) );
1411 PSA_ASSERT( psa_hash_abort( &operation ) );
1412#endif
1413
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001414exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001415 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001416}
1417/* END_CASE */
1418
1419/* BEGIN_CASE */
Gilles Peskine0a749c82019-11-28 19:33:58 +01001420void hash_compute_fail( int alg_arg, data_t *input,
1421 int output_size_arg, int expected_status_arg )
1422{
1423 psa_algorithm_t alg = alg_arg;
1424 uint8_t *output = NULL;
1425 size_t output_size = output_size_arg;
1426 size_t output_length = INVALID_EXPORT_LENGTH;
1427 psa_status_t expected_status = expected_status_arg;
1428 psa_status_t status;
1429
1430 ASSERT_ALLOC( output, output_size );
1431
1432 PSA_ASSERT( psa_crypto_init( ) );
1433
1434 status = psa_hash_compute( alg, input->x, input->len,
1435 output, output_size, &output_length );
1436 TEST_EQUAL( status, expected_status );
1437 TEST_ASSERT( output_length <= output_size );
1438
1439exit:
1440 mbedtls_free( output );
1441 PSA_DONE( );
1442}
1443/* END_CASE */
1444
1445/* BEGIN_CASE */
Gilles Peskine88e08462020-01-28 20:43:00 +01001446void hash_compare_fail( int alg_arg, data_t *input,
1447 data_t *reference_hash,
1448 int expected_status_arg )
1449{
1450 psa_algorithm_t alg = alg_arg;
1451 psa_status_t expected_status = expected_status_arg;
1452 psa_status_t status;
1453
1454 PSA_ASSERT( psa_crypto_init( ) );
1455
1456 status = psa_hash_compare( alg, input->x, input->len,
1457 reference_hash->x, reference_hash->len );
1458 TEST_EQUAL( status, expected_status );
1459
1460exit:
1461 PSA_DONE( );
1462}
1463/* END_CASE */
1464
1465/* BEGIN_CASE */
Gilles Peskine0a749c82019-11-28 19:33:58 +01001466void hash_compute_compare( int alg_arg, data_t *input,
1467 data_t *expected_output )
1468{
1469 psa_algorithm_t alg = alg_arg;
1470 uint8_t output[PSA_HASH_MAX_SIZE + 1];
1471 size_t output_length = INVALID_EXPORT_LENGTH;
1472 size_t i;
1473
1474 PSA_ASSERT( psa_crypto_init( ) );
1475
1476 /* Compute with tight buffer */
1477 PSA_ASSERT( psa_hash_compute( alg, input->x, input->len,
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001478 output, PSA_HASH_LENGTH( alg ),
Gilles Peskine0a749c82019-11-28 19:33:58 +01001479 &output_length ) );
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001480 TEST_EQUAL( output_length, PSA_HASH_LENGTH( alg ) );
Gilles Peskine0a749c82019-11-28 19:33:58 +01001481 ASSERT_COMPARE( output, output_length,
1482 expected_output->x, expected_output->len );
1483
1484 /* Compute with larger buffer */
1485 PSA_ASSERT( psa_hash_compute( alg, input->x, input->len,
1486 output, sizeof( output ),
1487 &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 /* Compare with correct hash */
1493 PSA_ASSERT( psa_hash_compare( alg, input->x, input->len,
1494 output, output_length ) );
1495
1496 /* Compare with trailing garbage */
1497 TEST_EQUAL( psa_hash_compare( alg, input->x, input->len,
1498 output, output_length + 1 ),
1499 PSA_ERROR_INVALID_SIGNATURE );
1500
1501 /* Compare with truncated hash */
1502 TEST_EQUAL( psa_hash_compare( alg, input->x, input->len,
1503 output, output_length - 1 ),
1504 PSA_ERROR_INVALID_SIGNATURE );
1505
1506 /* Compare with corrupted value */
1507 for( i = 0; i < output_length; i++ )
1508 {
Chris Jones9634bb12021-01-20 15:56:42 +00001509 mbedtls_test_set_step( i );
Gilles Peskine0a749c82019-11-28 19:33:58 +01001510 output[i] ^= 1;
1511 TEST_EQUAL( psa_hash_compare( alg, input->x, input->len,
1512 output, output_length ),
1513 PSA_ERROR_INVALID_SIGNATURE );
1514 output[i] ^= 1;
1515 }
1516
1517exit:
1518 PSA_DONE( );
1519}
1520/* END_CASE */
1521
Gilles Peskined6dc40c2021-01-12 12:55:31 +01001522/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
itayzafrirf86548d2018-11-01 10:44:32 +02001523void hash_bad_order( )
1524{
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001525 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrirf86548d2018-11-01 10:44:32 +02001526 unsigned char input[] = "";
1527 /* SHA-256 hash of an empty string */
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001528 const unsigned char valid_hash[] = {
itayzafrirf86548d2018-11-01 10:44:32 +02001529 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
1530 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
1531 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55 };
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001532 unsigned char hash[sizeof(valid_hash)] = { 0 };
itayzafrirf86548d2018-11-01 10:44:32 +02001533 size_t hash_len;
Jaeden Amero6a25b412019-01-04 11:47:44 +00001534 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirf86548d2018-11-01 10:44:32 +02001535
Gilles Peskine8817f612018-12-18 00:18:46 +01001536 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirf86548d2018-11-01 10:44:32 +02001537
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001538 /* Call setup twice in a row. */
1539 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
1540 TEST_EQUAL( psa_hash_setup( &operation, alg ),
1541 PSA_ERROR_BAD_STATE );
1542 PSA_ASSERT( psa_hash_abort( &operation ) );
1543
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001544 /* Call update without calling setup beforehand. */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001545 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001546 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001547 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02001548
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001549 /* Call update after finish. */
1550 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
1551 PSA_ASSERT( psa_hash_finish( &operation,
1552 hash, sizeof( hash ), &hash_len ) );
1553 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001554 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001555 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02001556
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001557 /* Call verify without calling setup beforehand. */
1558 TEST_EQUAL( psa_hash_verify( &operation,
1559 valid_hash, sizeof( valid_hash ) ),
1560 PSA_ERROR_BAD_STATE );
1561 PSA_ASSERT( psa_hash_abort( &operation ) );
1562
1563 /* Call verify after finish. */
1564 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
1565 PSA_ASSERT( psa_hash_finish( &operation,
1566 hash, sizeof( hash ), &hash_len ) );
1567 TEST_EQUAL( psa_hash_verify( &operation,
1568 valid_hash, sizeof( valid_hash ) ),
1569 PSA_ERROR_BAD_STATE );
1570 PSA_ASSERT( psa_hash_abort( &operation ) );
1571
1572 /* Call verify twice in a row. */
1573 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
1574 PSA_ASSERT( psa_hash_verify( &operation,
1575 valid_hash, sizeof( valid_hash ) ) );
1576 TEST_EQUAL( psa_hash_verify( &operation,
1577 valid_hash, sizeof( valid_hash ) ),
1578 PSA_ERROR_BAD_STATE );
1579 PSA_ASSERT( psa_hash_abort( &operation ) );
1580
1581 /* Call finish without calling setup beforehand. */
Gilles Peskinefe11b722018-12-18 00:24:04 +01001582 TEST_EQUAL( psa_hash_finish( &operation,
1583 hash, sizeof( hash ), &hash_len ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001584 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001585 PSA_ASSERT( psa_hash_abort( &operation ) );
1586
1587 /* Call finish twice in a row. */
1588 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
1589 PSA_ASSERT( psa_hash_finish( &operation,
1590 hash, sizeof( hash ), &hash_len ) );
1591 TEST_EQUAL( psa_hash_finish( &operation,
1592 hash, sizeof( hash ), &hash_len ),
1593 PSA_ERROR_BAD_STATE );
1594 PSA_ASSERT( psa_hash_abort( &operation ) );
1595
1596 /* Call finish after calling verify. */
1597 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
1598 PSA_ASSERT( psa_hash_verify( &operation,
1599 valid_hash, sizeof( valid_hash ) ) );
1600 TEST_EQUAL( psa_hash_finish( &operation,
1601 hash, sizeof( hash ), &hash_len ),
1602 PSA_ERROR_BAD_STATE );
1603 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02001604
1605exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001606 PSA_DONE( );
itayzafrirf86548d2018-11-01 10:44:32 +02001607}
1608/* END_CASE */
1609
Gilles Peskined6dc40c2021-01-12 12:55:31 +01001610/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
itayzafrir27e69452018-11-01 14:26:34 +02001611void hash_verify_bad_args( )
itayzafrirec93d302018-10-18 18:01:10 +03001612{
1613 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrir27e69452018-11-01 14:26:34 +02001614 /* SHA-256 hash of an empty string with 2 extra bytes (0xaa and 0xbb)
1615 * appended to it */
1616 unsigned char hash[] = {
1617 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
1618 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
1619 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55, 0xaa, 0xbb };
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001620 size_t expected_size = PSA_HASH_LENGTH( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00001621 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirec93d302018-10-18 18:01:10 +03001622
Gilles Peskine8817f612018-12-18 00:18:46 +01001623 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirec93d302018-10-18 18:01:10 +03001624
itayzafrir27e69452018-11-01 14:26:34 +02001625 /* psa_hash_verify with a smaller hash than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01001626 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001627 TEST_EQUAL( psa_hash_verify( &operation, hash, expected_size - 1 ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01001628 PSA_ERROR_INVALID_SIGNATURE );
itayzafrirec93d302018-10-18 18:01:10 +03001629
itayzafrir27e69452018-11-01 14:26:34 +02001630 /* psa_hash_verify with a non-matching hash */
Gilles Peskine8817f612018-12-18 00:18:46 +01001631 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001632 TEST_EQUAL( psa_hash_verify( &operation, hash + 1, expected_size ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01001633 PSA_ERROR_INVALID_SIGNATURE );
itayzafrirec93d302018-10-18 18:01:10 +03001634
itayzafrir27e69452018-11-01 14:26:34 +02001635 /* psa_hash_verify with a hash longer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01001636 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001637 TEST_EQUAL( psa_hash_verify( &operation, hash, sizeof( hash ) ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01001638 PSA_ERROR_INVALID_SIGNATURE );
itayzafrir4271df92018-10-24 18:16:19 +03001639
itayzafrirec93d302018-10-18 18:01:10 +03001640exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001641 PSA_DONE( );
itayzafrirec93d302018-10-18 18:01:10 +03001642}
1643/* END_CASE */
1644
Ronald Cronee414c72021-03-18 18:50:08 +01001645/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
itayzafrirb2dd5ed2018-11-01 11:58:59 +02001646void hash_finish_bad_args( )
itayzafrir58028322018-10-25 10:22:01 +03001647{
1648 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrirb2dd5ed2018-11-01 11:58:59 +02001649 unsigned char hash[PSA_HASH_MAX_SIZE];
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001650 size_t expected_size = PSA_HASH_LENGTH( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00001651 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrir58028322018-10-25 10:22:01 +03001652 size_t hash_len;
1653
Gilles Peskine8817f612018-12-18 00:18:46 +01001654 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir58028322018-10-25 10:22:01 +03001655
itayzafrir58028322018-10-25 10:22:01 +03001656 /* psa_hash_finish with a smaller hash buffer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01001657 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001658 TEST_EQUAL( psa_hash_finish( &operation,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01001659 hash, expected_size - 1, &hash_len ),
1660 PSA_ERROR_BUFFER_TOO_SMALL );
itayzafrir58028322018-10-25 10:22:01 +03001661
1662exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001663 PSA_DONE( );
itayzafrir58028322018-10-25 10:22:01 +03001664}
1665/* END_CASE */
1666
Ronald Cronee414c72021-03-18 18:50:08 +01001667/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01001668void hash_clone_source_state( )
1669{
1670 psa_algorithm_t alg = PSA_ALG_SHA_256;
1671 unsigned char hash[PSA_HASH_MAX_SIZE];
1672 psa_hash_operation_t op_source = PSA_HASH_OPERATION_INIT;
1673 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
1674 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
1675 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
1676 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
1677 size_t hash_len;
1678
1679 PSA_ASSERT( psa_crypto_init( ) );
1680 PSA_ASSERT( psa_hash_setup( &op_source, alg ) );
1681
1682 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
1683 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
1684 PSA_ASSERT( psa_hash_finish( &op_finished,
1685 hash, sizeof( hash ), &hash_len ) );
1686 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
1687 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
1688
1689 TEST_EQUAL( psa_hash_clone( &op_source, &op_setup ),
1690 PSA_ERROR_BAD_STATE );
1691
1692 PSA_ASSERT( psa_hash_clone( &op_source, &op_init ) );
1693 PSA_ASSERT( psa_hash_finish( &op_init,
1694 hash, sizeof( hash ), &hash_len ) );
1695 PSA_ASSERT( psa_hash_clone( &op_source, &op_finished ) );
1696 PSA_ASSERT( psa_hash_finish( &op_finished,
1697 hash, sizeof( hash ), &hash_len ) );
1698 PSA_ASSERT( psa_hash_clone( &op_source, &op_aborted ) );
1699 PSA_ASSERT( psa_hash_finish( &op_aborted,
1700 hash, sizeof( hash ), &hash_len ) );
1701
1702exit:
1703 psa_hash_abort( &op_source );
1704 psa_hash_abort( &op_init );
1705 psa_hash_abort( &op_setup );
1706 psa_hash_abort( &op_finished );
1707 psa_hash_abort( &op_aborted );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001708 PSA_DONE( );
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01001709}
1710/* END_CASE */
1711
Ronald Cronee414c72021-03-18 18:50:08 +01001712/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01001713void hash_clone_target_state( )
1714{
1715 psa_algorithm_t alg = PSA_ALG_SHA_256;
1716 unsigned char hash[PSA_HASH_MAX_SIZE];
1717 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
1718 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
1719 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
1720 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
1721 psa_hash_operation_t op_target = PSA_HASH_OPERATION_INIT;
1722 size_t hash_len;
1723
1724 PSA_ASSERT( psa_crypto_init( ) );
1725
1726 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
1727 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
1728 PSA_ASSERT( psa_hash_finish( &op_finished,
1729 hash, sizeof( hash ), &hash_len ) );
1730 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
1731 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
1732
1733 PSA_ASSERT( psa_hash_clone( &op_setup, &op_target ) );
1734 PSA_ASSERT( psa_hash_finish( &op_target,
1735 hash, sizeof( hash ), &hash_len ) );
1736
1737 TEST_EQUAL( psa_hash_clone( &op_init, &op_target ), PSA_ERROR_BAD_STATE );
1738 TEST_EQUAL( psa_hash_clone( &op_finished, &op_target ),
1739 PSA_ERROR_BAD_STATE );
1740 TEST_EQUAL( psa_hash_clone( &op_aborted, &op_target ),
1741 PSA_ERROR_BAD_STATE );
1742
1743exit:
1744 psa_hash_abort( &op_target );
1745 psa_hash_abort( &op_init );
1746 psa_hash_abort( &op_setup );
1747 psa_hash_abort( &op_finished );
1748 psa_hash_abort( &op_aborted );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001749 PSA_DONE( );
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01001750}
1751/* END_CASE */
1752
itayzafrir58028322018-10-25 10:22:01 +03001753/* BEGIN_CASE */
Jaeden Amero769ce272019-01-04 11:48:03 +00001754void mac_operation_init( )
1755{
Jaeden Amero252ef282019-02-15 14:05:35 +00001756 const uint8_t input[1] = { 0 };
1757
Jaeden Amero769ce272019-01-04 11:48:03 +00001758 /* Test each valid way of initializing the object, except for `= {0}`, as
1759 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
1760 * though it's OK by the C standard. We could test for this, but we'd need
1761 * to supress the Clang warning for the test. */
1762 psa_mac_operation_t func = psa_mac_operation_init( );
1763 psa_mac_operation_t init = PSA_MAC_OPERATION_INIT;
1764 psa_mac_operation_t zero;
1765
1766 memset( &zero, 0, sizeof( zero ) );
1767
Jaeden Amero252ef282019-02-15 14:05:35 +00001768 /* A freshly-initialized MAC operation should not be usable. */
1769 TEST_EQUAL( psa_mac_update( &func,
1770 input, sizeof( input ) ),
1771 PSA_ERROR_BAD_STATE );
1772 TEST_EQUAL( psa_mac_update( &init,
1773 input, sizeof( input ) ),
1774 PSA_ERROR_BAD_STATE );
1775 TEST_EQUAL( psa_mac_update( &zero,
1776 input, sizeof( input ) ),
1777 PSA_ERROR_BAD_STATE );
1778
Jaeden Amero5229bbb2019-02-07 16:33:37 +00001779 /* A default MAC operation should be abortable without error. */
1780 PSA_ASSERT( psa_mac_abort( &func ) );
1781 PSA_ASSERT( psa_mac_abort( &init ) );
1782 PSA_ASSERT( psa_mac_abort( &zero ) );
Jaeden Amero769ce272019-01-04 11:48:03 +00001783}
1784/* END_CASE */
1785
1786/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001787void mac_setup( int key_type_arg,
1788 data_t *key,
1789 int alg_arg,
1790 int expected_status_arg )
1791{
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001792 psa_key_type_t key_type = key_type_arg;
1793 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001794 psa_status_t expected_status = expected_status_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00001795 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskinef426e0f2019-02-25 17:42:03 +01001796 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
1797#if defined(KNOWN_SUPPORTED_MAC_ALG)
1798 const uint8_t smoke_test_key_data[16] = "kkkkkkkkkkkkkkkk";
1799#endif
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001800
Gilles Peskine8817f612018-12-18 00:18:46 +01001801 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001802
Gilles Peskinef426e0f2019-02-25 17:42:03 +01001803 if( ! exercise_mac_setup( key_type, key->x, key->len, alg,
1804 &operation, &status ) )
1805 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +01001806 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001807
Gilles Peskinef426e0f2019-02-25 17:42:03 +01001808 /* The operation object should be reusable. */
1809#if defined(KNOWN_SUPPORTED_MAC_ALG)
1810 if( ! exercise_mac_setup( KNOWN_SUPPORTED_MAC_KEY_TYPE,
1811 smoke_test_key_data,
1812 sizeof( smoke_test_key_data ),
1813 KNOWN_SUPPORTED_MAC_ALG,
1814 &operation, &status ) )
1815 goto exit;
1816 TEST_EQUAL( status, PSA_SUCCESS );
1817#endif
1818
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001819exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001820 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001821}
1822/* END_CASE */
1823
Gilles Peskined6dc40c2021-01-12 12:55:31 +01001824/* 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 +00001825void mac_bad_order( )
1826{
Ronald Cron5425a212020-08-04 14:58:35 +02001827 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Jaeden Amero252ef282019-02-15 14:05:35 +00001828 psa_key_type_t key_type = PSA_KEY_TYPE_HMAC;
1829 psa_algorithm_t alg = PSA_ALG_HMAC(PSA_ALG_SHA_256);
Ronald Cron5425a212020-08-04 14:58:35 +02001830 const uint8_t key_data[] = {
Jaeden Amero252ef282019-02-15 14:05:35 +00001831 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1832 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1833 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001834 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Amero252ef282019-02-15 14:05:35 +00001835 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
1836 uint8_t sign_mac[PSA_MAC_MAX_SIZE + 10] = { 0 };
1837 size_t sign_mac_length = 0;
1838 const uint8_t input[] = { 0xbb, 0xbb, 0xbb, 0xbb };
1839 const uint8_t verify_mac[] = {
1840 0x74, 0x65, 0x93, 0x8c, 0xeb, 0x1d, 0xb3, 0x76, 0x5a, 0x38, 0xe7, 0xdd,
1841 0x85, 0xc5, 0xad, 0x4f, 0x07, 0xe7, 0xd5, 0xb2, 0x64, 0xf0, 0x1a, 0x1a,
1842 0x2c, 0xf9, 0x18, 0xca, 0x59, 0x7e, 0x5d, 0xf6 };
1843
1844 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001845 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001846 psa_set_key_algorithm( &attributes, alg );
1847 psa_set_key_type( &attributes, key_type );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001848
Ronald Cron5425a212020-08-04 14:58:35 +02001849 PSA_ASSERT( psa_import_key( &attributes, key_data, sizeof( key_data ),
1850 &key ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001851
Jaeden Amero252ef282019-02-15 14:05:35 +00001852 /* Call update without calling setup beforehand. */
1853 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
1854 PSA_ERROR_BAD_STATE );
1855 PSA_ASSERT( psa_mac_abort( &operation ) );
1856
1857 /* Call sign finish without calling setup beforehand. */
1858 TEST_EQUAL( psa_mac_sign_finish( &operation, sign_mac, sizeof( sign_mac ),
1859 &sign_mac_length),
1860 PSA_ERROR_BAD_STATE );
1861 PSA_ASSERT( psa_mac_abort( &operation ) );
1862
1863 /* Call verify finish without calling setup beforehand. */
1864 TEST_EQUAL( psa_mac_verify_finish( &operation,
1865 verify_mac, sizeof( verify_mac ) ),
1866 PSA_ERROR_BAD_STATE );
1867 PSA_ASSERT( psa_mac_abort( &operation ) );
1868
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001869 /* Call setup twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02001870 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
1871 TEST_EQUAL( psa_mac_sign_setup( &operation, key, alg ),
Jaeden Amero36ee5d02019-02-19 09:25:10 +00001872 PSA_ERROR_BAD_STATE );
1873 PSA_ASSERT( psa_mac_abort( &operation ) );
1874
Jaeden Amero252ef282019-02-15 14:05:35 +00001875 /* Call update after sign finish. */
Ronald Cron5425a212020-08-04 14:58:35 +02001876 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001877 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
1878 PSA_ASSERT( psa_mac_sign_finish( &operation,
1879 sign_mac, sizeof( sign_mac ),
1880 &sign_mac_length ) );
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 update after verify finish. */
Ronald Cron5425a212020-08-04 14:58:35 +02001886 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001887 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
1888 PSA_ASSERT( psa_mac_verify_finish( &operation,
1889 verify_mac, sizeof( verify_mac ) ) );
1890 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
1891 PSA_ERROR_BAD_STATE );
1892 PSA_ASSERT( psa_mac_abort( &operation ) );
1893
1894 /* Call sign finish twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02001895 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001896 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
1897 PSA_ASSERT( psa_mac_sign_finish( &operation,
1898 sign_mac, sizeof( sign_mac ),
1899 &sign_mac_length ) );
1900 TEST_EQUAL( psa_mac_sign_finish( &operation,
1901 sign_mac, sizeof( sign_mac ),
1902 &sign_mac_length ),
1903 PSA_ERROR_BAD_STATE );
1904 PSA_ASSERT( psa_mac_abort( &operation ) );
1905
1906 /* Call verify finish twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02001907 PSA_ASSERT( psa_mac_verify_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_verify_finish( &operation,
1910 verify_mac, sizeof( verify_mac ) ) );
1911 TEST_EQUAL( psa_mac_verify_finish( &operation,
1912 verify_mac, sizeof( verify_mac ) ),
1913 PSA_ERROR_BAD_STATE );
1914 PSA_ASSERT( psa_mac_abort( &operation ) );
1915
1916 /* Setup sign but try verify. */
Ronald Cron5425a212020-08-04 14:58:35 +02001917 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001918 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
1919 TEST_EQUAL( psa_mac_verify_finish( &operation,
1920 verify_mac, sizeof( verify_mac ) ),
1921 PSA_ERROR_BAD_STATE );
1922 PSA_ASSERT( psa_mac_abort( &operation ) );
1923
1924 /* Setup verify but try sign. */
Ronald Cron5425a212020-08-04 14:58:35 +02001925 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00001926 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
1927 TEST_EQUAL( psa_mac_sign_finish( &operation,
1928 sign_mac, sizeof( sign_mac ),
1929 &sign_mac_length ),
1930 PSA_ERROR_BAD_STATE );
1931 PSA_ASSERT( psa_mac_abort( &operation ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001932
Ronald Cron5425a212020-08-04 14:58:35 +02001933 PSA_ASSERT( psa_destroy_key( key ) );
Gilles Peskine76b29a72019-05-28 14:08:50 +02001934
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001935exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001936 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001937}
1938/* END_CASE */
1939
1940/* BEGIN_CASE */
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001941void mac_sign( int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02001942 data_t *key_data,
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001943 int alg_arg,
1944 data_t *input,
1945 data_t *expected_mac )
1946{
Ronald Cron5425a212020-08-04 14:58:35 +02001947 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001948 psa_key_type_t key_type = key_type_arg;
1949 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00001950 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001951 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine5e65cec2020-08-25 23:38:39 +02001952 uint8_t *actual_mac = NULL;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001953 size_t mac_buffer_size =
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001954 PSA_MAC_LENGTH( key_type, PSA_BYTES_TO_BITS( key_data->len ), alg );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001955 size_t mac_length = 0;
Gilles Peskine8b356b52020-08-25 23:44:59 +02001956 const size_t output_sizes_to_test[] = {
1957 0,
1958 1,
1959 expected_mac->len - 1,
1960 expected_mac->len,
1961 expected_mac->len + 1,
1962 };
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001963
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001964 TEST_ASSERT( mac_buffer_size <= PSA_MAC_MAX_SIZE );
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001965 /* We expect PSA_MAC_LENGTH to be exact. */
Gilles Peskine3d404d62020-08-25 23:47:36 +02001966 TEST_ASSERT( expected_mac->len == mac_buffer_size );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001967
Gilles Peskine8817f612018-12-18 00:18:46 +01001968 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001969
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001970 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001971 psa_set_key_algorithm( &attributes, alg );
1972 psa_set_key_type( &attributes, key_type );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001973
Ronald Cron5425a212020-08-04 14:58:35 +02001974 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
1975 &key ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001976
Gilles Peskine8b356b52020-08-25 23:44:59 +02001977 for( size_t i = 0; i < ARRAY_LENGTH( output_sizes_to_test ); i++ )
1978 {
1979 const size_t output_size = output_sizes_to_test[i];
1980 psa_status_t expected_status =
1981 ( output_size >= expected_mac->len ? PSA_SUCCESS :
1982 PSA_ERROR_BUFFER_TOO_SMALL );
Gilles Peskine5e65cec2020-08-25 23:38:39 +02001983
Chris Jones9634bb12021-01-20 15:56:42 +00001984 mbedtls_test_set_step( output_size );
Gilles Peskine8b356b52020-08-25 23:44:59 +02001985 ASSERT_ALLOC( actual_mac, output_size );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02001986
gabor-mezei-arm534bb992021-03-01 15:35:48 +01001987 /* Calculate the MAC, one-shot case. */
1988 TEST_EQUAL( psa_mac_compute( key, alg,
1989 input->x, input->len,
1990 actual_mac, output_size, &mac_length ),
1991 expected_status );
1992 if( expected_status == PSA_SUCCESS )
1993 {
1994 ASSERT_COMPARE( expected_mac->x, expected_mac->len,
1995 actual_mac, mac_length );
1996 }
1997
1998 if( output_size > 0 )
1999 memset( actual_mac, 0, output_size );
2000
2001 /* Calculate the MAC, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002002 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Gilles Peskine8b356b52020-08-25 23:44:59 +02002003 PSA_ASSERT( psa_mac_update( &operation,
2004 input->x, input->len ) );
2005 TEST_EQUAL( psa_mac_sign_finish( &operation,
2006 actual_mac, output_size,
2007 &mac_length ),
2008 expected_status );
2009 PSA_ASSERT( psa_mac_abort( &operation ) );
2010
2011 if( expected_status == PSA_SUCCESS )
2012 {
2013 ASSERT_COMPARE( expected_mac->x, expected_mac->len,
2014 actual_mac, mac_length );
2015 }
2016 mbedtls_free( actual_mac );
2017 actual_mac = NULL;
2018 }
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002019
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002020exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002021 psa_mac_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002022 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002023 PSA_DONE( );
Gilles Peskine5e65cec2020-08-25 23:38:39 +02002024 mbedtls_free( actual_mac );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002025}
2026/* END_CASE */
2027
2028/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002029void mac_verify( int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002030 data_t *key_data,
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002031 int alg_arg,
2032 data_t *input,
2033 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +01002034{
Ronald Cron5425a212020-08-04 14:58:35 +02002035 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002036 psa_key_type_t key_type = key_type_arg;
2037 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002038 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002039 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002040 uint8_t *perturbed_mac = NULL;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002041
Gilles Peskine69c12672018-06-28 00:07:19 +02002042 TEST_ASSERT( expected_mac->len <= PSA_MAC_MAX_SIZE );
2043
Gilles Peskine8817f612018-12-18 00:18:46 +01002044 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002045
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01002046 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002047 psa_set_key_algorithm( &attributes, alg );
2048 psa_set_key_type( &attributes, key_type );
mohammad16036df908f2018-04-02 08:34:15 -07002049
Ronald Cron5425a212020-08-04 14:58:35 +02002050 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2051 &key ) );
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002052
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002053 /* Verify correct MAC, one-shot case. */
2054 PSA_ASSERT( psa_mac_verify( key, alg, input->x, input->len,
2055 expected_mac->x, expected_mac->len ) );
2056
2057 /* Verify correct MAC, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002058 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine8817f612018-12-18 00:18:46 +01002059 PSA_ASSERT( psa_mac_update( &operation,
2060 input->x, input->len ) );
2061 PSA_ASSERT( psa_mac_verify_finish( &operation,
2062 expected_mac->x,
2063 expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002064
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002065 /* Test a MAC that's too short, one-shot case. */
2066 TEST_EQUAL( psa_mac_verify( key, alg,
2067 input->x, input->len,
2068 expected_mac->x,
2069 expected_mac->len - 1 ),
2070 PSA_ERROR_INVALID_SIGNATURE );
2071
2072 /* Test a MAC that's too short, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002073 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002074 PSA_ASSERT( psa_mac_update( &operation,
2075 input->x, input->len ) );
2076 TEST_EQUAL( psa_mac_verify_finish( &operation,
2077 expected_mac->x,
2078 expected_mac->len - 1 ),
2079 PSA_ERROR_INVALID_SIGNATURE );
2080
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002081 /* Test a MAC that's too long, one-shot case. */
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002082 ASSERT_ALLOC( perturbed_mac, expected_mac->len + 1 );
2083 memcpy( perturbed_mac, expected_mac->x, expected_mac->len );
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002084 TEST_EQUAL( psa_mac_verify( key, alg,
2085 input->x, input->len,
2086 perturbed_mac, expected_mac->len + 1 ),
2087 PSA_ERROR_INVALID_SIGNATURE );
2088
2089 /* Test a MAC that's too long, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002090 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002091 PSA_ASSERT( psa_mac_update( &operation,
2092 input->x, input->len ) );
2093 TEST_EQUAL( psa_mac_verify_finish( &operation,
2094 perturbed_mac,
2095 expected_mac->len + 1 ),
2096 PSA_ERROR_INVALID_SIGNATURE );
2097
2098 /* Test changing one byte. */
2099 for( size_t i = 0; i < expected_mac->len; i++ )
2100 {
Chris Jones9634bb12021-01-20 15:56:42 +00002101 mbedtls_test_set_step( i );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002102 perturbed_mac[i] ^= 1;
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002103
2104 TEST_EQUAL( psa_mac_verify( key, alg,
2105 input->x, input->len,
2106 perturbed_mac, expected_mac->len ),
2107 PSA_ERROR_INVALID_SIGNATURE );
2108
Ronald Cron5425a212020-08-04 14:58:35 +02002109 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002110 PSA_ASSERT( psa_mac_update( &operation,
2111 input->x, input->len ) );
2112 TEST_EQUAL( psa_mac_verify_finish( &operation,
2113 perturbed_mac,
2114 expected_mac->len ),
2115 PSA_ERROR_INVALID_SIGNATURE );
2116 perturbed_mac[i] ^= 1;
2117 }
2118
Gilles Peskine8c9def32018-02-08 10:02:12 +01002119exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002120 psa_mac_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002121 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002122 PSA_DONE( );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002123 mbedtls_free( perturbed_mac );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002124}
2125/* END_CASE */
2126
2127/* BEGIN_CASE */
Jaeden Amero5bae2272019-01-04 11:48:27 +00002128void cipher_operation_init( )
2129{
Jaeden Ameroab439972019-02-15 14:12:05 +00002130 const uint8_t input[1] = { 0 };
2131 unsigned char output[1] = { 0 };
2132 size_t output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002133 /* Test each valid way of initializing the object, except for `= {0}`, as
2134 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
2135 * though it's OK by the C standard. We could test for this, but we'd need
2136 * to supress the Clang warning for the test. */
2137 psa_cipher_operation_t func = psa_cipher_operation_init( );
2138 psa_cipher_operation_t init = PSA_CIPHER_OPERATION_INIT;
2139 psa_cipher_operation_t zero;
2140
2141 memset( &zero, 0, sizeof( zero ) );
2142
Jaeden Ameroab439972019-02-15 14:12:05 +00002143 /* A freshly-initialized cipher operation should not be usable. */
2144 TEST_EQUAL( psa_cipher_update( &func,
2145 input, sizeof( input ),
2146 output, sizeof( output ),
2147 &output_length ),
2148 PSA_ERROR_BAD_STATE );
2149 TEST_EQUAL( psa_cipher_update( &init,
2150 input, sizeof( input ),
2151 output, sizeof( output ),
2152 &output_length ),
2153 PSA_ERROR_BAD_STATE );
2154 TEST_EQUAL( psa_cipher_update( &zero,
2155 input, sizeof( input ),
2156 output, sizeof( output ),
2157 &output_length ),
2158 PSA_ERROR_BAD_STATE );
2159
Jaeden Amero5229bbb2019-02-07 16:33:37 +00002160 /* A default cipher operation should be abortable without error. */
2161 PSA_ASSERT( psa_cipher_abort( &func ) );
2162 PSA_ASSERT( psa_cipher_abort( &init ) );
2163 PSA_ASSERT( psa_cipher_abort( &zero ) );
Jaeden Amero5bae2272019-01-04 11:48:27 +00002164}
2165/* END_CASE */
2166
2167/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002168void cipher_setup( int key_type_arg,
2169 data_t *key,
2170 int alg_arg,
2171 int expected_status_arg )
2172{
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002173 psa_key_type_t key_type = key_type_arg;
2174 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002175 psa_status_t expected_status = expected_status_arg;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002176 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002177 psa_status_t status;
Gilles Peskine612ffd22021-01-20 18:51:00 +01002178#if defined(KNOWN_SUPPORTED_CIPHER_ALG)
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002179 const uint8_t smoke_test_key_data[16] = "kkkkkkkkkkkkkkkk";
2180#endif
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002181
Gilles Peskine8817f612018-12-18 00:18:46 +01002182 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002183
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002184 if( ! exercise_cipher_setup( key_type, key->x, key->len, alg,
2185 &operation, &status ) )
2186 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002187 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002188
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002189 /* The operation object should be reusable. */
2190#if defined(KNOWN_SUPPORTED_CIPHER_ALG)
2191 if( ! exercise_cipher_setup( KNOWN_SUPPORTED_CIPHER_KEY_TYPE,
2192 smoke_test_key_data,
2193 sizeof( smoke_test_key_data ),
2194 KNOWN_SUPPORTED_CIPHER_ALG,
2195 &operation, &status ) )
2196 goto exit;
2197 TEST_EQUAL( status, PSA_SUCCESS );
2198#endif
2199
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002200exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002201 psa_cipher_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002202 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002203}
2204/* END_CASE */
2205
Ronald Cronee414c72021-03-18 18:50:08 +01002206/* BEGIN_CASE depends_on:PSA_WANT_KEY_TYPE_AES:PSA_WANT_ALG_CBC_PKCS7 */
Jaeden Ameroab439972019-02-15 14:12:05 +00002207void cipher_bad_order( )
2208{
Ronald Cron5425a212020-08-04 14:58:35 +02002209 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Jaeden Ameroab439972019-02-15 14:12:05 +00002210 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
2211 psa_algorithm_t alg = PSA_ALG_CBC_PKCS7;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002212 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Ameroab439972019-02-15 14:12:05 +00002213 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002214 unsigned char iv[PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES)] = { 0 };
Ronald Cron5425a212020-08-04 14:58:35 +02002215 const uint8_t key_data[] = {
Jaeden Ameroab439972019-02-15 14:12:05 +00002216 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2217 0xaa, 0xaa, 0xaa, 0xaa };
2218 const uint8_t text[] = {
2219 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2220 0xbb, 0xbb, 0xbb, 0xbb };
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002221 uint8_t buffer[PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES)] = { 0 };
Jaeden Ameroab439972019-02-15 14:12:05 +00002222 size_t length = 0;
2223
2224 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002225 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
2226 psa_set_key_algorithm( &attributes, alg );
2227 psa_set_key_type( &attributes, key_type );
Ronald Cron5425a212020-08-04 14:58:35 +02002228 PSA_ASSERT( psa_import_key( &attributes, key_data, sizeof( key_data ),
2229 &key ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002230
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002231 /* Call encrypt setup twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002232 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
2233 TEST_EQUAL( psa_cipher_encrypt_setup( &operation, key, alg ),
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002234 PSA_ERROR_BAD_STATE );
2235 PSA_ASSERT( psa_cipher_abort( &operation ) );
2236
2237 /* Call decrypt setup twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002238 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
2239 TEST_EQUAL( psa_cipher_decrypt_setup( &operation, key, alg ),
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002240 PSA_ERROR_BAD_STATE );
2241 PSA_ASSERT( psa_cipher_abort( &operation ) );
2242
Jaeden Ameroab439972019-02-15 14:12:05 +00002243 /* Generate an IV without calling setup beforehand. */
2244 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2245 buffer, sizeof( buffer ),
2246 &length ),
2247 PSA_ERROR_BAD_STATE );
2248 PSA_ASSERT( psa_cipher_abort( &operation ) );
2249
2250 /* Generate an IV twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002251 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002252 PSA_ASSERT( psa_cipher_generate_iv( &operation,
2253 buffer, sizeof( buffer ),
2254 &length ) );
2255 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2256 buffer, sizeof( buffer ),
2257 &length ),
2258 PSA_ERROR_BAD_STATE );
2259 PSA_ASSERT( psa_cipher_abort( &operation ) );
2260
2261 /* Generate an IV after it's already set. */
Ronald Cron5425a212020-08-04 14:58:35 +02002262 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002263 PSA_ASSERT( psa_cipher_set_iv( &operation,
2264 iv, sizeof( iv ) ) );
2265 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2266 buffer, sizeof( buffer ),
2267 &length ),
2268 PSA_ERROR_BAD_STATE );
2269 PSA_ASSERT( psa_cipher_abort( &operation ) );
2270
2271 /* Set an IV without calling setup beforehand. */
2272 TEST_EQUAL( psa_cipher_set_iv( &operation,
2273 iv, sizeof( iv ) ),
2274 PSA_ERROR_BAD_STATE );
2275 PSA_ASSERT( psa_cipher_abort( &operation ) );
2276
2277 /* Set an IV after it's already set. */
Ronald Cron5425a212020-08-04 14:58:35 +02002278 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002279 PSA_ASSERT( psa_cipher_set_iv( &operation,
2280 iv, sizeof( iv ) ) );
2281 TEST_EQUAL( psa_cipher_set_iv( &operation,
2282 iv, sizeof( iv ) ),
2283 PSA_ERROR_BAD_STATE );
2284 PSA_ASSERT( psa_cipher_abort( &operation ) );
2285
2286 /* Set an IV after it's already generated. */
Ronald Cron5425a212020-08-04 14:58:35 +02002287 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002288 PSA_ASSERT( psa_cipher_generate_iv( &operation,
2289 buffer, sizeof( buffer ),
2290 &length ) );
2291 TEST_EQUAL( psa_cipher_set_iv( &operation,
2292 iv, sizeof( iv ) ),
2293 PSA_ERROR_BAD_STATE );
2294 PSA_ASSERT( psa_cipher_abort( &operation ) );
2295
2296 /* Call update without calling setup beforehand. */
2297 TEST_EQUAL( psa_cipher_update( &operation,
2298 text, sizeof( text ),
2299 buffer, sizeof( buffer ),
2300 &length ),
2301 PSA_ERROR_BAD_STATE );
2302 PSA_ASSERT( psa_cipher_abort( &operation ) );
2303
2304 /* Call update without an IV where an IV is required. */
2305 TEST_EQUAL( psa_cipher_update( &operation,
2306 text, sizeof( text ),
2307 buffer, sizeof( buffer ),
2308 &length ),
2309 PSA_ERROR_BAD_STATE );
2310 PSA_ASSERT( psa_cipher_abort( &operation ) );
2311
2312 /* Call update after finish. */
Ronald Cron5425a212020-08-04 14:58:35 +02002313 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002314 PSA_ASSERT( psa_cipher_set_iv( &operation,
2315 iv, sizeof( iv ) ) );
2316 PSA_ASSERT( psa_cipher_finish( &operation,
2317 buffer, sizeof( buffer ), &length ) );
2318 TEST_EQUAL( psa_cipher_update( &operation,
2319 text, sizeof( text ),
2320 buffer, sizeof( buffer ),
2321 &length ),
2322 PSA_ERROR_BAD_STATE );
2323 PSA_ASSERT( psa_cipher_abort( &operation ) );
2324
2325 /* Call finish without calling setup beforehand. */
2326 TEST_EQUAL( psa_cipher_finish( &operation,
2327 buffer, sizeof( buffer ), &length ),
2328 PSA_ERROR_BAD_STATE );
2329 PSA_ASSERT( psa_cipher_abort( &operation ) );
2330
2331 /* Call finish without an IV where an IV is required. */
Ronald Cron5425a212020-08-04 14:58:35 +02002332 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002333 /* Not calling update means we are encrypting an empty buffer, which is OK
2334 * for cipher modes with padding. */
2335 TEST_EQUAL( psa_cipher_finish( &operation,
2336 buffer, sizeof( buffer ), &length ),
2337 PSA_ERROR_BAD_STATE );
2338 PSA_ASSERT( psa_cipher_abort( &operation ) );
2339
2340 /* Call finish twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002341 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002342 PSA_ASSERT( psa_cipher_set_iv( &operation,
2343 iv, sizeof( iv ) ) );
2344 PSA_ASSERT( psa_cipher_finish( &operation,
2345 buffer, sizeof( buffer ), &length ) );
2346 TEST_EQUAL( psa_cipher_finish( &operation,
2347 buffer, sizeof( buffer ), &length ),
2348 PSA_ERROR_BAD_STATE );
2349 PSA_ASSERT( psa_cipher_abort( &operation ) );
2350
Ronald Cron5425a212020-08-04 14:58:35 +02002351 PSA_ASSERT( psa_destroy_key( key ) );
Gilles Peskine76b29a72019-05-28 14:08:50 +02002352
Jaeden Ameroab439972019-02-15 14:12:05 +00002353exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002354 psa_cipher_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002355 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002356}
2357/* END_CASE */
2358
2359/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002360void cipher_encrypt( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002361 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002362 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002363 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002364{
Ronald Cron5425a212020-08-04 14:58:35 +02002365 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002366 psa_status_t status;
2367 psa_key_type_t key_type = key_type_arg;
2368 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002369 psa_status_t expected_status = expected_status_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002370 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002371 size_t output_buffer_size = 0;
2372 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002373 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002374 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002375 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002376
Gilles Peskine8817f612018-12-18 00:18:46 +01002377 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002378
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002379 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2380 psa_set_key_algorithm( &attributes, alg );
2381 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002382
Ronald Cron5425a212020-08-04 14:58:35 +02002383 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2384 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002385
Ronald Cron5425a212020-08-04 14:58:35 +02002386 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002387
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002388 if( iv->len > 0 )
2389 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002390 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002391 }
2392
gabor-mezei-armceface22021-01-21 12:26:17 +01002393 output_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2394 TEST_ASSERT( output_buffer_size <=
2395 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002396 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002397
Gilles Peskine8817f612018-12-18 00:18:46 +01002398 PSA_ASSERT( psa_cipher_update( &operation,
2399 input->x, input->len,
2400 output, output_buffer_size,
2401 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002402 TEST_ASSERT( function_output_length <=
2403 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) );
2404 TEST_ASSERT( function_output_length <=
2405 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002406 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002407
Gilles Peskine50e586b2018-06-08 14:28:46 +02002408 status = psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002409 ( output_buffer_size == 0 ? NULL :
2410 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002411 output_buffer_size - total_output_length,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002412 &function_output_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002413 TEST_ASSERT( function_output_length <=
2414 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2415 TEST_ASSERT( function_output_length <=
2416 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002417 total_output_length += function_output_length;
2418
Gilles Peskinefe11b722018-12-18 00:24:04 +01002419 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002420 if( expected_status == PSA_SUCCESS )
2421 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002422 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002423 ASSERT_COMPARE( expected_output->x, expected_output->len,
2424 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002425 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002426
Gilles Peskine50e586b2018-06-08 14:28:46 +02002427exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002428 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002429 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002430 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002431 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002432}
2433/* END_CASE */
2434
2435/* BEGIN_CASE */
2436void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002437 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002438 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002439 int first_part_size_arg,
2440 int output1_length_arg, int output2_length_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002441 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002442{
Ronald Cron5425a212020-08-04 14:58:35 +02002443 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002444 psa_key_type_t key_type = key_type_arg;
2445 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002446 size_t first_part_size = first_part_size_arg;
2447 size_t output1_length = output1_length_arg;
2448 size_t output2_length = output2_length_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002449 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002450 size_t output_buffer_size = 0;
2451 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002452 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002453 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002454 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002455
Gilles Peskine8817f612018-12-18 00:18:46 +01002456 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002457
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002458 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2459 psa_set_key_algorithm( &attributes, alg );
2460 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002461
Ronald Cron5425a212020-08-04 14:58:35 +02002462 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2463 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002464
Ronald Cron5425a212020-08-04 14:58:35 +02002465 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002466
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002467 if( iv->len > 0 )
2468 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002469 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002470 }
2471
gabor-mezei-armceface22021-01-21 12:26:17 +01002472 output_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2473 TEST_ASSERT( output_buffer_size <=
2474 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002475 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002476
Gilles Peskinee0866522019-02-19 19:44:00 +01002477 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002478 PSA_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
2479 output, output_buffer_size,
2480 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002481 TEST_ASSERT( function_output_length == output1_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002482 TEST_ASSERT( function_output_length <=
2483 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2484 TEST_ASSERT( function_output_length <=
2485 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002486 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002487
Gilles Peskine8817f612018-12-18 00:18:46 +01002488 PSA_ASSERT( psa_cipher_update( &operation,
2489 input->x + first_part_size,
2490 input->len - first_part_size,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002491 ( output_buffer_size == 0 ? NULL :
2492 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002493 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002494 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002495 TEST_ASSERT( function_output_length == output2_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002496 TEST_ASSERT( function_output_length <=
2497 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2498 alg,
2499 input->len - first_part_size ) );
2500 TEST_ASSERT( function_output_length <=
2501 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002502 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002503
Gilles Peskine8817f612018-12-18 00:18:46 +01002504 PSA_ASSERT( psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002505 ( output_buffer_size == 0 ? NULL :
2506 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002507 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002508 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002509 TEST_ASSERT( function_output_length <=
2510 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2511 TEST_ASSERT( function_output_length <=
2512 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002513 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002514 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002515
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002516 ASSERT_COMPARE( expected_output->x, expected_output->len,
2517 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002518
2519exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002520 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002521 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002522 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002523 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002524}
2525/* END_CASE */
2526
2527/* BEGIN_CASE */
2528void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002529 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002530 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002531 int first_part_size_arg,
2532 int output1_length_arg, int output2_length_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002533 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002534{
Ronald Cron5425a212020-08-04 14:58:35 +02002535 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002536 psa_key_type_t key_type = key_type_arg;
2537 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002538 size_t first_part_size = first_part_size_arg;
2539 size_t output1_length = output1_length_arg;
2540 size_t output2_length = output2_length_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002541 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002542 size_t output_buffer_size = 0;
2543 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002544 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002545 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002546 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002547
Gilles Peskine8817f612018-12-18 00:18:46 +01002548 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002549
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002550 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2551 psa_set_key_algorithm( &attributes, alg );
2552 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002553
Ronald Cron5425a212020-08-04 14:58:35 +02002554 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2555 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002556
Ronald Cron5425a212020-08-04 14:58:35 +02002557 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002558
Steven Cooreman177deba2020-09-07 17:14:14 +02002559 if( iv->len > 0 )
2560 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002561 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002562 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02002563
gabor-mezei-armceface22021-01-21 12:26:17 +01002564 output_buffer_size = PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2565 TEST_ASSERT( output_buffer_size <=
2566 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002567 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002568
Gilles Peskinee0866522019-02-19 19:44:00 +01002569 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01002570 PSA_ASSERT( psa_cipher_update( &operation,
2571 input->x, first_part_size,
2572 output, output_buffer_size,
2573 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002574 TEST_ASSERT( function_output_length == output1_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002575 TEST_ASSERT( function_output_length <=
2576 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2577 TEST_ASSERT( function_output_length <=
2578 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002579 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002580
Gilles Peskine8817f612018-12-18 00:18:46 +01002581 PSA_ASSERT( psa_cipher_update( &operation,
2582 input->x + first_part_size,
2583 input->len - first_part_size,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002584 ( output_buffer_size == 0 ? NULL :
2585 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002586 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002587 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01002588 TEST_ASSERT( function_output_length == output2_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002589 TEST_ASSERT( function_output_length <=
2590 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2591 alg,
2592 input->len - first_part_size ) );
2593 TEST_ASSERT( function_output_length <=
2594 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002595 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002596
Gilles Peskine8817f612018-12-18 00:18:46 +01002597 PSA_ASSERT( psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002598 ( output_buffer_size == 0 ? NULL :
2599 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002600 output_buffer_size - total_output_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002601 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002602 TEST_ASSERT( function_output_length <=
2603 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2604 TEST_ASSERT( function_output_length <=
2605 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002606 total_output_length += function_output_length;
Gilles Peskine8817f612018-12-18 00:18:46 +01002607 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002608
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002609 ASSERT_COMPARE( expected_output->x, expected_output->len,
2610 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002611
2612exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002613 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002614 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002615 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002616 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002617}
2618/* END_CASE */
2619
Gilles Peskine50e586b2018-06-08 14:28:46 +02002620/* BEGIN_CASE */
2621void cipher_decrypt( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002622 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002623 data_t *input, data_t *expected_output,
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002624 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002625{
Ronald Cron5425a212020-08-04 14:58:35 +02002626 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002627 psa_status_t status;
2628 psa_key_type_t key_type = key_type_arg;
2629 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002630 psa_status_t expected_status = expected_status_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002631 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002632 size_t output_buffer_size = 0;
2633 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002634 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002635 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002636 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002637
Gilles Peskine8817f612018-12-18 00:18:46 +01002638 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002639
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002640 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
2641 psa_set_key_algorithm( &attributes, alg );
2642 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002643
Ronald Cron5425a212020-08-04 14:58:35 +02002644 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2645 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002646
Ronald Cron5425a212020-08-04 14:58:35 +02002647 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002648
Steven Cooreman177deba2020-09-07 17:14:14 +02002649 if( iv->len > 0 )
2650 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002651 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002652 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02002653
gabor-mezei-armceface22021-01-21 12:26:17 +01002654 output_buffer_size = PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2655 TEST_ASSERT( output_buffer_size <=
2656 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002657 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002658
Gilles Peskine8817f612018-12-18 00:18:46 +01002659 PSA_ASSERT( psa_cipher_update( &operation,
2660 input->x, input->len,
2661 output, output_buffer_size,
2662 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002663 TEST_ASSERT( function_output_length <=
2664 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) );
2665 TEST_ASSERT( function_output_length <=
2666 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002667 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002668
Gilles Peskine50e586b2018-06-08 14:28:46 +02002669 status = psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01002670 ( output_buffer_size == 0 ? NULL :
2671 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01002672 output_buffer_size - total_output_length,
Gilles Peskine50e586b2018-06-08 14:28:46 +02002673 &function_output_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01002674 TEST_ASSERT( function_output_length <=
2675 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2676 TEST_ASSERT( function_output_length <=
2677 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02002678 total_output_length += function_output_length;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002679 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002680
2681 if( expected_status == PSA_SUCCESS )
2682 {
Gilles Peskine8817f612018-12-18 00:18:46 +01002683 PSA_ASSERT( psa_cipher_abort( &operation ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002684 ASSERT_COMPARE( expected_output->x, expected_output->len,
2685 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002686 }
2687
Gilles Peskine50e586b2018-06-08 14:28:46 +02002688exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002689 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002690 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02002691 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002692 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02002693}
2694/* END_CASE */
2695
Gilles Peskine50e586b2018-06-08 14:28:46 +02002696/* BEGIN_CASE */
2697void cipher_verify_output( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002698 data_t *key_data,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002699 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02002700{
Ronald Cron5425a212020-08-04 14:58:35 +02002701 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002702 psa_key_type_t key_type = key_type_arg;
2703 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -07002704 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +02002705 size_t iv_size = 16;
2706 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002707 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002708 size_t output1_size = 0;
2709 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002710 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002711 size_t output2_size = 0;
2712 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002713 size_t function_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002714 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
2715 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002716 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002717
Gilles Peskine8817f612018-12-18 00:18:46 +01002718 PSA_ASSERT( psa_crypto_init( ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002719
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002720 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
2721 psa_set_key_algorithm( &attributes, alg );
2722 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002723
Ronald Cron5425a212020-08-04 14:58:35 +02002724 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2725 &key ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002726
Ronald Cron5425a212020-08-04 14:58:35 +02002727 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1, key, alg ) );
2728 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2, key, alg ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002729
Steven Cooreman177deba2020-09-07 17:14:14 +02002730 if( alg != PSA_ALG_ECB_NO_PADDING )
2731 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002732 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
2733 iv, iv_size,
2734 &iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002735 }
gabor-mezei-armceface22021-01-21 12:26:17 +01002736 output1_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2737 TEST_ASSERT( output1_size <=
2738 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002739 ASSERT_ALLOC( output1, output1_size );
Moran Pekerded84402018-06-06 16:36:50 +03002740
Gilles Peskine8817f612018-12-18 00:18:46 +01002741 PSA_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
2742 output1, output1_size,
2743 &output1_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002744 TEST_ASSERT( output1_length <=
2745 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) );
2746 TEST_ASSERT( output1_length <=
2747 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
2748
Gilles Peskine8817f612018-12-18 00:18:46 +01002749 PSA_ASSERT( psa_cipher_finish( &operation1,
Gilles Peskineee46fe72019-02-19 19:05:33 +01002750 output1 + output1_length,
2751 output1_size - output1_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002752 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002753 TEST_ASSERT( function_output_length <=
2754 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2755 TEST_ASSERT( function_output_length <=
2756 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002757
Gilles Peskine048b7f02018-06-08 14:20:49 +02002758 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002759
Gilles Peskine8817f612018-12-18 00:18:46 +01002760 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
Moran Pekerded84402018-06-06 16:36:50 +03002761
2762 output2_size = output1_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002763 TEST_ASSERT( output2_size <=
2764 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, output1_length ) );
2765 TEST_ASSERT( output2_size <=
2766 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( output1_length ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002767 ASSERT_ALLOC( output2, output2_size );
Moran Pekerded84402018-06-06 16:36:50 +03002768
Steven Cooreman177deba2020-09-07 17:14:14 +02002769 if( iv_length > 0 )
2770 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002771 PSA_ASSERT( psa_cipher_set_iv( &operation2,
2772 iv, iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002773 }
2774
Gilles Peskine8817f612018-12-18 00:18:46 +01002775 PSA_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
2776 output2, output2_size,
2777 &output2_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002778 TEST_ASSERT( output2_length <=
2779 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, output1_length ) );
2780 TEST_ASSERT( output2_length <=
2781 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( output1_length ) );
2782
Gilles Peskine048b7f02018-06-08 14:20:49 +02002783 function_output_length = 0;
Gilles Peskine8817f612018-12-18 00:18:46 +01002784 PSA_ASSERT( psa_cipher_finish( &operation2,
2785 output2 + output2_length,
Gilles Peskineee46fe72019-02-19 19:05:33 +01002786 output2_size - output2_length,
Gilles Peskine8817f612018-12-18 00:18:46 +01002787 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002788 TEST_ASSERT( function_output_length <=
2789 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2790 TEST_ASSERT( function_output_length <=
2791 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Moran Pekerded84402018-06-06 16:36:50 +03002792
Gilles Peskine048b7f02018-06-08 14:20:49 +02002793 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002794
Gilles Peskine8817f612018-12-18 00:18:46 +01002795 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
Moran Pekerded84402018-06-06 16:36:50 +03002796
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002797 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
Moran Pekerded84402018-06-06 16:36:50 +03002798
2799exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002800 psa_cipher_abort( &operation1 );
2801 psa_cipher_abort( &operation2 );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002802 mbedtls_free( output1 );
2803 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02002804 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002805 PSA_DONE( );
Moran Pekerded84402018-06-06 16:36:50 +03002806}
2807/* END_CASE */
2808
2809/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02002810void cipher_verify_output_multipart( int alg_arg,
2811 int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002812 data_t *key_data,
itayzafrir3e02b3b2018-06-12 17:06:52 +03002813 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01002814 int first_part_size_arg )
Moran Pekerded84402018-06-06 16:36:50 +03002815{
Ronald Cron5425a212020-08-04 14:58:35 +02002816 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03002817 psa_key_type_t key_type = key_type_arg;
2818 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01002819 size_t first_part_size = first_part_size_arg;
Moran Pekerded84402018-06-06 16:36:50 +03002820 unsigned char iv[16] = {0};
2821 size_t iv_size = 16;
2822 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002823 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002824 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002825 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002826 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002827 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03002828 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02002829 size_t function_output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002830 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
2831 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002832 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03002833
Gilles Peskine8817f612018-12-18 00:18:46 +01002834 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerded84402018-06-06 16:36:50 +03002835
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002836 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
2837 psa_set_key_algorithm( &attributes, alg );
2838 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03002839
Ronald Cron5425a212020-08-04 14:58:35 +02002840 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2841 &key ) );
Moran Pekerded84402018-06-06 16:36:50 +03002842
Ronald Cron5425a212020-08-04 14:58:35 +02002843 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1, key, alg ) );
2844 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2, key, alg ) );
Moran Pekerded84402018-06-06 16:36:50 +03002845
Steven Cooreman177deba2020-09-07 17:14:14 +02002846 if( alg != PSA_ALG_ECB_NO_PADDING )
2847 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002848 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
2849 iv, iv_size,
2850 &iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002851 }
2852
gabor-mezei-armceface22021-01-21 12:26:17 +01002853 output1_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2854 TEST_ASSERT( output1_buffer_size <=
2855 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002856 ASSERT_ALLOC( output1, output1_buffer_size );
Moran Pekerded84402018-06-06 16:36:50 +03002857
Gilles Peskinee0866522019-02-19 19:44:00 +01002858 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002859
Gilles Peskine8817f612018-12-18 00:18:46 +01002860 PSA_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
2861 output1, output1_buffer_size,
2862 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002863 TEST_ASSERT( function_output_length <=
2864 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2865 TEST_ASSERT( function_output_length <=
2866 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002867 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002868
Gilles Peskine8817f612018-12-18 00:18:46 +01002869 PSA_ASSERT( psa_cipher_update( &operation1,
2870 input->x + first_part_size,
2871 input->len - first_part_size,
2872 output1, output1_buffer_size,
2873 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002874 TEST_ASSERT( function_output_length <=
2875 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2876 alg,
2877 input->len - first_part_size ) );
2878 TEST_ASSERT( function_output_length <=
2879 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len - first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002880 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002881
Gilles Peskine8817f612018-12-18 00:18:46 +01002882 PSA_ASSERT( psa_cipher_finish( &operation1,
2883 output1 + output1_length,
2884 output1_buffer_size - output1_length,
2885 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002886 TEST_ASSERT( function_output_length <=
2887 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2888 TEST_ASSERT( function_output_length <=
2889 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002890 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02002891
Gilles Peskine8817f612018-12-18 00:18:46 +01002892 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002893
Gilles Peskine048b7f02018-06-08 14:20:49 +02002894 output2_buffer_size = output1_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01002895 TEST_ASSERT( output2_buffer_size <=
2896 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, output1_length ) );
2897 TEST_ASSERT( output2_buffer_size <=
2898 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( output1_length ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02002899 ASSERT_ALLOC( output2, output2_buffer_size );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002900
Steven Cooreman177deba2020-09-07 17:14:14 +02002901 if( iv_length > 0 )
2902 {
Steven Cooremana6033e92020-08-25 11:47:50 +02002903 PSA_ASSERT( psa_cipher_set_iv( &operation2,
2904 iv, iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02002905 }
Moran Pekerded84402018-06-06 16:36:50 +03002906
Gilles Peskine8817f612018-12-18 00:18:46 +01002907 PSA_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
2908 output2, output2_buffer_size,
2909 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002910 TEST_ASSERT( function_output_length <=
2911 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
2912 TEST_ASSERT( function_output_length <=
2913 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002914 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002915
Gilles Peskine8817f612018-12-18 00:18:46 +01002916 PSA_ASSERT( psa_cipher_update( &operation2,
2917 output1 + first_part_size,
2918 output1_length - first_part_size,
2919 output2, output2_buffer_size,
2920 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002921 TEST_ASSERT( function_output_length <=
2922 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
2923 alg,
2924 output1_length - first_part_size ) );
2925 TEST_ASSERT( function_output_length <=
2926 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( output1_length - first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002927 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03002928
Gilles Peskine8817f612018-12-18 00:18:46 +01002929 PSA_ASSERT( psa_cipher_finish( &operation2,
2930 output2 + output2_length,
2931 output2_buffer_size - output2_length,
2932 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01002933 TEST_ASSERT( function_output_length <=
2934 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
2935 TEST_ASSERT( function_output_length <=
2936 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine048b7f02018-06-08 14:20:49 +02002937 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02002938
Gilles Peskine8817f612018-12-18 00:18:46 +01002939 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002940
Gilles Peskinebd7dea92018-09-27 13:57:19 +02002941 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002942
2943exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002944 psa_cipher_abort( &operation1 );
2945 psa_cipher_abort( &operation2 );
itayzafrir3e02b3b2018-06-12 17:06:52 +03002946 mbedtls_free( output1 );
2947 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02002948 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002949 PSA_DONE( );
mohammad1603d7d7ba52018-03-12 18:51:53 +02002950}
2951/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02002952
Gilles Peskine20035e32018-02-03 22:44:14 +01002953/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02002954void aead_encrypt_decrypt( int key_type_arg, data_t *key_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002955 int alg_arg,
Gilles Peskine7da96b02018-08-17 18:45:42 +02002956 data_t *nonce,
2957 data_t *additional_data,
2958 data_t *input_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02002959 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02002960{
Ronald Cron5425a212020-08-04 14:58:35 +02002961 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002962 psa_key_type_t key_type = key_type_arg;
2963 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01002964 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002965 unsigned char *output_data = NULL;
2966 size_t output_size = 0;
2967 size_t output_length = 0;
2968 unsigned char *output_data2 = NULL;
2969 size_t output_length2 = 0;
Steven Cooremanf49478b2021-02-15 15:19:25 +01002970 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskine4abf7412018-06-18 16:35:34 +02002971 psa_status_t expected_result = expected_result_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002972 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02002973
Gilles Peskine8817f612018-12-18 00:18:46 +01002974 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002975
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002976 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
2977 psa_set_key_algorithm( &attributes, alg );
2978 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002979
Gilles Peskine049c7532019-05-15 20:22:09 +02002980 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02002981 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01002982 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
2983 key_bits = psa_get_key_bits( &attributes );
2984
2985 output_size = input_data->len + PSA_AEAD_TAG_LENGTH( key_type, key_bits,
2986 alg );
2987 /* For all currently defined algorithms, PSA_AEAD_ENCRYPT_OUTPUT_SIZE
2988 * should be exact. */
2989 if( expected_result != PSA_ERROR_INVALID_ARGUMENT &&
2990 expected_result != PSA_ERROR_NOT_SUPPORTED )
2991 {
2992 TEST_EQUAL( output_size,
2993 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
2994 TEST_ASSERT( output_size <=
2995 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
2996 }
2997 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02002998
Steven Cooremanf49478b2021-02-15 15:19:25 +01002999 status = psa_aead_encrypt( key, alg,
3000 nonce->x, nonce->len,
3001 additional_data->x,
3002 additional_data->len,
3003 input_data->x, input_data->len,
3004 output_data, output_size,
3005 &output_length );
3006
3007 /* If the operation is not supported, just skip and not fail in case the
3008 * encryption involves a common limitation of cryptography hardwares and
3009 * an alternative implementation. */
3010 if( status == PSA_ERROR_NOT_SUPPORTED )
3011 {
3012 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3013 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
3014 }
3015
3016 TEST_EQUAL( status, expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003017
3018 if( PSA_SUCCESS == expected_result )
3019 {
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003020 ASSERT_ALLOC( output_data2, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003021
Gilles Peskine003a4a92019-05-14 16:09:40 +02003022 /* For all currently defined algorithms, PSA_AEAD_DECRYPT_OUTPUT_SIZE
3023 * should be exact. */
3024 TEST_EQUAL( input_data->len,
Bence Szépkútiec174e22021-03-19 18:46:15 +01003025 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg, output_length ) );
Gilles Peskine003a4a92019-05-14 16:09:40 +02003026
gabor-mezei-armceface22021-01-21 12:26:17 +01003027 TEST_ASSERT( input_data->len <=
3028 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( output_length ) );
3029
Ronald Cron5425a212020-08-04 14:58:35 +02003030 TEST_EQUAL( psa_aead_decrypt( key, alg,
Gilles Peskinefe11b722018-12-18 00:24:04 +01003031 nonce->x, nonce->len,
3032 additional_data->x,
3033 additional_data->len,
3034 output_data, output_length,
3035 output_data2, output_length,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003036 &output_length2 ),
3037 expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02003038
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003039 ASSERT_COMPARE( input_data->x, input_data->len,
3040 output_data2, output_length2 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003041 }
Gilles Peskine2d277862018-06-18 15:41:12 +02003042
Gilles Peskinea1cac842018-06-11 19:33:02 +02003043exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003044 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003045 mbedtls_free( output_data );
3046 mbedtls_free( output_data2 );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003047 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003048}
3049/* END_CASE */
3050
3051/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003052void aead_encrypt( int key_type_arg, data_t *key_data,
3053 int alg_arg,
3054 data_t *nonce,
3055 data_t *additional_data,
3056 data_t *input_data,
3057 data_t *expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003058{
Ronald Cron5425a212020-08-04 14:58:35 +02003059 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003060 psa_key_type_t key_type = key_type_arg;
3061 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003062 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003063 unsigned char *output_data = NULL;
3064 size_t output_size = 0;
3065 size_t output_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003066 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Steven Cooremand588ea12021-01-11 19:36:04 +01003067 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003068
Gilles Peskine8817f612018-12-18 00:18:46 +01003069 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003070
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003071 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3072 psa_set_key_algorithm( &attributes, alg );
3073 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003074
Gilles Peskine049c7532019-05-15 20:22:09 +02003075 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003076 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003077 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3078 key_bits = psa_get_key_bits( &attributes );
3079
3080 output_size = input_data->len + PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3081 alg );
3082 /* For all currently defined algorithms, PSA_AEAD_ENCRYPT_OUTPUT_SIZE
3083 * should be exact. */
3084 TEST_EQUAL( output_size,
3085 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3086 TEST_ASSERT( output_size <=
3087 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3088 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003089
Steven Cooremand588ea12021-01-11 19:36:04 +01003090 status = psa_aead_encrypt( key, alg,
3091 nonce->x, nonce->len,
3092 additional_data->x, additional_data->len,
3093 input_data->x, input_data->len,
3094 output_data, output_size,
3095 &output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003096
Ronald Cron28a45ed2021-02-09 20:35:42 +01003097 /* If the operation is not supported, just skip and not fail in case the
3098 * encryption involves a common limitation of cryptography hardwares and
3099 * an alternative implementation. */
3100 if( status == PSA_ERROR_NOT_SUPPORTED )
Steven Cooremand588ea12021-01-11 19:36:04 +01003101 {
Ronald Cron28a45ed2021-02-09 20:35:42 +01003102 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3103 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
Steven Cooremand588ea12021-01-11 19:36:04 +01003104 }
Steven Cooremand588ea12021-01-11 19:36:04 +01003105
3106 PSA_ASSERT( status );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003107 ASSERT_COMPARE( expected_result->x, expected_result->len,
3108 output_data, output_length );
Gilles Peskine2d277862018-06-18 15:41:12 +02003109
Gilles Peskinea1cac842018-06-11 19:33:02 +02003110exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003111 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003112 mbedtls_free( output_data );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003113 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003114}
3115/* END_CASE */
3116
3117/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003118void aead_decrypt( int key_type_arg, data_t *key_data,
3119 int alg_arg,
3120 data_t *nonce,
3121 data_t *additional_data,
3122 data_t *input_data,
3123 data_t *expected_data,
3124 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003125{
Ronald Cron5425a212020-08-04 14:58:35 +02003126 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003127 psa_key_type_t key_type = key_type_arg;
3128 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003129 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003130 unsigned char *output_data = NULL;
3131 size_t output_size = 0;
3132 size_t output_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003133 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003134 psa_status_t expected_result = expected_result_arg;
Steven Cooremand588ea12021-01-11 19:36:04 +01003135 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003136
Gilles Peskine8817f612018-12-18 00:18:46 +01003137 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003138
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003139 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3140 psa_set_key_algorithm( &attributes, alg );
3141 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003142
Gilles Peskine049c7532019-05-15 20:22:09 +02003143 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003144 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003145 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3146 key_bits = psa_get_key_bits( &attributes );
3147
3148 output_size = input_data->len - PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3149 alg );
3150 if( expected_result != PSA_ERROR_INVALID_ARGUMENT &&
3151 expected_result != PSA_ERROR_NOT_SUPPORTED )
3152 {
3153 /* For all currently defined algorithms, PSA_AEAD_DECRYPT_OUTPUT_SIZE
3154 * should be exact. */
3155 TEST_EQUAL( output_size,
3156 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3157 TEST_ASSERT( output_size <=
3158 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3159 }
3160 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003161
Steven Cooremand588ea12021-01-11 19:36:04 +01003162 status = psa_aead_decrypt( key, alg,
3163 nonce->x, nonce->len,
3164 additional_data->x,
3165 additional_data->len,
3166 input_data->x, input_data->len,
3167 output_data, output_size,
3168 &output_length );
3169
Ronald Cron28a45ed2021-02-09 20:35:42 +01003170 /* If the operation is not supported, just skip and not fail in case the
3171 * decryption involves a common limitation of cryptography hardwares and
3172 * an alternative implementation. */
3173 if( status == PSA_ERROR_NOT_SUPPORTED )
Steven Cooremand588ea12021-01-11 19:36:04 +01003174 {
Ronald Cron28a45ed2021-02-09 20:35:42 +01003175 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3176 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
Steven Cooremand588ea12021-01-11 19:36:04 +01003177 }
Steven Cooremand588ea12021-01-11 19:36:04 +01003178
3179 TEST_EQUAL( status, expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003180
Gilles Peskine2d277862018-06-18 15:41:12 +02003181 if( expected_result == PSA_SUCCESS )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003182 ASSERT_COMPARE( expected_data->x, expected_data->len,
3183 output_data, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003184
Gilles Peskinea1cac842018-06-11 19:33:02 +02003185exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003186 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003187 mbedtls_free( output_data );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003188 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003189}
3190/* END_CASE */
3191
3192/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003193void signature_size( int type_arg,
3194 int bits,
3195 int alg_arg,
3196 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003197{
3198 psa_key_type_t type = type_arg;
3199 psa_algorithm_t alg = alg_arg;
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003200 size_t actual_size = PSA_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskine841b14b2019-11-26 17:37:37 +01003201
Gilles Peskinefe11b722018-12-18 00:24:04 +01003202 TEST_EQUAL( actual_size, (size_t) expected_size_arg );
Gilles Peskine841b14b2019-11-26 17:37:37 +01003203
Gilles Peskinee59236f2018-01-27 23:32:46 +01003204exit:
3205 ;
3206}
3207/* END_CASE */
3208
3209/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003210void sign_hash_deterministic( int key_type_arg, data_t *key_data,
3211 int alg_arg, data_t *input_data,
3212 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01003213{
Ronald Cron5425a212020-08-04 14:58:35 +02003214 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinee59236f2018-01-27 23:32:46 +01003215 psa_key_type_t key_type = key_type_arg;
3216 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003217 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01003218 unsigned char *signature = NULL;
3219 size_t signature_size;
3220 size_t signature_length = 0xdeadbeef;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003221 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003222
Gilles Peskine8817f612018-12-18 00:18:46 +01003223 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003224
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003225 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003226 psa_set_key_algorithm( &attributes, alg );
3227 psa_set_key_type( &attributes, key_type );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003228
Gilles Peskine049c7532019-05-15 20:22:09 +02003229 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003230 &key ) );
3231 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003232 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine20035e32018-02-03 22:44:14 +01003233
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003234 /* Allocate a buffer which has the size advertized by the
3235 * library. */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003236 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003237 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01003238 TEST_ASSERT( signature_size != 0 );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003239 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003240 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003241
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003242 /* Perform the signature. */
Ronald Cron5425a212020-08-04 14:58:35 +02003243 PSA_ASSERT( psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003244 input_data->x, input_data->len,
3245 signature, signature_size,
3246 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003247 /* Verify that the signature is what is expected. */
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003248 ASSERT_COMPARE( output_data->x, output_data->len,
3249 signature, signature_length );
Gilles Peskine20035e32018-02-03 22:44:14 +01003250
3251exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003252 /*
3253 * Key attributes may have been returned by psa_get_key_attributes()
3254 * thus reset them as required.
3255 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003256 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003257
Ronald Cron5425a212020-08-04 14:58:35 +02003258 psa_destroy_key( key );
Gilles Peskine0189e752018-02-03 23:57:22 +01003259 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003260 PSA_DONE( );
Gilles Peskine20035e32018-02-03 22:44:14 +01003261}
3262/* END_CASE */
3263
3264/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003265void sign_hash_fail( int key_type_arg, data_t *key_data,
3266 int alg_arg, data_t *input_data,
3267 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01003268{
Ronald Cron5425a212020-08-04 14:58:35 +02003269 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003270 psa_key_type_t key_type = key_type_arg;
3271 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003272 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01003273 psa_status_t actual_status;
3274 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01003275 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01003276 size_t signature_length = 0xdeadbeef;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003277 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01003278
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003279 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003280
Gilles Peskine8817f612018-12-18 00:18:46 +01003281 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003282
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003283 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003284 psa_set_key_algorithm( &attributes, alg );
3285 psa_set_key_type( &attributes, key_type );
mohammad1603a97cb8c2018-03-28 03:46:26 -07003286
Gilles Peskine049c7532019-05-15 20:22:09 +02003287 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003288 &key ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01003289
Ronald Cron5425a212020-08-04 14:58:35 +02003290 actual_status = psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003291 input_data->x, input_data->len,
3292 signature, signature_size,
3293 &signature_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003294 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02003295 /* The value of *signature_length is unspecified on error, but
3296 * whatever it is, it should be less than signature_size, so that
3297 * if the caller tries to read *signature_length bytes without
3298 * checking the error code then they don't overflow a buffer. */
3299 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01003300
3301exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003302 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003303 psa_destroy_key( key );
Gilles Peskine20035e32018-02-03 22:44:14 +01003304 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003305 PSA_DONE( );
Gilles Peskine20035e32018-02-03 22:44:14 +01003306}
3307/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03003308
3309/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003310void sign_verify_hash( int key_type_arg, data_t *key_data,
3311 int alg_arg, data_t *input_data )
Gilles Peskine9911b022018-06-29 17:30:48 +02003312{
Ronald Cron5425a212020-08-04 14:58:35 +02003313 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003314 psa_key_type_t key_type = key_type_arg;
3315 psa_algorithm_t alg = alg_arg;
3316 size_t key_bits;
3317 unsigned char *signature = NULL;
3318 size_t signature_size;
3319 size_t signature_length = 0xdeadbeef;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003320 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02003321
Gilles Peskine8817f612018-12-18 00:18:46 +01003322 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003323
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003324 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003325 psa_set_key_algorithm( &attributes, alg );
3326 psa_set_key_type( &attributes, key_type );
Gilles Peskine9911b022018-06-29 17:30:48 +02003327
Gilles Peskine049c7532019-05-15 20:22:09 +02003328 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003329 &key ) );
3330 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003331 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine9911b022018-06-29 17:30:48 +02003332
3333 /* Allocate a buffer which has the size advertized by the
3334 * library. */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003335 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type,
Gilles Peskine9911b022018-06-29 17:30:48 +02003336 key_bits, alg );
3337 TEST_ASSERT( signature_size != 0 );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003338 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003339 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine9911b022018-06-29 17:30:48 +02003340
3341 /* Perform the signature. */
Ronald Cron5425a212020-08-04 14:58:35 +02003342 PSA_ASSERT( psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003343 input_data->x, input_data->len,
3344 signature, signature_size,
3345 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003346 /* Check that the signature length looks sensible. */
3347 TEST_ASSERT( signature_length <= signature_size );
3348 TEST_ASSERT( signature_length > 0 );
3349
3350 /* Use the library to verify that the signature is correct. */
Ronald Cron5425a212020-08-04 14:58:35 +02003351 PSA_ASSERT( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003352 input_data->x, input_data->len,
3353 signature, signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02003354
3355 if( input_data->len != 0 )
3356 {
3357 /* Flip a bit in the input and verify that the signature is now
3358 * detected as invalid. Flip a bit at the beginning, not at the end,
3359 * because ECDSA may ignore the last few bits of the input. */
3360 input_data->x[0] ^= 1;
Ronald Cron5425a212020-08-04 14:58:35 +02003361 TEST_EQUAL( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003362 input_data->x, input_data->len,
3363 signature, signature_length ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003364 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine9911b022018-06-29 17:30:48 +02003365 }
3366
3367exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003368 /*
3369 * Key attributes may have been returned by psa_get_key_attributes()
3370 * thus reset them as required.
3371 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003372 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003373
Ronald Cron5425a212020-08-04 14:58:35 +02003374 psa_destroy_key( key );
Gilles Peskine9911b022018-06-29 17:30:48 +02003375 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003376 PSA_DONE( );
Gilles Peskine9911b022018-06-29 17:30:48 +02003377}
3378/* END_CASE */
3379
3380/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003381void verify_hash( int key_type_arg, data_t *key_data,
3382 int alg_arg, data_t *hash_data,
3383 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03003384{
Ronald Cron5425a212020-08-04 14:58:35 +02003385 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003386 psa_key_type_t key_type = key_type_arg;
3387 psa_algorithm_t alg = alg_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003388 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03003389
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003390 TEST_ASSERT( signature_data->len <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine69c12672018-06-28 00:07:19 +02003391
Gilles Peskine8817f612018-12-18 00:18:46 +01003392 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir5c753392018-05-08 11:18:38 +03003393
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003394 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003395 psa_set_key_algorithm( &attributes, alg );
3396 psa_set_key_type( &attributes, key_type );
itayzafrir5c753392018-05-08 11:18:38 +03003397
Gilles Peskine049c7532019-05-15 20:22:09 +02003398 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003399 &key ) );
itayzafrir5c753392018-05-08 11:18:38 +03003400
Ronald Cron5425a212020-08-04 14:58:35 +02003401 PSA_ASSERT( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003402 hash_data->x, hash_data->len,
3403 signature_data->x, signature_data->len ) );
Gilles Peskine0627f982019-11-26 19:12:16 +01003404
itayzafrir5c753392018-05-08 11:18:38 +03003405exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003406 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003407 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003408 PSA_DONE( );
itayzafrir5c753392018-05-08 11:18:38 +03003409}
3410/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003411
3412/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02003413void verify_hash_fail( int key_type_arg, data_t *key_data,
3414 int alg_arg, data_t *hash_data,
3415 data_t *signature_data,
3416 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003417{
Ronald Cron5425a212020-08-04 14:58:35 +02003418 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003419 psa_key_type_t key_type = key_type_arg;
3420 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003421 psa_status_t actual_status;
3422 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003423 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003424
Gilles Peskine8817f612018-12-18 00:18:46 +01003425 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003426
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003427 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003428 psa_set_key_algorithm( &attributes, alg );
3429 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003430
Gilles Peskine049c7532019-05-15 20:22:09 +02003431 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003432 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003433
Ronald Cron5425a212020-08-04 14:58:35 +02003434 actual_status = psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01003435 hash_data->x, hash_data->len,
3436 signature_data->x, signature_data->len );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003437 TEST_EQUAL( actual_status, expected_status );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003438
3439exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003440 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003441 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003442 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003443}
3444/* END_CASE */
3445
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003446/* BEGIN_CASE */
gabor-mezei-arm53028482021-04-15 18:19:50 +02003447void sign_message_deterministic( int key_type_arg,
3448 data_t *key_data,
3449 int alg_arg,
3450 data_t *input_data,
3451 data_t *output_data )
3452{
3453 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3454 psa_key_type_t key_type = key_type_arg;
3455 psa_algorithm_t alg = alg_arg;
3456 size_t key_bits;
3457 unsigned char *signature = NULL;
3458 size_t signature_size;
3459 size_t signature_length = 0xdeadbeef;
3460 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3461
3462 PSA_ASSERT( psa_crypto_init( ) );
3463
3464 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
3465 psa_set_key_algorithm( &attributes, alg );
3466 psa_set_key_type( &attributes, key_type );
3467
3468 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3469 &key ) );
3470 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3471 key_bits = psa_get_key_bits( &attributes );
3472
3473 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
3474 TEST_ASSERT( signature_size != 0 );
3475 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
3476 ASSERT_ALLOC( signature, signature_size );
3477
3478 PSA_ASSERT( psa_sign_message( key, alg,
3479 input_data->x, input_data->len,
3480 signature, signature_size,
3481 &signature_length ) );
3482
3483 ASSERT_COMPARE( output_data->x, output_data->len,
3484 signature, signature_length );
3485
3486exit:
3487 psa_reset_key_attributes( &attributes );
3488
3489 psa_destroy_key( key );
3490 mbedtls_free( signature );
3491 PSA_DONE( );
3492
3493}
3494/* END_CASE */
3495
3496/* BEGIN_CASE */
3497void sign_message_fail( int key_type_arg,
3498 data_t *key_data,
3499 int alg_arg,
3500 data_t *input_data,
3501 int signature_size_arg,
3502 int expected_status_arg )
3503{
3504 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3505 psa_key_type_t key_type = key_type_arg;
3506 psa_algorithm_t alg = alg_arg;
3507 size_t signature_size = signature_size_arg;
3508 psa_status_t actual_status;
3509 psa_status_t expected_status = expected_status_arg;
3510 unsigned char *signature = NULL;
3511 size_t signature_length = 0xdeadbeef;
3512 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3513
3514 ASSERT_ALLOC( signature, signature_size );
3515
3516 PSA_ASSERT( psa_crypto_init( ) );
3517
3518 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
3519 psa_set_key_algorithm( &attributes, alg );
3520 psa_set_key_type( &attributes, key_type );
3521
3522 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3523 &key ) );
3524
3525 actual_status = psa_sign_message( key, alg,
3526 input_data->x, input_data->len,
3527 signature, signature_size,
3528 &signature_length );
3529 TEST_EQUAL( actual_status, expected_status );
3530 /* The value of *signature_length is unspecified on error, but
3531 * whatever it is, it should be less than signature_size, so that
3532 * if the caller tries to read *signature_length bytes without
3533 * checking the error code then they don't overflow a buffer. */
3534 TEST_ASSERT( signature_length <= signature_size );
3535
3536exit:
3537 psa_reset_key_attributes( &attributes );
3538 psa_destroy_key( key );
3539 mbedtls_free( signature );
3540 PSA_DONE( );
3541}
3542/* END_CASE */
3543
3544/* BEGIN_CASE */
3545void sign_verify_message( int key_type_arg,
3546 data_t *key_data,
3547 int alg_arg,
3548 data_t *input_data )
3549{
3550 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3551 psa_key_type_t key_type = key_type_arg;
3552 psa_algorithm_t alg = alg_arg;
3553 size_t key_bits;
3554 unsigned char *signature = NULL;
3555 size_t signature_size;
3556 size_t signature_length = 0xdeadbeef;
3557 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3558
3559 PSA_ASSERT( psa_crypto_init( ) );
3560
3561 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE |
3562 PSA_KEY_USAGE_VERIFY_MESSAGE );
3563 psa_set_key_algorithm( &attributes, alg );
3564 psa_set_key_type( &attributes, key_type );
3565
3566 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3567 &key ) );
3568 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3569 key_bits = psa_get_key_bits( &attributes );
3570
3571 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
3572 TEST_ASSERT( signature_size != 0 );
3573 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
3574 ASSERT_ALLOC( signature, signature_size );
3575
3576 PSA_ASSERT( psa_sign_message( key, alg,
3577 input_data->x, input_data->len,
3578 signature, signature_size,
3579 &signature_length ) );
3580 TEST_ASSERT( signature_length <= signature_size );
3581 TEST_ASSERT( signature_length > 0 );
3582
3583 PSA_ASSERT( psa_verify_message( key, alg,
3584 input_data->x, input_data->len,
3585 signature, signature_length ) );
3586
3587 if( input_data->len != 0 )
3588 {
3589 /* Flip a bit in the input and verify that the signature is now
3590 * detected as invalid. Flip a bit at the beginning, not at the end,
3591 * because ECDSA may ignore the last few bits of the input. */
3592 input_data->x[0] ^= 1;
3593 TEST_EQUAL( psa_verify_message( key, alg,
3594 input_data->x, input_data->len,
3595 signature, signature_length ),
3596 PSA_ERROR_INVALID_SIGNATURE );
3597 }
3598
3599exit:
3600 psa_reset_key_attributes( &attributes );
3601
3602 psa_destroy_key( key );
3603 mbedtls_free( signature );
3604 PSA_DONE( );
3605}
3606/* END_CASE */
3607
3608/* BEGIN_CASE */
3609void verify_message( int key_type_arg,
3610 data_t *key_data,
3611 int alg_arg,
3612 data_t *input_data,
3613 data_t *signature_data )
3614{
3615 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3616 psa_key_type_t key_type = key_type_arg;
3617 psa_algorithm_t alg = alg_arg;
3618 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3619
3620 TEST_ASSERT( signature_data->len <= PSA_SIGNATURE_MAX_SIZE );
3621
3622 PSA_ASSERT( psa_crypto_init( ) );
3623
3624 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_MESSAGE );
3625 psa_set_key_algorithm( &attributes, alg );
3626 psa_set_key_type( &attributes, key_type );
3627
3628 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3629 &key ) );
3630
3631 PSA_ASSERT( psa_verify_message( key, alg,
3632 input_data->x, input_data->len,
3633 signature_data->x, signature_data->len ) );
3634
3635exit:
3636 psa_reset_key_attributes( &attributes );
3637 psa_destroy_key( key );
3638 PSA_DONE( );
3639}
3640/* END_CASE */
3641
3642/* BEGIN_CASE */
3643void verify_message_fail( int key_type_arg,
3644 data_t *key_data,
3645 int alg_arg,
3646 data_t *hash_data,
3647 data_t *signature_data,
3648 int expected_status_arg )
3649{
3650 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3651 psa_key_type_t key_type = key_type_arg;
3652 psa_algorithm_t alg = alg_arg;
3653 psa_status_t actual_status;
3654 psa_status_t expected_status = expected_status_arg;
3655 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3656
3657 PSA_ASSERT( psa_crypto_init( ) );
3658
3659 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_MESSAGE );
3660 psa_set_key_algorithm( &attributes, alg );
3661 psa_set_key_type( &attributes, key_type );
3662
3663 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3664 &key ) );
3665
3666 actual_status = psa_verify_message( key, alg,
3667 hash_data->x, hash_data->len,
3668 signature_data->x,
3669 signature_data->len );
3670 TEST_EQUAL( actual_status, expected_status );
3671
3672exit:
3673 psa_reset_key_attributes( &attributes );
3674 psa_destroy_key( key );
3675 PSA_DONE( );
3676}
3677/* END_CASE */
3678
3679/* BEGIN_CASE */
Gilles Peskine656896e2018-06-29 19:12:28 +02003680void asymmetric_encrypt( int key_type_arg,
3681 data_t *key_data,
3682 int alg_arg,
3683 data_t *input_data,
Gilles Peskine68428122018-06-30 18:42:41 +02003684 data_t *label,
Gilles Peskine656896e2018-06-29 19:12:28 +02003685 int expected_output_length_arg,
3686 int expected_status_arg )
3687{
Ronald Cron5425a212020-08-04 14:58:35 +02003688 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003689 psa_key_type_t key_type = key_type_arg;
3690 psa_algorithm_t alg = alg_arg;
3691 size_t expected_output_length = expected_output_length_arg;
3692 size_t key_bits;
3693 unsigned char *output = NULL;
3694 size_t output_size;
3695 size_t output_length = ~0;
3696 psa_status_t actual_status;
3697 psa_status_t expected_status = expected_status_arg;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003698 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02003699
Gilles Peskine8817f612018-12-18 00:18:46 +01003700 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01003701
Gilles Peskine656896e2018-06-29 19:12:28 +02003702 /* Import the key */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003703 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3704 psa_set_key_algorithm( &attributes, alg );
3705 psa_set_key_type( &attributes, key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02003706 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003707 &key ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02003708
3709 /* Determine the maximum output length */
Ronald Cron5425a212020-08-04 14:58:35 +02003710 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003711 key_bits = psa_get_key_bits( &attributes );
gabor-mezei-armceface22021-01-21 12:26:17 +01003712
Gilles Peskine656896e2018-06-29 19:12:28 +02003713 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
gabor-mezei-armceface22021-01-21 12:26:17 +01003714 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003715 ASSERT_ALLOC( output, output_size );
Gilles Peskine656896e2018-06-29 19:12:28 +02003716
3717 /* Encrypt the input */
Ronald Cron5425a212020-08-04 14:58:35 +02003718 actual_status = psa_asymmetric_encrypt( key, alg,
Gilles Peskine656896e2018-06-29 19:12:28 +02003719 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003720 label->x, label->len,
Gilles Peskine656896e2018-06-29 19:12:28 +02003721 output, output_size,
3722 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003723 TEST_EQUAL( actual_status, expected_status );
3724 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine656896e2018-06-29 19:12:28 +02003725
Gilles Peskine68428122018-06-30 18:42:41 +02003726 /* If the label is empty, the test framework puts a non-null pointer
3727 * in label->x. Test that a null pointer works as well. */
3728 if( label->len == 0 )
3729 {
3730 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003731 if( output_size != 0 )
3732 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02003733 actual_status = psa_asymmetric_encrypt( key, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02003734 input_data->x, input_data->len,
3735 NULL, label->len,
3736 output, output_size,
3737 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003738 TEST_EQUAL( actual_status, expected_status );
3739 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003740 }
3741
Gilles Peskine656896e2018-06-29 19:12:28 +02003742exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003743 /*
3744 * Key attributes may have been returned by psa_get_key_attributes()
3745 * thus reset them as required.
3746 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003747 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003748
Ronald Cron5425a212020-08-04 14:58:35 +02003749 psa_destroy_key( key );
Gilles Peskine656896e2018-06-29 19:12:28 +02003750 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003751 PSA_DONE( );
Gilles Peskine656896e2018-06-29 19:12:28 +02003752}
3753/* END_CASE */
3754
3755/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003756void asymmetric_encrypt_decrypt( int key_type_arg,
3757 data_t *key_data,
3758 int alg_arg,
3759 data_t *input_data,
3760 data_t *label )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003761{
Ronald Cron5425a212020-08-04 14:58:35 +02003762 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003763 psa_key_type_t key_type = key_type_arg;
3764 psa_algorithm_t alg = alg_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003765 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003766 unsigned char *output = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003767 size_t output_size;
3768 size_t output_length = ~0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003769 unsigned char *output2 = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003770 size_t output2_size;
3771 size_t output2_length = ~0;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003772 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003773
Gilles Peskine8817f612018-12-18 00:18:46 +01003774 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003775
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003776 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3777 psa_set_key_algorithm( &attributes, alg );
3778 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003779
Gilles Peskine049c7532019-05-15 20:22:09 +02003780 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003781 &key ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003782
3783 /* Determine the maximum ciphertext length */
Ronald Cron5425a212020-08-04 14:58:35 +02003784 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02003785 key_bits = psa_get_key_bits( &attributes );
gabor-mezei-armceface22021-01-21 12:26:17 +01003786
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003787 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
gabor-mezei-armceface22021-01-21 12:26:17 +01003788 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003789 ASSERT_ALLOC( output, output_size );
gabor-mezei-armceface22021-01-21 12:26:17 +01003790
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003791 output2_size = input_data->len;
gabor-mezei-armceface22021-01-21 12:26:17 +01003792 TEST_ASSERT( output2_size <=
3793 PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE( key_type, key_bits, alg ) );
3794 TEST_ASSERT( output2_size <= PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003795 ASSERT_ALLOC( output2, output2_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003796
Gilles Peskineeebd7382018-06-08 18:11:54 +02003797 /* We test encryption by checking that encrypt-then-decrypt gives back
3798 * the original plaintext because of the non-optional random
3799 * part of encryption process which prevents using fixed vectors. */
Ronald Cron5425a212020-08-04 14:58:35 +02003800 PSA_ASSERT( psa_asymmetric_encrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01003801 input_data->x, input_data->len,
3802 label->x, label->len,
3803 output, output_size,
3804 &output_length ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003805 /* We don't know what ciphertext length to expect, but check that
3806 * it looks sensible. */
3807 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03003808
Ronald Cron5425a212020-08-04 14:58:35 +02003809 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01003810 output, output_length,
3811 label->x, label->len,
3812 output2, output2_size,
3813 &output2_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003814 ASSERT_COMPARE( input_data->x, input_data->len,
3815 output2, output2_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003816
3817exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003818 /*
3819 * Key attributes may have been returned by psa_get_key_attributes()
3820 * thus reset them as required.
3821 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003822 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01003823
Ronald Cron5425a212020-08-04 14:58:35 +02003824 psa_destroy_key( key );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003825 mbedtls_free( output );
3826 mbedtls_free( output2 );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003827 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003828}
3829/* END_CASE */
3830
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003831/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003832void asymmetric_decrypt( int key_type_arg,
3833 data_t *key_data,
3834 int alg_arg,
3835 data_t *input_data,
3836 data_t *label,
Gilles Peskine66763a02018-06-29 21:54:10 +02003837 data_t *expected_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003838{
Ronald Cron5425a212020-08-04 14:58:35 +02003839 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003840 psa_key_type_t key_type = key_type_arg;
3841 psa_algorithm_t alg = alg_arg;
gabor-mezei-armceface22021-01-21 12:26:17 +01003842 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003843 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03003844 size_t output_size = 0;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003845 size_t output_length = ~0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003846 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003847
Gilles Peskine8817f612018-12-18 00:18:46 +01003848 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003849
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003850 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3851 psa_set_key_algorithm( &attributes, alg );
3852 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003853
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 ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003856
gabor-mezei-armceface22021-01-21 12:26:17 +01003857 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3858 key_bits = psa_get_key_bits( &attributes );
3859
3860 /* Determine the maximum ciphertext length */
3861 output_size = PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
3862 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE );
3863 ASSERT_ALLOC( output, output_size );
3864
Ronald Cron5425a212020-08-04 14:58:35 +02003865 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01003866 input_data->x, input_data->len,
3867 label->x, label->len,
3868 output,
3869 output_size,
3870 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003871 ASSERT_COMPARE( expected_data->x, expected_data->len,
3872 output, output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003873
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 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01003882 input_data->x, input_data->len,
3883 NULL, label->len,
3884 output,
3885 output_size,
3886 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003887 ASSERT_COMPARE( expected_data->x, expected_data->len,
3888 output, output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02003889 }
3890
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003891exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003892 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003893 psa_destroy_key( key );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003894 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003895 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003896}
3897/* END_CASE */
3898
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003899/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02003900void asymmetric_decrypt_fail( int key_type_arg,
3901 data_t *key_data,
3902 int alg_arg,
3903 data_t *input_data,
3904 data_t *label,
Jaeden Amerof8daab72019-02-06 12:57:46 +00003905 int output_size_arg,
Gilles Peskine2d277862018-06-18 15:41:12 +02003906 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003907{
Ronald Cron5425a212020-08-04 14:58:35 +02003908 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003909 psa_key_type_t key_type = key_type_arg;
3910 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003911 unsigned char *output = NULL;
Jaeden Amerof8daab72019-02-06 12:57:46 +00003912 size_t output_size = output_size_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003913 size_t output_length = ~0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003914 psa_status_t actual_status;
3915 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003916 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003917
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003918 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003919
Gilles Peskine8817f612018-12-18 00:18:46 +01003920 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003921
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003922 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3923 psa_set_key_algorithm( &attributes, alg );
3924 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03003925
Gilles Peskine049c7532019-05-15 20:22:09 +02003926 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003927 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003928
Ronald Cron5425a212020-08-04 14:58:35 +02003929 actual_status = psa_asymmetric_decrypt( key, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003930 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02003931 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02003932 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02003933 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003934 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003935 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003936
Gilles Peskine68428122018-06-30 18:42:41 +02003937 /* If the label is empty, the test framework puts a non-null pointer
3938 * in label->x. Test that a null pointer works as well. */
3939 if( label->len == 0 )
3940 {
3941 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02003942 if( output_size != 0 )
3943 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02003944 actual_status = psa_asymmetric_decrypt( key, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02003945 input_data->x, input_data->len,
3946 NULL, label->len,
3947 output, output_size,
3948 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01003949 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02003950 TEST_ASSERT( output_length <= output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02003951 }
3952
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003953exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02003954 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02003955 psa_destroy_key( key );
Gilles Peskine2d277862018-06-18 15:41:12 +02003956 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003957 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03003958}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02003959/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02003960
3961/* BEGIN_CASE */
Gilles Peskinecbe66502019-05-16 16:59:18 +02003962void key_derivation_init( )
Jaeden Amerod94d6712019-01-04 14:11:48 +00003963{
3964 /* Test each valid way of initializing the object, except for `= {0}`, as
3965 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
3966 * though it's OK by the C standard. We could test for this, but we'd need
3967 * to supress the Clang warning for the test. */
Jaeden Amero5229bbb2019-02-07 16:33:37 +00003968 size_t capacity;
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02003969 psa_key_derivation_operation_t func = psa_key_derivation_operation_init( );
3970 psa_key_derivation_operation_t init = PSA_KEY_DERIVATION_OPERATION_INIT;
3971 psa_key_derivation_operation_t zero;
Jaeden Amerod94d6712019-01-04 14:11:48 +00003972
3973 memset( &zero, 0, sizeof( zero ) );
3974
Gilles Peskine51ae0e42019-05-16 17:31:03 +02003975 /* A default operation should not be able to report its capacity. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02003976 TEST_EQUAL( psa_key_derivation_get_capacity( &func, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00003977 PSA_ERROR_BAD_STATE );
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02003978 TEST_EQUAL( psa_key_derivation_get_capacity( &init, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00003979 PSA_ERROR_BAD_STATE );
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02003980 TEST_EQUAL( psa_key_derivation_get_capacity( &zero, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00003981 PSA_ERROR_BAD_STATE );
Jaeden Amero5229bbb2019-02-07 16:33:37 +00003982
Gilles Peskine51ae0e42019-05-16 17:31:03 +02003983 /* A default operation should be abortable without error. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02003984 PSA_ASSERT( psa_key_derivation_abort(&func) );
3985 PSA_ASSERT( psa_key_derivation_abort(&init) );
3986 PSA_ASSERT( psa_key_derivation_abort(&zero) );
Jaeden Amerod94d6712019-01-04 14:11:48 +00003987}
3988/* END_CASE */
3989
Janos Follath16de4a42019-06-13 16:32:24 +01003990/* BEGIN_CASE */
3991void derive_setup( int alg_arg, int expected_status_arg )
Gilles Peskineea0fb492018-07-12 17:17:20 +02003992{
Gilles Peskineea0fb492018-07-12 17:17:20 +02003993 psa_algorithm_t alg = alg_arg;
Gilles Peskineea0fb492018-07-12 17:17:20 +02003994 psa_status_t expected_status = expected_status_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02003995 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02003996
Gilles Peskine8817f612018-12-18 00:18:46 +01003997 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02003998
Janos Follath16de4a42019-06-13 16:32:24 +01003999 TEST_EQUAL( psa_key_derivation_setup( &operation, alg ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004000 expected_status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004001
4002exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004003 psa_key_derivation_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004004 PSA_DONE( );
Gilles Peskineea0fb492018-07-12 17:17:20 +02004005}
4006/* END_CASE */
4007
Janos Follathaf3c2a02019-06-12 12:34:34 +01004008/* BEGIN_CASE */
Janos Follatha27c9272019-06-14 09:59:36 +01004009void derive_set_capacity( int alg_arg, int capacity_arg,
4010 int expected_status_arg )
4011{
4012 psa_algorithm_t alg = alg_arg;
4013 size_t capacity = capacity_arg;
4014 psa_status_t expected_status = expected_status_arg;
4015 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4016
4017 PSA_ASSERT( psa_crypto_init( ) );
4018
4019 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4020
4021 TEST_EQUAL( psa_key_derivation_set_capacity( &operation, capacity ),
4022 expected_status );
4023
4024exit:
4025 psa_key_derivation_abort( &operation );
4026 PSA_DONE( );
4027}
4028/* END_CASE */
4029
4030/* BEGIN_CASE */
Janos Follathaf3c2a02019-06-12 12:34:34 +01004031void derive_input( int alg_arg,
Gilles Peskine6842ba42019-09-23 13:49:33 +02004032 int step_arg1, int key_type_arg1, data_t *input1,
Janos Follathaf3c2a02019-06-12 12:34:34 +01004033 int expected_status_arg1,
Gilles Peskine2058c072019-09-24 17:19:33 +02004034 int step_arg2, int key_type_arg2, data_t *input2,
Janos Follathaf3c2a02019-06-12 12:34:34 +01004035 int expected_status_arg2,
Gilles Peskine2058c072019-09-24 17:19:33 +02004036 int step_arg3, int key_type_arg3, data_t *input3,
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004037 int expected_status_arg3,
4038 int output_key_type_arg, int expected_output_status_arg )
Janos Follathaf3c2a02019-06-12 12:34:34 +01004039{
4040 psa_algorithm_t alg = alg_arg;
Gilles Peskine6842ba42019-09-23 13:49:33 +02004041 psa_key_derivation_step_t steps[] = {step_arg1, step_arg2, step_arg3};
4042 psa_key_type_t key_types[] = {key_type_arg1, key_type_arg2, key_type_arg3};
Janos Follathaf3c2a02019-06-12 12:34:34 +01004043 psa_status_t expected_statuses[] = {expected_status_arg1,
4044 expected_status_arg2,
4045 expected_status_arg3};
4046 data_t *inputs[] = {input1, input2, input3};
Ronald Cron5425a212020-08-04 14:58:35 +02004047 mbedtls_svc_key_id_t keys[] = { MBEDTLS_SVC_KEY_ID_INIT,
4048 MBEDTLS_SVC_KEY_ID_INIT,
4049 MBEDTLS_SVC_KEY_ID_INIT };
Janos Follathaf3c2a02019-06-12 12:34:34 +01004050 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4051 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4052 size_t i;
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004053 psa_key_type_t output_key_type = output_key_type_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02004054 mbedtls_svc_key_id_t output_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004055 psa_status_t expected_output_status = expected_output_status_arg;
4056 psa_status_t actual_output_status;
Janos Follathaf3c2a02019-06-12 12:34:34 +01004057
4058 PSA_ASSERT( psa_crypto_init( ) );
4059
4060 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4061 psa_set_key_algorithm( &attributes, alg );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004062
4063 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4064
4065 for( i = 0; i < ARRAY_LENGTH( steps ); i++ )
4066 {
Gilles Peskineb8965192019-09-24 16:21:10 +02004067 if( key_types[i] != PSA_KEY_TYPE_NONE )
Janos Follathaf3c2a02019-06-12 12:34:34 +01004068 {
Gilles Peskine6842ba42019-09-23 13:49:33 +02004069 psa_set_key_type( &attributes, key_types[i] );
4070 PSA_ASSERT( psa_import_key( &attributes,
4071 inputs[i]->x, inputs[i]->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004072 &keys[i] ) );
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004073 if( PSA_KEY_TYPE_IS_KEY_PAIR( key_types[i] ) &&
4074 steps[i] == PSA_KEY_DERIVATION_INPUT_SECRET )
4075 {
4076 // When taking a private key as secret input, use key agreement
4077 // to add the shared secret to the derivation
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004078 TEST_EQUAL( mbedtls_test_psa_key_agreement_with_self(
4079 &operation, keys[i] ),
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004080 expected_statuses[i] );
4081 }
4082 else
4083 {
4084 TEST_EQUAL( psa_key_derivation_input_key( &operation, steps[i],
Ronald Cron5425a212020-08-04 14:58:35 +02004085 keys[i] ),
Steven Cooreman0ee0d522020-10-05 16:03:42 +02004086 expected_statuses[i] );
4087 }
Gilles Peskine6842ba42019-09-23 13:49:33 +02004088 }
4089 else
4090 {
4091 TEST_EQUAL( psa_key_derivation_input_bytes(
4092 &operation, steps[i],
4093 inputs[i]->x, inputs[i]->len ),
4094 expected_statuses[i] );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004095 }
4096 }
4097
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004098 if( output_key_type != PSA_KEY_TYPE_NONE )
4099 {
4100 psa_reset_key_attributes( &attributes );
4101 psa_set_key_type( &attributes, PSA_KEY_TYPE_RAW_DATA );
4102 psa_set_key_bits( &attributes, 8 );
4103 actual_output_status =
4104 psa_key_derivation_output_key( &attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004105 &output_key );
Gilles Peskine1a2904c2019-09-24 17:45:07 +02004106 }
4107 else
4108 {
4109 uint8_t buffer[1];
4110 actual_output_status =
4111 psa_key_derivation_output_bytes( &operation,
4112 buffer, sizeof( buffer ) );
4113 }
4114 TEST_EQUAL( actual_output_status, expected_output_status );
4115
Janos Follathaf3c2a02019-06-12 12:34:34 +01004116exit:
4117 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004118 for( i = 0; i < ARRAY_LENGTH( keys ); i++ )
4119 psa_destroy_key( keys[i] );
4120 psa_destroy_key( output_key );
Janos Follathaf3c2a02019-06-12 12:34:34 +01004121 PSA_DONE( );
4122}
4123/* END_CASE */
4124
Janos Follathd958bb72019-07-03 15:02:16 +01004125/* BEGIN_CASE */
4126void test_derive_invalid_key_derivation_state( int alg_arg )
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004127{
Janos Follathd958bb72019-07-03 15:02:16 +01004128 psa_algorithm_t alg = alg_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02004129 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein4eda37b2018-10-31 12:15:58 +02004130 size_t key_type = PSA_KEY_TYPE_DERIVE;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004131 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Janos Follathd958bb72019-07-03 15:02:16 +01004132 unsigned char input1[] = "Input 1";
4133 size_t input1_length = sizeof( input1 );
4134 unsigned char input2[] = "Input 2";
4135 size_t input2_length = sizeof( input2 );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004136 uint8_t buffer[42];
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02004137 size_t capacity = sizeof( buffer );
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02004138 const uint8_t key_data[22] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
4139 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
4140 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004141 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004142
Gilles Peskine8817f612018-12-18 00:18:46 +01004143 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004144
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02004145 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4146 psa_set_key_algorithm( &attributes, alg );
4147 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004148
Gilles Peskine73676cb2019-05-15 20:15:10 +02004149 PSA_ASSERT( psa_import_key( &attributes,
4150 key_data, sizeof( key_data ),
Ronald Cron5425a212020-08-04 14:58:35 +02004151 &key ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004152
4153 /* valid key derivation */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004154 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, key, alg,
4155 input1, input1_length,
4156 input2, input2_length,
4157 capacity ) )
Janos Follathd958bb72019-07-03 15:02:16 +01004158 goto exit;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004159
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004160 /* state of operation shouldn't allow additional generation */
Janos Follathd958bb72019-07-03 15:02:16 +01004161 TEST_EQUAL( psa_key_derivation_setup( &operation, alg ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01004162 PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004163
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004164 PSA_ASSERT( psa_key_derivation_output_bytes( &operation, buffer, capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004165
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004166 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, buffer, capacity ),
David Saadab4ecc272019-02-14 13:48:10 +02004167 PSA_ERROR_INSUFFICIENT_DATA );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004168
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004169exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004170 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004171 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004172 PSA_DONE( );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004173}
4174/* END_CASE */
4175
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004176/* BEGIN_CASE */
Gilles Peskinecbe66502019-05-16 16:59:18 +02004177void test_derive_invalid_key_derivation_tests( )
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004178{
4179 uint8_t output_buffer[16];
4180 size_t buffer_size = 16;
4181 size_t capacity = 0;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004182 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004183
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004184 TEST_ASSERT( psa_key_derivation_output_bytes( &operation,
4185 output_buffer, buffer_size )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004186 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004187
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004188 TEST_ASSERT( psa_key_derivation_get_capacity( &operation, &capacity )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004189 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004190
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004191 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004192
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004193 TEST_ASSERT( psa_key_derivation_output_bytes( &operation,
4194 output_buffer, buffer_size )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004195 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004196
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004197 TEST_ASSERT( psa_key_derivation_get_capacity( &operation, &capacity )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00004198 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03004199
4200exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004201 psa_key_derivation_abort( &operation );
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03004202}
4203/* END_CASE */
4204
4205/* BEGIN_CASE */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004206void derive_output( int alg_arg,
Gilles Peskine1468da72019-05-29 17:35:49 +02004207 int step1_arg, data_t *input1,
4208 int step2_arg, data_t *input2,
4209 int step3_arg, data_t *input3,
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004210 int requested_capacity_arg,
4211 data_t *expected_output1,
4212 data_t *expected_output2 )
4213{
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004214 psa_algorithm_t alg = alg_arg;
Gilles Peskine1468da72019-05-29 17:35:49 +02004215 psa_key_derivation_step_t steps[] = {step1_arg, step2_arg, step3_arg};
4216 data_t *inputs[] = {input1, input2, input3};
Ronald Cron5425a212020-08-04 14:58:35 +02004217 mbedtls_svc_key_id_t keys[] = { MBEDTLS_SVC_KEY_ID_INIT,
4218 MBEDTLS_SVC_KEY_ID_INIT,
4219 MBEDTLS_SVC_KEY_ID_INIT };
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004220 size_t requested_capacity = requested_capacity_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004221 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004222 uint8_t *expected_outputs[2] =
4223 {expected_output1->x, expected_output2->x};
4224 size_t output_sizes[2] =
4225 {expected_output1->len, expected_output2->len};
4226 size_t output_buffer_size = 0;
4227 uint8_t *output_buffer = NULL;
4228 size_t expected_capacity;
4229 size_t current_capacity;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004230 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004231 psa_status_t status;
Gilles Peskine1468da72019-05-29 17:35:49 +02004232 size_t i;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004233
4234 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4235 {
4236 if( output_sizes[i] > output_buffer_size )
4237 output_buffer_size = output_sizes[i];
4238 if( output_sizes[i] == 0 )
4239 expected_outputs[i] = NULL;
4240 }
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004241 ASSERT_ALLOC( output_buffer, output_buffer_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01004242 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004243
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004244 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4245 psa_set_key_algorithm( &attributes, alg );
4246 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004247
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004248 /* Extraction phase. */
Gilles Peskine1468da72019-05-29 17:35:49 +02004249 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
4250 PSA_ASSERT( psa_key_derivation_set_capacity( &operation,
4251 requested_capacity ) );
4252 for( i = 0; i < ARRAY_LENGTH( steps ); i++ )
Gilles Peskineb70a0fd2019-01-07 22:59:38 +01004253 {
Gilles Peskine1468da72019-05-29 17:35:49 +02004254 switch( steps[i] )
4255 {
4256 case 0:
4257 break;
4258 case PSA_KEY_DERIVATION_INPUT_SECRET:
4259 PSA_ASSERT( psa_import_key( &attributes,
4260 inputs[i]->x, inputs[i]->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004261 &keys[i] ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01004262
4263 if ( PSA_ALG_IS_TLS12_PSK_TO_MS( alg ) )
4264 {
4265 PSA_ASSERT( psa_get_key_attributes( keys[i], &attributes ) );
4266 TEST_ASSERT( PSA_BITS_TO_BYTES( psa_get_key_bits( &attributes ) ) <=
4267 PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE );
4268 }
4269
Gilles Peskine1468da72019-05-29 17:35:49 +02004270 PSA_ASSERT( psa_key_derivation_input_key(
Ronald Cron5425a212020-08-04 14:58:35 +02004271 &operation, steps[i], keys[i] ) );
Gilles Peskine1468da72019-05-29 17:35:49 +02004272 break;
4273 default:
4274 PSA_ASSERT( psa_key_derivation_input_bytes(
4275 &operation, steps[i],
4276 inputs[i]->x, inputs[i]->len ) );
4277 break;
4278 }
Gilles Peskineb70a0fd2019-01-07 22:59:38 +01004279 }
Gilles Peskine1468da72019-05-29 17:35:49 +02004280
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004281 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004282 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004283 TEST_EQUAL( current_capacity, requested_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004284 expected_capacity = requested_capacity;
4285
4286 /* Expansion phase. */
4287 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
4288 {
4289 /* Read some bytes. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004290 status = psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004291 output_buffer, output_sizes[i] );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004292 if( expected_capacity == 0 && output_sizes[i] == 0 )
4293 {
4294 /* Reading 0 bytes when 0 bytes are available can go either way. */
4295 TEST_ASSERT( status == PSA_SUCCESS ||
David Saadab4ecc272019-02-14 13:48:10 +02004296 status == PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004297 continue;
4298 }
4299 else if( expected_capacity == 0 ||
4300 output_sizes[i] > expected_capacity )
4301 {
4302 /* Capacity exceeded. */
David Saadab4ecc272019-02-14 13:48:10 +02004303 TEST_EQUAL( status, PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004304 expected_capacity = 0;
4305 continue;
4306 }
4307 /* Success. Check the read data. */
Gilles Peskine8817f612018-12-18 00:18:46 +01004308 PSA_ASSERT( status );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004309 if( output_sizes[i] != 0 )
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004310 ASSERT_COMPARE( output_buffer, output_sizes[i],
4311 expected_outputs[i], output_sizes[i] );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004312 /* Check the operation status. */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004313 expected_capacity -= output_sizes[i];
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004314 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004315 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004316 TEST_EQUAL( expected_capacity, current_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004317 }
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004318 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004319
4320exit:
4321 mbedtls_free( output_buffer );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004322 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004323 for( i = 0; i < ARRAY_LENGTH( keys ); i++ )
4324 psa_destroy_key( keys[i] );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004325 PSA_DONE( );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02004326}
4327/* END_CASE */
4328
4329/* BEGIN_CASE */
Gilles Peskined54931c2018-07-17 21:06:59 +02004330void derive_full( int alg_arg,
4331 data_t *key_data,
Janos Follath47f27ed2019-06-25 13:24:52 +01004332 data_t *input1,
4333 data_t *input2,
Gilles Peskined54931c2018-07-17 21:06:59 +02004334 int requested_capacity_arg )
4335{
Ronald Cron5425a212020-08-04 14:58:35 +02004336 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004337 psa_algorithm_t alg = alg_arg;
4338 size_t requested_capacity = requested_capacity_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004339 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004340 unsigned char output_buffer[16];
4341 size_t expected_capacity = requested_capacity;
4342 size_t current_capacity;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004343 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02004344
Gilles Peskine8817f612018-12-18 00:18:46 +01004345 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004346
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004347 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4348 psa_set_key_algorithm( &attributes, alg );
4349 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskined54931c2018-07-17 21:06:59 +02004350
Gilles Peskine049c7532019-05-15 20:22:09 +02004351 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004352 &key ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004353
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004354 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, key, alg,
4355 input1->x, input1->len,
4356 input2->x, input2->len,
4357 requested_capacity ) )
Janos Follathf2815ea2019-07-03 12:41:36 +01004358 goto exit;
Janos Follath47f27ed2019-06-25 13:24:52 +01004359
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004360 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004361 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004362 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004363
4364 /* Expansion phase. */
4365 while( current_capacity > 0 )
4366 {
4367 size_t read_size = sizeof( output_buffer );
4368 if( read_size > current_capacity )
4369 read_size = current_capacity;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004370 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004371 output_buffer,
4372 read_size ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004373 expected_capacity -= read_size;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004374 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004375 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004376 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02004377 }
4378
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004379 /* Check that the operation refuses to go over capacity. */
4380 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, output_buffer, 1 ),
David Saadab4ecc272019-02-14 13:48:10 +02004381 PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskined54931c2018-07-17 21:06:59 +02004382
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004383 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02004384
4385exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004386 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004387 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004388 PSA_DONE( );
Gilles Peskined54931c2018-07-17 21:06:59 +02004389}
4390/* END_CASE */
4391
Janos Follathe60c9052019-07-03 13:51:30 +01004392/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02004393void derive_key_exercise( int alg_arg,
4394 data_t *key_data,
Janos Follathe60c9052019-07-03 13:51:30 +01004395 data_t *input1,
4396 data_t *input2,
Gilles Peskine0386fba2018-07-12 17:29:22 +02004397 int derived_type_arg,
4398 int derived_bits_arg,
4399 int derived_usage_arg,
4400 int derived_alg_arg )
4401{
Ronald Cron5425a212020-08-04 14:58:35 +02004402 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4403 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004404 psa_algorithm_t alg = alg_arg;
4405 psa_key_type_t derived_type = derived_type_arg;
4406 size_t derived_bits = derived_bits_arg;
4407 psa_key_usage_t derived_usage = derived_usage_arg;
4408 psa_algorithm_t derived_alg = derived_alg_arg;
4409 size_t capacity = PSA_BITS_TO_BYTES( derived_bits );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004410 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004411 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004412 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004413
Gilles Peskine8817f612018-12-18 00:18:46 +01004414 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004415
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004416 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4417 psa_set_key_algorithm( &attributes, alg );
4418 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02004419 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004420 &base_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004421
4422 /* Derive a key. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004423 if ( mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4424 input1->x, input1->len,
4425 input2->x, input2->len,
4426 capacity ) )
Janos Follathe60c9052019-07-03 13:51:30 +01004427 goto exit;
4428
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004429 psa_set_key_usage_flags( &attributes, derived_usage );
4430 psa_set_key_algorithm( &attributes, derived_alg );
4431 psa_set_key_type( &attributes, derived_type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004432 psa_set_key_bits( &attributes, derived_bits );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004433 PSA_ASSERT( psa_key_derivation_output_key( &attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004434 &derived_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004435
4436 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02004437 PSA_ASSERT( psa_get_key_attributes( derived_key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004438 TEST_EQUAL( psa_get_key_type( &got_attributes ), derived_type );
4439 TEST_EQUAL( psa_get_key_bits( &got_attributes ), derived_bits );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004440
4441 /* Exercise the derived key. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004442 if( ! mbedtls_test_psa_exercise_key( derived_key, derived_usage, derived_alg ) )
Gilles Peskine0386fba2018-07-12 17:29:22 +02004443 goto exit;
4444
4445exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004446 /*
4447 * Key attributes may have been returned by psa_get_key_attributes()
4448 * thus reset them as required.
4449 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004450 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004451
4452 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004453 psa_destroy_key( base_key );
4454 psa_destroy_key( derived_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004455 PSA_DONE( );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004456}
4457/* END_CASE */
4458
Janos Follath42fd8882019-07-03 14:17:09 +01004459/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02004460void derive_key_export( int alg_arg,
4461 data_t *key_data,
Janos Follath42fd8882019-07-03 14:17:09 +01004462 data_t *input1,
4463 data_t *input2,
Gilles Peskine0386fba2018-07-12 17:29:22 +02004464 int bytes1_arg,
4465 int bytes2_arg )
4466{
Ronald Cron5425a212020-08-04 14:58:35 +02004467 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4468 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004469 psa_algorithm_t alg = alg_arg;
4470 size_t bytes1 = bytes1_arg;
4471 size_t bytes2 = bytes2_arg;
4472 size_t capacity = bytes1 + bytes2;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004473 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004474 uint8_t *output_buffer = NULL;
4475 uint8_t *export_buffer = NULL;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004476 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
4477 psa_key_attributes_t derived_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02004478 size_t length;
4479
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004480 ASSERT_ALLOC( output_buffer, capacity );
4481 ASSERT_ALLOC( export_buffer, capacity );
Gilles Peskine8817f612018-12-18 00:18:46 +01004482 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004483
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004484 psa_set_key_usage_flags( &base_attributes, PSA_KEY_USAGE_DERIVE );
4485 psa_set_key_algorithm( &base_attributes, alg );
4486 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02004487 PSA_ASSERT( psa_import_key( &base_attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004488 &base_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004489
4490 /* Derive some material and output it. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004491 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4492 input1->x, input1->len,
4493 input2->x, input2->len,
4494 capacity ) )
Janos Follath42fd8882019-07-03 14:17:09 +01004495 goto exit;
4496
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004497 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004498 output_buffer,
4499 capacity ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004500 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004501
4502 /* Derive the same output again, but this time store it in key objects. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004503 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4504 input1->x, input1->len,
4505 input2->x, input2->len,
4506 capacity ) )
Janos Follath42fd8882019-07-03 14:17:09 +01004507 goto exit;
4508
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004509 psa_set_key_usage_flags( &derived_attributes, PSA_KEY_USAGE_EXPORT );
4510 psa_set_key_algorithm( &derived_attributes, 0 );
4511 psa_set_key_type( &derived_attributes, PSA_KEY_TYPE_RAW_DATA );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004512 psa_set_key_bits( &derived_attributes, PSA_BYTES_TO_BITS( bytes1 ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004513 PSA_ASSERT( psa_key_derivation_output_key( &derived_attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004514 &derived_key ) );
4515 PSA_ASSERT( psa_export_key( derived_key,
Gilles Peskine8817f612018-12-18 00:18:46 +01004516 export_buffer, bytes1,
4517 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004518 TEST_EQUAL( length, bytes1 );
Ronald Cron5425a212020-08-04 14:58:35 +02004519 PSA_ASSERT( psa_destroy_key( derived_key ) );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004520 psa_set_key_bits( &derived_attributes, PSA_BYTES_TO_BITS( bytes2 ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004521 PSA_ASSERT( psa_key_derivation_output_key( &derived_attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02004522 &derived_key ) );
4523 PSA_ASSERT( psa_export_key( derived_key,
Gilles Peskine8817f612018-12-18 00:18:46 +01004524 export_buffer + bytes1, bytes2,
4525 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004526 TEST_EQUAL( length, bytes2 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004527
4528 /* Compare the outputs from the two runs. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004529 ASSERT_COMPARE( output_buffer, bytes1 + bytes2,
4530 export_buffer, capacity );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004531
4532exit:
4533 mbedtls_free( output_buffer );
4534 mbedtls_free( export_buffer );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004535 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004536 psa_destroy_key( base_key );
4537 psa_destroy_key( derived_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004538 PSA_DONE( );
Gilles Peskine0386fba2018-07-12 17:29:22 +02004539}
4540/* END_CASE */
4541
4542/* BEGIN_CASE */
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004543void derive_key( int alg_arg,
4544 data_t *key_data, data_t *input1, data_t *input2,
4545 int type_arg, int bits_arg,
Steven Cooreman83fdb702021-01-21 14:24:39 +01004546 int expected_status_arg,
4547 int is_large_output )
Gilles Peskinec744d992019-07-30 17:26:54 +02004548{
Ronald Cron5425a212020-08-04 14:58:35 +02004549 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
4550 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec744d992019-07-30 17:26:54 +02004551 psa_algorithm_t alg = alg_arg;
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004552 psa_key_type_t type = type_arg;
Gilles Peskinec744d992019-07-30 17:26:54 +02004553 size_t bits = bits_arg;
4554 psa_status_t expected_status = expected_status_arg;
4555 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
4556 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
4557 psa_key_attributes_t derived_attributes = PSA_KEY_ATTRIBUTES_INIT;
4558
4559 PSA_ASSERT( psa_crypto_init( ) );
4560
4561 psa_set_key_usage_flags( &base_attributes, PSA_KEY_USAGE_DERIVE );
4562 psa_set_key_algorithm( &base_attributes, alg );
4563 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
4564 PSA_ASSERT( psa_import_key( &base_attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02004565 &base_key ) );
Gilles Peskinec744d992019-07-30 17:26:54 +02004566
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004567 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
4568 input1->x, input1->len,
4569 input2->x, input2->len,
4570 SIZE_MAX ) )
Gilles Peskinec744d992019-07-30 17:26:54 +02004571 goto exit;
4572
4573 psa_set_key_usage_flags( &derived_attributes, PSA_KEY_USAGE_EXPORT );
4574 psa_set_key_algorithm( &derived_attributes, 0 );
Gilles Peskine7c227ae2019-07-31 15:14:44 +02004575 psa_set_key_type( &derived_attributes, type );
Gilles Peskinec744d992019-07-30 17:26:54 +02004576 psa_set_key_bits( &derived_attributes, bits );
Steven Cooreman83fdb702021-01-21 14:24:39 +01004577
4578 psa_status_t status =
4579 psa_key_derivation_output_key( &derived_attributes,
4580 &operation,
4581 &derived_key );
4582 if( is_large_output > 0 )
4583 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
4584 TEST_EQUAL( status, expected_status );
Gilles Peskinec744d992019-07-30 17:26:54 +02004585
4586exit:
4587 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02004588 psa_destroy_key( base_key );
4589 psa_destroy_key( derived_key );
Gilles Peskinec744d992019-07-30 17:26:54 +02004590 PSA_DONE( );
4591}
4592/* END_CASE */
4593
4594/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02004595void key_agreement_setup( int alg_arg,
Steven Cooremance48e852020-10-05 16:02:45 +02004596 int our_key_type_arg, int our_key_alg_arg,
4597 data_t *our_key_data, data_t *peer_key_data,
Gilles Peskine01d718c2018-09-18 12:01:02 +02004598 int expected_status_arg )
4599{
Ronald Cron5425a212020-08-04 14:58:35 +02004600 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004601 psa_algorithm_t alg = alg_arg;
Steven Cooremanfa5e6312020-10-15 17:07:12 +02004602 psa_algorithm_t our_key_alg = our_key_alg_arg;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004603 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004604 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004605 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine77f40d82019-04-11 21:27:06 +02004606 psa_status_t expected_status = expected_status_arg;
4607 psa_status_t status;
Gilles Peskine01d718c2018-09-18 12:01:02 +02004608
Gilles Peskine8817f612018-12-18 00:18:46 +01004609 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004610
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004611 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
Steven Cooremanfa5e6312020-10-15 17:07:12 +02004612 psa_set_key_algorithm( &attributes, our_key_alg );
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004613 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004614 PSA_ASSERT( psa_import_key( &attributes,
4615 our_key_data->x, our_key_data->len,
4616 &our_key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004617
Gilles Peskine77f40d82019-04-11 21:27:06 +02004618 /* The tests currently include inputs that should fail at either step.
4619 * Test cases that fail at the setup step should be changed to call
4620 * key_derivation_setup instead, and this function should be renamed
4621 * to key_agreement_fail. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004622 status = psa_key_derivation_setup( &operation, alg );
Gilles Peskine77f40d82019-04-11 21:27:06 +02004623 if( status == PSA_SUCCESS )
4624 {
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004625 TEST_EQUAL( psa_key_derivation_key_agreement(
4626 &operation, PSA_KEY_DERIVATION_INPUT_SECRET,
4627 our_key,
4628 peer_key_data->x, peer_key_data->len ),
Gilles Peskine77f40d82019-04-11 21:27:06 +02004629 expected_status );
4630 }
4631 else
4632 {
4633 TEST_ASSERT( status == expected_status );
4634 }
Gilles Peskine01d718c2018-09-18 12:01:02 +02004635
4636exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004637 psa_key_derivation_abort( &operation );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004638 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004639 PSA_DONE( );
Gilles Peskine01d718c2018-09-18 12:01:02 +02004640}
4641/* END_CASE */
4642
4643/* BEGIN_CASE */
Gilles Peskinef0cba732019-04-11 22:12:38 +02004644void raw_key_agreement( int alg_arg,
4645 int our_key_type_arg, data_t *our_key_data,
4646 data_t *peer_key_data,
4647 data_t *expected_output )
4648{
Ronald Cron5425a212020-08-04 14:58:35 +02004649 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004650 psa_algorithm_t alg = alg_arg;
4651 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004652 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004653 unsigned char *output = NULL;
4654 size_t output_length = ~0;
gabor-mezei-armceface22021-01-21 12:26:17 +01004655 size_t key_bits;
Gilles Peskinef0cba732019-04-11 22:12:38 +02004656
4657 ASSERT_ALLOC( output, expected_output->len );
4658 PSA_ASSERT( psa_crypto_init( ) );
4659
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004660 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4661 psa_set_key_algorithm( &attributes, alg );
4662 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004663 PSA_ASSERT( psa_import_key( &attributes,
4664 our_key_data->x, our_key_data->len,
4665 &our_key ) );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004666
gabor-mezei-armceface22021-01-21 12:26:17 +01004667 PSA_ASSERT( psa_get_key_attributes( our_key, &attributes ) );
4668 key_bits = psa_get_key_bits( &attributes );
4669
Gilles Peskinebe697d82019-05-16 18:00:41 +02004670 PSA_ASSERT( psa_raw_key_agreement( alg, our_key,
4671 peer_key_data->x, peer_key_data->len,
4672 output, expected_output->len,
4673 &output_length ) );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004674 ASSERT_COMPARE( output, output_length,
4675 expected_output->x, expected_output->len );
gabor-mezei-armceface22021-01-21 12:26:17 +01004676 TEST_ASSERT( output_length <=
4677 PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE( our_key_type, key_bits ) );
4678 TEST_ASSERT( output_length <=
4679 PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004680
4681exit:
4682 mbedtls_free( output );
4683 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004684 PSA_DONE( );
Gilles Peskinef0cba732019-04-11 22:12:38 +02004685}
4686/* END_CASE */
4687
4688/* BEGIN_CASE */
Gilles Peskine59685592018-09-18 12:11:34 +02004689void key_agreement_capacity( int alg_arg,
4690 int our_key_type_arg, data_t *our_key_data,
4691 data_t *peer_key_data,
4692 int expected_capacity_arg )
4693{
Ronald Cron5425a212020-08-04 14:58:35 +02004694 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004695 psa_algorithm_t alg = alg_arg;
4696 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004697 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004698 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004699 size_t actual_capacity;
Gilles Peskinebf491972018-10-25 22:36:12 +02004700 unsigned char output[16];
Gilles Peskine59685592018-09-18 12:11:34 +02004701
Gilles Peskine8817f612018-12-18 00:18:46 +01004702 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004703
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004704 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4705 psa_set_key_algorithm( &attributes, alg );
4706 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004707 PSA_ASSERT( psa_import_key( &attributes,
4708 our_key_data->x, our_key_data->len,
4709 &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004710
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004711 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004712 PSA_ASSERT( psa_key_derivation_key_agreement(
4713 &operation,
4714 PSA_KEY_DERIVATION_INPUT_SECRET, our_key,
4715 peer_key_data->x, peer_key_data->len ) );
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004716 if( PSA_ALG_IS_HKDF( PSA_ALG_KEY_AGREEMENT_GET_KDF( alg ) ) )
4717 {
4718 /* The test data is for info="" */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004719 PSA_ASSERT( psa_key_derivation_input_bytes( &operation,
Gilles Peskine03410b52019-05-16 16:05:19 +02004720 PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004721 NULL, 0 ) );
4722 }
Gilles Peskine59685592018-09-18 12:11:34 +02004723
Gilles Peskinebf491972018-10-25 22:36:12 +02004724 /* Test the advertized capacity. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02004725 PSA_ASSERT( psa_key_derivation_get_capacity(
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004726 &operation, &actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01004727 TEST_EQUAL( actual_capacity, (size_t) expected_capacity_arg );
Gilles Peskine59685592018-09-18 12:11:34 +02004728
Gilles Peskinebf491972018-10-25 22:36:12 +02004729 /* Test the actual capacity by reading the output. */
4730 while( actual_capacity > sizeof( output ) )
4731 {
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004732 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004733 output, sizeof( output ) ) );
Gilles Peskinebf491972018-10-25 22:36:12 +02004734 actual_capacity -= sizeof( output );
4735 }
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004736 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004737 output, actual_capacity ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004738 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, output, 1 ),
David Saadab4ecc272019-02-14 13:48:10 +02004739 PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskinebf491972018-10-25 22:36:12 +02004740
Gilles Peskine59685592018-09-18 12:11:34 +02004741exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004742 psa_key_derivation_abort( &operation );
Gilles Peskine59685592018-09-18 12:11:34 +02004743 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004744 PSA_DONE( );
Gilles Peskine59685592018-09-18 12:11:34 +02004745}
4746/* END_CASE */
4747
4748/* BEGIN_CASE */
4749void key_agreement_output( int alg_arg,
4750 int our_key_type_arg, data_t *our_key_data,
4751 data_t *peer_key_data,
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004752 data_t *expected_output1, data_t *expected_output2 )
Gilles Peskine59685592018-09-18 12:11:34 +02004753{
Ronald Cron5425a212020-08-04 14:58:35 +02004754 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02004755 psa_algorithm_t alg = alg_arg;
4756 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 Peskine3ec8ed82018-10-25 22:37:15 +02004759 uint8_t *actual_output = NULL;
Gilles Peskine59685592018-09-18 12:11:34 +02004760
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004761 ASSERT_ALLOC( actual_output, MAX( expected_output1->len,
4762 expected_output2->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004763
Gilles Peskine8817f612018-12-18 00:18:46 +01004764 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004765
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004766 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
4767 psa_set_key_algorithm( &attributes, alg );
4768 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02004769 PSA_ASSERT( psa_import_key( &attributes,
4770 our_key_data->x, our_key_data->len,
4771 &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02004772
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004773 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004774 PSA_ASSERT( psa_key_derivation_key_agreement(
4775 &operation,
4776 PSA_KEY_DERIVATION_INPUT_SECRET, our_key,
4777 peer_key_data->x, peer_key_data->len ) );
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004778 if( PSA_ALG_IS_HKDF( PSA_ALG_KEY_AGREEMENT_GET_KDF( alg ) ) )
4779 {
4780 /* The test data is for info="" */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004781 PSA_ASSERT( psa_key_derivation_input_bytes( &operation,
Gilles Peskine03410b52019-05-16 16:05:19 +02004782 PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskinef8a9d942019-04-11 22:13:20 +02004783 NULL, 0 ) );
4784 }
Gilles Peskine59685592018-09-18 12:11:34 +02004785
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004786 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004787 actual_output,
4788 expected_output1->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004789 ASSERT_COMPARE( actual_output, expected_output1->len,
4790 expected_output1->x, expected_output1->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004791 if( expected_output2->len != 0 )
4792 {
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004793 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004794 actual_output,
4795 expected_output2->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01004796 ASSERT_COMPARE( actual_output, expected_output2->len,
4797 expected_output2->x, expected_output2->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02004798 }
Gilles Peskine59685592018-09-18 12:11:34 +02004799
4800exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02004801 psa_key_derivation_abort( &operation );
Gilles Peskine59685592018-09-18 12:11:34 +02004802 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004803 PSA_DONE( );
Gilles Peskine59685592018-09-18 12:11:34 +02004804 mbedtls_free( actual_output );
4805}
4806/* END_CASE */
4807
4808/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02004809void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02004810{
Gilles Peskinea50d7392018-06-21 10:22:13 +02004811 size_t bytes = bytes_arg;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004812 unsigned char *output = NULL;
4813 unsigned char *changed = NULL;
Gilles Peskinea50d7392018-06-21 10:22:13 +02004814 size_t i;
4815 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02004816
Simon Butcher49f8e312020-03-03 15:51:50 +00004817 TEST_ASSERT( bytes_arg >= 0 );
4818
Gilles Peskine91892022021-02-08 19:50:26 +01004819 ASSERT_ALLOC( output, bytes );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02004820 ASSERT_ALLOC( changed, bytes );
Gilles Peskine05d69892018-06-19 22:00:52 +02004821
Gilles Peskine8817f612018-12-18 00:18:46 +01004822 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02004823
Gilles Peskinea50d7392018-06-21 10:22:13 +02004824 /* Run several times, to ensure that every output byte will be
4825 * nonzero at least once with overwhelming probability
4826 * (2^(-8*number_of_runs)). */
4827 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02004828 {
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02004829 if( bytes != 0 )
4830 memset( output, 0, bytes );
Gilles Peskine8817f612018-12-18 00:18:46 +01004831 PSA_ASSERT( psa_generate_random( output, bytes ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004832
Gilles Peskinea50d7392018-06-21 10:22:13 +02004833 for( i = 0; i < bytes; i++ )
4834 {
4835 if( output[i] != 0 )
4836 ++changed[i];
4837 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004838 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02004839
4840 /* Check that every byte was changed to nonzero at least once. This
4841 * validates that psa_generate_random is overwriting every byte of
4842 * the output buffer. */
4843 for( i = 0; i < bytes; i++ )
4844 {
4845 TEST_ASSERT( changed[i] != 0 );
4846 }
Gilles Peskine05d69892018-06-19 22:00:52 +02004847
4848exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004849 PSA_DONE( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02004850 mbedtls_free( output );
4851 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02004852}
4853/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02004854
4855/* BEGIN_CASE */
4856void generate_key( int type_arg,
4857 int bits_arg,
4858 int usage_arg,
4859 int alg_arg,
Steven Cooreman83fdb702021-01-21 14:24:39 +01004860 int expected_status_arg,
4861 int is_large_key )
Gilles Peskine12313cd2018-06-20 00:20:32 +02004862{
Ronald Cron5425a212020-08-04 14:58:35 +02004863 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004864 psa_key_type_t type = type_arg;
4865 psa_key_usage_t usage = usage_arg;
4866 size_t bits = bits_arg;
4867 psa_algorithm_t alg = alg_arg;
4868 psa_status_t expected_status = expected_status_arg;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004869 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004870 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004871
Gilles Peskine8817f612018-12-18 00:18:46 +01004872 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004873
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004874 psa_set_key_usage_flags( &attributes, usage );
4875 psa_set_key_algorithm( &attributes, alg );
4876 psa_set_key_type( &attributes, type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02004877 psa_set_key_bits( &attributes, bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004878
4879 /* Generate a key */
Steven Cooreman83fdb702021-01-21 14:24:39 +01004880 psa_status_t status = psa_generate_key( &attributes, &key );
4881
4882 if( is_large_key > 0 )
4883 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
4884 TEST_EQUAL( status , expected_status );
Gilles Peskinee56e8782019-04-26 17:34:02 +02004885 if( expected_status != PSA_SUCCESS )
Gilles Peskineff5f0e72019-04-18 12:53:30 +02004886 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004887
4888 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02004889 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02004890 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
4891 TEST_EQUAL( psa_get_key_bits( &got_attributes ), bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004892
Gilles Peskine818ca122018-06-20 18:16:48 +02004893 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004894 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +02004895 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02004896
4897exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004898 /*
4899 * Key attributes may have been returned by psa_get_key_attributes()
4900 * thus reset them as required.
4901 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02004902 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01004903
Ronald Cron5425a212020-08-04 14:58:35 +02004904 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02004905 PSA_DONE( );
Gilles Peskine12313cd2018-06-20 00:20:32 +02004906}
4907/* END_CASE */
itayzafrir0adf0fc2018-09-06 16:24:41 +03004908
Ronald Cronee414c72021-03-18 18:50:08 +01004909/* 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 +02004910void generate_key_rsa( int bits_arg,
4911 data_t *e_arg,
4912 int expected_status_arg )
4913{
Ronald Cron5425a212020-08-04 14:58:35 +02004914 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec93b80c2019-05-16 19:39:54 +02004915 psa_key_type_t type = PSA_KEY_TYPE_RSA_KEY_PAIR;
Gilles Peskinee56e8782019-04-26 17:34:02 +02004916 size_t bits = bits_arg;
4917 psa_key_usage_t usage = PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT;
4918 psa_algorithm_t alg = PSA_ALG_RSA_PKCS1V15_SIGN_RAW;
4919 psa_status_t expected_status = expected_status_arg;
4920 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4921 uint8_t *exported = NULL;
4922 size_t exported_size =
gabor-mezei-armcbcec212020-12-18 14:23:51 +01004923 PSA_EXPORT_KEY_OUTPUT_SIZE( PSA_KEY_TYPE_RSA_PUBLIC_KEY, bits );
Gilles Peskinee56e8782019-04-26 17:34:02 +02004924 size_t exported_length = SIZE_MAX;
4925 uint8_t *e_read_buffer = NULL;
4926 int is_default_public_exponent = 0;
Gilles Peskineaa02c172019-04-28 11:44:17 +02004927 size_t e_read_size = PSA_KEY_DOMAIN_PARAMETERS_SIZE( type, bits );
Gilles Peskinee56e8782019-04-26 17:34:02 +02004928 size_t e_read_length = SIZE_MAX;
4929
4930 if( e_arg->len == 0 ||
4931 ( e_arg->len == 3 &&
4932 e_arg->x[0] == 1 && e_arg->x[1] == 0 && e_arg->x[2] == 1 ) )
4933 {
4934 is_default_public_exponent = 1;
4935 e_read_size = 0;
4936 }
4937 ASSERT_ALLOC( e_read_buffer, e_read_size );
4938 ASSERT_ALLOC( exported, exported_size );
4939
4940 PSA_ASSERT( psa_crypto_init( ) );
4941
4942 psa_set_key_usage_flags( &attributes, usage );
4943 psa_set_key_algorithm( &attributes, alg );
4944 PSA_ASSERT( psa_set_key_domain_parameters( &attributes, type,
4945 e_arg->x, e_arg->len ) );
4946 psa_set_key_bits( &attributes, bits );
4947
4948 /* Generate a key */
Ronald Cron5425a212020-08-04 14:58:35 +02004949 TEST_EQUAL( psa_generate_key( &attributes, &key ), expected_status );
Gilles Peskinee56e8782019-04-26 17:34:02 +02004950 if( expected_status != PSA_SUCCESS )
4951 goto exit;
4952
4953 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02004954 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskinee56e8782019-04-26 17:34:02 +02004955 TEST_EQUAL( psa_get_key_type( &attributes ), type );
4956 TEST_EQUAL( psa_get_key_bits( &attributes ), bits );
4957 PSA_ASSERT( psa_get_key_domain_parameters( &attributes,
4958 e_read_buffer, e_read_size,
4959 &e_read_length ) );
4960 if( is_default_public_exponent )
4961 TEST_EQUAL( e_read_length, 0 );
4962 else
4963 ASSERT_COMPARE( e_read_buffer, e_read_length, e_arg->x, e_arg->len );
4964
4965 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01004966 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskinee56e8782019-04-26 17:34:02 +02004967 goto exit;
4968
4969 /* Export the key and check the public exponent. */
Ronald Cron5425a212020-08-04 14:58:35 +02004970 PSA_ASSERT( psa_export_public_key( key,
Gilles Peskinee56e8782019-04-26 17:34:02 +02004971 exported, exported_size,
4972 &exported_length ) );
4973 {
4974 uint8_t *p = exported;
4975 uint8_t *end = exported + exported_length;
4976 size_t len;
4977 /* RSAPublicKey ::= SEQUENCE {
4978 * modulus INTEGER, -- n
4979 * publicExponent INTEGER } -- e
4980 */
4981 TEST_EQUAL( 0, mbedtls_asn1_get_tag( &p, end, &len,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02004982 MBEDTLS_ASN1_SEQUENCE |
4983 MBEDTLS_ASN1_CONSTRUCTED ) );
Gilles Peskine8e94efe2021-02-13 00:25:53 +01004984 TEST_ASSERT( mbedtls_test_asn1_skip_integer( &p, end, bits, bits, 1 ) );
Gilles Peskinee56e8782019-04-26 17:34:02 +02004985 TEST_EQUAL( 0, mbedtls_asn1_get_tag( &p, end, &len,
4986 MBEDTLS_ASN1_INTEGER ) );
4987 if( len >= 1 && p[0] == 0 )
4988 {
4989 ++p;
4990 --len;
4991 }
4992 if( e_arg->len == 0 )
4993 {
4994 TEST_EQUAL( len, 3 );
4995 TEST_EQUAL( p[0], 1 );
4996 TEST_EQUAL( p[1], 0 );
4997 TEST_EQUAL( p[2], 1 );
4998 }
4999 else
5000 ASSERT_COMPARE( p, len, e_arg->x, e_arg->len );
5001 }
5002
5003exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005004 /*
5005 * Key attributes may have been returned by psa_get_key_attributes() or
5006 * set by psa_set_key_domain_parameters() thus reset them as required.
5007 */
Gilles Peskinee56e8782019-04-26 17:34:02 +02005008 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005009
Ronald Cron5425a212020-08-04 14:58:35 +02005010 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005011 PSA_DONE( );
Gilles Peskinee56e8782019-04-26 17:34:02 +02005012 mbedtls_free( e_read_buffer );
5013 mbedtls_free( exported );
5014}
5015/* END_CASE */
5016
Darryl Greend49a4992018-06-18 17:27:26 +01005017/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C */
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005018void persistent_key_load_key_from_storage( data_t *data,
5019 int type_arg, int bits_arg,
5020 int usage_flags_arg, int alg_arg,
5021 int generation_method )
Darryl Greend49a4992018-06-18 17:27:26 +01005022{
Ronald Cron71016a92020-08-28 19:01:50 +02005023 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, 1 );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005024 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +02005025 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
5026 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005027 psa_key_type_t type = type_arg;
5028 size_t bits = bits_arg;
5029 psa_key_usage_t usage_flags = usage_flags_arg;
5030 psa_algorithm_t alg = alg_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005031 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01005032 unsigned char *first_export = NULL;
5033 unsigned char *second_export = NULL;
gabor-mezei-armcbcec212020-12-18 14:23:51 +01005034 size_t export_size = PSA_EXPORT_KEY_OUTPUT_SIZE( type, bits );
Darryl Greend49a4992018-06-18 17:27:26 +01005035 size_t first_exported_length;
5036 size_t second_exported_length;
5037
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005038 if( usage_flags & PSA_KEY_USAGE_EXPORT )
5039 {
5040 ASSERT_ALLOC( first_export, export_size );
5041 ASSERT_ALLOC( second_export, export_size );
5042 }
Darryl Greend49a4992018-06-18 17:27:26 +01005043
Gilles Peskine8817f612018-12-18 00:18:46 +01005044 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01005045
Gilles Peskinec87af662019-05-15 16:12:22 +02005046 psa_set_key_id( &attributes, key_id );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005047 psa_set_key_usage_flags( &attributes, usage_flags );
5048 psa_set_key_algorithm( &attributes, alg );
5049 psa_set_key_type( &attributes, type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02005050 psa_set_key_bits( &attributes, bits );
Darryl Greend49a4992018-06-18 17:27:26 +01005051
Darryl Green0c6575a2018-11-07 16:05:30 +00005052 switch( generation_method )
5053 {
5054 case IMPORT_KEY:
5055 /* Import the key */
Gilles Peskine049c7532019-05-15 20:22:09 +02005056 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02005057 &key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005058 break;
Darryl Greend49a4992018-06-18 17:27:26 +01005059
Darryl Green0c6575a2018-11-07 16:05:30 +00005060 case GENERATE_KEY:
5061 /* Generate a key */
Ronald Cron5425a212020-08-04 14:58:35 +02005062 PSA_ASSERT( psa_generate_key( &attributes, &key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005063 break;
5064
5065 case DERIVE_KEY:
Steven Cooreman70f654a2021-02-15 10:51:43 +01005066#if defined(PSA_WANT_ALG_HKDF) && defined(PSA_WANT_ALG_SHA_256)
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005067 {
5068 /* Create base key */
5069 psa_algorithm_t derive_alg = PSA_ALG_HKDF( PSA_ALG_SHA_256 );
5070 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
5071 psa_set_key_usage_flags( &base_attributes,
5072 PSA_KEY_USAGE_DERIVE );
5073 psa_set_key_algorithm( &base_attributes, derive_alg );
5074 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02005075 PSA_ASSERT( psa_import_key( &base_attributes,
5076 data->x, data->len,
5077 &base_key ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005078 /* Derive a key. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005079 PSA_ASSERT( psa_key_derivation_setup( &operation, derive_alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005080 PSA_ASSERT( psa_key_derivation_input_key(
5081 &operation,
5082 PSA_KEY_DERIVATION_INPUT_SECRET, base_key ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005083 PSA_ASSERT( psa_key_derivation_input_bytes(
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005084 &operation, PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005085 NULL, 0 ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02005086 PSA_ASSERT( psa_key_derivation_output_key( &attributes,
5087 &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02005088 &key ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005089 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005090 PSA_ASSERT( psa_destroy_key( base_key ) );
Ronald Cron5425a212020-08-04 14:58:35 +02005091 base_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005092 }
Gilles Peskine6fea21d2021-01-12 00:02:15 +01005093#else
5094 TEST_ASSUME( ! "KDF not supported in this configuration" );
5095#endif
5096 break;
5097
5098 default:
5099 TEST_ASSERT( ! "generation_method not implemented in test" );
5100 break;
Darryl Green0c6575a2018-11-07 16:05:30 +00005101 }
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005102 psa_reset_key_attributes( &attributes );
Darryl Greend49a4992018-06-18 17:27:26 +01005103
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005104 /* Export the key if permitted by the key policy. */
5105 if( usage_flags & PSA_KEY_USAGE_EXPORT )
5106 {
Ronald Cron5425a212020-08-04 14:58:35 +02005107 PSA_ASSERT( psa_export_key( key,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005108 first_export, export_size,
5109 &first_exported_length ) );
5110 if( generation_method == IMPORT_KEY )
5111 ASSERT_COMPARE( data->x, data->len,
5112 first_export, first_exported_length );
5113 }
Darryl Greend49a4992018-06-18 17:27:26 +01005114
5115 /* Shutdown and restart */
Ronald Cron5425a212020-08-04 14:58:35 +02005116 PSA_ASSERT( psa_purge_key( key ) );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005117 PSA_DONE();
Gilles Peskine8817f612018-12-18 00:18:46 +01005118 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01005119
Darryl Greend49a4992018-06-18 17:27:26 +01005120 /* Check key slot still contains key data */
Ronald Cron5425a212020-08-04 14:58:35 +02005121 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Ronald Cronecfb2372020-07-23 17:13:42 +02005122 TEST_ASSERT( mbedtls_svc_key_id_equal(
5123 psa_get_key_id( &attributes ), key_id ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005124 TEST_EQUAL( psa_get_key_lifetime( &attributes ),
5125 PSA_KEY_LIFETIME_PERSISTENT );
5126 TEST_EQUAL( psa_get_key_type( &attributes ), type );
5127 TEST_EQUAL( psa_get_key_bits( &attributes ), bits );
5128 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), usage_flags );
5129 TEST_EQUAL( psa_get_key_algorithm( &attributes ), alg );
Darryl Greend49a4992018-06-18 17:27:26 +01005130
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005131 /* Export the key again if permitted by the key policy. */
5132 if( usage_flags & PSA_KEY_USAGE_EXPORT )
Darryl Green0c6575a2018-11-07 16:05:30 +00005133 {
Ronald Cron5425a212020-08-04 14:58:35 +02005134 PSA_ASSERT( psa_export_key( key,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005135 second_export, export_size,
5136 &second_exported_length ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00005137 ASSERT_COMPARE( first_export, first_exported_length,
5138 second_export, second_exported_length );
Darryl Green0c6575a2018-11-07 16:05:30 +00005139 }
5140
5141 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01005142 if( ! mbedtls_test_psa_exercise_key( key, usage_flags, alg ) )
Darryl Green0c6575a2018-11-07 16:05:30 +00005143 goto exit;
Darryl Greend49a4992018-06-18 17:27:26 +01005144
5145exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005146 /*
5147 * Key attributes may have been returned by psa_get_key_attributes()
5148 * thus reset them as required.
5149 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005150 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005151
Darryl Greend49a4992018-06-18 17:27:26 +01005152 mbedtls_free( first_export );
5153 mbedtls_free( second_export );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02005154 psa_key_derivation_abort( &operation );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02005155 psa_destroy_key( base_key );
Ronald Cron5425a212020-08-04 14:58:35 +02005156 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005157 PSA_DONE();
Darryl Greend49a4992018-06-18 17:27:26 +01005158}
5159/* END_CASE */