blob: c3bd487d5fa91053c98ca4033de739fff975b8dd [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"
Archana4d7ae1d2021-07-07 02:50:22 +053018#if defined(PSA_CRYPTO_DRIVER_TEST)
19#include "test/drivers/test_driver.h"
Archana8a180362021-07-05 02:18:48 +053020#define TEST_DRIVER_LOCATION PSA_CRYPTO_TEST_DRIVER_LOCATION
21#else
22#define TEST_DRIVER_LOCATION 0x7fffff
Archana4d7ae1d2021-07-07 02:50:22 +053023#endif
Ronald Cron28a45ed2021-02-09 20:35:42 +010024
Gilles Peskine4023c012021-05-27 13:21:20 +020025/* If this comes up, it's a bug in the test code or in the test data. */
26#define UNUSED 0xdeadbeef
27
Dave Rodgman647791d2021-06-23 12:49:59 +010028/* Assert that an operation is (not) active.
29 * This serves as a proxy for checking if the operation is aborted. */
30#define ASSERT_OPERATION_IS_ACTIVE( operation ) TEST_ASSERT( operation.id != 0 )
31#define ASSERT_OPERATION_IS_INACTIVE( operation ) TEST_ASSERT( operation.id == 0 )
Gilles Peskinef426e0f2019-02-25 17:42:03 +010032
33/** An invalid export length that will never be set by psa_export_key(). */
34static const size_t INVALID_EXPORT_LENGTH = ~0U;
35
Gilles Peskinea7aa4422018-08-14 15:17:54 +020036/** Test if a buffer contains a constant byte value.
37 *
38 * `mem_is_char(buffer, c, size)` is true after `memset(buffer, c, size)`.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020039 *
40 * \param buffer Pointer to the beginning of the buffer.
Gilles Peskinea7aa4422018-08-14 15:17:54 +020041 * \param c Expected value of every byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020042 * \param size Size of the buffer in bytes.
43 *
Gilles Peskine3f669c32018-06-21 09:21:51 +020044 * \return 1 if the buffer is all-bits-zero.
45 * \return 0 if there is at least one nonzero byte.
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020046 */
Gilles Peskinea7aa4422018-08-14 15:17:54 +020047static int mem_is_char( void *buffer, unsigned char c, size_t size )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020048{
49 size_t i;
50 for( i = 0; i < size; i++ )
51 {
Gilles Peskinea7aa4422018-08-14 15:17:54 +020052 if( ( (unsigned char *) buffer )[i] != c )
Gilles Peskine3f669c32018-06-21 09:21:51 +020053 return( 0 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020054 }
Gilles Peskine3f669c32018-06-21 09:21:51 +020055 return( 1 );
Gilles Peskinee66ca3b2018-06-20 00:11:45 +020056}
Andrzej Kurek77b8e092022-01-17 15:29:38 +010057#if defined(MBEDTLS_ASN1_WRITE_C)
Gilles Peskine0b352bc2018-06-28 00:16:11 +020058/* Write the ASN.1 INTEGER with the value 2^(bits-1)+x backwards from *p. */
59static int asn1_write_10x( unsigned char **p,
60 unsigned char *start,
61 size_t bits,
62 unsigned char x )
63{
64 int ret;
65 int len = bits / 8 + 1;
Gilles Peskine480416a2018-06-28 19:04:07 +020066 if( bits == 0 )
67 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
68 if( bits <= 8 && x >= 1 << ( bits - 1 ) )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020069 return( MBEDTLS_ERR_ASN1_INVALID_DATA );
Moran Pekercb088e72018-07-17 17:36:59 +030070 if( *p < start || *p - start < (ptrdiff_t) len )
Gilles Peskine0b352bc2018-06-28 00:16:11 +020071 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
72 *p -= len;
73 ( *p )[len-1] = x;
74 if( bits % 8 == 0 )
75 ( *p )[1] |= 1;
76 else
77 ( *p )[0] |= 1 << ( bits % 8 );
78 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
79 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
80 MBEDTLS_ASN1_INTEGER ) );
81 return( len );
82}
83
84static int construct_fake_rsa_key( unsigned char *buffer,
85 size_t buffer_size,
86 unsigned char **p,
87 size_t bits,
88 int keypair )
89{
90 size_t half_bits = ( bits + 1 ) / 2;
91 int ret;
92 int len = 0;
93 /* Construct something that looks like a DER encoding of
94 * as defined by PKCS#1 v2.2 (RFC 8017) section A.1.2:
95 * RSAPrivateKey ::= SEQUENCE {
96 * version Version,
97 * modulus INTEGER, -- n
98 * publicExponent INTEGER, -- e
99 * privateExponent INTEGER, -- d
100 * prime1 INTEGER, -- p
101 * prime2 INTEGER, -- q
102 * exponent1 INTEGER, -- d mod (p-1)
103 * exponent2 INTEGER, -- d mod (q-1)
104 * coefficient INTEGER, -- (inverse of q) mod p
105 * otherPrimeInfos OtherPrimeInfos OPTIONAL
106 * }
107 * Or, for a public key, the same structure with only
108 * version, modulus and publicExponent.
109 */
110 *p = buffer + buffer_size;
111 if( keypair )
112 {
113 MBEDTLS_ASN1_CHK_ADD( len, /* pq */
114 asn1_write_10x( p, buffer, half_bits, 1 ) );
115 MBEDTLS_ASN1_CHK_ADD( len, /* dq */
116 asn1_write_10x( p, buffer, half_bits, 1 ) );
117 MBEDTLS_ASN1_CHK_ADD( len, /* dp */
118 asn1_write_10x( p, buffer, half_bits, 1 ) );
119 MBEDTLS_ASN1_CHK_ADD( len, /* q */
120 asn1_write_10x( p, buffer, half_bits, 1 ) );
121 MBEDTLS_ASN1_CHK_ADD( len, /* p != q to pass mbedtls sanity checks */
122 asn1_write_10x( p, buffer, half_bits, 3 ) );
123 MBEDTLS_ASN1_CHK_ADD( len, /* d */
124 asn1_write_10x( p, buffer, bits, 1 ) );
125 }
126 MBEDTLS_ASN1_CHK_ADD( len, /* e = 65537 */
127 asn1_write_10x( p, buffer, 17, 1 ) );
128 MBEDTLS_ASN1_CHK_ADD( len, /* n */
129 asn1_write_10x( p, buffer, bits, 1 ) );
130 if( keypair )
131 MBEDTLS_ASN1_CHK_ADD( len, /* version = 0 */
132 mbedtls_asn1_write_int( p, buffer, 0 ) );
133 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, buffer, len ) );
134 {
135 const unsigned char tag =
136 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE;
137 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, buffer, tag ) );
138 }
139 return( len );
140}
Andrzej Kurek77b8e092022-01-17 15:29:38 +0100141#endif /* MBEDTLS_ASN1_WRITE_C */
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200142
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100143int exercise_mac_setup( psa_key_type_t key_type,
144 const unsigned char *key_bytes,
145 size_t key_length,
146 psa_algorithm_t alg,
147 psa_mac_operation_t *operation,
148 psa_status_t *status )
149{
Ronald Cron5425a212020-08-04 14:58:35 +0200150 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200151 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100152
Gilles Peskine89d8c5c2019-11-26 17:01:59 +0100153 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200154 psa_set_key_algorithm( &attributes, alg );
155 psa_set_key_type( &attributes, key_type );
Ronald Cron5425a212020-08-04 14:58:35 +0200156 PSA_ASSERT( psa_import_key( &attributes, key_bytes, key_length, &key ) );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100157
Ronald Cron5425a212020-08-04 14:58:35 +0200158 *status = psa_mac_sign_setup( operation, key, alg );
Gilles Peskine9e0a4a52019-02-25 22:11:18 +0100159 /* Whether setup succeeded or failed, abort must succeed. */
160 PSA_ASSERT( psa_mac_abort( operation ) );
161 /* If setup failed, reproduce the failure, so that the caller can
162 * test the resulting state of the operation object. */
163 if( *status != PSA_SUCCESS )
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100164 {
Ronald Cron5425a212020-08-04 14:58:35 +0200165 TEST_EQUAL( psa_mac_sign_setup( operation, key, alg ), *status );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100166 }
167
Ronald Cron5425a212020-08-04 14:58:35 +0200168 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100169 return( 1 );
170
171exit:
Ronald Cron5425a212020-08-04 14:58:35 +0200172 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100173 return( 0 );
174}
175
176int exercise_cipher_setup( psa_key_type_t key_type,
177 const unsigned char *key_bytes,
178 size_t key_length,
179 psa_algorithm_t alg,
180 psa_cipher_operation_t *operation,
181 psa_status_t *status )
182{
Ronald Cron5425a212020-08-04 14:58:35 +0200183 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200184 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100185
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200186 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
187 psa_set_key_algorithm( &attributes, alg );
188 psa_set_key_type( &attributes, key_type );
Ronald Cron5425a212020-08-04 14:58:35 +0200189 PSA_ASSERT( psa_import_key( &attributes, key_bytes, key_length, &key ) );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100190
Ronald Cron5425a212020-08-04 14:58:35 +0200191 *status = psa_cipher_encrypt_setup( operation, key, alg );
Gilles Peskine9e0a4a52019-02-25 22:11:18 +0100192 /* Whether setup succeeded or failed, abort must succeed. */
193 PSA_ASSERT( psa_cipher_abort( operation ) );
194 /* If setup failed, reproduce the failure, so that the caller can
195 * test the resulting state of the operation object. */
196 if( *status != PSA_SUCCESS )
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100197 {
Ronald Cron5425a212020-08-04 14:58:35 +0200198 TEST_EQUAL( psa_cipher_encrypt_setup( operation, key, alg ),
Gilles Peskine9e0a4a52019-02-25 22:11:18 +0100199 *status );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100200 }
201
Ronald Cron5425a212020-08-04 14:58:35 +0200202 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100203 return( 1 );
204
205exit:
Ronald Cron5425a212020-08-04 14:58:35 +0200206 psa_destroy_key( key );
Gilles Peskinef426e0f2019-02-25 17:42:03 +0100207 return( 0 );
208}
209
Ronald Cron5425a212020-08-04 14:58:35 +0200210static int test_operations_on_invalid_key( mbedtls_svc_key_id_t key )
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200211{
212 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cronecfb2372020-07-23 17:13:42 +0200213 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, 0x6964 );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200214 uint8_t buffer[1];
215 size_t length;
216 int ok = 0;
217
Ronald Cronecfb2372020-07-23 17:13:42 +0200218 psa_set_key_id( &attributes, key_id );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200219 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
220 psa_set_key_algorithm( &attributes, PSA_ALG_CTR );
221 psa_set_key_type( &attributes, PSA_KEY_TYPE_AES );
Ronald Cron5425a212020-08-04 14:58:35 +0200222 TEST_EQUAL( psa_get_key_attributes( key, &attributes ),
Maulik Patel3240c9d2021-03-17 16:11:05 +0000223 PSA_ERROR_INVALID_HANDLE );
Ronald Cronecfb2372020-07-23 17:13:42 +0200224 TEST_EQUAL(
225 MBEDTLS_SVC_KEY_ID_GET_KEY_ID( psa_get_key_id( &attributes ) ), 0 );
226 TEST_EQUAL(
227 MBEDTLS_SVC_KEY_ID_GET_OWNER_ID( psa_get_key_id( &attributes ) ), 0 );
Gilles Peskine5c648ab2019-04-19 14:06:53 +0200228 TEST_EQUAL( psa_get_key_lifetime( &attributes ), 0 );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200229 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), 0 );
230 TEST_EQUAL( psa_get_key_algorithm( &attributes ), 0 );
231 TEST_EQUAL( psa_get_key_type( &attributes ), 0 );
232 TEST_EQUAL( psa_get_key_bits( &attributes ), 0 );
233
Ronald Cron5425a212020-08-04 14:58:35 +0200234 TEST_EQUAL( psa_export_key( key, buffer, sizeof( buffer ), &length ),
Maulik Patel3240c9d2021-03-17 16:11:05 +0000235 PSA_ERROR_INVALID_HANDLE );
Ronald Cron5425a212020-08-04 14:58:35 +0200236 TEST_EQUAL( psa_export_public_key( key,
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200237 buffer, sizeof( buffer ), &length ),
Maulik Patel3240c9d2021-03-17 16:11:05 +0000238 PSA_ERROR_INVALID_HANDLE );
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200239
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200240 ok = 1;
241
242exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100243 /*
244 * Key attributes may have been returned by psa_get_key_attributes()
245 * thus reset them as required.
246 */
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200247 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100248
Gilles Peskine4cf3a432019-04-18 22:28:52 +0200249 return( ok );
250}
251
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200252/* Assert that a key isn't reported as having a slot number. */
253#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
254#define ASSERT_NO_SLOT_NUMBER( attributes ) \
255 do \
256 { \
257 psa_key_slot_number_t ASSERT_NO_SLOT_NUMBER_slot_number; \
258 TEST_EQUAL( psa_get_key_slot_number( \
259 attributes, \
260 &ASSERT_NO_SLOT_NUMBER_slot_number ), \
261 PSA_ERROR_INVALID_ARGUMENT ); \
262 } \
263 while( 0 )
264#else /* MBEDTLS_PSA_CRYPTO_SE_C */
265#define ASSERT_NO_SLOT_NUMBER( attributes ) \
266 ( (void) 0 )
267#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
268
Gilles Peskinebdf309c2018-12-03 15:36:32 +0100269/* An overapproximation of the amount of storage needed for a key of the
270 * given type and with the given content. The API doesn't make it easy
271 * to find a good value for the size. The current implementation doesn't
272 * care about the value anyway. */
273#define KEY_BITS_FROM_DATA( type, data ) \
274 ( data )->len
275
Darryl Green0c6575a2018-11-07 16:05:30 +0000276typedef enum {
277 IMPORT_KEY = 0,
278 GENERATE_KEY = 1,
279 DERIVE_KEY = 2
280} generate_method;
281
Paul Elliott33746aa2021-09-15 16:40:40 +0100282typedef enum
283{
284 DO_NOT_SET_LENGTHS = 0,
285 SET_LENGTHS_BEFORE_NONCE = 1,
286 SET_LENGTHS_AFTER_NONCE = 2
Paul Elliottbb979e72021-09-22 12:54:42 +0100287} set_lengths_method_t;
Paul Elliott33746aa2021-09-15 16:40:40 +0100288
Paul Elliott1c67e0b2021-09-19 13:11:50 +0100289typedef enum
290{
291 USE_NULL_TAG = 0,
292 USE_GIVEN_TAG = 1,
Paul Elliottbb979e72021-09-22 12:54:42 +0100293} tag_usage_method_t;
Paul Elliott1c67e0b2021-09-19 13:11:50 +0100294
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100295/*!
296 * \brief Internal Function for AEAD multipart tests.
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100297 * \param key_type_arg Type of key passed in
298 * \param key_data The encryption / decryption key data
299 * \param alg_arg The type of algorithm used
300 * \param nonce Nonce data
301 * \param additional_data Additional data
Paul Elliott8eec8d42021-09-19 22:38:27 +0100302 * \param ad_part_len_arg If not -1, the length of chunks to
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100303 * feed additional data in to be encrypted /
304 * decrypted. If -1, no chunking.
305 * \param input_data Data to encrypt / decrypt
Paul Elliott8eec8d42021-09-19 22:38:27 +0100306 * \param data_part_len_arg If not -1, the length of chunks to feed
307 * the data in to be encrypted / decrypted. If
308 * -1, no chunking
Paul Elliottbb979e72021-09-22 12:54:42 +0100309 * \param set_lengths_method A member of the set_lengths_method_t enum is
Paul Elliott8eec8d42021-09-19 22:38:27 +0100310 * expected here, this controls whether or not
311 * to set lengths, and in what order with
312 * respect to set nonce.
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100313 * \param expected_output Expected output
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100314 * \param is_encrypt If non-zero this is an encryption operation.
Paul Elliott41ffae12021-07-22 21:52:01 +0100315 * \param do_zero_parts If non-zero, interleave zero length chunks
Paul Elliott8eec8d42021-09-19 22:38:27 +0100316 * with normal length chunks.
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100317 * \return int Zero on failure, non-zero on success.
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100318 */
319static int aead_multipart_internal_func( int key_type_arg, data_t *key_data,
320 int alg_arg,
321 data_t *nonce,
322 data_t *additional_data,
Paul Elliott6bfd0fb2021-09-15 14:15:55 +0100323 int ad_part_len_arg,
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100324 data_t *input_data,
Paul Elliott6bfd0fb2021-09-15 14:15:55 +0100325 int data_part_len_arg,
Paul Elliottbb979e72021-09-22 12:54:42 +0100326 set_lengths_method_t set_lengths_method,
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100327 data_t *expected_output,
Paul Elliott329d5382021-07-22 17:10:45 +0100328 int is_encrypt,
Paul Elliott33746aa2021-09-15 16:40:40 +0100329 int do_zero_parts )
Paul Elliottd3f82412021-06-16 16:52:21 +0100330{
331 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
332 psa_key_type_t key_type = key_type_arg;
333 psa_algorithm_t alg = alg_arg;
Paul Elliottfbb4c6d2021-09-22 16:44:21 +0100334 psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT;
Paul Elliottd3f82412021-06-16 16:52:21 +0100335 unsigned char *output_data = NULL;
336 unsigned char *part_data = NULL;
337 unsigned char *final_data = NULL;
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100338 size_t data_true_size = 0;
Paul Elliottd3f82412021-06-16 16:52:21 +0100339 size_t part_data_size = 0;
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100340 size_t output_size = 0;
341 size_t final_output_size = 0;
Paul Elliottd3f82412021-06-16 16:52:21 +0100342 size_t output_length = 0;
343 size_t key_bits = 0;
344 size_t tag_length = 0;
Paul Elliott6bfd0fb2021-09-15 14:15:55 +0100345 size_t part_offset = 0;
Paul Elliottd3f82412021-06-16 16:52:21 +0100346 size_t part_length = 0;
347 size_t output_part_length = 0;
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100348 size_t tag_size = 0;
Paul Elliott6bfd0fb2021-09-15 14:15:55 +0100349 size_t ad_part_len = 0;
350 size_t data_part_len = 0;
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100351 uint8_t tag_buffer[PSA_AEAD_TAG_MAX_SIZE];
Paul Elliottd3f82412021-06-16 16:52:21 +0100352 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
353 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
354
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100355 int test_ok = 0;
Paul Elliott6bfd0fb2021-09-15 14:15:55 +0100356 size_t part_count = 0;
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100357
Paul Elliottd3f82412021-06-16 16:52:21 +0100358 PSA_ASSERT( psa_crypto_init( ) );
359
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100360 if( is_encrypt )
361 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
362 else
363 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
364
Paul Elliottd3f82412021-06-16 16:52:21 +0100365 psa_set_key_algorithm( &attributes, alg );
366 psa_set_key_type( &attributes, key_type );
367
368 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
369 &key ) );
370
371 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
372 key_bits = psa_get_key_bits( &attributes );
373
374 tag_length = PSA_AEAD_TAG_LENGTH( key_type, key_bits, alg );
375
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100376 if( is_encrypt )
377 {
378 /* Tag gets written at end of buffer. */
379 output_size = PSA_AEAD_UPDATE_OUTPUT_SIZE( key_type, alg,
380 ( input_data->len +
381 tag_length ) );
382 data_true_size = input_data->len;
383 }
384 else
385 {
386 output_size = PSA_AEAD_UPDATE_OUTPUT_SIZE( key_type, alg,
387 ( input_data->len -
388 tag_length ) );
Paul Elliottd3f82412021-06-16 16:52:21 +0100389
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100390 /* Do not want to attempt to decrypt tag. */
391 data_true_size = input_data->len - tag_length;
392 }
Paul Elliottd3f82412021-06-16 16:52:21 +0100393
394 ASSERT_ALLOC( output_data, output_size );
395
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100396 if( is_encrypt )
397 {
Paul Elliott5a9642f2021-09-13 19:13:22 +0100398 final_output_size = PSA_AEAD_FINISH_OUTPUT_SIZE( key_type, alg );
399 TEST_ASSERT( final_output_size <= PSA_AEAD_FINISH_OUTPUT_MAX_SIZE );
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100400 }
401 else
402 {
Paul Elliott5a9642f2021-09-13 19:13:22 +0100403 final_output_size = PSA_AEAD_VERIFY_OUTPUT_SIZE( key_type, alg );
404 TEST_ASSERT( final_output_size <= PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE );
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100405 }
Paul Elliottd3f82412021-06-16 16:52:21 +0100406
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100407 ASSERT_ALLOC( final_data, final_output_size );
Paul Elliottd3f82412021-06-16 16:52:21 +0100408
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100409 if( is_encrypt )
410 status = psa_aead_encrypt_setup( &operation, key, alg );
411 else
412 status = psa_aead_decrypt_setup( &operation, key, alg );
Paul Elliottd3f82412021-06-16 16:52:21 +0100413
414 /* If the operation is not supported, just skip and not fail in case the
415 * encryption involves a common limitation of cryptography hardwares and
416 * an alternative implementation. */
417 if( status == PSA_ERROR_NOT_SUPPORTED )
418 {
419 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
420 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
421 }
422
423 PSA_ASSERT( status );
424
Paul Elliott33746aa2021-09-15 16:40:40 +0100425 if( set_lengths_method == DO_NOT_SET_LENGTHS )
426 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
427 else if( set_lengths_method == SET_LENGTHS_BEFORE_NONCE )
Paul Elliottd3f82412021-06-16 16:52:21 +0100428 {
Paul Elliott33746aa2021-09-15 16:40:40 +0100429 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
430 data_true_size ) );
Paul Elliottebf91632021-07-22 17:54:42 +0100431 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
432 }
Paul Elliott33746aa2021-09-15 16:40:40 +0100433 else if( set_lengths_method == SET_LENGTHS_AFTER_NONCE )
Paul Elliottebf91632021-07-22 17:54:42 +0100434 {
435 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
436
Paul Elliott33746aa2021-09-15 16:40:40 +0100437 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
438 data_true_size ) );
Paul Elliottd3f82412021-06-16 16:52:21 +0100439 }
Paul Elliottd3f82412021-06-16 16:52:21 +0100440
Paul Elliott6bfd0fb2021-09-15 14:15:55 +0100441 if( ad_part_len_arg != -1 )
Paul Elliottd3f82412021-06-16 16:52:21 +0100442 {
443 /* Pass additional data in parts */
Paul Elliott6bfd0fb2021-09-15 14:15:55 +0100444 ad_part_len = (size_t) ad_part_len_arg;
Paul Elliottd3f82412021-06-16 16:52:21 +0100445
Paul Elliott4e4d71a2021-09-15 16:50:01 +0100446 for( part_offset = 0, part_count = 0;
447 part_offset < additional_data->len;
448 part_offset += part_length, part_count++ )
Paul Elliottd3f82412021-06-16 16:52:21 +0100449 {
Paul Elliott4e4d71a2021-09-15 16:50:01 +0100450 if( do_zero_parts && ( part_count & 0x01 ) )
Paul Elliottd3f82412021-06-16 16:52:21 +0100451 {
Paul Elliott329d5382021-07-22 17:10:45 +0100452 part_length = 0;
Paul Elliottd3f82412021-06-16 16:52:21 +0100453 }
Paul Elliotte49fe452021-09-15 16:52:11 +0100454 else if( additional_data->len - part_offset < ad_part_len )
455 {
456 part_length = additional_data->len - part_offset;
457 }
Paul Elliottd3f82412021-06-16 16:52:21 +0100458 else
459 {
Paul Elliotte49fe452021-09-15 16:52:11 +0100460 part_length = ad_part_len;
Paul Elliottd3f82412021-06-16 16:52:21 +0100461 }
462
463 PSA_ASSERT( psa_aead_update_ad( &operation,
464 additional_data->x + part_offset,
465 part_length ) );
466
Paul Elliottd3f82412021-06-16 16:52:21 +0100467 }
468 }
469 else
470 {
471 /* Pass additional data in one go. */
472 PSA_ASSERT( psa_aead_update_ad( &operation, additional_data->x,
473 additional_data->len ) );
474 }
475
Paul Elliott6bfd0fb2021-09-15 14:15:55 +0100476 if( data_part_len_arg != -1 )
Paul Elliottd3f82412021-06-16 16:52:21 +0100477 {
478 /* Pass data in parts */
Paul Elliott6bfd0fb2021-09-15 14:15:55 +0100479 data_part_len = ( size_t ) data_part_len_arg;
Paul Elliottd3f82412021-06-16 16:52:21 +0100480 part_data_size = PSA_AEAD_UPDATE_OUTPUT_SIZE( key_type, alg,
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100481 ( size_t ) data_part_len );
Paul Elliottd3f82412021-06-16 16:52:21 +0100482
483 ASSERT_ALLOC( part_data, part_data_size );
484
Paul Elliott4e4d71a2021-09-15 16:50:01 +0100485 for( part_offset = 0, part_count = 0;
486 part_offset < data_true_size;
487 part_offset += part_length, part_count++ )
Paul Elliottd3f82412021-06-16 16:52:21 +0100488 {
Paul Elliott4e4d71a2021-09-15 16:50:01 +0100489 if( do_zero_parts && ( part_count & 0x01 ) )
Paul Elliottd3f82412021-06-16 16:52:21 +0100490 {
Paul Elliott329d5382021-07-22 17:10:45 +0100491 part_length = 0;
Paul Elliottd3f82412021-06-16 16:52:21 +0100492 }
Paul Elliotte49fe452021-09-15 16:52:11 +0100493 else if( ( data_true_size - part_offset ) < data_part_len )
494 {
495 part_length = ( data_true_size - part_offset );
496 }
Paul Elliottd3f82412021-06-16 16:52:21 +0100497 else
498 {
Paul Elliotte49fe452021-09-15 16:52:11 +0100499 part_length = data_part_len;
Paul Elliottd3f82412021-06-16 16:52:21 +0100500 }
501
502 PSA_ASSERT( psa_aead_update( &operation,
503 ( input_data->x + part_offset ),
504 part_length, part_data,
505 part_data_size,
506 &output_part_length ) );
507
508 if( output_data && output_part_length )
509 {
510 memcpy( ( output_data + part_offset ), part_data,
511 output_part_length );
512 }
513
Paul Elliottd3f82412021-06-16 16:52:21 +0100514 output_length += output_part_length;
515 }
516 }
517 else
518 {
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100519 /* Pass all data in one go. */
Paul Elliottd3f82412021-06-16 16:52:21 +0100520 PSA_ASSERT( psa_aead_update( &operation, input_data->x,
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100521 data_true_size, output_data,
Paul Elliottd3f82412021-06-16 16:52:21 +0100522 output_size, &output_length ) );
523 }
524
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100525 if( is_encrypt )
526 PSA_ASSERT( psa_aead_finish( &operation, final_data,
527 final_output_size,
528 &output_part_length,
529 tag_buffer, tag_length,
530 &tag_size ) );
531 else
Paul Elliottd3f82412021-06-16 16:52:21 +0100532 {
Paul Elliott9961a662021-09-17 19:19:02 +0100533 PSA_ASSERT( psa_aead_verify( &operation, final_data,
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100534 final_output_size,
535 &output_part_length,
536 ( input_data->x + data_true_size ),
Paul Elliott9961a662021-09-17 19:19:02 +0100537 tag_length ) );
Paul Elliottd3f82412021-06-16 16:52:21 +0100538 }
539
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100540 if( output_data && output_part_length )
541 memcpy( ( output_data + output_length ), final_data,
542 output_part_length );
Paul Elliottd3f82412021-06-16 16:52:21 +0100543
544 output_length += output_part_length;
545
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100546
547 /* For all currently defined algorithms, PSA_AEAD_xxx_OUTPUT_SIZE
548 * should be exact.*/
549 if( is_encrypt )
Paul Elliottd3f82412021-06-16 16:52:21 +0100550 {
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100551 TEST_EQUAL( tag_length, tag_size );
552
553 if( output_data && tag_length )
554 memcpy( ( output_data + output_length ), tag_buffer,
555 tag_length );
556
557 output_length += tag_length;
558
559 TEST_EQUAL( output_length,
560 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg,
561 input_data->len ) );
562 TEST_ASSERT( output_length <=
563 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
564 }
565 else
566 {
567 TEST_EQUAL( output_length,
568 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg,
569 input_data->len ) );
570 TEST_ASSERT( output_length <=
571 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
Paul Elliottd3f82412021-06-16 16:52:21 +0100572 }
573
Paul Elliottd3f82412021-06-16 16:52:21 +0100574
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100575 ASSERT_COMPARE( expected_output->x, expected_output->len,
Paul Elliottd3f82412021-06-16 16:52:21 +0100576 output_data, output_length );
577
Paul Elliottd3f82412021-06-16 16:52:21 +0100578
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100579 test_ok = 1;
Paul Elliottd3f82412021-06-16 16:52:21 +0100580
581exit:
582 psa_destroy_key( key );
583 psa_aead_abort( &operation );
584 mbedtls_free( output_data );
585 mbedtls_free( part_data );
586 mbedtls_free( final_data );
587 PSA_DONE( );
Paul Elliott97fd1ba2021-07-21 18:46:06 +0100588
589 return( test_ok );
Paul Elliottd3f82412021-06-16 16:52:21 +0100590}
591
Gilles Peskinee59236f2018-01-27 23:32:46 +0100592/* END_HEADER */
593
594/* BEGIN_DEPENDENCIES
595 * depends_on:MBEDTLS_PSA_CRYPTO_C
596 * END_DEPENDENCIES
597 */
598
599/* BEGIN_CASE */
Gilles Peskinee1f2d7d2018-08-21 14:54:54 +0200600void static_checks( )
601{
602 size_t max_truncated_mac_size =
603 PSA_ALG_MAC_TRUNCATION_MASK >> PSA_MAC_TRUNCATION_OFFSET;
604
605 /* Check that the length for a truncated MAC always fits in the algorithm
606 * encoding. The shifted mask is the maximum truncated value. The
607 * untruncated algorithm may be one byte larger. */
608 TEST_ASSERT( PSA_MAC_MAX_SIZE <= 1 + max_truncated_mac_size );
609}
610/* END_CASE */
611
612/* BEGIN_CASE */
Gilles Peskine6edfa292019-07-31 15:53:45 +0200613void import_with_policy( int type_arg,
614 int usage_arg, int alg_arg,
615 int expected_status_arg )
616{
617 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
618 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +0200619 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine6edfa292019-07-31 15:53:45 +0200620 psa_key_type_t type = type_arg;
621 psa_key_usage_t usage = usage_arg;
622 psa_algorithm_t alg = alg_arg;
623 psa_status_t expected_status = expected_status_arg;
624 const uint8_t key_material[16] = {0};
625 psa_status_t status;
626
627 PSA_ASSERT( psa_crypto_init( ) );
628
629 psa_set_key_type( &attributes, type );
630 psa_set_key_usage_flags( &attributes, usage );
631 psa_set_key_algorithm( &attributes, alg );
632
633 status = psa_import_key( &attributes,
634 key_material, sizeof( key_material ),
Ronald Cron5425a212020-08-04 14:58:35 +0200635 &key );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200636 TEST_EQUAL( status, expected_status );
637 if( status != PSA_SUCCESS )
638 goto exit;
639
Ronald Cron5425a212020-08-04 14:58:35 +0200640 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200641 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
gabor-mezei-arm4ff73032021-05-13 12:05:01 +0200642 TEST_EQUAL( psa_get_key_usage_flags( &got_attributes ),
gabor-mezei-arm98a34352021-06-28 14:05:00 +0200643 mbedtls_test_update_key_usage_flags( usage ) );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200644 TEST_EQUAL( psa_get_key_algorithm( &got_attributes ), alg );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200645 ASSERT_NO_SLOT_NUMBER( &got_attributes );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200646
Ronald Cron5425a212020-08-04 14:58:35 +0200647 PSA_ASSERT( psa_destroy_key( key ) );
648 test_operations_on_invalid_key( key );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200649
650exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100651 /*
652 * Key attributes may have been returned by psa_get_key_attributes()
653 * thus reset them as required.
654 */
Gilles Peskine6edfa292019-07-31 15:53:45 +0200655 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100656
657 psa_destroy_key( key );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200658 PSA_DONE( );
659}
660/* END_CASE */
661
662/* BEGIN_CASE */
663void import_with_data( data_t *data, int type_arg,
664 int attr_bits_arg,
665 int expected_status_arg )
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200666{
667 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
668 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +0200669 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200670 psa_key_type_t type = type_arg;
Gilles Peskine8fb3a9e2019-05-03 16:59:21 +0200671 size_t attr_bits = attr_bits_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200672 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100673 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100674
Gilles Peskine8817f612018-12-18 00:18:46 +0100675 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100676
Gilles Peskine4747d192019-04-17 15:05:45 +0200677 psa_set_key_type( &attributes, type );
Gilles Peskine8fb3a9e2019-05-03 16:59:21 +0200678 psa_set_key_bits( &attributes, attr_bits );
Gilles Peskine6edfa292019-07-31 15:53:45 +0200679
Ronald Cron5425a212020-08-04 14:58:35 +0200680 status = psa_import_key( &attributes, data->x, data->len, &key );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100681 TEST_EQUAL( status, expected_status );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200682 if( status != PSA_SUCCESS )
683 goto exit;
684
Ronald Cron5425a212020-08-04 14:58:35 +0200685 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200686 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
Gilles Peskine8fb3a9e2019-05-03 16:59:21 +0200687 if( attr_bits != 0 )
Gilles Peskine7e0cff92019-07-30 13:48:52 +0200688 TEST_EQUAL( attr_bits, psa_get_key_bits( &got_attributes ) );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200689 ASSERT_NO_SLOT_NUMBER( &got_attributes );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200690
Ronald Cron5425a212020-08-04 14:58:35 +0200691 PSA_ASSERT( psa_destroy_key( key ) );
692 test_operations_on_invalid_key( key );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100693
694exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100695 /*
696 * Key attributes may have been returned by psa_get_key_attributes()
697 * thus reset them as required.
698 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +0200699 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100700
701 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200702 PSA_DONE( );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100703}
704/* END_CASE */
705
706/* BEGIN_CASE */
Gilles Peskinec744d992019-07-30 17:26:54 +0200707void import_large_key( int type_arg, int byte_size_arg,
708 int expected_status_arg )
709{
710 psa_key_type_t type = type_arg;
711 size_t byte_size = byte_size_arg;
712 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
713 psa_status_t expected_status = expected_status_arg;
Ronald Cron5425a212020-08-04 14:58:35 +0200714 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec744d992019-07-30 17:26:54 +0200715 psa_status_t status;
716 uint8_t *buffer = NULL;
717 size_t buffer_size = byte_size + 1;
718 size_t n;
719
Steven Cooreman69967ce2021-01-18 18:01:08 +0100720 /* Skip the test case if the target running the test cannot
721 * accomodate large keys due to heap size constraints */
722 ASSERT_ALLOC_WEAK( buffer, buffer_size );
Gilles Peskinec744d992019-07-30 17:26:54 +0200723 memset( buffer, 'K', byte_size );
724
725 PSA_ASSERT( psa_crypto_init( ) );
726
727 /* Try importing the key */
728 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT );
729 psa_set_key_type( &attributes, type );
Ronald Cron5425a212020-08-04 14:58:35 +0200730 status = psa_import_key( &attributes, buffer, byte_size, &key );
Steven Cooreman83fdb702021-01-21 14:24:39 +0100731 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
Gilles Peskinec744d992019-07-30 17:26:54 +0200732 TEST_EQUAL( status, expected_status );
733
734 if( status == PSA_SUCCESS )
735 {
Ronald Cron5425a212020-08-04 14:58:35 +0200736 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskinec744d992019-07-30 17:26:54 +0200737 TEST_EQUAL( psa_get_key_type( &attributes ), type );
738 TEST_EQUAL( psa_get_key_bits( &attributes ),
739 PSA_BYTES_TO_BITS( byte_size ) );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200740 ASSERT_NO_SLOT_NUMBER( &attributes );
Gilles Peskinec744d992019-07-30 17:26:54 +0200741 memset( buffer, 0, byte_size + 1 );
Ronald Cron5425a212020-08-04 14:58:35 +0200742 PSA_ASSERT( psa_export_key( key, buffer, byte_size, &n ) );
Gilles Peskinec744d992019-07-30 17:26:54 +0200743 for( n = 0; n < byte_size; n++ )
744 TEST_EQUAL( buffer[n], 'K' );
745 for( n = byte_size; n < buffer_size; n++ )
746 TEST_EQUAL( buffer[n], 0 );
747 }
748
749exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100750 /*
751 * Key attributes may have been returned by psa_get_key_attributes()
752 * thus reset them as required.
753 */
754 psa_reset_key_attributes( &attributes );
755
Ronald Cron5425a212020-08-04 14:58:35 +0200756 psa_destroy_key( key );
Gilles Peskinec744d992019-07-30 17:26:54 +0200757 PSA_DONE( );
758 mbedtls_free( buffer );
759}
760/* END_CASE */
761
Andrzej Kurek77b8e092022-01-17 15:29:38 +0100762/* BEGIN_CASE depends_on:MBEDTLS_ASN1_WRITE_C */
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200763void import_rsa_made_up( int bits_arg, int keypair, int expected_status_arg )
764{
Ronald Cron5425a212020-08-04 14:58:35 +0200765 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200766 size_t bits = bits_arg;
767 psa_status_t expected_status = expected_status_arg;
768 psa_status_t status;
769 psa_key_type_t type =
Gilles Peskinec93b80c2019-05-16 19:39:54 +0200770 keypair ? PSA_KEY_TYPE_RSA_KEY_PAIR : PSA_KEY_TYPE_RSA_PUBLIC_KEY;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200771 size_t buffer_size = /* Slight overapproximations */
772 keypair ? bits * 9 / 16 + 80 : bits / 8 + 20;
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200773 unsigned char *buffer = NULL;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200774 unsigned char *p;
775 int ret;
776 size_t length;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200777 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200778
Gilles Peskine8817f612018-12-18 00:18:46 +0100779 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200780 ASSERT_ALLOC( buffer, buffer_size );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200781
782 TEST_ASSERT( ( ret = construct_fake_rsa_key( buffer, buffer_size, &p,
783 bits, keypair ) ) >= 0 );
784 length = ret;
785
786 /* Try importing the key */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +0200787 psa_set_key_type( &attributes, type );
Ronald Cron5425a212020-08-04 14:58:35 +0200788 status = psa_import_key( &attributes, p, length, &key );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100789 TEST_EQUAL( status, expected_status );
Gilles Peskine76b29a72019-05-28 14:08:50 +0200790
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200791 if( status == PSA_SUCCESS )
Ronald Cron5425a212020-08-04 14:58:35 +0200792 PSA_ASSERT( psa_destroy_key( key ) );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200793
794exit:
795 mbedtls_free( buffer );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200796 PSA_DONE( );
Gilles Peskine0b352bc2018-06-28 00:16:11 +0200797}
798/* END_CASE */
799
800/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300801void import_export( data_t *data,
Moran Pekera964a8f2018-06-04 18:42:36 +0300802 int type_arg,
Gilles Peskine1ecf92c22019-05-24 15:00:06 +0200803 int usage_arg, int alg_arg,
Archana4d7ae1d2021-07-07 02:50:22 +0530804 int lifetime_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100805 int expected_bits,
806 int export_size_delta,
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200807 int expected_export_status_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100808 int canonical_input )
809{
Ronald Cron5425a212020-08-04 14:58:35 +0200810 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100811 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200812 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200813 psa_status_t expected_export_status = expected_export_status_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100814 psa_status_t status;
Archana4d7ae1d2021-07-07 02:50:22 +0530815 psa_key_lifetime_t lifetime = lifetime_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100816 unsigned char *exported = NULL;
817 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100818 size_t export_size;
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100819 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100820 size_t reexported_length;
Gilles Peskine4747d192019-04-17 15:05:45 +0200821 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200822 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100823
Moran Pekercb088e72018-07-17 17:36:59 +0300824 export_size = (ptrdiff_t) data->len + export_size_delta;
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200825 ASSERT_ALLOC( exported, export_size );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100826 if( ! canonical_input )
Gilles Peskine8cebbba2018-09-27 13:54:18 +0200827 ASSERT_ALLOC( reexported, export_size );
Gilles Peskine8817f612018-12-18 00:18:46 +0100828 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100829
Archana4d7ae1d2021-07-07 02:50:22 +0530830 psa_set_key_lifetime( &attributes, lifetime );
Gilles Peskine4747d192019-04-17 15:05:45 +0200831 psa_set_key_usage_flags( &attributes, usage_arg );
832 psa_set_key_algorithm( &attributes, alg );
833 psa_set_key_type( &attributes, type );
mohammad1603a97cb8c2018-03-28 03:46:26 -0700834
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100835 /* Import the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200836 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len, &key ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100837
838 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +0200839 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200840 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
841 TEST_EQUAL( psa_get_key_bits( &got_attributes ), (size_t) expected_bits );
Gilles Peskine5fe5e272019-08-02 20:30:01 +0200842 ASSERT_NO_SLOT_NUMBER( &got_attributes );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100843
844 /* Export the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200845 status = psa_export_key( key, exported, export_size, &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100846 TEST_EQUAL( status, expected_export_status );
Jaeden Amerof24c7f82018-06-27 17:20:43 +0100847
848 /* The exported length must be set by psa_export_key() to a value between 0
849 * and export_size. On errors, the exported length must be 0. */
850 TEST_ASSERT( exported_length != INVALID_EXPORT_LENGTH );
851 TEST_ASSERT( status == PSA_SUCCESS || exported_length == 0 );
852 TEST_ASSERT( exported_length <= export_size );
853
Gilles Peskinea7aa4422018-08-14 15:17:54 +0200854 TEST_ASSERT( mem_is_char( exported + exported_length, 0,
Gilles Peskine3f669c32018-06-21 09:21:51 +0200855 export_size - exported_length ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100856 if( status != PSA_SUCCESS )
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200857 {
Gilles Peskinefe11b722018-12-18 00:24:04 +0100858 TEST_EQUAL( exported_length, 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100859 goto destroy;
Gilles Peskinee66ca3b2018-06-20 00:11:45 +0200860 }
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100861
Gilles Peskineea38a922021-02-13 00:05:16 +0100862 /* Run sanity checks on the exported key. For non-canonical inputs,
863 * this validates the canonical representations. For canonical inputs,
864 * this doesn't directly validate the implementation, but it still helps
865 * by cross-validating the test data with the sanity check code. */
Archana4d7ae1d2021-07-07 02:50:22 +0530866 if( !psa_key_lifetime_is_external( lifetime ) )
867 {
868 if( ! mbedtls_test_psa_exercise_key( key, usage_arg, 0 ) )
869 goto exit;
870 }
Gilles Peskine8f609232018-08-11 01:24:55 +0200871
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100872 if( canonical_input )
Gilles Peskinebd7dea92018-09-27 13:57:19 +0200873 ASSERT_COMPARE( data->x, data->len, exported, exported_length );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100874 else
875 {
Ronald Cron5425a212020-08-04 14:58:35 +0200876 mbedtls_svc_key_id_t key2 = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine049c7532019-05-15 20:22:09 +0200877 PSA_ASSERT( psa_import_key( &attributes, exported, exported_length,
Ronald Cron5425a212020-08-04 14:58:35 +0200878 &key2 ) );
879 PSA_ASSERT( psa_export_key( key2,
Gilles Peskine8817f612018-12-18 00:18:46 +0100880 reexported,
881 export_size,
882 &reexported_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +0200883 ASSERT_COMPARE( exported, exported_length,
Archana4d7ae1d2021-07-07 02:50:22 +0530884 reexported, reexported_length );
Ronald Cron5425a212020-08-04 14:58:35 +0200885 PSA_ASSERT( psa_destroy_key( key2 ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100886 }
gabor-mezei-armceface22021-01-21 12:26:17 +0100887 TEST_ASSERT( exported_length <=
Archana4d7ae1d2021-07-07 02:50:22 +0530888 PSA_EXPORT_KEY_OUTPUT_SIZE( type,
Archana9d17bf42021-09-10 06:22:44 +0530889 psa_get_key_bits( &got_attributes ) ) );
gabor-mezei-armceface22021-01-21 12:26:17 +0100890 TEST_ASSERT( exported_length <= PSA_EXPORT_KEY_PAIR_MAX_SIZE );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100891
892destroy:
893 /* Destroy the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200894 PSA_ASSERT( psa_destroy_key( key ) );
895 test_operations_on_invalid_key( key );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100896
897exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100898 /*
899 * Key attributes may have been returned by psa_get_key_attributes()
900 * thus reset them as required.
901 */
902 psa_reset_key_attributes( &got_attributes );
Archana4d7ae1d2021-07-07 02:50:22 +0530903 psa_destroy_key( key ) ;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300904 mbedtls_free( exported );
905 mbedtls_free( reexported );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200906 PSA_DONE( );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100907}
908/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100909
Moran Pekerf709f4a2018-06-06 17:26:04 +0300910/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300911void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200912 int type_arg,
913 int alg_arg,
Archana4d7ae1d2021-07-07 02:50:22 +0530914 int lifetime_arg,
Gilles Peskine49c25912018-10-29 15:15:31 +0100915 int export_size_delta,
916 int expected_export_status_arg,
917 data_t *expected_public_key )
Moran Pekerf709f4a2018-06-06 17:26:04 +0300918{
Ronald Cron5425a212020-08-04 14:58:35 +0200919 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300920 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200921 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +0200922 psa_status_t expected_export_status = expected_export_status_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300923 psa_status_t status;
Archana4d7ae1d2021-07-07 02:50:22 +0530924 psa_key_lifetime_t lifetime = lifetime_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300925 unsigned char *exported = NULL;
Gilles Peskine49c25912018-10-29 15:15:31 +0100926 size_t export_size = expected_public_key->len + export_size_delta;
Jaeden Amero2a671e92018-06-27 17:47:40 +0100927 size_t exported_length = INVALID_EXPORT_LENGTH;
Gilles Peskine4747d192019-04-17 15:05:45 +0200928 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300929
Gilles Peskine8817f612018-12-18 00:18:46 +0100930 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300931
Archana4d7ae1d2021-07-07 02:50:22 +0530932 psa_set_key_lifetime( &attributes, lifetime );
Gilles Peskine4747d192019-04-17 15:05:45 +0200933 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT );
934 psa_set_key_algorithm( &attributes, alg );
935 psa_set_key_type( &attributes, type );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300936
937 /* Import the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200938 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len, &key ) );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300939
Gilles Peskine49c25912018-10-29 15:15:31 +0100940 /* Export the public key */
941 ASSERT_ALLOC( exported, export_size );
Ronald Cron5425a212020-08-04 14:58:35 +0200942 status = psa_export_public_key( key,
Gilles Peskine2d277862018-06-18 15:41:12 +0200943 exported, export_size,
944 &exported_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +0100945 TEST_EQUAL( status, expected_export_status );
Gilles Peskine49c25912018-10-29 15:15:31 +0100946 if( status == PSA_SUCCESS )
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100947 {
Gilles Peskinec93b80c2019-05-16 19:39:54 +0200948 psa_key_type_t public_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR( type );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100949 size_t bits;
Ronald Cron5425a212020-08-04 14:58:35 +0200950 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200951 bits = psa_get_key_bits( &attributes );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100952 TEST_ASSERT( expected_public_key->len <=
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100953 PSA_EXPORT_KEY_OUTPUT_SIZE( public_type, bits ) );
gabor-mezei-armceface22021-01-21 12:26:17 +0100954 TEST_ASSERT( expected_public_key->len <=
955 PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE( public_type, bits ) );
956 TEST_ASSERT( expected_public_key->len <=
957 PSA_EXPORT_PUBLIC_KEY_MAX_SIZE );
Gilles Peskine49c25912018-10-29 15:15:31 +0100958 ASSERT_COMPARE( expected_public_key->x, expected_public_key->len,
959 exported, exported_length );
Gilles Peskined8b7d4f2018-10-29 15:18:41 +0100960 }
Moran Pekerf709f4a2018-06-06 17:26:04 +0300961exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100962 /*
963 * Key attributes may have been returned by psa_get_key_attributes()
964 * thus reset them as required.
965 */
966 psa_reset_key_attributes( &attributes );
967
itayzafrir3e02b3b2018-06-12 17:06:52 +0300968 mbedtls_free( exported );
Ronald Cron5425a212020-08-04 14:58:35 +0200969 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +0200970 PSA_DONE( );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300971}
972/* END_CASE */
973
Gilles Peskine20035e32018-02-03 22:44:14 +0100974/* BEGIN_CASE */
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200975void import_and_exercise_key( data_t *data,
976 int type_arg,
977 int bits_arg,
978 int alg_arg )
979{
Ronald Cron5425a212020-08-04 14:58:35 +0200980 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200981 psa_key_type_t type = type_arg;
982 size_t bits = bits_arg;
983 psa_algorithm_t alg = alg_arg;
Gilles Peskinec18e25f2021-02-12 23:48:20 +0100984 psa_key_usage_t usage = mbedtls_test_psa_usage_to_exercise( type, alg );
Gilles Peskine4747d192019-04-17 15:05:45 +0200985 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200986 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200987
Gilles Peskine8817f612018-12-18 00:18:46 +0100988 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200989
Gilles Peskine4747d192019-04-17 15:05:45 +0200990 psa_set_key_usage_flags( &attributes, usage );
991 psa_set_key_algorithm( &attributes, alg );
992 psa_set_key_type( &attributes, type );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200993
994 /* Import the key */
Ronald Cron5425a212020-08-04 14:58:35 +0200995 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len, &key ) );
Gilles Peskinea680c7a2018-06-26 16:12:43 +0200996
997 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +0200998 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +0200999 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
1000 TEST_EQUAL( psa_get_key_bits( &got_attributes ), bits );
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001001
1002 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001003 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +02001004 goto exit;
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001005
Ronald Cron5425a212020-08-04 14:58:35 +02001006 PSA_ASSERT( psa_destroy_key( key ) );
1007 test_operations_on_invalid_key( key );
Gilles Peskine4cf3a432019-04-18 22:28:52 +02001008
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001009exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001010 /*
1011 * Key attributes may have been returned by psa_get_key_attributes()
1012 * thus reset them as required.
1013 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02001014 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001015
1016 psa_reset_key_attributes( &attributes );
1017 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001018 PSA_DONE( );
Gilles Peskinea680c7a2018-06-26 16:12:43 +02001019}
1020/* END_CASE */
1021
1022/* BEGIN_CASE */
Gilles Peskine06c28892019-11-26 18:07:46 +01001023void effective_key_attributes( int type_arg, int expected_type_arg,
1024 int bits_arg, int expected_bits_arg,
1025 int usage_arg, int expected_usage_arg,
1026 int alg_arg, int expected_alg_arg )
Gilles Peskined5b33222018-06-18 22:20:03 +02001027{
Ronald Cron5425a212020-08-04 14:58:35 +02001028 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine1a960492019-11-26 17:12:21 +01001029 psa_key_type_t key_type = type_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +01001030 psa_key_type_t expected_key_type = expected_type_arg;
Gilles Peskine1a960492019-11-26 17:12:21 +01001031 size_t bits = bits_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +01001032 size_t expected_bits = expected_bits_arg;
Gilles Peskined5b33222018-06-18 22:20:03 +02001033 psa_algorithm_t alg = alg_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +01001034 psa_algorithm_t expected_alg = expected_alg_arg;
Gilles Peskined5b33222018-06-18 22:20:03 +02001035 psa_key_usage_t usage = usage_arg;
Gilles Peskine06c28892019-11-26 18:07:46 +01001036 psa_key_usage_t expected_usage = expected_usage_arg;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02001037 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskined5b33222018-06-18 22:20:03 +02001038
Gilles Peskine8817f612018-12-18 00:18:46 +01001039 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001040
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02001041 psa_set_key_usage_flags( &attributes, usage );
1042 psa_set_key_algorithm( &attributes, alg );
1043 psa_set_key_type( &attributes, key_type );
Gilles Peskine1a960492019-11-26 17:12:21 +01001044 psa_set_key_bits( &attributes, bits );
Gilles Peskined5b33222018-06-18 22:20:03 +02001045
Ronald Cron5425a212020-08-04 14:58:35 +02001046 PSA_ASSERT( psa_generate_key( &attributes, &key ) );
Gilles Peskine1a960492019-11-26 17:12:21 +01001047 psa_reset_key_attributes( &attributes );
Gilles Peskined5b33222018-06-18 22:20:03 +02001048
Ronald Cron5425a212020-08-04 14:58:35 +02001049 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine06c28892019-11-26 18:07:46 +01001050 TEST_EQUAL( psa_get_key_type( &attributes ), expected_key_type );
1051 TEST_EQUAL( psa_get_key_bits( &attributes ), expected_bits );
1052 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), expected_usage );
1053 TEST_EQUAL( psa_get_key_algorithm( &attributes ), expected_alg );
Gilles Peskined5b33222018-06-18 22:20:03 +02001054
1055exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001056 /*
1057 * Key attributes may have been returned by psa_get_key_attributes()
1058 * thus reset them as required.
1059 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02001060 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001061
1062 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001063 PSA_DONE( );
Gilles Peskined5b33222018-06-18 22:20:03 +02001064}
1065/* END_CASE */
1066
1067/* BEGIN_CASE */
Gilles Peskine06c28892019-11-26 18:07:46 +01001068void check_key_policy( int type_arg, int bits_arg,
1069 int usage_arg, int alg_arg )
1070{
1071 test_effective_key_attributes( type_arg, type_arg, bits_arg, bits_arg,
gabor-mezei-armff8264c2021-06-28 14:36:03 +02001072 usage_arg,
1073 mbedtls_test_update_key_usage_flags( usage_arg ),
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001074 alg_arg, alg_arg );
Gilles Peskine06c28892019-11-26 18:07:46 +01001075 goto exit;
1076}
1077/* END_CASE */
1078
1079/* BEGIN_CASE */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001080void key_attributes_init( )
Jaeden Amero70261c52019-01-04 11:47:20 +00001081{
1082 /* Test each valid way of initializing the object, except for `= {0}`, as
1083 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
1084 * though it's OK by the C standard. We could test for this, but we'd need
1085 * to supress the Clang warning for the test. */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001086 psa_key_attributes_t func = psa_key_attributes_init( );
1087 psa_key_attributes_t init = PSA_KEY_ATTRIBUTES_INIT;
1088 psa_key_attributes_t zero;
Jaeden Amero70261c52019-01-04 11:47:20 +00001089
1090 memset( &zero, 0, sizeof( zero ) );
1091
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001092 TEST_EQUAL( psa_get_key_lifetime( &func ), PSA_KEY_LIFETIME_VOLATILE );
1093 TEST_EQUAL( psa_get_key_lifetime( &init ), PSA_KEY_LIFETIME_VOLATILE );
1094 TEST_EQUAL( psa_get_key_lifetime( &zero ), PSA_KEY_LIFETIME_VOLATILE );
Jaeden Amero5229bbb2019-02-07 16:33:37 +00001095
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001096 TEST_EQUAL( psa_get_key_type( &func ), 0 );
1097 TEST_EQUAL( psa_get_key_type( &init ), 0 );
1098 TEST_EQUAL( psa_get_key_type( &zero ), 0 );
1099
1100 TEST_EQUAL( psa_get_key_bits( &func ), 0 );
1101 TEST_EQUAL( psa_get_key_bits( &init ), 0 );
1102 TEST_EQUAL( psa_get_key_bits( &zero ), 0 );
1103
1104 TEST_EQUAL( psa_get_key_usage_flags( &func ), 0 );
1105 TEST_EQUAL( psa_get_key_usage_flags( &init ), 0 );
1106 TEST_EQUAL( psa_get_key_usage_flags( &zero ), 0 );
1107
1108 TEST_EQUAL( psa_get_key_algorithm( &func ), 0 );
1109 TEST_EQUAL( psa_get_key_algorithm( &init ), 0 );
1110 TEST_EQUAL( psa_get_key_algorithm( &zero ), 0 );
Jaeden Amero70261c52019-01-04 11:47:20 +00001111}
1112/* END_CASE */
1113
1114/* BEGIN_CASE */
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001115void mac_key_policy( int policy_usage_arg,
1116 int policy_alg_arg,
1117 int key_type_arg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001118 data_t *key_data,
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001119 int exercise_alg_arg,
Mateusz Starzykd07f4fc2021-08-24 11:01:23 +02001120 int expected_status_sign_arg,
1121 int expected_status_verify_arg )
Gilles Peskined5b33222018-06-18 22:20:03 +02001122{
Ronald Cron5425a212020-08-04 14:58:35 +02001123 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001124 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Amero769ce272019-01-04 11:48:03 +00001125 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001126 psa_key_type_t key_type = key_type_arg;
1127 psa_algorithm_t policy_alg = policy_alg_arg;
1128 psa_algorithm_t exercise_alg = exercise_alg_arg;
1129 psa_key_usage_t policy_usage = policy_usage_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001130 psa_status_t status;
Mateusz Starzykd07f4fc2021-08-24 11:01:23 +02001131 psa_status_t expected_status_sign = expected_status_sign_arg;
1132 psa_status_t expected_status_verify = expected_status_verify_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001133 unsigned char mac[PSA_MAC_MAX_SIZE];
Gilles Peskined5b33222018-06-18 22:20:03 +02001134
Gilles Peskine8817f612018-12-18 00:18:46 +01001135 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001136
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001137 psa_set_key_usage_flags( &attributes, policy_usage );
1138 psa_set_key_algorithm( &attributes, policy_alg );
1139 psa_set_key_type( &attributes, key_type );
Gilles Peskined5b33222018-06-18 22:20:03 +02001140
Gilles Peskine049c7532019-05-15 20:22:09 +02001141 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001142 &key ) );
Gilles Peskined5b33222018-06-18 22:20:03 +02001143
gabor-mezei-arm40d5cd82021-06-29 11:06:16 +02001144 TEST_EQUAL( psa_get_key_usage_flags( &attributes ),
1145 mbedtls_test_update_key_usage_flags( policy_usage ) );
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001146
Ronald Cron5425a212020-08-04 14:58:35 +02001147 status = psa_mac_sign_setup( &operation, key, exercise_alg );
Mateusz Starzykd07f4fc2021-08-24 11:01:23 +02001148 TEST_EQUAL( status, expected_status_sign );
Steven Cooremanb3ce8152021-02-18 12:03:50 +01001149
Mateusz Starzyk1ebcd552021-08-30 17:09:03 +02001150 /* Calculate the MAC, one-shot case. */
1151 uint8_t input[128] = {0};
1152 size_t mac_len;
1153 TEST_EQUAL( psa_mac_compute( key, exercise_alg,
1154 input, 128,
1155 mac, PSA_MAC_MAX_SIZE, &mac_len ),
1156 expected_status_sign );
1157
1158 /* Verify correct MAC, one-shot case. */
1159 status = psa_mac_verify( key, exercise_alg, input, 128,
1160 mac, mac_len );
1161
1162 if( expected_status_sign != PSA_SUCCESS && expected_status_verify == PSA_SUCCESS )
1163 TEST_EQUAL( status, PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine8817f612018-12-18 00:18:46 +01001164 else
Mateusz Starzyk1ebcd552021-08-30 17:09:03 +02001165 TEST_EQUAL( status, expected_status_verify );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001166
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001167 psa_mac_abort( &operation );
Gilles Peskined5b33222018-06-18 22:20:03 +02001168
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001169 memset( mac, 0, sizeof( mac ) );
Ronald Cron5425a212020-08-04 14:58:35 +02001170 status = psa_mac_verify_setup( &operation, key, exercise_alg );
Mateusz Starzykd07f4fc2021-08-24 11:01:23 +02001171 TEST_EQUAL( status, expected_status_verify );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001172
1173exit:
1174 psa_mac_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001175 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001176 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001177}
1178/* END_CASE */
1179
1180/* BEGIN_CASE */
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001181void cipher_key_policy( int policy_usage_arg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001182 int policy_alg,
1183 int key_type,
1184 data_t *key_data,
1185 int exercise_alg )
1186{
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;
Jaeden Amero5bae2272019-01-04 11:48:27 +00001189 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001190 psa_key_usage_t policy_usage = policy_usage_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001191 psa_status_t status;
1192
Gilles Peskine8817f612018-12-18 00:18:46 +01001193 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001194
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001195 psa_set_key_usage_flags( &attributes, policy_usage );
1196 psa_set_key_algorithm( &attributes, policy_alg );
1197 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001198
Gilles Peskine049c7532019-05-15 20:22:09 +02001199 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001200 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001201
gabor-mezei-arm98a34352021-06-28 14:05:00 +02001202 /* Check if no key usage flag implication is done */
1203 TEST_EQUAL( policy_usage,
1204 mbedtls_test_update_key_usage_flags( policy_usage ) );
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001205
Ronald Cron5425a212020-08-04 14:58:35 +02001206 status = psa_cipher_encrypt_setup( &operation, key, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001207 if( policy_alg == exercise_alg &&
1208 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001209 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001210 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001211 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001212 psa_cipher_abort( &operation );
1213
Ronald Cron5425a212020-08-04 14:58:35 +02001214 status = psa_cipher_decrypt_setup( &operation, key, exercise_alg );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001215 if( policy_alg == exercise_alg &&
1216 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001217 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001218 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001219 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001220
1221exit:
1222 psa_cipher_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001223 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001224 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001225}
1226/* END_CASE */
1227
1228/* BEGIN_CASE */
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001229void aead_key_policy( int policy_usage_arg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001230 int policy_alg,
1231 int key_type,
1232 data_t *key_data,
1233 int nonce_length_arg,
1234 int tag_length_arg,
Steven Cooremanb3ce8152021-02-18 12:03:50 +01001235 int exercise_alg,
1236 int expected_status_arg )
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001237{
Ronald Cron5425a212020-08-04 14:58:35 +02001238 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001239 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001240 psa_key_usage_t policy_usage = policy_usage_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001241 psa_status_t status;
Steven Cooremanb3ce8152021-02-18 12:03:50 +01001242 psa_status_t expected_status = expected_status_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001243 unsigned char nonce[16] = {0};
1244 size_t nonce_length = nonce_length_arg;
1245 unsigned char tag[16];
1246 size_t tag_length = tag_length_arg;
1247 size_t output_length;
1248
1249 TEST_ASSERT( nonce_length <= sizeof( nonce ) );
1250 TEST_ASSERT( tag_length <= sizeof( tag ) );
1251
Gilles Peskine8817f612018-12-18 00:18:46 +01001252 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001253
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001254 psa_set_key_usage_flags( &attributes, policy_usage );
1255 psa_set_key_algorithm( &attributes, policy_alg );
1256 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001257
Gilles Peskine049c7532019-05-15 20:22:09 +02001258 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001259 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001260
gabor-mezei-arm98a34352021-06-28 14:05:00 +02001261 /* Check if no key usage implication is done */
1262 TEST_EQUAL( policy_usage,
1263 mbedtls_test_update_key_usage_flags( policy_usage ) );
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001264
Ronald Cron5425a212020-08-04 14:58:35 +02001265 status = psa_aead_encrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001266 nonce, nonce_length,
1267 NULL, 0,
1268 NULL, 0,
1269 tag, tag_length,
1270 &output_length );
Steven Cooremanb3ce8152021-02-18 12:03:50 +01001271 if( ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
1272 TEST_EQUAL( status, expected_status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001273 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001274 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001275
1276 memset( tag, 0, sizeof( tag ) );
Ronald Cron5425a212020-08-04 14:58:35 +02001277 status = psa_aead_decrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001278 nonce, nonce_length,
1279 NULL, 0,
1280 tag, tag_length,
1281 NULL, 0,
1282 &output_length );
Steven Cooremanb3ce8152021-02-18 12:03:50 +01001283 if( ( policy_usage & PSA_KEY_USAGE_DECRYPT ) == 0 )
1284 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
1285 else if( expected_status == PSA_SUCCESS )
Gilles Peskinefe11b722018-12-18 00:24:04 +01001286 TEST_EQUAL( status, PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001287 else
Steven Cooremanb3ce8152021-02-18 12:03:50 +01001288 TEST_EQUAL( status, expected_status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001289
1290exit:
Ronald Cron5425a212020-08-04 14:58:35 +02001291 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001292 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001293}
1294/* END_CASE */
1295
1296/* BEGIN_CASE */
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001297void asymmetric_encryption_key_policy( int policy_usage_arg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001298 int policy_alg,
1299 int key_type,
1300 data_t *key_data,
1301 int exercise_alg )
1302{
Ronald Cron5425a212020-08-04 14:58:35 +02001303 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001304 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001305 psa_key_usage_t policy_usage = policy_usage_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001306 psa_status_t status;
1307 size_t key_bits;
1308 size_t buffer_length;
1309 unsigned char *buffer = NULL;
1310 size_t output_length;
1311
Gilles Peskine8817f612018-12-18 00:18:46 +01001312 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001313
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001314 psa_set_key_usage_flags( &attributes, policy_usage );
1315 psa_set_key_algorithm( &attributes, policy_alg );
1316 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001317
Gilles Peskine049c7532019-05-15 20:22:09 +02001318 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001319 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001320
gabor-mezei-arm98a34352021-06-28 14:05:00 +02001321 /* Check if no key usage implication is done */
1322 TEST_EQUAL( policy_usage,
1323 mbedtls_test_update_key_usage_flags( policy_usage ) );
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001324
Ronald Cron5425a212020-08-04 14:58:35 +02001325 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02001326 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001327 buffer_length = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits,
1328 exercise_alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02001329 ASSERT_ALLOC( buffer, buffer_length );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001330
Ronald Cron5425a212020-08-04 14:58:35 +02001331 status = psa_asymmetric_encrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001332 NULL, 0,
1333 NULL, 0,
1334 buffer, buffer_length,
1335 &output_length );
1336 if( policy_alg == exercise_alg &&
1337 ( policy_usage & PSA_KEY_USAGE_ENCRYPT ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001338 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001339 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001340 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001341
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02001342 if( buffer_length != 0 )
1343 memset( buffer, 0, buffer_length );
Ronald Cron5425a212020-08-04 14:58:35 +02001344 status = psa_asymmetric_decrypt( key, exercise_alg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001345 buffer, buffer_length,
1346 NULL, 0,
1347 buffer, buffer_length,
1348 &output_length );
1349 if( policy_alg == exercise_alg &&
1350 ( policy_usage & PSA_KEY_USAGE_DECRYPT ) != 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +01001351 TEST_EQUAL( status, PSA_ERROR_INVALID_PADDING );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001352 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001353 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001354
1355exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001356 /*
1357 * Key attributes may have been returned by psa_get_key_attributes()
1358 * thus reset them as required.
1359 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02001360 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001361
1362 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001363 PSA_DONE( );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001364 mbedtls_free( buffer );
1365}
1366/* END_CASE */
1367
1368/* BEGIN_CASE */
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001369void asymmetric_signature_key_policy( int policy_usage_arg,
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001370 int policy_alg,
1371 int key_type,
1372 data_t *key_data,
Gilles Peskine30f77cd2019-01-14 16:06:39 +01001373 int exercise_alg,
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001374 int payload_length_arg,
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001375 int expected_usage_arg )
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001376{
Ronald Cron5425a212020-08-04 14:58:35 +02001377 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001378 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001379 psa_key_usage_t policy_usage = policy_usage_arg;
1380 psa_key_usage_t expected_usage = expected_usage_arg;
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001381 psa_status_t status;
Gilles Peskine30f77cd2019-01-14 16:06:39 +01001382 unsigned char payload[PSA_HASH_MAX_SIZE] = {1};
1383 /* If `payload_length_arg > 0`, `exercise_alg` is supposed to be
1384 * compatible with the policy and `payload_length_arg` is supposed to be
1385 * a valid input length to sign. If `payload_length_arg <= 0`,
1386 * `exercise_alg` is supposed to be forbidden by the policy. */
1387 int compatible_alg = payload_length_arg > 0;
1388 size_t payload_length = compatible_alg ? payload_length_arg : 0;
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001389 unsigned char signature[PSA_SIGNATURE_MAX_SIZE] = {0};
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001390 size_t signature_length;
1391
gabor-mezei-arm98a34352021-06-28 14:05:00 +02001392 /* Check if all implicit usage flags are deployed
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001393 in the expected usage flags. */
gabor-mezei-arm98a34352021-06-28 14:05:00 +02001394 TEST_EQUAL( expected_usage,
1395 mbedtls_test_update_key_usage_flags( policy_usage ) );
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001396
Gilles Peskine8817f612018-12-18 00:18:46 +01001397 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001398
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001399 psa_set_key_usage_flags( &attributes, policy_usage );
1400 psa_set_key_algorithm( &attributes, policy_alg );
1401 psa_set_key_type( &attributes, key_type );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001402
Gilles Peskine049c7532019-05-15 20:22:09 +02001403 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001404 &key ) );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001405
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001406 TEST_EQUAL( psa_get_key_usage_flags( &attributes ), expected_usage );
1407
Ronald Cron5425a212020-08-04 14:58:35 +02001408 status = psa_sign_hash( key, exercise_alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001409 payload, payload_length,
1410 signature, sizeof( signature ),
1411 &signature_length );
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001412 if( compatible_alg && ( expected_usage & PSA_KEY_USAGE_SIGN_HASH ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001413 PSA_ASSERT( status );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001414 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001415 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001416
1417 memset( signature, 0, sizeof( signature ) );
Ronald Cron5425a212020-08-04 14:58:35 +02001418 status = psa_verify_hash( key, exercise_alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01001419 payload, payload_length,
1420 signature, sizeof( signature ) );
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001421 if( compatible_alg && ( expected_usage & PSA_KEY_USAGE_VERIFY_HASH ) != 0 )
Gilles Peskinefe11b722018-12-18 00:24:04 +01001422 TEST_EQUAL( status, PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine76f5c7b2018-07-06 16:53:09 +02001423 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001424 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskined5b33222018-06-18 22:20:03 +02001425
Gilles Peskinef7b41372021-09-22 16:15:05 +02001426 if( PSA_ALG_IS_SIGN_HASH( exercise_alg ) &&
gabor-mezei-armd851d682021-06-28 14:53:49 +02001427 PSA_ALG_IS_HASH( PSA_ALG_SIGN_GET_HASH( exercise_alg ) ) )
gabor-mezei-armedf2df82021-05-13 16:17:16 +02001428 {
1429 status = psa_sign_message( key, exercise_alg,
1430 payload, payload_length,
1431 signature, sizeof( signature ),
1432 &signature_length );
1433 if( compatible_alg && ( expected_usage & PSA_KEY_USAGE_SIGN_MESSAGE ) != 0 )
1434 PSA_ASSERT( status );
1435 else
1436 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
1437
1438 memset( signature, 0, sizeof( signature ) );
1439 status = psa_verify_message( key, exercise_alg,
1440 payload, payload_length,
1441 signature, sizeof( signature ) );
1442 if( compatible_alg && ( expected_usage & PSA_KEY_USAGE_VERIFY_MESSAGE ) != 0 )
1443 TEST_EQUAL( status, PSA_ERROR_INVALID_SIGNATURE );
1444 else
1445 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
1446 }
1447
Gilles Peskined5b33222018-06-18 22:20:03 +02001448exit:
Ronald Cron5425a212020-08-04 14:58:35 +02001449 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001450 PSA_DONE( );
Gilles Peskined5b33222018-06-18 22:20:03 +02001451}
1452/* END_CASE */
1453
Janos Follathba3fab92019-06-11 14:50:16 +01001454/* BEGIN_CASE */
Gilles Peskineea0fb492018-07-12 17:17:20 +02001455void derive_key_policy( int policy_usage,
1456 int policy_alg,
1457 int key_type,
1458 data_t *key_data,
1459 int exercise_alg )
1460{
Ronald Cron5425a212020-08-04 14:58:35 +02001461 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001462 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001463 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02001464 psa_status_t status;
1465
Gilles Peskine8817f612018-12-18 00:18:46 +01001466 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001467
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001468 psa_set_key_usage_flags( &attributes, policy_usage );
1469 psa_set_key_algorithm( &attributes, policy_alg );
1470 psa_set_key_type( &attributes, key_type );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001471
Gilles Peskine049c7532019-05-15 20:22:09 +02001472 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001473 &key ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001474
Janos Follathba3fab92019-06-11 14:50:16 +01001475 PSA_ASSERT( psa_key_derivation_setup( &operation, exercise_alg ) );
1476
1477 if( PSA_ALG_IS_TLS12_PRF( exercise_alg ) ||
1478 PSA_ALG_IS_TLS12_PSK_TO_MS( exercise_alg ) )
Janos Follath0c1ed842019-06-28 13:35:36 +01001479 {
Janos Follathba3fab92019-06-11 14:50:16 +01001480 PSA_ASSERT( psa_key_derivation_input_bytes(
1481 &operation,
1482 PSA_KEY_DERIVATION_INPUT_SEED,
1483 (const uint8_t*) "", 0) );
Janos Follath0c1ed842019-06-28 13:35:36 +01001484 }
Janos Follathba3fab92019-06-11 14:50:16 +01001485
1486 status = psa_key_derivation_input_key( &operation,
1487 PSA_KEY_DERIVATION_INPUT_SECRET,
Ronald Cron5425a212020-08-04 14:58:35 +02001488 key );
Janos Follathba3fab92019-06-11 14:50:16 +01001489
Gilles Peskineea0fb492018-07-12 17:17:20 +02001490 if( policy_alg == exercise_alg &&
1491 ( policy_usage & PSA_KEY_USAGE_DERIVE ) != 0 )
Gilles Peskine8817f612018-12-18 00:18:46 +01001492 PSA_ASSERT( status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001493 else
Gilles Peskinefe11b722018-12-18 00:24:04 +01001494 TEST_EQUAL( status, PSA_ERROR_NOT_PERMITTED );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001495
1496exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001497 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001498 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001499 PSA_DONE( );
Gilles Peskineea0fb492018-07-12 17:17:20 +02001500}
1501/* END_CASE */
1502
1503/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02001504void agreement_key_policy( int policy_usage,
1505 int policy_alg,
1506 int key_type_arg,
1507 data_t *key_data,
Steven Cooremance48e852020-10-05 16:02:45 +02001508 int exercise_alg,
1509 int expected_status_arg )
Gilles Peskine01d718c2018-09-18 12:01:02 +02001510{
Ronald Cron5425a212020-08-04 14:58:35 +02001511 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001512 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001513 psa_key_type_t key_type = key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001514 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001515 psa_status_t status;
Steven Cooremance48e852020-10-05 16:02:45 +02001516 psa_status_t expected_status = expected_status_arg;
Gilles Peskine01d718c2018-09-18 12:01:02 +02001517
Gilles Peskine8817f612018-12-18 00:18:46 +01001518 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001519
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001520 psa_set_key_usage_flags( &attributes, policy_usage );
1521 psa_set_key_algorithm( &attributes, policy_alg );
1522 psa_set_key_type( &attributes, key_type );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001523
Gilles Peskine049c7532019-05-15 20:22:09 +02001524 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001525 &key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001526
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001527 PSA_ASSERT( psa_key_derivation_setup( &operation, exercise_alg ) );
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001528 status = mbedtls_test_psa_key_agreement_with_self( &operation, key );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001529
Steven Cooremance48e852020-10-05 16:02:45 +02001530 TEST_EQUAL( status, expected_status );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001531
1532exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001533 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001534 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001535 PSA_DONE( );
Gilles Peskine01d718c2018-09-18 12:01:02 +02001536}
1537/* END_CASE */
1538
1539/* BEGIN_CASE */
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001540void key_policy_alg2( int key_type_arg, data_t *key_data,
1541 int usage_arg, int alg_arg, int alg2_arg )
1542{
Ronald Cron5425a212020-08-04 14:58:35 +02001543 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001544 psa_key_type_t key_type = key_type_arg;
1545 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1546 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
1547 psa_key_usage_t usage = usage_arg;
1548 psa_algorithm_t alg = alg_arg;
1549 psa_algorithm_t alg2 = alg2_arg;
1550
1551 PSA_ASSERT( psa_crypto_init( ) );
1552
1553 psa_set_key_usage_flags( &attributes, usage );
1554 psa_set_key_algorithm( &attributes, alg );
1555 psa_set_key_enrollment_algorithm( &attributes, alg2 );
1556 psa_set_key_type( &attributes, key_type );
1557 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001558 &key ) );
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001559
gabor-mezei-arm98a34352021-06-28 14:05:00 +02001560 /* Update the usage flags to obtain implicit usage flags */
1561 usage = mbedtls_test_update_key_usage_flags( usage );
Ronald Cron5425a212020-08-04 14:58:35 +02001562 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001563 TEST_EQUAL( psa_get_key_usage_flags( &got_attributes ), usage );
1564 TEST_EQUAL( psa_get_key_algorithm( &got_attributes ), alg );
1565 TEST_EQUAL( psa_get_key_enrollment_algorithm( &got_attributes ), alg2 );
1566
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001567 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001568 goto exit;
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001569 if( ! mbedtls_test_psa_exercise_key( key, usage, alg2 ) )
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001570 goto exit;
1571
1572exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001573 /*
1574 * Key attributes may have been returned by psa_get_key_attributes()
1575 * thus reset them as required.
1576 */
1577 psa_reset_key_attributes( &got_attributes );
1578
Ronald Cron5425a212020-08-04 14:58:35 +02001579 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001580 PSA_DONE( );
Gilles Peskine96f0b3b2019-05-10 19:33:38 +02001581}
1582/* END_CASE */
1583
1584/* BEGIN_CASE */
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001585void raw_agreement_key_policy( int policy_usage,
1586 int policy_alg,
1587 int key_type_arg,
1588 data_t *key_data,
Steven Cooremance48e852020-10-05 16:02:45 +02001589 int exercise_alg,
1590 int expected_status_arg )
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001591{
Ronald Cron5425a212020-08-04 14:58:35 +02001592 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001593 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001594 psa_key_type_t key_type = key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001595 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001596 psa_status_t status;
Steven Cooremance48e852020-10-05 16:02:45 +02001597 psa_status_t expected_status = expected_status_arg;
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001598
1599 PSA_ASSERT( psa_crypto_init( ) );
1600
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02001601 psa_set_key_usage_flags( &attributes, policy_usage );
1602 psa_set_key_algorithm( &attributes, policy_alg );
1603 psa_set_key_type( &attributes, key_type );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001604
Gilles Peskine049c7532019-05-15 20:22:09 +02001605 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001606 &key ) );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001607
Gilles Peskinec18e25f2021-02-12 23:48:20 +01001608 status = mbedtls_test_psa_raw_key_agreement_with_self( exercise_alg, key );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001609
Steven Cooremance48e852020-10-05 16:02:45 +02001610 TEST_EQUAL( status, expected_status );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001611
1612exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02001613 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02001614 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001615 PSA_DONE( );
Gilles Peskine04ee2d22019-04-11 21:25:46 +02001616}
1617/* END_CASE */
1618
1619/* BEGIN_CASE */
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001620void copy_success( int source_usage_arg,
1621 int source_alg_arg, int source_alg2_arg,
Archana8a180362021-07-05 02:18:48 +05301622 unsigned int source_lifetime_arg,
Gilles Peskine4a644642019-05-03 17:14:08 +02001623 int type_arg, data_t *material,
1624 int copy_attributes,
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001625 int target_usage_arg,
1626 int target_alg_arg, int target_alg2_arg,
Archana8a180362021-07-05 02:18:48 +05301627 unsigned int target_lifetime_arg,
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001628 int expected_usage_arg,
1629 int expected_alg_arg, int expected_alg2_arg )
Gilles Peskine57ab7212019-01-28 13:03:09 +01001630{
Gilles Peskineca25db92019-04-19 11:43:08 +02001631 psa_key_attributes_t source_attributes = PSA_KEY_ATTRIBUTES_INIT;
1632 psa_key_attributes_t target_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine57ab7212019-01-28 13:03:09 +01001633 psa_key_usage_t expected_usage = expected_usage_arg;
1634 psa_algorithm_t expected_alg = expected_alg_arg;
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001635 psa_algorithm_t expected_alg2 = expected_alg2_arg;
Archana8a180362021-07-05 02:18:48 +05301636 psa_key_lifetime_t source_lifetime = source_lifetime_arg;
1637 psa_key_lifetime_t target_lifetime = target_lifetime_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02001638 mbedtls_svc_key_id_t source_key = MBEDTLS_SVC_KEY_ID_INIT;
1639 mbedtls_svc_key_id_t target_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine57ab7212019-01-28 13:03:09 +01001640 uint8_t *export_buffer = NULL;
1641
Gilles Peskine57ab7212019-01-28 13:03:09 +01001642 PSA_ASSERT( psa_crypto_init( ) );
1643
Gilles Peskineca25db92019-04-19 11:43:08 +02001644 /* Prepare the source key. */
1645 psa_set_key_usage_flags( &source_attributes, source_usage_arg );
1646 psa_set_key_algorithm( &source_attributes, source_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001647 psa_set_key_enrollment_algorithm( &source_attributes, source_alg2_arg );
Gilles Peskineca25db92019-04-19 11:43:08 +02001648 psa_set_key_type( &source_attributes, type_arg );
Archana8a180362021-07-05 02:18:48 +05301649 psa_set_key_lifetime( &source_attributes, source_lifetime);
Gilles Peskine049c7532019-05-15 20:22:09 +02001650 PSA_ASSERT( psa_import_key( &source_attributes,
1651 material->x, material->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001652 &source_key ) );
1653 PSA_ASSERT( psa_get_key_attributes( source_key, &source_attributes ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001654
Gilles Peskineca25db92019-04-19 11:43:08 +02001655 /* Prepare the target attributes. */
1656 if( copy_attributes )
Ronald Cron65f38a32020-10-23 17:11:13 +02001657 {
Gilles Peskineca25db92019-04-19 11:43:08 +02001658 target_attributes = source_attributes;
Ronald Cron65f38a32020-10-23 17:11:13 +02001659 }
Archana8a180362021-07-05 02:18:48 +05301660 psa_set_key_lifetime( &target_attributes, target_lifetime);
Ronald Cron65f38a32020-10-23 17:11:13 +02001661
Gilles Peskineca25db92019-04-19 11:43:08 +02001662 if( target_usage_arg != -1 )
1663 psa_set_key_usage_flags( &target_attributes, target_usage_arg );
1664 if( target_alg_arg != -1 )
1665 psa_set_key_algorithm( &target_attributes, target_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001666 if( target_alg2_arg != -1 )
1667 psa_set_key_enrollment_algorithm( &target_attributes, target_alg2_arg );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001668
Archana8a180362021-07-05 02:18:48 +05301669
Gilles Peskine57ab7212019-01-28 13:03:09 +01001670 /* Copy the key. */
Ronald Cron5425a212020-08-04 14:58:35 +02001671 PSA_ASSERT( psa_copy_key( source_key,
1672 &target_attributes, &target_key ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001673
1674 /* Destroy the source to ensure that this doesn't affect the target. */
Ronald Cron5425a212020-08-04 14:58:35 +02001675 PSA_ASSERT( psa_destroy_key( source_key ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001676
1677 /* Test that the target slot has the expected content and policy. */
Ronald Cron5425a212020-08-04 14:58:35 +02001678 PSA_ASSERT( psa_get_key_attributes( target_key, &target_attributes ) );
Gilles Peskineca25db92019-04-19 11:43:08 +02001679 TEST_EQUAL( psa_get_key_type( &source_attributes ),
1680 psa_get_key_type( &target_attributes ) );
1681 TEST_EQUAL( psa_get_key_bits( &source_attributes ),
1682 psa_get_key_bits( &target_attributes ) );
1683 TEST_EQUAL( expected_usage, psa_get_key_usage_flags( &target_attributes ) );
1684 TEST_EQUAL( expected_alg, psa_get_key_algorithm( &target_attributes ) );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001685 TEST_EQUAL( expected_alg2,
1686 psa_get_key_enrollment_algorithm( &target_attributes ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001687 if( expected_usage & PSA_KEY_USAGE_EXPORT )
1688 {
1689 size_t length;
1690 ASSERT_ALLOC( export_buffer, material->len );
Ronald Cron5425a212020-08-04 14:58:35 +02001691 PSA_ASSERT( psa_export_key( target_key, export_buffer,
Gilles Peskine57ab7212019-01-28 13:03:09 +01001692 material->len, &length ) );
1693 ASSERT_COMPARE( material->x, material->len,
1694 export_buffer, length );
1695 }
Steven Cooremanb3ce8152021-02-18 12:03:50 +01001696
Archana8a180362021-07-05 02:18:48 +05301697 if( !psa_key_lifetime_is_external( target_lifetime ) )
1698 {
1699 if( ! mbedtls_test_psa_exercise_key( target_key, expected_usage, expected_alg ) )
1700 goto exit;
1701 if( ! mbedtls_test_psa_exercise_key( target_key, expected_usage, expected_alg2 ) )
1702 goto exit;
1703 }
Gilles Peskine57ab7212019-01-28 13:03:09 +01001704
Ronald Cron5425a212020-08-04 14:58:35 +02001705 PSA_ASSERT( psa_destroy_key( target_key ) );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001706
1707exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001708 /*
1709 * Source and target key attributes may have been returned by
1710 * psa_get_key_attributes() thus reset them as required.
1711 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02001712 psa_reset_key_attributes( &source_attributes );
1713 psa_reset_key_attributes( &target_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001714
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001715 PSA_DONE( );
Gilles Peskine57ab7212019-01-28 13:03:09 +01001716 mbedtls_free( export_buffer );
1717}
1718/* END_CASE */
1719
1720/* BEGIN_CASE */
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001721void copy_fail( int source_usage_arg,
1722 int source_alg_arg, int source_alg2_arg,
Archana8a180362021-07-05 02:18:48 +05301723 int source_lifetime_arg,
Gilles Peskine4a644642019-05-03 17:14:08 +02001724 int type_arg, data_t *material,
1725 int target_type_arg, int target_bits_arg,
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001726 int target_usage_arg,
1727 int target_alg_arg, int target_alg2_arg,
Ronald Cron88a55462021-03-31 09:39:07 +02001728 int target_id_arg, int target_lifetime_arg,
Gilles Peskine4a644642019-05-03 17:14:08 +02001729 int expected_status_arg )
1730{
1731 psa_key_attributes_t source_attributes = PSA_KEY_ATTRIBUTES_INIT;
1732 psa_key_attributes_t target_attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +02001733 mbedtls_svc_key_id_t source_key = MBEDTLS_SVC_KEY_ID_INIT;
1734 mbedtls_svc_key_id_t target_key = MBEDTLS_SVC_KEY_ID_INIT;
Ronald Cron88a55462021-03-31 09:39:07 +02001735 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, target_id_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001736
1737 PSA_ASSERT( psa_crypto_init( ) );
1738
1739 /* Prepare the source key. */
1740 psa_set_key_usage_flags( &source_attributes, source_usage_arg );
1741 psa_set_key_algorithm( &source_attributes, source_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001742 psa_set_key_enrollment_algorithm( &source_attributes, source_alg2_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001743 psa_set_key_type( &source_attributes, type_arg );
Archana8a180362021-07-05 02:18:48 +05301744 psa_set_key_lifetime( &source_attributes, source_lifetime_arg );
Gilles Peskine049c7532019-05-15 20:22:09 +02001745 PSA_ASSERT( psa_import_key( &source_attributes,
1746 material->x, material->len,
Ronald Cron5425a212020-08-04 14:58:35 +02001747 &source_key ) );
Gilles Peskine4a644642019-05-03 17:14:08 +02001748
1749 /* Prepare the target attributes. */
Ronald Cron88a55462021-03-31 09:39:07 +02001750 psa_set_key_id( &target_attributes, key_id );
1751 psa_set_key_lifetime( &target_attributes, target_lifetime_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001752 psa_set_key_type( &target_attributes, target_type_arg );
1753 psa_set_key_bits( &target_attributes, target_bits_arg );
1754 psa_set_key_usage_flags( &target_attributes, target_usage_arg );
1755 psa_set_key_algorithm( &target_attributes, target_alg_arg );
Gilles Peskinebcdd44b2019-05-20 17:28:11 +02001756 psa_set_key_enrollment_algorithm( &target_attributes, target_alg2_arg );
Gilles Peskine4a644642019-05-03 17:14:08 +02001757
1758 /* Try to copy the key. */
Ronald Cron5425a212020-08-04 14:58:35 +02001759 TEST_EQUAL( psa_copy_key( source_key,
1760 &target_attributes, &target_key ),
Gilles Peskine4a644642019-05-03 17:14:08 +02001761 expected_status_arg );
Gilles Peskine76b29a72019-05-28 14:08:50 +02001762
Ronald Cron5425a212020-08-04 14:58:35 +02001763 PSA_ASSERT( psa_destroy_key( source_key ) );
Gilles Peskine76b29a72019-05-28 14:08:50 +02001764
Gilles Peskine4a644642019-05-03 17:14:08 +02001765exit:
1766 psa_reset_key_attributes( &source_attributes );
1767 psa_reset_key_attributes( &target_attributes );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001768 PSA_DONE( );
Gilles Peskine4a644642019-05-03 17:14:08 +02001769}
1770/* END_CASE */
1771
1772/* BEGIN_CASE */
Jaeden Amero6a25b412019-01-04 11:47:44 +00001773void hash_operation_init( )
1774{
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001775 const uint8_t input[1] = { 0 };
Jaeden Amero6a25b412019-01-04 11:47:44 +00001776 /* Test each valid way of initializing the object, except for `= {0}`, as
1777 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
1778 * though it's OK by the C standard. We could test for this, but we'd need
1779 * to supress the Clang warning for the test. */
1780 psa_hash_operation_t func = psa_hash_operation_init( );
1781 psa_hash_operation_t init = PSA_HASH_OPERATION_INIT;
1782 psa_hash_operation_t zero;
1783
1784 memset( &zero, 0, sizeof( zero ) );
1785
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00001786 /* A freshly-initialized hash operation should not be usable. */
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00001787 TEST_EQUAL( psa_hash_update( &func, input, sizeof( input ) ),
1788 PSA_ERROR_BAD_STATE );
1789 TEST_EQUAL( psa_hash_update( &init, input, sizeof( input ) ),
1790 PSA_ERROR_BAD_STATE );
1791 TEST_EQUAL( psa_hash_update( &zero, input, sizeof( input ) ),
1792 PSA_ERROR_BAD_STATE );
1793
Jaeden Amero5229bbb2019-02-07 16:33:37 +00001794 /* A default hash operation should be abortable without error. */
1795 PSA_ASSERT( psa_hash_abort( &func ) );
1796 PSA_ASSERT( psa_hash_abort( &init ) );
1797 PSA_ASSERT( psa_hash_abort( &zero ) );
Jaeden Amero6a25b412019-01-04 11:47:44 +00001798}
1799/* END_CASE */
1800
1801/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001802void hash_setup( int alg_arg,
1803 int expected_status_arg )
1804{
1805 psa_algorithm_t alg = alg_arg;
Neil Armstrongedb20862022-02-07 15:47:44 +01001806 uint8_t *output = NULL;
1807 size_t output_size = 0;
1808 size_t output_length = 0;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02001809 psa_status_t expected_status = expected_status_arg;
Jaeden Amero6a25b412019-01-04 11:47:44 +00001810 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001811 psa_status_t status;
1812
Gilles Peskine8817f612018-12-18 00:18:46 +01001813 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001814
Neil Armstrongedb20862022-02-07 15:47:44 +01001815 /* Hash Setup, one-shot */
1816 output_size = PSA_HASH_LENGTH(alg);
1817 ASSERT_ALLOC( output, output_size );
1818
1819 status = psa_hash_compute( alg, NULL, 0,
1820 output, output_size, &output_length );
1821 TEST_EQUAL( status, expected_status );
1822
1823 /* Hash Setup, multi-part */
Gilles Peskineda8191d1c2018-07-08 19:46:38 +02001824 status = psa_hash_setup( &operation, alg );
Gilles Peskinefe11b722018-12-18 00:24:04 +01001825 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001826
Gilles Peskine9e0a4a52019-02-25 22:11:18 +01001827 /* Whether setup succeeded or failed, abort must succeed. */
1828 PSA_ASSERT( psa_hash_abort( &operation ) );
1829
1830 /* If setup failed, reproduce the failure, so as to
1831 * test the resulting state of the operation object. */
1832 if( status != PSA_SUCCESS )
1833 TEST_EQUAL( psa_hash_setup( &operation, alg ), status );
1834
Gilles Peskinef426e0f2019-02-25 17:42:03 +01001835 /* Now the operation object should be reusable. */
1836#if defined(KNOWN_SUPPORTED_HASH_ALG)
1837 PSA_ASSERT( psa_hash_setup( &operation, KNOWN_SUPPORTED_HASH_ALG ) );
1838 PSA_ASSERT( psa_hash_abort( &operation ) );
1839#endif
1840
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001841exit:
Neil Armstrongedb20862022-02-07 15:47:44 +01001842 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02001843 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02001844}
1845/* END_CASE */
1846
1847/* BEGIN_CASE */
Gilles Peskine0a749c82019-11-28 19:33:58 +01001848void hash_compute_fail( int alg_arg, data_t *input,
1849 int output_size_arg, int expected_status_arg )
1850{
1851 psa_algorithm_t alg = alg_arg;
1852 uint8_t *output = NULL;
1853 size_t output_size = output_size_arg;
1854 size_t output_length = INVALID_EXPORT_LENGTH;
Neil Armstrong161ec5c2022-02-07 11:18:45 +01001855 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
Gilles Peskine0a749c82019-11-28 19:33:58 +01001856 psa_status_t expected_status = expected_status_arg;
1857 psa_status_t status;
1858
1859 ASSERT_ALLOC( output, output_size );
1860
1861 PSA_ASSERT( psa_crypto_init( ) );
1862
Neil Armstrong161ec5c2022-02-07 11:18:45 +01001863 /* Hash Compute, one-shot */
Gilles Peskine0a749c82019-11-28 19:33:58 +01001864 status = psa_hash_compute( alg, input->x, input->len,
1865 output, output_size, &output_length );
1866 TEST_EQUAL( status, expected_status );
1867 TEST_ASSERT( output_length <= output_size );
1868
Neil Armstrong161ec5c2022-02-07 11:18:45 +01001869 /* Hash Compute, multi-part */
1870 status = psa_hash_setup( &operation, alg );
1871 if( status == PSA_SUCCESS )
1872 {
1873 status = psa_hash_update( &operation, input->x, input->len );
1874 if( status == PSA_SUCCESS )
1875 {
1876 status = psa_hash_finish( &operation, output, output_size,
1877 &output_length );
1878 if( status == PSA_SUCCESS )
1879 TEST_ASSERT( output_length <= output_size );
1880 else
1881 TEST_EQUAL( status, expected_status );
1882 }
1883 else
1884 {
1885 TEST_EQUAL( status, expected_status );
1886 }
1887 }
1888 else
1889 {
1890 TEST_EQUAL( status, expected_status );
1891 }
1892
Gilles Peskine0a749c82019-11-28 19:33:58 +01001893exit:
Neil Armstrong161ec5c2022-02-07 11:18:45 +01001894 PSA_ASSERT( psa_hash_abort( &operation ) );
Gilles Peskine0a749c82019-11-28 19:33:58 +01001895 mbedtls_free( output );
1896 PSA_DONE( );
1897}
1898/* END_CASE */
1899
1900/* BEGIN_CASE */
Gilles Peskine88e08462020-01-28 20:43:00 +01001901void hash_compare_fail( int alg_arg, data_t *input,
1902 data_t *reference_hash,
1903 int expected_status_arg )
1904{
1905 psa_algorithm_t alg = alg_arg;
1906 psa_status_t expected_status = expected_status_arg;
Neil Armstrong55a1be12022-02-07 11:23:20 +01001907 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
Gilles Peskine88e08462020-01-28 20:43:00 +01001908 psa_status_t status;
1909
1910 PSA_ASSERT( psa_crypto_init( ) );
1911
Neil Armstrong55a1be12022-02-07 11:23:20 +01001912 /* Hash Compare, one-shot */
Gilles Peskine88e08462020-01-28 20:43:00 +01001913 status = psa_hash_compare( alg, input->x, input->len,
1914 reference_hash->x, reference_hash->len );
1915 TEST_EQUAL( status, expected_status );
1916
Neil Armstrong55a1be12022-02-07 11:23:20 +01001917 /* Hash Compare, multi-part */
1918 status = psa_hash_setup( &operation, alg );
1919 if( status == PSA_SUCCESS )
1920 {
1921 status = psa_hash_update( &operation, input->x, input->len );
1922 if( status == PSA_SUCCESS )
1923 {
1924 status = psa_hash_verify( &operation, reference_hash->x,
1925 reference_hash->len );
1926 TEST_EQUAL( status, expected_status );
1927 }
1928 else
1929 {
1930 TEST_EQUAL( status, expected_status );
1931 }
1932 }
1933 else
1934 {
1935 TEST_EQUAL( status, expected_status );
1936 }
1937
Gilles Peskine88e08462020-01-28 20:43:00 +01001938exit:
Neil Armstrong55a1be12022-02-07 11:23:20 +01001939 PSA_ASSERT( psa_hash_abort( &operation ) );
Gilles Peskine88e08462020-01-28 20:43:00 +01001940 PSA_DONE( );
1941}
1942/* END_CASE */
1943
1944/* BEGIN_CASE */
Gilles Peskine0a749c82019-11-28 19:33:58 +01001945void hash_compute_compare( int alg_arg, data_t *input,
1946 data_t *expected_output )
1947{
1948 psa_algorithm_t alg = alg_arg;
1949 uint8_t output[PSA_HASH_MAX_SIZE + 1];
1950 size_t output_length = INVALID_EXPORT_LENGTH;
1951 size_t i;
1952
1953 PSA_ASSERT( psa_crypto_init( ) );
1954
1955 /* Compute with tight buffer */
1956 PSA_ASSERT( psa_hash_compute( alg, input->x, input->len,
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001957 output, PSA_HASH_LENGTH( alg ),
Gilles Peskine0a749c82019-11-28 19:33:58 +01001958 &output_length ) );
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001959 TEST_EQUAL( output_length, PSA_HASH_LENGTH( alg ) );
Gilles Peskine0a749c82019-11-28 19:33:58 +01001960 ASSERT_COMPARE( output, output_length,
1961 expected_output->x, expected_output->len );
1962
1963 /* Compute with larger buffer */
1964 PSA_ASSERT( psa_hash_compute( alg, input->x, input->len,
1965 output, sizeof( output ),
1966 &output_length ) );
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001967 TEST_EQUAL( output_length, PSA_HASH_LENGTH( alg ) );
Gilles Peskine0a749c82019-11-28 19:33:58 +01001968 ASSERT_COMPARE( output, output_length,
1969 expected_output->x, expected_output->len );
1970
1971 /* Compare with correct hash */
1972 PSA_ASSERT( psa_hash_compare( alg, input->x, input->len,
1973 output, output_length ) );
1974
1975 /* Compare with trailing garbage */
1976 TEST_EQUAL( psa_hash_compare( alg, input->x, input->len,
1977 output, output_length + 1 ),
1978 PSA_ERROR_INVALID_SIGNATURE );
1979
1980 /* Compare with truncated hash */
1981 TEST_EQUAL( psa_hash_compare( alg, input->x, input->len,
1982 output, output_length - 1 ),
1983 PSA_ERROR_INVALID_SIGNATURE );
1984
1985 /* Compare with corrupted value */
1986 for( i = 0; i < output_length; i++ )
1987 {
Chris Jones9634bb12021-01-20 15:56:42 +00001988 mbedtls_test_set_step( i );
Gilles Peskine0a749c82019-11-28 19:33:58 +01001989 output[i] ^= 1;
1990 TEST_EQUAL( psa_hash_compare( alg, input->x, input->len,
1991 output, output_length ),
1992 PSA_ERROR_INVALID_SIGNATURE );
1993 output[i] ^= 1;
1994 }
1995
1996exit:
1997 PSA_DONE( );
1998}
1999/* END_CASE */
2000
Gilles Peskined6dc40c2021-01-12 12:55:31 +01002001/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
itayzafrirf86548d2018-11-01 10:44:32 +02002002void hash_bad_order( )
2003{
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002004 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrirf86548d2018-11-01 10:44:32 +02002005 unsigned char input[] = "";
2006 /* SHA-256 hash of an empty string */
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002007 const unsigned char valid_hash[] = {
itayzafrirf86548d2018-11-01 10:44:32 +02002008 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
2009 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
2010 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55 };
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002011 unsigned char hash[sizeof(valid_hash)] = { 0 };
itayzafrirf86548d2018-11-01 10:44:32 +02002012 size_t hash_len;
Jaeden Amero6a25b412019-01-04 11:47:44 +00002013 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirf86548d2018-11-01 10:44:32 +02002014
Gilles Peskine8817f612018-12-18 00:18:46 +01002015 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirf86548d2018-11-01 10:44:32 +02002016
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002017 /* Call setup twice in a row. */
2018 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002019 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002020 TEST_EQUAL( psa_hash_setup( &operation, alg ),
2021 PSA_ERROR_BAD_STATE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002022 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002023 PSA_ASSERT( psa_hash_abort( &operation ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002024 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002025
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002026 /* Call update without calling setup beforehand. */
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002027 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00002028 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002029 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02002030
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002031 /* Check that update calls abort on error. */
2032 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Dave Rodgman6f710582021-06-24 18:14:52 +01002033 operation.id = UINT_MAX;
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002034 ASSERT_OPERATION_IS_ACTIVE( operation );
2035 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
2036 PSA_ERROR_BAD_STATE );
2037 ASSERT_OPERATION_IS_INACTIVE( operation );
2038 PSA_ASSERT( psa_hash_abort( &operation ) );
2039 ASSERT_OPERATION_IS_INACTIVE( operation );
2040
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002041 /* Call update after finish. */
2042 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
2043 PSA_ASSERT( psa_hash_finish( &operation,
2044 hash, sizeof( hash ), &hash_len ) );
2045 TEST_EQUAL( psa_hash_update( &operation, input, sizeof( input ) ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00002046 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002047 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02002048
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002049 /* Call verify without calling setup beforehand. */
2050 TEST_EQUAL( psa_hash_verify( &operation,
2051 valid_hash, sizeof( valid_hash ) ),
2052 PSA_ERROR_BAD_STATE );
2053 PSA_ASSERT( psa_hash_abort( &operation ) );
2054
2055 /* Call verify after finish. */
2056 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
2057 PSA_ASSERT( psa_hash_finish( &operation,
2058 hash, sizeof( hash ), &hash_len ) );
2059 TEST_EQUAL( psa_hash_verify( &operation,
2060 valid_hash, sizeof( valid_hash ) ),
2061 PSA_ERROR_BAD_STATE );
2062 PSA_ASSERT( psa_hash_abort( &operation ) );
2063
2064 /* Call verify twice in a row. */
2065 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002066 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002067 PSA_ASSERT( psa_hash_verify( &operation,
2068 valid_hash, sizeof( valid_hash ) ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002069 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002070 TEST_EQUAL( psa_hash_verify( &operation,
2071 valid_hash, sizeof( valid_hash ) ),
2072 PSA_ERROR_BAD_STATE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002073 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002074 PSA_ASSERT( psa_hash_abort( &operation ) );
2075
2076 /* Call finish without calling setup beforehand. */
Gilles Peskinefe11b722018-12-18 00:24:04 +01002077 TEST_EQUAL( psa_hash_finish( &operation,
2078 hash, sizeof( hash ), &hash_len ),
Jaeden Ameroa0f625a2019-02-15 13:52:25 +00002079 PSA_ERROR_BAD_STATE );
Jaeden Amero11aa7ee2019-02-19 11:44:55 +00002080 PSA_ASSERT( psa_hash_abort( &operation ) );
2081
2082 /* Call finish twice in a row. */
2083 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
2084 PSA_ASSERT( psa_hash_finish( &operation,
2085 hash, sizeof( hash ), &hash_len ) );
2086 TEST_EQUAL( psa_hash_finish( &operation,
2087 hash, sizeof( hash ), &hash_len ),
2088 PSA_ERROR_BAD_STATE );
2089 PSA_ASSERT( psa_hash_abort( &operation ) );
2090
2091 /* Call finish after calling verify. */
2092 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
2093 PSA_ASSERT( psa_hash_verify( &operation,
2094 valid_hash, sizeof( valid_hash ) ) );
2095 TEST_EQUAL( psa_hash_finish( &operation,
2096 hash, sizeof( hash ), &hash_len ),
2097 PSA_ERROR_BAD_STATE );
2098 PSA_ASSERT( psa_hash_abort( &operation ) );
itayzafrirf86548d2018-11-01 10:44:32 +02002099
2100exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002101 PSA_DONE( );
itayzafrirf86548d2018-11-01 10:44:32 +02002102}
2103/* END_CASE */
2104
Gilles Peskined6dc40c2021-01-12 12:55:31 +01002105/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
itayzafrir27e69452018-11-01 14:26:34 +02002106void hash_verify_bad_args( )
itayzafrirec93d302018-10-18 18:01:10 +03002107{
2108 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrir27e69452018-11-01 14:26:34 +02002109 /* SHA-256 hash of an empty string with 2 extra bytes (0xaa and 0xbb)
2110 * appended to it */
2111 unsigned char hash[] = {
2112 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
2113 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
2114 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55, 0xaa, 0xbb };
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002115 size_t expected_size = PSA_HASH_LENGTH( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00002116 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrirec93d302018-10-18 18:01:10 +03002117
Gilles Peskine8817f612018-12-18 00:18:46 +01002118 PSA_ASSERT( psa_crypto_init( ) );
itayzafrirec93d302018-10-18 18:01:10 +03002119
itayzafrir27e69452018-11-01 14:26:34 +02002120 /* psa_hash_verify with a smaller hash than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002121 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002122 ASSERT_OPERATION_IS_ACTIVE( operation );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002123 TEST_EQUAL( psa_hash_verify( &operation, hash, expected_size - 1 ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002124 PSA_ERROR_INVALID_SIGNATURE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002125 ASSERT_OPERATION_IS_INACTIVE( operation );
2126 PSA_ASSERT( psa_hash_abort( &operation ) );
2127 ASSERT_OPERATION_IS_INACTIVE( operation );
itayzafrirec93d302018-10-18 18:01:10 +03002128
itayzafrir27e69452018-11-01 14:26:34 +02002129 /* psa_hash_verify with a non-matching hash */
Gilles Peskine8817f612018-12-18 00:18:46 +01002130 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002131 TEST_EQUAL( psa_hash_verify( &operation, hash + 1, expected_size ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002132 PSA_ERROR_INVALID_SIGNATURE );
itayzafrirec93d302018-10-18 18:01:10 +03002133
itayzafrir27e69452018-11-01 14:26:34 +02002134 /* psa_hash_verify with a hash longer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002135 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002136 TEST_EQUAL( psa_hash_verify( &operation, hash, sizeof( hash ) ),
Gilles Peskinefe11b722018-12-18 00:24:04 +01002137 PSA_ERROR_INVALID_SIGNATURE );
itayzafrir4271df92018-10-24 18:16:19 +03002138
itayzafrirec93d302018-10-18 18:01:10 +03002139exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002140 PSA_DONE( );
itayzafrirec93d302018-10-18 18:01:10 +03002141}
2142/* END_CASE */
2143
Ronald Cronee414c72021-03-18 18:50:08 +01002144/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
itayzafrirb2dd5ed2018-11-01 11:58:59 +02002145void hash_finish_bad_args( )
itayzafrir58028322018-10-25 10:22:01 +03002146{
2147 psa_algorithm_t alg = PSA_ALG_SHA_256;
itayzafrirb2dd5ed2018-11-01 11:58:59 +02002148 unsigned char hash[PSA_HASH_MAX_SIZE];
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002149 size_t expected_size = PSA_HASH_LENGTH( alg );
Jaeden Amero6a25b412019-01-04 11:47:44 +00002150 psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
itayzafrir58028322018-10-25 10:22:01 +03002151 size_t hash_len;
2152
Gilles Peskine8817f612018-12-18 00:18:46 +01002153 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir58028322018-10-25 10:22:01 +03002154
itayzafrir58028322018-10-25 10:22:01 +03002155 /* psa_hash_finish with a smaller hash buffer than expected */
Gilles Peskine8817f612018-12-18 00:18:46 +01002156 PSA_ASSERT( psa_hash_setup( &operation, alg ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01002157 TEST_EQUAL( psa_hash_finish( &operation,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01002158 hash, expected_size - 1, &hash_len ),
2159 PSA_ERROR_BUFFER_TOO_SMALL );
itayzafrir58028322018-10-25 10:22:01 +03002160
2161exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002162 PSA_DONE( );
itayzafrir58028322018-10-25 10:22:01 +03002163}
2164/* END_CASE */
2165
Ronald Cronee414c72021-03-18 18:50:08 +01002166/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01002167void hash_clone_source_state( )
2168{
2169 psa_algorithm_t alg = PSA_ALG_SHA_256;
2170 unsigned char hash[PSA_HASH_MAX_SIZE];
2171 psa_hash_operation_t op_source = PSA_HASH_OPERATION_INIT;
2172 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
2173 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
2174 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
2175 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
2176 size_t hash_len;
2177
2178 PSA_ASSERT( psa_crypto_init( ) );
2179 PSA_ASSERT( psa_hash_setup( &op_source, alg ) );
2180
2181 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
2182 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
2183 PSA_ASSERT( psa_hash_finish( &op_finished,
2184 hash, sizeof( hash ), &hash_len ) );
2185 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
2186 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
2187
2188 TEST_EQUAL( psa_hash_clone( &op_source, &op_setup ),
2189 PSA_ERROR_BAD_STATE );
2190
2191 PSA_ASSERT( psa_hash_clone( &op_source, &op_init ) );
2192 PSA_ASSERT( psa_hash_finish( &op_init,
2193 hash, sizeof( hash ), &hash_len ) );
2194 PSA_ASSERT( psa_hash_clone( &op_source, &op_finished ) );
2195 PSA_ASSERT( psa_hash_finish( &op_finished,
2196 hash, sizeof( hash ), &hash_len ) );
2197 PSA_ASSERT( psa_hash_clone( &op_source, &op_aborted ) );
2198 PSA_ASSERT( psa_hash_finish( &op_aborted,
2199 hash, sizeof( hash ), &hash_len ) );
2200
2201exit:
2202 psa_hash_abort( &op_source );
2203 psa_hash_abort( &op_init );
2204 psa_hash_abort( &op_setup );
2205 psa_hash_abort( &op_finished );
2206 psa_hash_abort( &op_aborted );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002207 PSA_DONE( );
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01002208}
2209/* END_CASE */
2210
Ronald Cronee414c72021-03-18 18:50:08 +01002211/* BEGIN_CASE depends_on:PSA_WANT_ALG_SHA_256 */
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01002212void hash_clone_target_state( )
2213{
2214 psa_algorithm_t alg = PSA_ALG_SHA_256;
2215 unsigned char hash[PSA_HASH_MAX_SIZE];
2216 psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
2217 psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
2218 psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
2219 psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
2220 psa_hash_operation_t op_target = PSA_HASH_OPERATION_INIT;
2221 size_t hash_len;
2222
2223 PSA_ASSERT( psa_crypto_init( ) );
2224
2225 PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
2226 PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
2227 PSA_ASSERT( psa_hash_finish( &op_finished,
2228 hash, sizeof( hash ), &hash_len ) );
2229 PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
2230 PSA_ASSERT( psa_hash_abort( &op_aborted ) );
2231
2232 PSA_ASSERT( psa_hash_clone( &op_setup, &op_target ) );
2233 PSA_ASSERT( psa_hash_finish( &op_target,
2234 hash, sizeof( hash ), &hash_len ) );
2235
2236 TEST_EQUAL( psa_hash_clone( &op_init, &op_target ), PSA_ERROR_BAD_STATE );
2237 TEST_EQUAL( psa_hash_clone( &op_finished, &op_target ),
2238 PSA_ERROR_BAD_STATE );
2239 TEST_EQUAL( psa_hash_clone( &op_aborted, &op_target ),
2240 PSA_ERROR_BAD_STATE );
2241
2242exit:
2243 psa_hash_abort( &op_target );
2244 psa_hash_abort( &op_init );
2245 psa_hash_abort( &op_setup );
2246 psa_hash_abort( &op_finished );
2247 psa_hash_abort( &op_aborted );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002248 PSA_DONE( );
Gilles Peskineebb2c3e2019-01-19 12:03:41 +01002249}
2250/* END_CASE */
2251
itayzafrir58028322018-10-25 10:22:01 +03002252/* BEGIN_CASE */
Jaeden Amero769ce272019-01-04 11:48:03 +00002253void mac_operation_init( )
2254{
Jaeden Amero252ef282019-02-15 14:05:35 +00002255 const uint8_t input[1] = { 0 };
2256
Jaeden Amero769ce272019-01-04 11:48:03 +00002257 /* Test each valid way of initializing the object, except for `= {0}`, as
2258 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
2259 * though it's OK by the C standard. We could test for this, but we'd need
2260 * to supress the Clang warning for the test. */
2261 psa_mac_operation_t func = psa_mac_operation_init( );
2262 psa_mac_operation_t init = PSA_MAC_OPERATION_INIT;
2263 psa_mac_operation_t zero;
2264
2265 memset( &zero, 0, sizeof( zero ) );
2266
Jaeden Amero252ef282019-02-15 14:05:35 +00002267 /* A freshly-initialized MAC operation should not be usable. */
2268 TEST_EQUAL( psa_mac_update( &func,
2269 input, sizeof( input ) ),
2270 PSA_ERROR_BAD_STATE );
2271 TEST_EQUAL( psa_mac_update( &init,
2272 input, sizeof( input ) ),
2273 PSA_ERROR_BAD_STATE );
2274 TEST_EQUAL( psa_mac_update( &zero,
2275 input, sizeof( input ) ),
2276 PSA_ERROR_BAD_STATE );
2277
Jaeden Amero5229bbb2019-02-07 16:33:37 +00002278 /* A default MAC operation should be abortable without error. */
2279 PSA_ASSERT( psa_mac_abort( &func ) );
2280 PSA_ASSERT( psa_mac_abort( &init ) );
2281 PSA_ASSERT( psa_mac_abort( &zero ) );
Jaeden Amero769ce272019-01-04 11:48:03 +00002282}
2283/* END_CASE */
2284
2285/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002286void mac_setup( int key_type_arg,
2287 data_t *key,
2288 int alg_arg,
2289 int expected_status_arg )
2290{
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002291 psa_key_type_t key_type = key_type_arg;
2292 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002293 psa_status_t expected_status = expected_status_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002294 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002295 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2296#if defined(KNOWN_SUPPORTED_MAC_ALG)
2297 const uint8_t smoke_test_key_data[16] = "kkkkkkkkkkkkkkkk";
2298#endif
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002299
Gilles Peskine8817f612018-12-18 00:18:46 +01002300 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002301
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002302 if( ! exercise_mac_setup( key_type, key->x, key->len, alg,
2303 &operation, &status ) )
2304 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002305 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002306
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002307 /* The operation object should be reusable. */
2308#if defined(KNOWN_SUPPORTED_MAC_ALG)
2309 if( ! exercise_mac_setup( KNOWN_SUPPORTED_MAC_KEY_TYPE,
2310 smoke_test_key_data,
2311 sizeof( smoke_test_key_data ),
2312 KNOWN_SUPPORTED_MAC_ALG,
2313 &operation, &status ) )
2314 goto exit;
2315 TEST_EQUAL( status, PSA_SUCCESS );
2316#endif
2317
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002318exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002319 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002320}
2321/* END_CASE */
2322
Gilles Peskined6dc40c2021-01-12 12:55:31 +01002323/* 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 +00002324void mac_bad_order( )
2325{
Ronald Cron5425a212020-08-04 14:58:35 +02002326 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Jaeden Amero252ef282019-02-15 14:05:35 +00002327 psa_key_type_t key_type = PSA_KEY_TYPE_HMAC;
2328 psa_algorithm_t alg = PSA_ALG_HMAC(PSA_ALG_SHA_256);
Ronald Cron5425a212020-08-04 14:58:35 +02002329 const uint8_t key_data[] = {
Jaeden Amero252ef282019-02-15 14:05:35 +00002330 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2331 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2332 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002333 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Amero252ef282019-02-15 14:05:35 +00002334 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
2335 uint8_t sign_mac[PSA_MAC_MAX_SIZE + 10] = { 0 };
2336 size_t sign_mac_length = 0;
2337 const uint8_t input[] = { 0xbb, 0xbb, 0xbb, 0xbb };
2338 const uint8_t verify_mac[] = {
2339 0x74, 0x65, 0x93, 0x8c, 0xeb, 0x1d, 0xb3, 0x76, 0x5a, 0x38, 0xe7, 0xdd,
2340 0x85, 0xc5, 0xad, 0x4f, 0x07, 0xe7, 0xd5, 0xb2, 0x64, 0xf0, 0x1a, 0x1a,
2341 0x2c, 0xf9, 0x18, 0xca, 0x59, 0x7e, 0x5d, 0xf6 };
2342
2343 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01002344 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002345 psa_set_key_algorithm( &attributes, alg );
2346 psa_set_key_type( &attributes, key_type );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002347
Ronald Cron5425a212020-08-04 14:58:35 +02002348 PSA_ASSERT( psa_import_key( &attributes, key_data, sizeof( key_data ),
2349 &key ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002350
Jaeden Amero252ef282019-02-15 14:05:35 +00002351 /* Call update without calling setup beforehand. */
2352 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2353 PSA_ERROR_BAD_STATE );
2354 PSA_ASSERT( psa_mac_abort( &operation ) );
2355
2356 /* Call sign finish without calling setup beforehand. */
2357 TEST_EQUAL( psa_mac_sign_finish( &operation, sign_mac, sizeof( sign_mac ),
2358 &sign_mac_length),
2359 PSA_ERROR_BAD_STATE );
2360 PSA_ASSERT( psa_mac_abort( &operation ) );
2361
2362 /* Call verify finish without calling setup beforehand. */
2363 TEST_EQUAL( psa_mac_verify_finish( &operation,
2364 verify_mac, sizeof( verify_mac ) ),
2365 PSA_ERROR_BAD_STATE );
2366 PSA_ASSERT( psa_mac_abort( &operation ) );
2367
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002368 /* Call setup twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002369 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002370 ASSERT_OPERATION_IS_ACTIVE( operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002371 TEST_EQUAL( psa_mac_sign_setup( &operation, key, alg ),
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002372 PSA_ERROR_BAD_STATE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002373 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002374 PSA_ASSERT( psa_mac_abort( &operation ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002375 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002376
Jaeden Amero252ef282019-02-15 14:05:35 +00002377 /* Call update after sign finish. */
Ronald Cron5425a212020-08-04 14:58:35 +02002378 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00002379 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2380 PSA_ASSERT( psa_mac_sign_finish( &operation,
2381 sign_mac, sizeof( sign_mac ),
2382 &sign_mac_length ) );
2383 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2384 PSA_ERROR_BAD_STATE );
2385 PSA_ASSERT( psa_mac_abort( &operation ) );
2386
2387 /* Call update after verify finish. */
Ronald Cron5425a212020-08-04 14:58:35 +02002388 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00002389 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2390 PSA_ASSERT( psa_mac_verify_finish( &operation,
2391 verify_mac, sizeof( verify_mac ) ) );
2392 TEST_EQUAL( psa_mac_update( &operation, input, sizeof( input ) ),
2393 PSA_ERROR_BAD_STATE );
2394 PSA_ASSERT( psa_mac_abort( &operation ) );
2395
2396 /* Call sign finish twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002397 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00002398 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2399 PSA_ASSERT( psa_mac_sign_finish( &operation,
2400 sign_mac, sizeof( sign_mac ),
2401 &sign_mac_length ) );
2402 TEST_EQUAL( psa_mac_sign_finish( &operation,
2403 sign_mac, sizeof( sign_mac ),
2404 &sign_mac_length ),
2405 PSA_ERROR_BAD_STATE );
2406 PSA_ASSERT( psa_mac_abort( &operation ) );
2407
2408 /* Call verify finish twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002409 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00002410 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
2411 PSA_ASSERT( psa_mac_verify_finish( &operation,
2412 verify_mac, sizeof( verify_mac ) ) );
2413 TEST_EQUAL( psa_mac_verify_finish( &operation,
2414 verify_mac, sizeof( verify_mac ) ),
2415 PSA_ERROR_BAD_STATE );
2416 PSA_ASSERT( psa_mac_abort( &operation ) );
2417
2418 /* Setup sign but try verify. */
Ronald Cron5425a212020-08-04 14:58:35 +02002419 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00002420 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002421 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Amero252ef282019-02-15 14:05:35 +00002422 TEST_EQUAL( psa_mac_verify_finish( &operation,
2423 verify_mac, sizeof( verify_mac ) ),
2424 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01002425 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero252ef282019-02-15 14:05:35 +00002426 PSA_ASSERT( psa_mac_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002427 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero252ef282019-02-15 14:05:35 +00002428
2429 /* Setup verify but try sign. */
Ronald Cron5425a212020-08-04 14:58:35 +02002430 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Jaeden Amero252ef282019-02-15 14:05:35 +00002431 PSA_ASSERT( psa_mac_update( &operation, input, sizeof( input ) ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002432 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Amero252ef282019-02-15 14:05:35 +00002433 TEST_EQUAL( psa_mac_sign_finish( &operation,
2434 sign_mac, sizeof( sign_mac ),
2435 &sign_mac_length ),
2436 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01002437 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero252ef282019-02-15 14:05:35 +00002438 PSA_ASSERT( psa_mac_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002439 ASSERT_OPERATION_IS_INACTIVE( operation );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002440
Ronald Cron5425a212020-08-04 14:58:35 +02002441 PSA_ASSERT( psa_destroy_key( key ) );
Gilles Peskine76b29a72019-05-28 14:08:50 +02002442
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002443exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002444 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002445}
2446/* END_CASE */
2447
2448/* BEGIN_CASE */
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002449void mac_sign( int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002450 data_t *key_data,
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002451 int alg_arg,
2452 data_t *input,
2453 data_t *expected_mac )
2454{
Ronald Cron5425a212020-08-04 14:58:35 +02002455 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002456 psa_key_type_t key_type = key_type_arg;
2457 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002458 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002459 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine5e65cec2020-08-25 23:38:39 +02002460 uint8_t *actual_mac = NULL;
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002461 size_t mac_buffer_size =
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002462 PSA_MAC_LENGTH( key_type, PSA_BYTES_TO_BITS( key_data->len ), alg );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002463 size_t mac_length = 0;
Gilles Peskine8b356b52020-08-25 23:44:59 +02002464 const size_t output_sizes_to_test[] = {
2465 0,
2466 1,
2467 expected_mac->len - 1,
2468 expected_mac->len,
2469 expected_mac->len + 1,
2470 };
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002471
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002472 TEST_ASSERT( mac_buffer_size <= PSA_MAC_MAX_SIZE );
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002473 /* We expect PSA_MAC_LENGTH to be exact. */
Gilles Peskine3d404d62020-08-25 23:47:36 +02002474 TEST_ASSERT( expected_mac->len == mac_buffer_size );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002475
Gilles Peskine8817f612018-12-18 00:18:46 +01002476 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002477
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01002478 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002479 psa_set_key_algorithm( &attributes, alg );
2480 psa_set_key_type( &attributes, key_type );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002481
Ronald Cron5425a212020-08-04 14:58:35 +02002482 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2483 &key ) );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002484
Gilles Peskine8b356b52020-08-25 23:44:59 +02002485 for( size_t i = 0; i < ARRAY_LENGTH( output_sizes_to_test ); i++ )
2486 {
2487 const size_t output_size = output_sizes_to_test[i];
2488 psa_status_t expected_status =
2489 ( output_size >= expected_mac->len ? PSA_SUCCESS :
2490 PSA_ERROR_BUFFER_TOO_SMALL );
Gilles Peskine5e65cec2020-08-25 23:38:39 +02002491
Chris Jones9634bb12021-01-20 15:56:42 +00002492 mbedtls_test_set_step( output_size );
Gilles Peskine8b356b52020-08-25 23:44:59 +02002493 ASSERT_ALLOC( actual_mac, output_size );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002494
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002495 /* Calculate the MAC, one-shot case. */
2496 TEST_EQUAL( psa_mac_compute( key, alg,
2497 input->x, input->len,
2498 actual_mac, output_size, &mac_length ),
2499 expected_status );
2500 if( expected_status == PSA_SUCCESS )
2501 {
2502 ASSERT_COMPARE( expected_mac->x, expected_mac->len,
2503 actual_mac, mac_length );
2504 }
2505
2506 if( output_size > 0 )
2507 memset( actual_mac, 0, output_size );
2508
2509 /* Calculate the MAC, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002510 PSA_ASSERT( psa_mac_sign_setup( &operation, key, alg ) );
Gilles Peskine8b356b52020-08-25 23:44:59 +02002511 PSA_ASSERT( psa_mac_update( &operation,
2512 input->x, input->len ) );
2513 TEST_EQUAL( psa_mac_sign_finish( &operation,
2514 actual_mac, output_size,
2515 &mac_length ),
2516 expected_status );
2517 PSA_ASSERT( psa_mac_abort( &operation ) );
2518
2519 if( expected_status == PSA_SUCCESS )
2520 {
2521 ASSERT_COMPARE( expected_mac->x, expected_mac->len,
2522 actual_mac, mac_length );
2523 }
2524 mbedtls_free( actual_mac );
2525 actual_mac = NULL;
2526 }
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002527
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002528exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002529 psa_mac_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002530 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002531 PSA_DONE( );
Gilles Peskine5e65cec2020-08-25 23:38:39 +02002532 mbedtls_free( actual_mac );
Gilles Peskinea7aa4422018-08-14 15:17:54 +02002533}
2534/* END_CASE */
2535
2536/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002537void mac_verify( int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02002538 data_t *key_data,
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002539 int alg_arg,
2540 data_t *input,
2541 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +01002542{
Ronald Cron5425a212020-08-04 14:58:35 +02002543 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002544 psa_key_type_t key_type = key_type_arg;
2545 psa_algorithm_t alg = alg_arg;
Jaeden Amero769ce272019-01-04 11:48:03 +00002546 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002547 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002548 uint8_t *perturbed_mac = NULL;
Gilles Peskine8c9def32018-02-08 10:02:12 +01002549
Gilles Peskine69c12672018-06-28 00:07:19 +02002550 TEST_ASSERT( expected_mac->len <= PSA_MAC_MAX_SIZE );
2551
Gilles Peskine8817f612018-12-18 00:18:46 +01002552 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002553
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01002554 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002555 psa_set_key_algorithm( &attributes, alg );
2556 psa_set_key_type( &attributes, key_type );
mohammad16036df908f2018-04-02 08:34:15 -07002557
Ronald Cron5425a212020-08-04 14:58:35 +02002558 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2559 &key ) );
Gilles Peskinec0ec9722018-06-18 17:03:37 +02002560
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002561 /* Verify correct MAC, one-shot case. */
2562 PSA_ASSERT( psa_mac_verify( key, alg, input->x, input->len,
2563 expected_mac->x, expected_mac->len ) );
2564
2565 /* Verify correct MAC, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002566 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine8817f612018-12-18 00:18:46 +01002567 PSA_ASSERT( psa_mac_update( &operation,
2568 input->x, input->len ) );
2569 PSA_ASSERT( psa_mac_verify_finish( &operation,
2570 expected_mac->x,
2571 expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002572
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002573 /* Test a MAC that's too short, one-shot case. */
2574 TEST_EQUAL( psa_mac_verify( key, alg,
2575 input->x, input->len,
2576 expected_mac->x,
2577 expected_mac->len - 1 ),
2578 PSA_ERROR_INVALID_SIGNATURE );
2579
2580 /* Test a MAC that's too short, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002581 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002582 PSA_ASSERT( psa_mac_update( &operation,
2583 input->x, input->len ) );
2584 TEST_EQUAL( psa_mac_verify_finish( &operation,
2585 expected_mac->x,
2586 expected_mac->len - 1 ),
2587 PSA_ERROR_INVALID_SIGNATURE );
2588
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002589 /* Test a MAC that's too long, one-shot case. */
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002590 ASSERT_ALLOC( perturbed_mac, expected_mac->len + 1 );
2591 memcpy( perturbed_mac, expected_mac->x, expected_mac->len );
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002592 TEST_EQUAL( psa_mac_verify( key, alg,
2593 input->x, input->len,
2594 perturbed_mac, expected_mac->len + 1 ),
2595 PSA_ERROR_INVALID_SIGNATURE );
2596
2597 /* Test a MAC that's too long, multi-part case. */
Ronald Cron5425a212020-08-04 14:58:35 +02002598 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002599 PSA_ASSERT( psa_mac_update( &operation,
2600 input->x, input->len ) );
2601 TEST_EQUAL( psa_mac_verify_finish( &operation,
2602 perturbed_mac,
2603 expected_mac->len + 1 ),
2604 PSA_ERROR_INVALID_SIGNATURE );
2605
2606 /* Test changing one byte. */
2607 for( size_t i = 0; i < expected_mac->len; i++ )
2608 {
Chris Jones9634bb12021-01-20 15:56:42 +00002609 mbedtls_test_set_step( i );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002610 perturbed_mac[i] ^= 1;
gabor-mezei-arm534bb992021-03-01 15:35:48 +01002611
2612 TEST_EQUAL( psa_mac_verify( key, alg,
2613 input->x, input->len,
2614 perturbed_mac, expected_mac->len ),
2615 PSA_ERROR_INVALID_SIGNATURE );
2616
Ronald Cron5425a212020-08-04 14:58:35 +02002617 PSA_ASSERT( psa_mac_verify_setup( &operation, key, alg ) );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002618 PSA_ASSERT( psa_mac_update( &operation,
2619 input->x, input->len ) );
2620 TEST_EQUAL( psa_mac_verify_finish( &operation,
2621 perturbed_mac,
2622 expected_mac->len ),
2623 PSA_ERROR_INVALID_SIGNATURE );
2624 perturbed_mac[i] ^= 1;
2625 }
2626
Gilles Peskine8c9def32018-02-08 10:02:12 +01002627exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002628 psa_mac_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002629 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002630 PSA_DONE( );
Gilles Peskine29c4a6c2020-08-26 00:01:39 +02002631 mbedtls_free( perturbed_mac );
Gilles Peskine8c9def32018-02-08 10:02:12 +01002632}
2633/* END_CASE */
2634
2635/* BEGIN_CASE */
Jaeden Amero5bae2272019-01-04 11:48:27 +00002636void cipher_operation_init( )
2637{
Jaeden Ameroab439972019-02-15 14:12:05 +00002638 const uint8_t input[1] = { 0 };
2639 unsigned char output[1] = { 0 };
2640 size_t output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002641 /* Test each valid way of initializing the object, except for `= {0}`, as
2642 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
2643 * though it's OK by the C standard. We could test for this, but we'd need
2644 * to supress the Clang warning for the test. */
2645 psa_cipher_operation_t func = psa_cipher_operation_init( );
2646 psa_cipher_operation_t init = PSA_CIPHER_OPERATION_INIT;
2647 psa_cipher_operation_t zero;
2648
2649 memset( &zero, 0, sizeof( zero ) );
2650
Jaeden Ameroab439972019-02-15 14:12:05 +00002651 /* A freshly-initialized cipher operation should not be usable. */
2652 TEST_EQUAL( psa_cipher_update( &func,
2653 input, sizeof( input ),
2654 output, sizeof( output ),
2655 &output_length ),
2656 PSA_ERROR_BAD_STATE );
2657 TEST_EQUAL( psa_cipher_update( &init,
2658 input, sizeof( input ),
2659 output, sizeof( output ),
2660 &output_length ),
2661 PSA_ERROR_BAD_STATE );
2662 TEST_EQUAL( psa_cipher_update( &zero,
2663 input, sizeof( input ),
2664 output, sizeof( output ),
2665 &output_length ),
2666 PSA_ERROR_BAD_STATE );
2667
Jaeden Amero5229bbb2019-02-07 16:33:37 +00002668 /* A default cipher operation should be abortable without error. */
2669 PSA_ASSERT( psa_cipher_abort( &func ) );
2670 PSA_ASSERT( psa_cipher_abort( &init ) );
2671 PSA_ASSERT( psa_cipher_abort( &zero ) );
Jaeden Amero5bae2272019-01-04 11:48:27 +00002672}
2673/* END_CASE */
2674
2675/* BEGIN_CASE */
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002676void cipher_setup( int key_type_arg,
2677 data_t *key,
2678 int alg_arg,
2679 int expected_status_arg )
2680{
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002681 psa_key_type_t key_type = key_type_arg;
2682 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002683 psa_status_t expected_status = expected_status_arg;
Jaeden Amero5bae2272019-01-04 11:48:27 +00002684 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002685 psa_status_t status;
Gilles Peskine612ffd22021-01-20 18:51:00 +01002686#if defined(KNOWN_SUPPORTED_CIPHER_ALG)
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002687 const uint8_t smoke_test_key_data[16] = "kkkkkkkkkkkkkkkk";
2688#endif
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002689
Gilles Peskine8817f612018-12-18 00:18:46 +01002690 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002691
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002692 if( ! exercise_cipher_setup( key_type, key->x, key->len, alg,
2693 &operation, &status ) )
2694 goto exit;
Gilles Peskinefe11b722018-12-18 00:24:04 +01002695 TEST_EQUAL( status, expected_status );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002696
Gilles Peskinef426e0f2019-02-25 17:42:03 +01002697 /* The operation object should be reusable. */
2698#if defined(KNOWN_SUPPORTED_CIPHER_ALG)
2699 if( ! exercise_cipher_setup( KNOWN_SUPPORTED_CIPHER_KEY_TYPE,
2700 smoke_test_key_data,
2701 sizeof( smoke_test_key_data ),
2702 KNOWN_SUPPORTED_CIPHER_ALG,
2703 &operation, &status ) )
2704 goto exit;
2705 TEST_EQUAL( status, PSA_SUCCESS );
2706#endif
2707
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002708exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002709 psa_cipher_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002710 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002711}
2712/* END_CASE */
2713
Ronald Cronee414c72021-03-18 18:50:08 +01002714/* BEGIN_CASE depends_on:PSA_WANT_KEY_TYPE_AES:PSA_WANT_ALG_CBC_PKCS7 */
Jaeden Ameroab439972019-02-15 14:12:05 +00002715void cipher_bad_order( )
2716{
Ronald Cron5425a212020-08-04 14:58:35 +02002717 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Jaeden Ameroab439972019-02-15 14:12:05 +00002718 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
2719 psa_algorithm_t alg = PSA_ALG_CBC_PKCS7;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002720 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Jaeden Ameroab439972019-02-15 14:12:05 +00002721 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002722 unsigned char iv[PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES)] = { 0 };
Ronald Cron5425a212020-08-04 14:58:35 +02002723 const uint8_t key_data[] = {
Jaeden Ameroab439972019-02-15 14:12:05 +00002724 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2725 0xaa, 0xaa, 0xaa, 0xaa };
2726 const uint8_t text[] = {
2727 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2728 0xbb, 0xbb, 0xbb, 0xbb };
gabor-mezei-armcbcec212020-12-18 14:23:51 +01002729 uint8_t buffer[PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES)] = { 0 };
Jaeden Ameroab439972019-02-15 14:12:05 +00002730 size_t length = 0;
2731
2732 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02002733 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
2734 psa_set_key_algorithm( &attributes, alg );
2735 psa_set_key_type( &attributes, key_type );
Ronald Cron5425a212020-08-04 14:58:35 +02002736 PSA_ASSERT( psa_import_key( &attributes, key_data, sizeof( key_data ),
2737 &key ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002738
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002739 /* Call encrypt setup twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002740 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002741 ASSERT_OPERATION_IS_ACTIVE( operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002742 TEST_EQUAL( psa_cipher_encrypt_setup( &operation, key, alg ),
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002743 PSA_ERROR_BAD_STATE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002744 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002745 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002746 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002747
2748 /* Call decrypt setup twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002749 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002750 ASSERT_OPERATION_IS_ACTIVE( operation );
Ronald Cron5425a212020-08-04 14:58:35 +02002751 TEST_EQUAL( psa_cipher_decrypt_setup( &operation, key, alg ),
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002752 PSA_ERROR_BAD_STATE );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002753 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002754 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman5ae6f752021-06-24 11:36:14 +01002755 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Amero36ee5d02019-02-19 09:25:10 +00002756
Jaeden Ameroab439972019-02-15 14:12:05 +00002757 /* Generate an IV without calling setup beforehand. */
2758 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2759 buffer, sizeof( buffer ),
2760 &length ),
2761 PSA_ERROR_BAD_STATE );
2762 PSA_ASSERT( psa_cipher_abort( &operation ) );
2763
2764 /* Generate an IV twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002765 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002766 PSA_ASSERT( psa_cipher_generate_iv( &operation,
2767 buffer, sizeof( buffer ),
2768 &length ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002769 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002770 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2771 buffer, sizeof( buffer ),
2772 &length ),
2773 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01002774 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002775 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002776 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002777
2778 /* Generate an IV after it's already set. */
Ronald Cron5425a212020-08-04 14:58:35 +02002779 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002780 PSA_ASSERT( psa_cipher_set_iv( &operation,
2781 iv, sizeof( iv ) ) );
2782 TEST_EQUAL( psa_cipher_generate_iv( &operation,
2783 buffer, sizeof( buffer ),
2784 &length ),
2785 PSA_ERROR_BAD_STATE );
2786 PSA_ASSERT( psa_cipher_abort( &operation ) );
2787
2788 /* Set an IV without calling setup beforehand. */
2789 TEST_EQUAL( psa_cipher_set_iv( &operation,
2790 iv, sizeof( iv ) ),
2791 PSA_ERROR_BAD_STATE );
2792 PSA_ASSERT( psa_cipher_abort( &operation ) );
2793
2794 /* Set an IV after it's already set. */
Ronald Cron5425a212020-08-04 14:58:35 +02002795 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002796 PSA_ASSERT( psa_cipher_set_iv( &operation,
2797 iv, sizeof( iv ) ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002798 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002799 TEST_EQUAL( psa_cipher_set_iv( &operation,
2800 iv, sizeof( iv ) ),
2801 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01002802 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002803 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002804 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002805
2806 /* Set an IV after it's already generated. */
Ronald Cron5425a212020-08-04 14:58:35 +02002807 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002808 PSA_ASSERT( psa_cipher_generate_iv( &operation,
2809 buffer, sizeof( buffer ),
2810 &length ) );
2811 TEST_EQUAL( psa_cipher_set_iv( &operation,
2812 iv, sizeof( iv ) ),
2813 PSA_ERROR_BAD_STATE );
2814 PSA_ASSERT( psa_cipher_abort( &operation ) );
2815
2816 /* Call update without calling setup beforehand. */
2817 TEST_EQUAL( psa_cipher_update( &operation,
2818 text, sizeof( text ),
2819 buffer, sizeof( buffer ),
2820 &length ),
2821 PSA_ERROR_BAD_STATE );
2822 PSA_ASSERT( psa_cipher_abort( &operation ) );
2823
2824 /* Call update without an IV where an IV is required. */
Dave Rodgman095dadc2021-06-23 12:48:52 +01002825 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002826 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002827 TEST_EQUAL( psa_cipher_update( &operation,
2828 text, sizeof( text ),
2829 buffer, sizeof( buffer ),
2830 &length ),
2831 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01002832 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002833 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002834 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002835
2836 /* Call update after finish. */
Ronald Cron5425a212020-08-04 14:58:35 +02002837 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002838 PSA_ASSERT( psa_cipher_set_iv( &operation,
2839 iv, sizeof( iv ) ) );
2840 PSA_ASSERT( psa_cipher_finish( &operation,
2841 buffer, sizeof( buffer ), &length ) );
2842 TEST_EQUAL( psa_cipher_update( &operation,
2843 text, sizeof( text ),
2844 buffer, sizeof( buffer ),
2845 &length ),
2846 PSA_ERROR_BAD_STATE );
2847 PSA_ASSERT( psa_cipher_abort( &operation ) );
2848
2849 /* Call finish without calling setup beforehand. */
2850 TEST_EQUAL( psa_cipher_finish( &operation,
2851 buffer, sizeof( buffer ), &length ),
2852 PSA_ERROR_BAD_STATE );
2853 PSA_ASSERT( psa_cipher_abort( &operation ) );
2854
2855 /* Call finish without an IV where an IV is required. */
Ronald Cron5425a212020-08-04 14:58:35 +02002856 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002857 /* Not calling update means we are encrypting an empty buffer, which is OK
2858 * for cipher modes with padding. */
Dave Rodgman647791d2021-06-23 12:49:59 +01002859 ASSERT_OPERATION_IS_ACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002860 TEST_EQUAL( psa_cipher_finish( &operation,
2861 buffer, sizeof( buffer ), &length ),
2862 PSA_ERROR_BAD_STATE );
Dave Rodgman647791d2021-06-23 12:49:59 +01002863 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002864 PSA_ASSERT( psa_cipher_abort( &operation ) );
Dave Rodgman647791d2021-06-23 12:49:59 +01002865 ASSERT_OPERATION_IS_INACTIVE( operation );
Jaeden Ameroab439972019-02-15 14:12:05 +00002866
2867 /* Call finish twice in a row. */
Ronald Cron5425a212020-08-04 14:58:35 +02002868 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Jaeden Ameroab439972019-02-15 14:12:05 +00002869 PSA_ASSERT( psa_cipher_set_iv( &operation,
2870 iv, sizeof( iv ) ) );
2871 PSA_ASSERT( psa_cipher_finish( &operation,
2872 buffer, sizeof( buffer ), &length ) );
2873 TEST_EQUAL( psa_cipher_finish( &operation,
2874 buffer, sizeof( buffer ), &length ),
2875 PSA_ERROR_BAD_STATE );
2876 PSA_ASSERT( psa_cipher_abort( &operation ) );
2877
Ronald Cron5425a212020-08-04 14:58:35 +02002878 PSA_ASSERT( psa_destroy_key( key ) );
Gilles Peskine76b29a72019-05-28 14:08:50 +02002879
Jaeden Ameroab439972019-02-15 14:12:05 +00002880exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02002881 psa_cipher_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02002882 PSA_DONE( );
Gilles Peskine16c0f4f2018-06-20 16:05:20 +02002883}
2884/* END_CASE */
2885
2886/* BEGIN_CASE */
gabor-mezei-arma56756e2021-06-25 15:49:14 +02002887void cipher_encrypt_fail( int alg_arg,
2888 int key_type_arg,
2889 data_t *key_data,
2890 data_t *input,
2891 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02002892{
Ronald Cron5425a212020-08-04 14:58:35 +02002893 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002894 psa_status_t status;
2895 psa_key_type_t key_type = key_type_arg;
2896 psa_algorithm_t alg = alg_arg;
Gilles Peskineb866e2b2018-06-21 09:25:10 +02002897 psa_status_t expected_status = expected_status_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03002898 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02002899 size_t output_buffer_size = 0;
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002900 size_t output_length = 0;
2901 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2902
2903 if ( PSA_ERROR_BAD_STATE != expected_status )
2904 {
2905 PSA_ASSERT( psa_crypto_init( ) );
2906
2907 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2908 psa_set_key_algorithm( &attributes, alg );
2909 psa_set_key_type( &attributes, key_type );
2910
2911 output_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg,
2912 input->len );
2913 ASSERT_ALLOC( output, output_buffer_size );
2914
2915 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2916 &key ) );
2917 }
2918
2919 status = psa_cipher_encrypt( key, alg, input->x, input->len, output,
2920 output_buffer_size, &output_length );
2921
2922 TEST_EQUAL( status, expected_status );
2923
2924exit:
2925 mbedtls_free( output );
2926 psa_destroy_key( key );
2927 PSA_DONE( );
2928}
2929/* END_CASE */
2930
2931/* BEGIN_CASE */
Mateusz Starzyked71e922021-10-21 10:04:57 +02002932void cipher_encrypt_validate_iv_length( int alg, int key_type, data_t* key_data,
2933 data_t *input, int iv_length,
2934 int expected_result )
2935{
2936 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
2937 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
2938 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2939 size_t output_buffer_size = 0;
2940 unsigned char *output = NULL;
2941
2942 output_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2943 ASSERT_ALLOC( output, output_buffer_size );
2944
2945 PSA_ASSERT( psa_crypto_init( ) );
2946
2947 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2948 psa_set_key_algorithm( &attributes, alg );
2949 psa_set_key_type( &attributes, key_type );
2950
2951 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2952 &key ) );
2953 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
2954 TEST_EQUAL( expected_result, psa_cipher_set_iv( &operation, output,
2955 iv_length ) );
2956
2957exit:
2958 psa_cipher_abort( &operation );
2959 mbedtls_free( output );
2960 psa_destroy_key( key );
2961 PSA_DONE( );
2962}
2963/* END_CASE */
2964
2965/* BEGIN_CASE */
gabor-mezei-arma56756e2021-06-25 15:49:14 +02002966void cipher_encrypt_alg_without_iv( int alg_arg,
2967 int key_type_arg,
2968 data_t *key_data,
2969 data_t *input,
2970 data_t *expected_output )
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002971{
2972 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
2973 psa_key_type_t key_type = key_type_arg;
2974 psa_algorithm_t alg = alg_arg;
Ronald Cron6c9bb0f2021-07-15 09:38:11 +02002975 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
2976 uint8_t iv[1] = { 0x5a };
2977 size_t iv_length;
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01002978 unsigned char *output = NULL;
2979 size_t output_buffer_size = 0;
2980 size_t output_length = 0;
2981 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2982
2983 PSA_ASSERT( psa_crypto_init( ) );
2984
2985 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
2986 psa_set_key_algorithm( &attributes, alg );
2987 psa_set_key_type( &attributes, key_type );
2988
2989 output_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
2990 ASSERT_ALLOC( output, output_buffer_size );
2991
2992 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
2993 &key ) );
2994
Ronald Cron6c9bb0f2021-07-15 09:38:11 +02002995 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
2996 TEST_EQUAL( psa_cipher_set_iv( &operation, iv, sizeof( iv ) ),
2997 PSA_ERROR_BAD_STATE );
2998 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
2999 TEST_EQUAL( psa_cipher_generate_iv( &operation, iv, sizeof( iv ),
3000 &iv_length ),
3001 PSA_ERROR_BAD_STATE );
3002
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003003 PSA_ASSERT( psa_cipher_encrypt( key, alg, input->x, input->len, output,
3004 output_buffer_size, &output_length ) );
3005 TEST_ASSERT( output_length <=
3006 PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len ) );
3007 TEST_ASSERT( output_length <=
3008 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
3009
3010 ASSERT_COMPARE( expected_output->x, expected_output->len,
3011 output, output_length );
3012exit:
3013 mbedtls_free( output );
3014 psa_destroy_key( key );
3015 PSA_DONE( );
3016}
3017/* END_CASE */
3018
3019/* BEGIN_CASE */
Paul Elliotta417f562021-07-14 12:31:21 +01003020void cipher_bad_key( int alg_arg, int key_type_arg, data_t *key_data )
3021{
3022 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3023 psa_algorithm_t alg = alg_arg;
3024 psa_key_type_t key_type = key_type_arg;
3025 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3026 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
3027 psa_status_t status;
3028
3029 PSA_ASSERT( psa_crypto_init( ) );
3030
3031 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3032 psa_set_key_algorithm( &attributes, alg );
3033 psa_set_key_type( &attributes, key_type );
3034
3035 /* Usage of either of these two size macros would cause divide by zero
3036 * with incorrect key types previously. Input length should be irrelevant
3037 * here. */
3038 TEST_EQUAL( PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, 16 ),
3039 0 );
3040 TEST_EQUAL( PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, 16 ), 0 );
3041
3042
3043 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3044 &key ) );
3045
3046 /* Should fail due to invalid alg type (to support invalid key type).
3047 * Encrypt or decrypt will end up in the same place. */
3048 status = psa_cipher_encrypt_setup( &operation, key, alg );
3049
3050 TEST_EQUAL( status, PSA_ERROR_INVALID_ARGUMENT );
3051
3052exit:
3053 psa_cipher_abort( &operation );
3054 psa_destroy_key( key );
3055 PSA_DONE( );
3056}
3057/* END_CASE */
3058
3059/* BEGIN_CASE */
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003060void cipher_encrypt_validation( int alg_arg,
3061 int key_type_arg,
3062 data_t *key_data,
3063 data_t *input )
3064{
3065 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3066 psa_key_type_t key_type = key_type_arg;
3067 psa_algorithm_t alg = alg_arg;
3068 size_t iv_size = PSA_CIPHER_IV_LENGTH ( key_type, alg );
3069 unsigned char *output1 = NULL;
3070 size_t output1_buffer_size = 0;
3071 size_t output1_length = 0;
3072 unsigned char *output2 = NULL;
3073 size_t output2_buffer_size = 0;
3074 size_t output2_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +02003075 size_t function_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00003076 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003077 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02003078
Gilles Peskine8817f612018-12-18 00:18:46 +01003079 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003080
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003081 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3082 psa_set_key_algorithm( &attributes, alg );
3083 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03003084
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003085 output1_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
3086 output2_buffer_size = PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) +
3087 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg );
3088 ASSERT_ALLOC( output1, output1_buffer_size );
3089 ASSERT_ALLOC( output2, output2_buffer_size );
3090
Ronald Cron5425a212020-08-04 14:58:35 +02003091 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3092 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003093
gabor-mezei-arm50c86cf2021-06-25 15:47:50 +02003094 /* The one-shot cipher encryption uses generated iv so validating
3095 the output is not possible. Validating with multipart encryption. */
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003096 PSA_ASSERT( psa_cipher_encrypt( key, alg, input->x, input->len, output1,
3097 output1_buffer_size, &output1_length ) );
3098 TEST_ASSERT( output1_length <=
3099 PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len ) );
3100 TEST_ASSERT( output1_length <=
gabor-mezei-armceface22021-01-21 12:26:17 +01003101 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003102
3103 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
3104 PSA_ASSERT( psa_cipher_set_iv( &operation, output1, iv_size ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003105
Gilles Peskine8817f612018-12-18 00:18:46 +01003106 PSA_ASSERT( psa_cipher_update( &operation,
3107 input->x, input->len,
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003108 output2, output2_buffer_size,
Gilles Peskine8817f612018-12-18 00:18:46 +01003109 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003110 TEST_ASSERT( function_output_length <=
3111 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) );
3112 TEST_ASSERT( function_output_length <=
3113 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003114 output2_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01003115
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003116 PSA_ASSERT( psa_cipher_finish( &operation,
3117 output2 + output2_length,
3118 output2_buffer_size - output2_length,
3119 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003120 TEST_ASSERT( function_output_length <=
3121 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
3122 TEST_ASSERT( function_output_length <=
3123 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003124 output2_length += function_output_length;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02003125
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003126 PSA_ASSERT( psa_cipher_abort( &operation ) );
3127 ASSERT_COMPARE( output1 + iv_size, output1_length - iv_size,
3128 output2, output2_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02003129
Gilles Peskine50e586b2018-06-08 14:28:46 +02003130exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02003131 psa_cipher_abort( &operation );
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003132 mbedtls_free( output1 );
3133 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02003134 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003135 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003136}
3137/* END_CASE */
3138
3139/* BEGIN_CASE */
3140void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02003141 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03003142 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01003143 int first_part_size_arg,
3144 int output1_length_arg, int output2_length_arg,
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003145 data_t *expected_output,
3146 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02003147{
Ronald Cron5425a212020-08-04 14:58:35 +02003148 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02003149 psa_key_type_t key_type = key_type_arg;
3150 psa_algorithm_t alg = alg_arg;
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003151 psa_status_t status;
3152 psa_status_t expected_status = expected_status_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01003153 size_t first_part_size = first_part_size_arg;
3154 size_t output1_length = output1_length_arg;
3155 size_t output2_length = output2_length_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003156 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02003157 size_t output_buffer_size = 0;
3158 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02003159 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00003160 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003161 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02003162
Gilles Peskine8817f612018-12-18 00:18:46 +01003163 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003164
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003165 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3166 psa_set_key_algorithm( &attributes, alg );
3167 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03003168
Ronald Cron5425a212020-08-04 14:58:35 +02003169 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3170 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003171
Ronald Cron5425a212020-08-04 14:58:35 +02003172 PSA_ASSERT( psa_cipher_encrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003173
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02003174 if( iv->len > 0 )
3175 {
Steven Cooremana6033e92020-08-25 11:47:50 +02003176 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02003177 }
3178
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003179 output_buffer_size = PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) +
3180 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003181 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003182
Gilles Peskinee0866522019-02-19 19:44:00 +01003183 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01003184 PSA_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
3185 output, output_buffer_size,
3186 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01003187 TEST_ASSERT( function_output_length == output1_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01003188 TEST_ASSERT( function_output_length <=
3189 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
3190 TEST_ASSERT( function_output_length <=
3191 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02003192 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01003193
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003194 if( first_part_size < input->len )
3195 {
3196 PSA_ASSERT( psa_cipher_update( &operation,
3197 input->x + first_part_size,
3198 input->len - first_part_size,
3199 ( output_buffer_size == 0 ? NULL :
3200 output + total_output_length ),
3201 output_buffer_size - total_output_length,
3202 &function_output_length ) );
3203 TEST_ASSERT( function_output_length == output2_length );
3204 TEST_ASSERT( function_output_length <=
3205 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
3206 alg,
3207 input->len - first_part_size ) );
3208 TEST_ASSERT( function_output_length <=
3209 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
3210 total_output_length += function_output_length;
3211 }
gabor-mezei-armceface22021-01-21 12:26:17 +01003212
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003213 status = psa_cipher_finish( &operation,
3214 ( output_buffer_size == 0 ? NULL :
3215 output + total_output_length ),
3216 output_buffer_size - total_output_length,
3217 &function_output_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01003218 TEST_ASSERT( function_output_length <=
3219 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
3220 TEST_ASSERT( function_output_length <=
3221 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02003222 total_output_length += function_output_length;
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003223 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003224
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003225 if( expected_status == PSA_SUCCESS )
3226 {
3227 PSA_ASSERT( psa_cipher_abort( &operation ) );
3228
3229 ASSERT_COMPARE( expected_output->x, expected_output->len,
3230 output, total_output_length );
3231 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02003232
3233exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02003234 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003235 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02003236 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003237 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003238}
3239/* END_CASE */
3240
3241/* BEGIN_CASE */
3242void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02003243 data_t *key_data, data_t *iv,
itayzafrir3e02b3b2018-06-12 17:06:52 +03003244 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01003245 int first_part_size_arg,
3246 int output1_length_arg, int output2_length_arg,
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003247 data_t *expected_output,
3248 int expected_status_arg )
Gilles Peskine50e586b2018-06-08 14:28:46 +02003249{
Ronald Cron5425a212020-08-04 14:58:35 +02003250 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02003251 psa_key_type_t key_type = key_type_arg;
3252 psa_algorithm_t alg = alg_arg;
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003253 psa_status_t status;
3254 psa_status_t expected_status = expected_status_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01003255 size_t first_part_size = first_part_size_arg;
3256 size_t output1_length = output1_length_arg;
3257 size_t output2_length = output2_length_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003258 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +02003259 size_t output_buffer_size = 0;
3260 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02003261 size_t total_output_length = 0;
Jaeden Amero5bae2272019-01-04 11:48:27 +00003262 psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003263 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine50e586b2018-06-08 14:28:46 +02003264
Gilles Peskine8817f612018-12-18 00:18:46 +01003265 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003266
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003267 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3268 psa_set_key_algorithm( &attributes, alg );
3269 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03003270
Ronald Cron5425a212020-08-04 14:58:35 +02003271 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3272 &key ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003273
Ronald Cron5425a212020-08-04 14:58:35 +02003274 PSA_ASSERT( psa_cipher_decrypt_setup( &operation, key, alg ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003275
Steven Cooreman177deba2020-09-07 17:14:14 +02003276 if( iv->len > 0 )
3277 {
Steven Cooremana6033e92020-08-25 11:47:50 +02003278 PSA_ASSERT( psa_cipher_set_iv( &operation, iv->x, iv->len ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02003279 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02003280
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003281 output_buffer_size = PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, input->len ) +
3282 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003283 ASSERT_ALLOC( output, output_buffer_size );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003284
Gilles Peskinee0866522019-02-19 19:44:00 +01003285 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine8817f612018-12-18 00:18:46 +01003286 PSA_ASSERT( psa_cipher_update( &operation,
3287 input->x, first_part_size,
3288 output, output_buffer_size,
3289 &function_output_length ) );
Gilles Peskinee0866522019-02-19 19:44:00 +01003290 TEST_ASSERT( function_output_length == output1_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01003291 TEST_ASSERT( function_output_length <=
3292 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
3293 TEST_ASSERT( function_output_length <=
3294 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02003295 total_output_length += function_output_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01003296
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003297 if( first_part_size < input->len )
Steven Cooreman177deba2020-09-07 17:14:14 +02003298 {
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003299 PSA_ASSERT( psa_cipher_update( &operation,
3300 input->x + first_part_size,
3301 input->len - first_part_size,
3302 ( output_buffer_size == 0 ? NULL :
3303 output + total_output_length ),
3304 output_buffer_size - total_output_length,
3305 &function_output_length ) );
3306 TEST_ASSERT( function_output_length == output2_length );
3307 TEST_ASSERT( function_output_length <=
3308 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
3309 alg,
3310 input->len - first_part_size ) );
3311 TEST_ASSERT( function_output_length <=
3312 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len ) );
3313 total_output_length += function_output_length;
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02003314 }
Gilles Peskine50e586b2018-06-08 14:28:46 +02003315
Gilles Peskine50e586b2018-06-08 14:28:46 +02003316 status = psa_cipher_finish( &operation,
Gilles Peskine0c510f32021-03-24 00:41:51 +01003317 ( output_buffer_size == 0 ? NULL :
3318 output + total_output_length ),
Gilles Peskineee46fe72019-02-19 19:05:33 +01003319 output_buffer_size - total_output_length,
Gilles Peskine50e586b2018-06-08 14:28:46 +02003320 &function_output_length );
gabor-mezei-armceface22021-01-21 12:26:17 +01003321 TEST_ASSERT( function_output_length <=
3322 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
3323 TEST_ASSERT( function_output_length <=
3324 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +02003325 total_output_length += function_output_length;
Gilles Peskinefe11b722018-12-18 00:24:04 +01003326 TEST_EQUAL( status, expected_status );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003327
3328 if( expected_status == PSA_SUCCESS )
3329 {
Gilles Peskine8817f612018-12-18 00:18:46 +01003330 PSA_ASSERT( psa_cipher_abort( &operation ) );
gabor-mezei-arm95aad832021-06-25 18:21:33 +02003331
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003332 ASSERT_COMPARE( expected_output->x, expected_output->len,
3333 output, total_output_length );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003334 }
3335
Gilles Peskine50e586b2018-06-08 14:28:46 +02003336exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02003337 psa_cipher_abort( &operation );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003338 mbedtls_free( output );
Ronald Cron5425a212020-08-04 14:58:35 +02003339 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003340 PSA_DONE( );
Gilles Peskine50e586b2018-06-08 14:28:46 +02003341}
3342/* END_CASE */
3343
Gilles Peskine50e586b2018-06-08 14:28:46 +02003344/* BEGIN_CASE */
gabor-mezei-arma56756e2021-06-25 15:49:14 +02003345void cipher_decrypt_fail( int alg_arg,
3346 int key_type_arg,
3347 data_t *key_data,
3348 data_t *iv,
3349 data_t *input_arg,
3350 int expected_status_arg )
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003351{
3352 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3353 psa_status_t status;
3354 psa_key_type_t key_type = key_type_arg;
3355 psa_algorithm_t alg = alg_arg;
3356 psa_status_t expected_status = expected_status_arg;
3357 unsigned char *input = NULL;
3358 size_t input_buffer_size = 0;
3359 unsigned char *output = NULL;
3360 size_t output_buffer_size = 0;
3361 size_t output_length = 0;
3362 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3363
3364 if ( PSA_ERROR_BAD_STATE != expected_status )
3365 {
3366 PSA_ASSERT( psa_crypto_init( ) );
3367
3368 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3369 psa_set_key_algorithm( &attributes, alg );
3370 psa_set_key_type( &attributes, key_type );
3371
3372 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3373 &key ) );
3374 }
3375
3376 /* Allocate input buffer and copy the iv and the plaintext */
3377 input_buffer_size = ( (size_t) input_arg->len + (size_t) iv->len );
3378 if ( input_buffer_size > 0 )
3379 {
3380 ASSERT_ALLOC( input, input_buffer_size );
3381 memcpy( input, iv->x, iv->len );
3382 memcpy( input + iv->len, input_arg->x, input_arg->len );
3383 }
3384
3385 output_buffer_size = PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input_buffer_size );
3386 ASSERT_ALLOC( output, output_buffer_size );
3387
3388 status = psa_cipher_decrypt( key, alg, input, input_buffer_size, output,
3389 output_buffer_size, &output_length );
3390 TEST_EQUAL( status, expected_status );
3391
3392exit:
3393 mbedtls_free( input );
3394 mbedtls_free( output );
3395 psa_destroy_key( key );
3396 PSA_DONE( );
3397}
3398/* END_CASE */
3399
3400/* BEGIN_CASE */
3401void cipher_decrypt( int alg_arg,
3402 int key_type_arg,
3403 data_t *key_data,
3404 data_t *iv,
3405 data_t *input_arg,
3406 data_t *expected_output )
3407{
3408 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
3409 psa_key_type_t key_type = key_type_arg;
3410 psa_algorithm_t alg = alg_arg;
3411 unsigned char *input = NULL;
3412 size_t input_buffer_size = 0;
3413 unsigned char *output = NULL;
3414 size_t output_buffer_size = 0;
3415 size_t output_length = 0;
3416 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3417
3418 PSA_ASSERT( psa_crypto_init( ) );
3419
3420 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3421 psa_set_key_algorithm( &attributes, alg );
3422 psa_set_key_type( &attributes, key_type );
3423
3424 /* Allocate input buffer and copy the iv and the plaintext */
3425 input_buffer_size = ( (size_t) input_arg->len + (size_t) iv->len );
3426 if ( input_buffer_size > 0 )
3427 {
3428 ASSERT_ALLOC( input, input_buffer_size );
3429 memcpy( input, iv->x, iv->len );
3430 memcpy( input + iv->len, input_arg->x, input_arg->len );
3431 }
3432
3433 output_buffer_size = PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input_buffer_size );
3434 ASSERT_ALLOC( output, output_buffer_size );
3435
3436 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3437 &key ) );
3438
3439 PSA_ASSERT( psa_cipher_decrypt( key, alg, input, input_buffer_size, output,
3440 output_buffer_size, &output_length ) );
3441 TEST_ASSERT( output_length <=
3442 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, input_buffer_size ) );
3443 TEST_ASSERT( output_length <=
3444 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( input_buffer_size ) );
3445
3446 ASSERT_COMPARE( expected_output->x, expected_output->len,
3447 output, output_length );
3448exit:
3449 mbedtls_free( input );
3450 mbedtls_free( output );
3451 psa_destroy_key( key );
3452 PSA_DONE( );
3453}
3454/* END_CASE */
3455
3456/* BEGIN_CASE */
3457void cipher_verify_output( int alg_arg,
3458 int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02003459 data_t *key_data,
itayzafrir3e02b3b2018-06-12 17:06:52 +03003460 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +02003461{
Ronald Cron5425a212020-08-04 14:58:35 +02003462 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003463 psa_key_type_t key_type = key_type_arg;
3464 psa_algorithm_t alg = alg_arg;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003465 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003466 size_t output1_size = 0;
3467 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003468 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003469 size_t output2_size = 0;
3470 size_t output2_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003471 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003472
Gilles Peskine8817f612018-12-18 00:18:46 +01003473 PSA_ASSERT( psa_crypto_init( ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003474
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003475 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3476 psa_set_key_algorithm( &attributes, alg );
3477 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03003478
Ronald Cron5425a212020-08-04 14:58:35 +02003479 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3480 &key ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003481 output1_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003482 ASSERT_ALLOC( output1, output1_size );
Moran Pekerded84402018-06-06 16:36:50 +03003483
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003484 PSA_ASSERT( psa_cipher_encrypt( key, alg, input->x, input->len,
3485 output1, output1_size,
3486 &output1_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003487 TEST_ASSERT( output1_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003488 PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003489 TEST_ASSERT( output1_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003490 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Moran Pekerded84402018-06-06 16:36:50 +03003491
3492 output2_size = output1_length;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003493 ASSERT_ALLOC( output2, output2_size );
Moran Pekerded84402018-06-06 16:36:50 +03003494
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003495 PSA_ASSERT( psa_cipher_decrypt( key, alg, output1, output1_length,
3496 output2, output2_size,
3497 &output2_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003498 TEST_ASSERT( output2_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003499 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, output1_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003500 TEST_ASSERT( output2_length <=
gabor-mezei-armf494bcd2021-03-01 15:11:46 +01003501 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( output1_length ) );
Moran Pekerded84402018-06-06 16:36:50 +03003502
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003503 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
Moran Pekerded84402018-06-06 16:36:50 +03003504
3505exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +03003506 mbedtls_free( output1 );
3507 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02003508 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003509 PSA_DONE( );
Moran Pekerded84402018-06-06 16:36:50 +03003510}
3511/* END_CASE */
3512
3513/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +02003514void cipher_verify_output_multipart( int alg_arg,
3515 int key_type_arg,
Ronald Cron5425a212020-08-04 14:58:35 +02003516 data_t *key_data,
itayzafrir3e02b3b2018-06-12 17:06:52 +03003517 data_t *input,
Gilles Peskinee0866522019-02-19 19:44:00 +01003518 int first_part_size_arg )
Moran Pekerded84402018-06-06 16:36:50 +03003519{
Ronald Cron5425a212020-08-04 14:58:35 +02003520 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03003521 psa_key_type_t key_type = key_type_arg;
3522 psa_algorithm_t alg = alg_arg;
Gilles Peskinee0866522019-02-19 19:44:00 +01003523 size_t first_part_size = first_part_size_arg;
Moran Pekerded84402018-06-06 16:36:50 +03003524 unsigned char iv[16] = {0};
3525 size_t iv_size = 16;
3526 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003527 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003528 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03003529 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +03003530 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003531 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +03003532 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +02003533 size_t function_output_length;
Jaeden Amero5bae2272019-01-04 11:48:27 +00003534 psa_cipher_operation_t operation1 = PSA_CIPHER_OPERATION_INIT;
3535 psa_cipher_operation_t operation2 = PSA_CIPHER_OPERATION_INIT;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003536 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Moran Pekerded84402018-06-06 16:36:50 +03003537
Gilles Peskine8817f612018-12-18 00:18:46 +01003538 PSA_ASSERT( psa_crypto_init( ) );
Moran Pekerded84402018-06-06 16:36:50 +03003539
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003540 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3541 psa_set_key_algorithm( &attributes, alg );
3542 psa_set_key_type( &attributes, key_type );
Moran Pekered346952018-07-05 15:22:45 +03003543
Ronald Cron5425a212020-08-04 14:58:35 +02003544 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
3545 &key ) );
Moran Pekerded84402018-06-06 16:36:50 +03003546
Ronald Cron5425a212020-08-04 14:58:35 +02003547 PSA_ASSERT( psa_cipher_encrypt_setup( &operation1, key, alg ) );
3548 PSA_ASSERT( psa_cipher_decrypt_setup( &operation2, key, alg ) );
Moran Pekerded84402018-06-06 16:36:50 +03003549
Steven Cooreman177deba2020-09-07 17:14:14 +02003550 if( alg != PSA_ALG_ECB_NO_PADDING )
3551 {
Steven Cooremana6033e92020-08-25 11:47:50 +02003552 PSA_ASSERT( psa_cipher_generate_iv( &operation1,
3553 iv, iv_size,
3554 &iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02003555 }
3556
gabor-mezei-armceface22021-01-21 12:26:17 +01003557 output1_buffer_size = PSA_CIPHER_ENCRYPT_OUTPUT_SIZE( key_type, alg, input->len );
3558 TEST_ASSERT( output1_buffer_size <=
3559 PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE( input->len ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003560 ASSERT_ALLOC( output1, output1_buffer_size );
Moran Pekerded84402018-06-06 16:36:50 +03003561
Gilles Peskinee0866522019-02-19 19:44:00 +01003562 TEST_ASSERT( first_part_size <= input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003563
Gilles Peskine8817f612018-12-18 00:18:46 +01003564 PSA_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
3565 output1, output1_buffer_size,
3566 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003567 TEST_ASSERT( function_output_length <=
3568 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
3569 TEST_ASSERT( function_output_length <=
3570 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003571 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003572
Gilles Peskine8817f612018-12-18 00:18:46 +01003573 PSA_ASSERT( psa_cipher_update( &operation1,
3574 input->x + first_part_size,
3575 input->len - first_part_size,
3576 output1, output1_buffer_size,
3577 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003578 TEST_ASSERT( function_output_length <=
3579 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
3580 alg,
3581 input->len - first_part_size ) );
3582 TEST_ASSERT( function_output_length <=
3583 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( input->len - first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003584 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003585
Gilles Peskine8817f612018-12-18 00:18:46 +01003586 PSA_ASSERT( psa_cipher_finish( &operation1,
3587 output1 + output1_length,
3588 output1_buffer_size - output1_length,
3589 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003590 TEST_ASSERT( function_output_length <=
3591 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
3592 TEST_ASSERT( function_output_length <=
3593 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003594 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +02003595
Gilles Peskine8817f612018-12-18 00:18:46 +01003596 PSA_ASSERT( psa_cipher_abort( &operation1 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003597
Gilles Peskine048b7f02018-06-08 14:20:49 +02003598 output2_buffer_size = output1_length;
gabor-mezei-armceface22021-01-21 12:26:17 +01003599 TEST_ASSERT( output2_buffer_size <=
3600 PSA_CIPHER_DECRYPT_OUTPUT_SIZE( key_type, alg, output1_length ) );
3601 TEST_ASSERT( output2_buffer_size <=
3602 PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE( output1_length ) );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003603 ASSERT_ALLOC( output2, output2_buffer_size );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003604
Steven Cooreman177deba2020-09-07 17:14:14 +02003605 if( iv_length > 0 )
3606 {
Steven Cooremana6033e92020-08-25 11:47:50 +02003607 PSA_ASSERT( psa_cipher_set_iv( &operation2,
3608 iv, iv_length ) );
Steven Cooremaned3c9ec2020-07-06 14:08:59 +02003609 }
Moran Pekerded84402018-06-06 16:36:50 +03003610
Gilles Peskine8817f612018-12-18 00:18:46 +01003611 PSA_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
3612 output2, output2_buffer_size,
3613 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003614 TEST_ASSERT( function_output_length <=
3615 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type, alg, first_part_size ) );
3616 TEST_ASSERT( function_output_length <=
3617 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003618 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003619
Gilles Peskine8817f612018-12-18 00:18:46 +01003620 PSA_ASSERT( psa_cipher_update( &operation2,
3621 output1 + first_part_size,
3622 output1_length - first_part_size,
3623 output2, output2_buffer_size,
3624 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003625 TEST_ASSERT( function_output_length <=
3626 PSA_CIPHER_UPDATE_OUTPUT_SIZE( key_type,
3627 alg,
3628 output1_length - first_part_size ) );
3629 TEST_ASSERT( function_output_length <=
3630 PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE( output1_length - first_part_size ) );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003631 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +03003632
Gilles Peskine8817f612018-12-18 00:18:46 +01003633 PSA_ASSERT( psa_cipher_finish( &operation2,
3634 output2 + output2_length,
3635 output2_buffer_size - output2_length,
3636 &function_output_length ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01003637 TEST_ASSERT( function_output_length <=
3638 PSA_CIPHER_FINISH_OUTPUT_SIZE( key_type, alg ) );
3639 TEST_ASSERT( function_output_length <=
3640 PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE );
Gilles Peskine048b7f02018-06-08 14:20:49 +02003641 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +02003642
Gilles Peskine8817f612018-12-18 00:18:46 +01003643 PSA_ASSERT( psa_cipher_abort( &operation2 ) );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003644
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003645 ASSERT_COMPARE( input->x, input->len, output2, output2_length );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003646
3647exit:
Gilles Peskine64f13ef2020-08-25 23:15:20 +02003648 psa_cipher_abort( &operation1 );
3649 psa_cipher_abort( &operation2 );
itayzafrir3e02b3b2018-06-12 17:06:52 +03003650 mbedtls_free( output1 );
3651 mbedtls_free( output2 );
Ronald Cron5425a212020-08-04 14:58:35 +02003652 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003653 PSA_DONE( );
mohammad1603d7d7ba52018-03-12 18:51:53 +02003654}
3655/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +02003656
Gilles Peskine20035e32018-02-03 22:44:14 +01003657/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003658void aead_encrypt_decrypt( int key_type_arg, data_t *key_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003659 int alg_arg,
Gilles Peskine7da96b02018-08-17 18:45:42 +02003660 data_t *nonce,
3661 data_t *additional_data,
3662 data_t *input_data,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02003663 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003664{
Ronald Cron5425a212020-08-04 14:58:35 +02003665 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003666 psa_key_type_t key_type = key_type_arg;
3667 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003668 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003669 unsigned char *output_data = NULL;
3670 size_t output_size = 0;
3671 size_t output_length = 0;
3672 unsigned char *output_data2 = NULL;
3673 size_t output_length2 = 0;
Steven Cooremanf49478b2021-02-15 15:19:25 +01003674 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003675 psa_status_t expected_result = expected_result_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003676 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003677
Gilles Peskine8817f612018-12-18 00:18:46 +01003678 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003679
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003680 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
3681 psa_set_key_algorithm( &attributes, alg );
3682 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003683
Gilles Peskine049c7532019-05-15 20:22:09 +02003684 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003685 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003686 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3687 key_bits = psa_get_key_bits( &attributes );
3688
3689 output_size = input_data->len + PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3690 alg );
3691 /* For all currently defined algorithms, PSA_AEAD_ENCRYPT_OUTPUT_SIZE
3692 * should be exact. */
3693 if( expected_result != PSA_ERROR_INVALID_ARGUMENT &&
3694 expected_result != PSA_ERROR_NOT_SUPPORTED )
3695 {
3696 TEST_EQUAL( output_size,
3697 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3698 TEST_ASSERT( output_size <=
3699 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3700 }
3701 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003702
Steven Cooremanf49478b2021-02-15 15:19:25 +01003703 status = psa_aead_encrypt( key, alg,
3704 nonce->x, nonce->len,
3705 additional_data->x,
3706 additional_data->len,
3707 input_data->x, input_data->len,
3708 output_data, output_size,
3709 &output_length );
3710
3711 /* If the operation is not supported, just skip and not fail in case the
3712 * encryption involves a common limitation of cryptography hardwares and
3713 * an alternative implementation. */
3714 if( status == PSA_ERROR_NOT_SUPPORTED )
3715 {
3716 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3717 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
3718 }
3719
3720 TEST_EQUAL( status, expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003721
3722 if( PSA_SUCCESS == expected_result )
3723 {
Gilles Peskine8cebbba2018-09-27 13:54:18 +02003724 ASSERT_ALLOC( output_data2, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003725
Gilles Peskine003a4a92019-05-14 16:09:40 +02003726 /* For all currently defined algorithms, PSA_AEAD_DECRYPT_OUTPUT_SIZE
3727 * should be exact. */
3728 TEST_EQUAL( input_data->len,
Bence Szépkútiec174e22021-03-19 18:46:15 +01003729 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg, output_length ) );
Gilles Peskine003a4a92019-05-14 16:09:40 +02003730
gabor-mezei-armceface22021-01-21 12:26:17 +01003731 TEST_ASSERT( input_data->len <=
3732 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( output_length ) );
3733
Ronald Cron5425a212020-08-04 14:58:35 +02003734 TEST_EQUAL( psa_aead_decrypt( key, alg,
Gilles Peskinefe11b722018-12-18 00:24:04 +01003735 nonce->x, nonce->len,
3736 additional_data->x,
3737 additional_data->len,
3738 output_data, output_length,
3739 output_data2, output_length,
Gilles Peskinef812dcf2018-12-18 00:33:25 +01003740 &output_length2 ),
3741 expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +02003742
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003743 ASSERT_COMPARE( input_data->x, input_data->len,
3744 output_data2, output_length2 );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003745 }
Gilles Peskine2d277862018-06-18 15:41:12 +02003746
Gilles Peskinea1cac842018-06-11 19:33:02 +02003747exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003748 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003749 mbedtls_free( output_data );
3750 mbedtls_free( output_data2 );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003751 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003752}
3753/* END_CASE */
3754
3755/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003756void aead_encrypt( int key_type_arg, data_t *key_data,
3757 int alg_arg,
3758 data_t *nonce,
3759 data_t *additional_data,
3760 data_t *input_data,
3761 data_t *expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003762{
Ronald Cron5425a212020-08-04 14:58:35 +02003763 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003764 psa_key_type_t key_type = key_type_arg;
3765 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003766 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003767 unsigned char *output_data = NULL;
3768 size_t output_size = 0;
3769 size_t output_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003770 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Steven Cooremand588ea12021-01-11 19:36:04 +01003771 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003772
Gilles Peskine8817f612018-12-18 00:18:46 +01003773 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003774
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003775 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
3776 psa_set_key_algorithm( &attributes, alg );
3777 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003778
Gilles Peskine049c7532019-05-15 20:22:09 +02003779 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003780 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003781 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3782 key_bits = psa_get_key_bits( &attributes );
3783
3784 output_size = input_data->len + PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3785 alg );
3786 /* For all currently defined algorithms, PSA_AEAD_ENCRYPT_OUTPUT_SIZE
3787 * should be exact. */
3788 TEST_EQUAL( output_size,
3789 PSA_AEAD_ENCRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3790 TEST_ASSERT( output_size <=
3791 PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3792 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003793
Steven Cooremand588ea12021-01-11 19:36:04 +01003794 status = psa_aead_encrypt( key, alg,
3795 nonce->x, nonce->len,
3796 additional_data->x, additional_data->len,
3797 input_data->x, input_data->len,
3798 output_data, output_size,
3799 &output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003800
Ronald Cron28a45ed2021-02-09 20:35:42 +01003801 /* If the operation is not supported, just skip and not fail in case the
3802 * encryption involves a common limitation of cryptography hardwares and
3803 * an alternative implementation. */
3804 if( status == PSA_ERROR_NOT_SUPPORTED )
Steven Cooremand588ea12021-01-11 19:36:04 +01003805 {
Ronald Cron28a45ed2021-02-09 20:35:42 +01003806 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3807 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
Steven Cooremand588ea12021-01-11 19:36:04 +01003808 }
Steven Cooremand588ea12021-01-11 19:36:04 +01003809
3810 PSA_ASSERT( status );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003811 ASSERT_COMPARE( expected_result->x, expected_result->len,
3812 output_data, output_length );
Gilles Peskine2d277862018-06-18 15:41:12 +02003813
Gilles Peskinea1cac842018-06-11 19:33:02 +02003814exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003815 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003816 mbedtls_free( output_data );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003817 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003818}
3819/* END_CASE */
3820
3821/* BEGIN_CASE */
Gilles Peskine7da96b02018-08-17 18:45:42 +02003822void aead_decrypt( int key_type_arg, data_t *key_data,
3823 int alg_arg,
3824 data_t *nonce,
3825 data_t *additional_data,
3826 data_t *input_data,
3827 data_t *expected_data,
3828 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +02003829{
Ronald Cron5425a212020-08-04 14:58:35 +02003830 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003831 psa_key_type_t key_type = key_type_arg;
3832 psa_algorithm_t alg = alg_arg;
Bence Szépkútiec174e22021-03-19 18:46:15 +01003833 size_t key_bits;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003834 unsigned char *output_data = NULL;
3835 size_t output_size = 0;
3836 size_t output_length = 0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003837 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine4abf7412018-06-18 16:35:34 +02003838 psa_status_t expected_result = expected_result_arg;
Steven Cooremand588ea12021-01-11 19:36:04 +01003839 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Gilles Peskinea1cac842018-06-11 19:33:02 +02003840
Gilles Peskine8817f612018-12-18 00:18:46 +01003841 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003842
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02003843 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
3844 psa_set_key_algorithm( &attributes, alg );
3845 psa_set_key_type( &attributes, key_type );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003846
Gilles Peskine049c7532019-05-15 20:22:09 +02003847 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02003848 &key ) );
Bence Szépkútiec174e22021-03-19 18:46:15 +01003849 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
3850 key_bits = psa_get_key_bits( &attributes );
3851
3852 output_size = input_data->len - PSA_AEAD_TAG_LENGTH( key_type, key_bits,
3853 alg );
3854 if( expected_result != PSA_ERROR_INVALID_ARGUMENT &&
3855 expected_result != PSA_ERROR_NOT_SUPPORTED )
3856 {
3857 /* For all currently defined algorithms, PSA_AEAD_DECRYPT_OUTPUT_SIZE
3858 * should be exact. */
3859 TEST_EQUAL( output_size,
3860 PSA_AEAD_DECRYPT_OUTPUT_SIZE( key_type, alg, input_data->len ) );
3861 TEST_ASSERT( output_size <=
3862 PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( input_data->len ) );
3863 }
3864 ASSERT_ALLOC( output_data, output_size );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003865
Steven Cooremand588ea12021-01-11 19:36:04 +01003866 status = psa_aead_decrypt( key, alg,
3867 nonce->x, nonce->len,
3868 additional_data->x,
3869 additional_data->len,
3870 input_data->x, input_data->len,
3871 output_data, output_size,
3872 &output_length );
3873
Ronald Cron28a45ed2021-02-09 20:35:42 +01003874 /* If the operation is not supported, just skip and not fail in case the
3875 * decryption involves a common limitation of cryptography hardwares and
3876 * an alternative implementation. */
3877 if( status == PSA_ERROR_NOT_SUPPORTED )
Steven Cooremand588ea12021-01-11 19:36:04 +01003878 {
Ronald Cron28a45ed2021-02-09 20:35:42 +01003879 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
3880 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
Steven Cooremand588ea12021-01-11 19:36:04 +01003881 }
Steven Cooremand588ea12021-01-11 19:36:04 +01003882
3883 TEST_EQUAL( status, expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003884
Gilles Peskine2d277862018-06-18 15:41:12 +02003885 if( expected_result == PSA_SUCCESS )
Gilles Peskinebd7dea92018-09-27 13:57:19 +02003886 ASSERT_COMPARE( expected_data->x, expected_data->len,
3887 output_data, output_length );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003888
Gilles Peskinea1cac842018-06-11 19:33:02 +02003889exit:
Ronald Cron5425a212020-08-04 14:58:35 +02003890 psa_destroy_key( key );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003891 mbedtls_free( output_data );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02003892 PSA_DONE( );
Gilles Peskinea1cac842018-06-11 19:33:02 +02003893}
3894/* END_CASE */
3895
3896/* BEGIN_CASE */
Paul Elliott0023e0a2021-04-27 10:06:22 +01003897void aead_multipart_encrypt( int key_type_arg, data_t *key_data,
3898 int alg_arg,
3899 data_t *nonce,
3900 data_t *additional_data,
Paul Elliott0023e0a2021-04-27 10:06:22 +01003901 data_t *input_data,
Paul Elliott97fd1ba2021-07-21 18:46:06 +01003902 int do_set_lengths,
3903 data_t *expected_output )
Paul Elliott0023e0a2021-04-27 10:06:22 +01003904{
Paul Elliottd3f82412021-06-16 16:52:21 +01003905 size_t ad_part_len = 0;
3906 size_t data_part_len = 0;
Paul Elliottbb979e72021-09-22 12:54:42 +01003907 set_lengths_method_t set_lengths_method = DO_NOT_SET_LENGTHS;
Paul Elliott0023e0a2021-04-27 10:06:22 +01003908
Paul Elliott32f46ba2021-09-23 18:24:36 +01003909 for( ad_part_len = 1; ad_part_len <= additional_data->len; ad_part_len++ )
Paul Elliott0023e0a2021-04-27 10:06:22 +01003910 {
Paul Elliott32f46ba2021-09-23 18:24:36 +01003911 mbedtls_test_set_step( ad_part_len );
3912
3913 if( do_set_lengths )
Paul Elliott0023e0a2021-04-27 10:06:22 +01003914 {
Paul Elliott32f46ba2021-09-23 18:24:36 +01003915 if( ad_part_len & 0x01 )
3916 set_lengths_method = SET_LENGTHS_AFTER_NONCE;
3917 else
3918 set_lengths_method = SET_LENGTHS_BEFORE_NONCE;
Paul Elliott0023e0a2021-04-27 10:06:22 +01003919 }
Paul Elliott32f46ba2021-09-23 18:24:36 +01003920
3921 /* Split ad into length(ad_part_len) parts. */
3922 if( !aead_multipart_internal_func( key_type_arg, key_data,
3923 alg_arg, nonce,
3924 additional_data,
3925 ad_part_len,
3926 input_data, -1,
3927 set_lengths_method,
3928 expected_output,
3929 1, 0 ) )
3930 break;
3931
3932 /* length(0) part, length(ad_part_len) part, length(0) part... */
3933 mbedtls_test_set_step( 1000 + ad_part_len );
3934
3935 if( !aead_multipart_internal_func( key_type_arg, key_data,
3936 alg_arg, nonce,
3937 additional_data,
3938 ad_part_len,
3939 input_data, -1,
3940 set_lengths_method,
3941 expected_output,
3942 1, 1 ) )
3943 break;
Paul Elliott0023e0a2021-04-27 10:06:22 +01003944 }
Paul Elliottd3f82412021-06-16 16:52:21 +01003945
Paul Elliott32f46ba2021-09-23 18:24:36 +01003946 for( data_part_len = 1; data_part_len <= input_data->len; data_part_len++ )
Paul Elliott0023e0a2021-04-27 10:06:22 +01003947 {
Paul Elliott32f46ba2021-09-23 18:24:36 +01003948 /* Split data into length(data_part_len) parts. */
3949 mbedtls_test_set_step( 2000 + data_part_len );
3950
3951 if( do_set_lengths )
Paul Elliott0023e0a2021-04-27 10:06:22 +01003952 {
Paul Elliott32f46ba2021-09-23 18:24:36 +01003953 if( data_part_len & 0x01 )
3954 set_lengths_method = SET_LENGTHS_AFTER_NONCE;
3955 else
3956 set_lengths_method = SET_LENGTHS_BEFORE_NONCE;
Paul Elliott0023e0a2021-04-27 10:06:22 +01003957 }
Paul Elliott0023e0a2021-04-27 10:06:22 +01003958
Paul Elliott32f46ba2021-09-23 18:24:36 +01003959 if( !aead_multipart_internal_func( key_type_arg, key_data,
3960 alg_arg, nonce,
3961 additional_data, -1,
3962 input_data, data_part_len,
3963 set_lengths_method,
3964 expected_output,
3965 1, 0 ) )
3966 break;
3967
3968 /* length(0) part, length(data_part_len) part, length(0) part... */
3969 mbedtls_test_set_step( 3000 + data_part_len );
3970
3971 if( !aead_multipart_internal_func( key_type_arg, key_data,
3972 alg_arg, nonce,
3973 additional_data, -1,
3974 input_data, data_part_len,
3975 set_lengths_method,
3976 expected_output,
3977 1, 1 ) )
3978 break;
3979 }
Paul Elliott0023e0a2021-04-27 10:06:22 +01003980
Paul Elliott8fc45162021-06-23 16:06:01 +01003981 /* Goto is required to silence warnings about unused labels, as we
3982 * don't actually do any test assertions in this function. */
3983 goto exit;
Paul Elliott0023e0a2021-04-27 10:06:22 +01003984}
3985/* END_CASE */
3986
3987/* BEGIN_CASE */
Paul Elliott0023e0a2021-04-27 10:06:22 +01003988void aead_multipart_decrypt( int key_type_arg, data_t *key_data,
3989 int alg_arg,
3990 data_t *nonce,
3991 data_t *additional_data,
Paul Elliott0023e0a2021-04-27 10:06:22 +01003992 data_t *input_data,
Paul Elliott97fd1ba2021-07-21 18:46:06 +01003993 int do_set_lengths,
Paul Elliott9961a662021-09-17 19:19:02 +01003994 data_t *expected_output )
Paul Elliott0023e0a2021-04-27 10:06:22 +01003995{
Paul Elliottd3f82412021-06-16 16:52:21 +01003996 size_t ad_part_len = 0;
3997 size_t data_part_len = 0;
Paul Elliottbb979e72021-09-22 12:54:42 +01003998 set_lengths_method_t set_lengths_method = DO_NOT_SET_LENGTHS;
Paul Elliott0023e0a2021-04-27 10:06:22 +01003999
Paul Elliott32f46ba2021-09-23 18:24:36 +01004000 for( ad_part_len = 1; ad_part_len <= additional_data->len; ad_part_len++ )
Paul Elliott0023e0a2021-04-27 10:06:22 +01004001 {
Paul Elliott32f46ba2021-09-23 18:24:36 +01004002 /* Split ad into length(ad_part_len) parts. */
4003 mbedtls_test_set_step( ad_part_len );
4004
4005 if( do_set_lengths )
Paul Elliott0023e0a2021-04-27 10:06:22 +01004006 {
Paul Elliott32f46ba2021-09-23 18:24:36 +01004007 if( ad_part_len & 0x01 )
4008 set_lengths_method = SET_LENGTHS_AFTER_NONCE;
4009 else
4010 set_lengths_method = SET_LENGTHS_BEFORE_NONCE;
Paul Elliott0023e0a2021-04-27 10:06:22 +01004011 }
Paul Elliott32f46ba2021-09-23 18:24:36 +01004012
4013 if( !aead_multipart_internal_func( key_type_arg, key_data,
4014 alg_arg, nonce,
4015 additional_data,
4016 ad_part_len,
4017 input_data, -1,
4018 set_lengths_method,
4019 expected_output,
4020 0, 0 ) )
4021 break;
4022
4023 /* length(0) part, length(ad_part_len) part, length(0) part... */
4024 mbedtls_test_set_step( 1000 + ad_part_len );
4025
4026 if( !aead_multipart_internal_func( key_type_arg, key_data,
4027 alg_arg, nonce,
4028 additional_data,
4029 ad_part_len,
4030 input_data, -1,
4031 set_lengths_method,
4032 expected_output,
4033 0, 1 ) )
4034 break;
Paul Elliott0023e0a2021-04-27 10:06:22 +01004035 }
4036
Paul Elliott32f46ba2021-09-23 18:24:36 +01004037 for( data_part_len = 1; data_part_len <= input_data->len; data_part_len++ )
Paul Elliott0023e0a2021-04-27 10:06:22 +01004038 {
Paul Elliott32f46ba2021-09-23 18:24:36 +01004039 /* Split data into length(data_part_len) parts. */
4040 mbedtls_test_set_step( 2000 + data_part_len );
4041
4042 if( do_set_lengths )
Paul Elliott0023e0a2021-04-27 10:06:22 +01004043 {
Paul Elliott32f46ba2021-09-23 18:24:36 +01004044 if( data_part_len & 0x01 )
4045 set_lengths_method = SET_LENGTHS_AFTER_NONCE;
4046 else
4047 set_lengths_method = SET_LENGTHS_BEFORE_NONCE;
Paul Elliott0023e0a2021-04-27 10:06:22 +01004048 }
Paul Elliott32f46ba2021-09-23 18:24:36 +01004049
4050 if( !aead_multipart_internal_func( key_type_arg, key_data,
4051 alg_arg, nonce,
4052 additional_data, -1,
4053 input_data, data_part_len,
4054 set_lengths_method,
4055 expected_output,
4056 0, 0 ) )
4057 break;
4058
4059 /* length(0) part, length(data_part_len) part, length(0) part... */
4060 mbedtls_test_set_step( 3000 + data_part_len );
4061
4062 if( !aead_multipart_internal_func( key_type_arg, key_data,
4063 alg_arg, nonce,
4064 additional_data, -1,
4065 input_data, data_part_len,
4066 set_lengths_method,
4067 expected_output,
4068 0, 1 ) )
4069 break;
Paul Elliott0023e0a2021-04-27 10:06:22 +01004070 }
4071
Paul Elliott8fc45162021-06-23 16:06:01 +01004072 /* Goto is required to silence warnings about unused labels, as we
4073 * don't actually do any test assertions in this function. */
Paul Elliottd3f82412021-06-16 16:52:21 +01004074 goto exit;
Paul Elliott0023e0a2021-04-27 10:06:22 +01004075}
4076/* END_CASE */
4077
4078/* BEGIN_CASE */
Paul Elliott8eb9daf2021-06-04 16:42:21 +01004079void aead_multipart_generate_nonce( int key_type_arg, data_t *key_data,
4080 int alg_arg,
Paul Elliottf1277632021-08-24 18:11:37 +01004081 int nonce_length,
4082 int expected_nonce_length_arg,
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004083 data_t *additional_data,
4084 data_t *input_data,
4085 int expected_status_arg )
Paul Elliott8eb9daf2021-06-04 16:42:21 +01004086{
4087
4088 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
4089 psa_key_type_t key_type = key_type_arg;
4090 psa_algorithm_t alg = alg_arg;
Paul Elliottfbb4c6d2021-09-22 16:44:21 +01004091 psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT;
Paul Elliott8eb9daf2021-06-04 16:42:21 +01004092 uint8_t nonce_buffer[PSA_AEAD_NONCE_MAX_SIZE];
4093 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4094 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
Paul Elliott693bf312021-07-23 17:40:41 +01004095 psa_status_t expected_status = expected_status_arg;
Paul Elliottf1277632021-08-24 18:11:37 +01004096 size_t actual_nonce_length = 0;
4097 size_t expected_nonce_length = expected_nonce_length_arg;
4098 unsigned char *output = NULL;
4099 unsigned char *ciphertext = NULL;
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004100 size_t output_size = 0;
Paul Elliottf1277632021-08-24 18:11:37 +01004101 size_t ciphertext_size = 0;
4102 size_t ciphertext_length = 0;
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004103 size_t tag_length = 0;
4104 uint8_t tag_buffer[PSA_AEAD_TAG_MAX_SIZE];
Paul Elliott8eb9daf2021-06-04 16:42:21 +01004105
4106 PSA_ASSERT( psa_crypto_init( ) );
4107
4108 psa_set_key_usage_flags( & attributes, PSA_KEY_USAGE_ENCRYPT );
4109 psa_set_key_algorithm( & attributes, alg );
4110 psa_set_key_type( & attributes, key_type );
4111
4112 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
4113 &key ) );
4114
4115 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
4116
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004117 output_size = PSA_AEAD_UPDATE_OUTPUT_SIZE( key_type, alg, input_data->len );
4118
Paul Elliottf1277632021-08-24 18:11:37 +01004119 ASSERT_ALLOC( output, output_size );
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004120
Paul Elliottf1277632021-08-24 18:11:37 +01004121 ciphertext_size = PSA_AEAD_FINISH_OUTPUT_SIZE( key_type, alg );
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004122
Paul Elliottf1277632021-08-24 18:11:37 +01004123 TEST_ASSERT( ciphertext_size <= PSA_AEAD_FINISH_OUTPUT_MAX_SIZE );
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004124
Paul Elliottf1277632021-08-24 18:11:37 +01004125 ASSERT_ALLOC( ciphertext, ciphertext_size );
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004126
Paul Elliott8eb9daf2021-06-04 16:42:21 +01004127 status = psa_aead_encrypt_setup( &operation, key, alg );
4128
4129 /* If the operation is not supported, just skip and not fail in case the
4130 * encryption involves a common limitation of cryptography hardwares and
4131 * an alternative implementation. */
4132 if( status == PSA_ERROR_NOT_SUPPORTED )
4133 {
4134 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
Paul Elliottf1277632021-08-24 18:11:37 +01004135 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce_length );
Paul Elliott8eb9daf2021-06-04 16:42:21 +01004136 }
4137
4138 PSA_ASSERT( status );
4139
Paul Elliott8eb9daf2021-06-04 16:42:21 +01004140 status = psa_aead_generate_nonce( &operation, nonce_buffer,
Paul Elliottf1277632021-08-24 18:11:37 +01004141 nonce_length,
4142 &actual_nonce_length );
Paul Elliott8eb9daf2021-06-04 16:42:21 +01004143
Paul Elliott693bf312021-07-23 17:40:41 +01004144 TEST_EQUAL( status, expected_status );
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004145
Paul Elliottf1277632021-08-24 18:11:37 +01004146 TEST_EQUAL( actual_nonce_length, expected_nonce_length );
Paul Elliottd85f5472021-07-16 18:20:16 +01004147
Paul Elliott88ecbe12021-09-22 17:23:03 +01004148 if( expected_status == PSA_SUCCESS )
4149 TEST_EQUAL( actual_nonce_length, PSA_AEAD_NONCE_LENGTH( key_type,
4150 alg ) );
4151
Paul Elliottd79c5c52021-10-06 21:49:41 +01004152 TEST_ASSERT( actual_nonce_length <= PSA_AEAD_NONCE_MAX_SIZE );
Paul Elliotte0fcb3b2021-07-16 18:52:03 +01004153
Paul Elliott693bf312021-07-23 17:40:41 +01004154 if( expected_status == PSA_SUCCESS )
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004155 {
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004156 /* Ensure we can still complete operation. */
Paul Elliottd79c5c52021-10-06 21:49:41 +01004157 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
4158 input_data->len ) );
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004159
4160 PSA_ASSERT( psa_aead_update_ad( &operation, additional_data->x,
4161 additional_data->len ) );
4162
4163 PSA_ASSERT( psa_aead_update( &operation, input_data->x, input_data->len,
Paul Elliottf1277632021-08-24 18:11:37 +01004164 output, output_size,
4165 &ciphertext_length ) );
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004166
Paul Elliottf1277632021-08-24 18:11:37 +01004167 PSA_ASSERT( psa_aead_finish( &operation, ciphertext, ciphertext_size,
4168 &ciphertext_length, tag_buffer,
Paul Elliott3bd5dba2021-06-23 17:14:40 +01004169 PSA_AEAD_TAG_MAX_SIZE, &tag_length ) );
4170 }
Paul Elliott8eb9daf2021-06-04 16:42:21 +01004171
4172exit:
4173 psa_destroy_key( key );
Paul Elliottf1277632021-08-24 18:11:37 +01004174 mbedtls_free( output );
4175 mbedtls_free( ciphertext );
Paul Elliott8eb9daf2021-06-04 16:42:21 +01004176 psa_aead_abort( &operation );
4177 PSA_DONE( );
4178}
4179/* END_CASE */
4180
4181/* BEGIN_CASE */
Paul Elliott863864a2021-07-23 17:28:31 +01004182void aead_multipart_set_nonce( int key_type_arg, data_t *key_data,
4183 int alg_arg,
Paul Elliott4023ffd2021-09-10 16:21:22 +01004184 int nonce_length_arg,
Andrzej Kureka2ce72e2021-12-25 17:21:47 +01004185 int set_lengths_method_arg,
Paul Elliott863864a2021-07-23 17:28:31 +01004186 data_t *additional_data,
4187 data_t *input_data,
4188 int expected_status_arg )
4189{
4190
4191 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
4192 psa_key_type_t key_type = key_type_arg;
4193 psa_algorithm_t alg = alg_arg;
Paul Elliottfbb4c6d2021-09-22 16:44:21 +01004194 psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT;
Paul Elliott863864a2021-07-23 17:28:31 +01004195 uint8_t *nonce_buffer = NULL;
4196 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4197 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
4198 psa_status_t expected_status = expected_status_arg;
Paul Elliott6f0e7202021-08-25 12:57:18 +01004199 unsigned char *output = NULL;
4200 unsigned char *ciphertext = NULL;
Paul Elliott4023ffd2021-09-10 16:21:22 +01004201 size_t nonce_length;
Paul Elliott863864a2021-07-23 17:28:31 +01004202 size_t output_size = 0;
Paul Elliott6f0e7202021-08-25 12:57:18 +01004203 size_t ciphertext_size = 0;
4204 size_t ciphertext_length = 0;
Paul Elliott863864a2021-07-23 17:28:31 +01004205 size_t tag_length = 0;
4206 uint8_t tag_buffer[PSA_AEAD_TAG_MAX_SIZE];
Paul Elliott4023ffd2021-09-10 16:21:22 +01004207 size_t index = 0;
Andrzej Kureka2ce72e2021-12-25 17:21:47 +01004208 set_lengths_method_t set_lengths_method = set_lengths_method_arg;
Paul Elliott863864a2021-07-23 17:28:31 +01004209
4210 PSA_ASSERT( psa_crypto_init( ) );
4211
4212 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
4213 psa_set_key_algorithm( &attributes, alg );
4214 psa_set_key_type( &attributes, key_type );
4215
4216 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
4217 &key ) );
4218
4219 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
4220
4221 output_size = PSA_AEAD_UPDATE_OUTPUT_SIZE( key_type, alg, input_data->len );
4222
Paul Elliott6f0e7202021-08-25 12:57:18 +01004223 ASSERT_ALLOC( output, output_size );
Paul Elliott863864a2021-07-23 17:28:31 +01004224
Paul Elliott6f0e7202021-08-25 12:57:18 +01004225 ciphertext_size = PSA_AEAD_FINISH_OUTPUT_SIZE( key_type, alg );
Paul Elliott863864a2021-07-23 17:28:31 +01004226
Paul Elliott6f0e7202021-08-25 12:57:18 +01004227 TEST_ASSERT( ciphertext_size <= PSA_AEAD_FINISH_OUTPUT_MAX_SIZE );
Paul Elliott863864a2021-07-23 17:28:31 +01004228
Paul Elliott6f0e7202021-08-25 12:57:18 +01004229 ASSERT_ALLOC( ciphertext, ciphertext_size );
Paul Elliott863864a2021-07-23 17:28:31 +01004230
Paul Elliott863864a2021-07-23 17:28:31 +01004231 status = psa_aead_encrypt_setup( &operation, key, alg );
4232
4233 /* If the operation is not supported, just skip and not fail in case the
4234 * encryption involves a common limitation of cryptography hardwares and
4235 * an alternative implementation. */
4236 if( status == PSA_ERROR_NOT_SUPPORTED )
4237 {
4238 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
Paul Elliott4023ffd2021-09-10 16:21:22 +01004239 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce_length_arg );
Paul Elliott863864a2021-07-23 17:28:31 +01004240 }
4241
4242 PSA_ASSERT( status );
4243
Paul Elliott4023ffd2021-09-10 16:21:22 +01004244 /* -1 == zero length and valid buffer, 0 = zero length and NULL buffer. */
4245 if( nonce_length_arg == -1 )
Paul Elliott863864a2021-07-23 17:28:31 +01004246 {
Paul Elliott5e69aa52021-08-25 17:24:37 +01004247 /* Arbitrary size buffer, to test zero length valid buffer. */
4248 ASSERT_ALLOC( nonce_buffer, 4 );
Paul Elliott4023ffd2021-09-10 16:21:22 +01004249 nonce_length = 0;
Paul Elliott66696b52021-08-16 18:42:41 +01004250 }
4251 else
4252 {
Paul Elliott4023ffd2021-09-10 16:21:22 +01004253 /* If length is zero, then this will return NULL. */
4254 nonce_length = ( size_t ) nonce_length_arg;
Paul Elliott6f0e7202021-08-25 12:57:18 +01004255 ASSERT_ALLOC( nonce_buffer, nonce_length );
Paul Elliott66696b52021-08-16 18:42:41 +01004256
Paul Elliott4023ffd2021-09-10 16:21:22 +01004257 if( nonce_buffer )
Paul Elliott66696b52021-08-16 18:42:41 +01004258 {
Paul Elliott4023ffd2021-09-10 16:21:22 +01004259 for( index = 0; index < nonce_length - 1; ++index )
4260 {
4261 nonce_buffer[index] = 'a' + index;
4262 }
Paul Elliott66696b52021-08-16 18:42:41 +01004263 }
Paul Elliott863864a2021-07-23 17:28:31 +01004264 }
4265
Andrzej Kureka2ce72e2021-12-25 17:21:47 +01004266 if( set_lengths_method == SET_LENGTHS_BEFORE_NONCE )
4267 {
4268 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
4269 input_data->len ) );
4270 }
4271
Paul Elliott6f0e7202021-08-25 12:57:18 +01004272 status = psa_aead_set_nonce( &operation, nonce_buffer, nonce_length );
Paul Elliott863864a2021-07-23 17:28:31 +01004273
Paul Elliott693bf312021-07-23 17:40:41 +01004274 TEST_EQUAL( status, expected_status );
Paul Elliott863864a2021-07-23 17:28:31 +01004275
4276 if( expected_status == PSA_SUCCESS )
4277 {
Andrzej Kureka2ce72e2021-12-25 17:21:47 +01004278 if( set_lengths_method == SET_LENGTHS_AFTER_NONCE )
4279 {
4280 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
4281 input_data->len ) );
4282 }
4283 if( operation.alg == PSA_ALG_CCM && set_lengths_method == DO_NOT_SET_LENGTHS )
4284 expected_status = PSA_ERROR_BAD_STATE;
Paul Elliott863864a2021-07-23 17:28:31 +01004285
Andrzej Kureka2ce72e2021-12-25 17:21:47 +01004286 /* Ensure we can still complete operation, unless it's CCM and we didn't set lengths. */
4287 TEST_EQUAL( psa_aead_update_ad( &operation, additional_data->x,
4288 additional_data->len ),
4289 expected_status );
Paul Elliott863864a2021-07-23 17:28:31 +01004290
Andrzej Kureka2ce72e2021-12-25 17:21:47 +01004291 TEST_EQUAL( psa_aead_update( &operation, input_data->x, input_data->len,
Paul Elliott6f0e7202021-08-25 12:57:18 +01004292 output, output_size,
Andrzej Kureka2ce72e2021-12-25 17:21:47 +01004293 &ciphertext_length ),
4294 expected_status );
Paul Elliott863864a2021-07-23 17:28:31 +01004295
Andrzej Kureka2ce72e2021-12-25 17:21:47 +01004296 TEST_EQUAL( psa_aead_finish( &operation, ciphertext, ciphertext_size,
Paul Elliott6f0e7202021-08-25 12:57:18 +01004297 &ciphertext_length, tag_buffer,
Andrzej Kureka2ce72e2021-12-25 17:21:47 +01004298 PSA_AEAD_TAG_MAX_SIZE, &tag_length ),
4299 expected_status );
Paul Elliott863864a2021-07-23 17:28:31 +01004300 }
4301
4302exit:
4303 psa_destroy_key( key );
Paul Elliott6f0e7202021-08-25 12:57:18 +01004304 mbedtls_free( output );
4305 mbedtls_free( ciphertext );
Paul Elliott863864a2021-07-23 17:28:31 +01004306 mbedtls_free( nonce_buffer );
4307 psa_aead_abort( &operation );
4308 PSA_DONE( );
4309}
4310/* END_CASE */
4311
4312/* BEGIN_CASE */
Paul Elliott43fbda62021-07-23 18:30:59 +01004313void aead_multipart_update_buffer_test( int key_type_arg, data_t *key_data,
4314 int alg_arg,
Paul Elliottc6d11d02021-09-01 12:04:23 +01004315 int output_size_arg,
Paul Elliott43fbda62021-07-23 18:30:59 +01004316 data_t *nonce,
4317 data_t *additional_data,
4318 data_t *input_data,
4319 int expected_status_arg )
4320{
4321
4322 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
4323 psa_key_type_t key_type = key_type_arg;
4324 psa_algorithm_t alg = alg_arg;
Paul Elliottfbb4c6d2021-09-22 16:44:21 +01004325 psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT;
Paul Elliott43fbda62021-07-23 18:30:59 +01004326 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4327 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
4328 psa_status_t expected_status = expected_status_arg;
Paul Elliottc6d11d02021-09-01 12:04:23 +01004329 unsigned char *output = NULL;
4330 unsigned char *ciphertext = NULL;
4331 size_t output_size = output_size_arg;
4332 size_t ciphertext_size = 0;
4333 size_t ciphertext_length = 0;
Paul Elliott43fbda62021-07-23 18:30:59 +01004334 size_t tag_length = 0;
4335 uint8_t tag_buffer[PSA_AEAD_TAG_MAX_SIZE];
4336
4337 PSA_ASSERT( psa_crypto_init( ) );
4338
4339 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
4340 psa_set_key_algorithm( &attributes, alg );
4341 psa_set_key_type( &attributes, key_type );
4342
4343 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
4344 &key ) );
4345
4346 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
4347
Paul Elliottc6d11d02021-09-01 12:04:23 +01004348 ASSERT_ALLOC( output, output_size );
Paul Elliott43fbda62021-07-23 18:30:59 +01004349
Paul Elliottc6d11d02021-09-01 12:04:23 +01004350 ciphertext_size = PSA_AEAD_FINISH_OUTPUT_SIZE( key_type, alg );
Paul Elliott43fbda62021-07-23 18:30:59 +01004351
Paul Elliottc6d11d02021-09-01 12:04:23 +01004352 ASSERT_ALLOC( ciphertext, ciphertext_size );
Paul Elliott43fbda62021-07-23 18:30:59 +01004353
Paul Elliott43fbda62021-07-23 18:30:59 +01004354 status = psa_aead_encrypt_setup( &operation, key, alg );
4355
4356 /* If the operation is not supported, just skip and not fail in case the
4357 * encryption involves a common limitation of cryptography hardwares and
4358 * an alternative implementation. */
4359 if( status == PSA_ERROR_NOT_SUPPORTED )
4360 {
4361 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
4362 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
4363 }
4364
4365 PSA_ASSERT( status );
4366
Paul Elliott47b9a142021-10-07 15:04:57 +01004367 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
4368 input_data->len ) );
4369
Paul Elliott43fbda62021-07-23 18:30:59 +01004370 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
4371
4372 PSA_ASSERT( psa_aead_update_ad( &operation, additional_data->x,
4373 additional_data->len ) );
4374
4375 status = psa_aead_update( &operation, input_data->x, input_data->len,
Paul Elliottc6d11d02021-09-01 12:04:23 +01004376 output, output_size, &ciphertext_length );
Paul Elliott43fbda62021-07-23 18:30:59 +01004377
4378 TEST_EQUAL( status, expected_status );
4379
4380 if( expected_status == PSA_SUCCESS )
4381 {
4382 /* Ensure we can still complete operation. */
Paul Elliottc6d11d02021-09-01 12:04:23 +01004383 PSA_ASSERT( psa_aead_finish( &operation, ciphertext, ciphertext_size,
4384 &ciphertext_length, tag_buffer,
Paul Elliott43fbda62021-07-23 18:30:59 +01004385 PSA_AEAD_TAG_MAX_SIZE, &tag_length ) );
4386 }
4387
4388exit:
4389 psa_destroy_key( key );
Paul Elliottc6d11d02021-09-01 12:04:23 +01004390 mbedtls_free( output );
4391 mbedtls_free( ciphertext );
Paul Elliott43fbda62021-07-23 18:30:59 +01004392 psa_aead_abort( &operation );
4393 PSA_DONE( );
4394}
4395/* END_CASE */
4396
Paul Elliott91b021e2021-07-23 18:52:31 +01004397/* BEGIN_CASE */
4398void aead_multipart_finish_buffer_test( int key_type_arg, data_t *key_data,
4399 int alg_arg,
Paul Elliotte58cb1e2021-09-10 18:36:00 +01004400 int finish_ciphertext_size_arg,
Paul Elliott719c1322021-09-13 18:27:22 +01004401 int tag_size_arg,
Paul Elliott91b021e2021-07-23 18:52:31 +01004402 data_t *nonce,
4403 data_t *additional_data,
4404 data_t *input_data,
4405 int expected_status_arg )
4406{
4407
4408 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
4409 psa_key_type_t key_type = key_type_arg;
4410 psa_algorithm_t alg = alg_arg;
Paul Elliottfbb4c6d2021-09-22 16:44:21 +01004411 psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT;
Paul Elliott91b021e2021-07-23 18:52:31 +01004412 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4413 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
4414 psa_status_t expected_status = expected_status_arg;
Paul Elliotte58cb1e2021-09-10 18:36:00 +01004415 unsigned char *ciphertext = NULL;
4416 unsigned char *finish_ciphertext = NULL;
Paul Elliott719c1322021-09-13 18:27:22 +01004417 unsigned char *tag_buffer = NULL;
Paul Elliotte58cb1e2021-09-10 18:36:00 +01004418 size_t ciphertext_size = 0;
4419 size_t ciphertext_length = 0;
4420 size_t finish_ciphertext_size = ( size_t ) finish_ciphertext_size_arg;
Paul Elliott719c1322021-09-13 18:27:22 +01004421 size_t tag_size = ( size_t ) tag_size_arg;
Paul Elliott91b021e2021-07-23 18:52:31 +01004422 size_t tag_length = 0;
Paul Elliott91b021e2021-07-23 18:52:31 +01004423
4424 PSA_ASSERT( psa_crypto_init( ) );
4425
4426 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
4427 psa_set_key_algorithm( &attributes, alg );
4428 psa_set_key_type( &attributes, key_type );
4429
4430 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
4431 &key ) );
4432
4433 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
4434
Paul Elliotte58cb1e2021-09-10 18:36:00 +01004435 ciphertext_size = PSA_AEAD_UPDATE_OUTPUT_SIZE( key_type, alg, input_data->len );
Paul Elliott91b021e2021-07-23 18:52:31 +01004436
Paul Elliotte58cb1e2021-09-10 18:36:00 +01004437 ASSERT_ALLOC( ciphertext, ciphertext_size );
Paul Elliott91b021e2021-07-23 18:52:31 +01004438
Paul Elliotte58cb1e2021-09-10 18:36:00 +01004439 ASSERT_ALLOC( finish_ciphertext, finish_ciphertext_size );
Paul Elliott91b021e2021-07-23 18:52:31 +01004440
Paul Elliott719c1322021-09-13 18:27:22 +01004441 ASSERT_ALLOC( tag_buffer, tag_size );
4442
Paul Elliott91b021e2021-07-23 18:52:31 +01004443 status = psa_aead_encrypt_setup( &operation, key, alg );
4444
4445 /* If the operation is not supported, just skip and not fail in case the
4446 * encryption involves a common limitation of cryptography hardwares and
4447 * an alternative implementation. */
4448 if( status == PSA_ERROR_NOT_SUPPORTED )
4449 {
4450 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
4451 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
4452 }
4453
4454 PSA_ASSERT( status );
4455
4456 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
4457
Paul Elliott76bda482021-10-07 17:07:23 +01004458 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
4459 input_data->len ) );
4460
Paul Elliott91b021e2021-07-23 18:52:31 +01004461 PSA_ASSERT( psa_aead_update_ad( &operation, additional_data->x,
4462 additional_data->len ) );
4463
4464 PSA_ASSERT( psa_aead_update( &operation, input_data->x, input_data->len,
Paul Elliotte58cb1e2021-09-10 18:36:00 +01004465 ciphertext, ciphertext_size, &ciphertext_length ) );
Paul Elliott91b021e2021-07-23 18:52:31 +01004466
4467 /* Ensure we can still complete operation. */
Paul Elliotte58cb1e2021-09-10 18:36:00 +01004468 status = psa_aead_finish( &operation, finish_ciphertext,
4469 finish_ciphertext_size,
4470 &ciphertext_length, tag_buffer,
Paul Elliott719c1322021-09-13 18:27:22 +01004471 tag_size, &tag_length );
Paul Elliott91b021e2021-07-23 18:52:31 +01004472
4473 TEST_EQUAL( status, expected_status );
4474
4475exit:
4476 psa_destroy_key( key );
Paul Elliotte58cb1e2021-09-10 18:36:00 +01004477 mbedtls_free( ciphertext );
4478 mbedtls_free( finish_ciphertext );
Paul Elliott4a760882021-09-20 09:42:21 +01004479 mbedtls_free( tag_buffer );
Paul Elliott91b021e2021-07-23 18:52:31 +01004480 psa_aead_abort( &operation );
4481 PSA_DONE( );
4482}
4483/* END_CASE */
Paul Elliott43fbda62021-07-23 18:30:59 +01004484
4485/* BEGIN_CASE */
Paul Elliott9961a662021-09-17 19:19:02 +01004486void aead_multipart_verify( int key_type_arg, data_t *key_data,
4487 int alg_arg,
4488 data_t *nonce,
4489 data_t *additional_data,
4490 data_t *input_data,
4491 data_t *tag,
Paul Elliott1c67e0b2021-09-19 13:11:50 +01004492 int tag_usage_arg,
Andrzej Kurekf8816012021-12-19 17:00:12 +01004493 int expected_setup_status_arg,
Paul Elliott9961a662021-09-17 19:19:02 +01004494 int expected_status_arg )
4495{
4496 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
4497 psa_key_type_t key_type = key_type_arg;
4498 psa_algorithm_t alg = alg_arg;
Paul Elliottfbb4c6d2021-09-22 16:44:21 +01004499 psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT;
Paul Elliott9961a662021-09-17 19:19:02 +01004500 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4501 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
4502 psa_status_t expected_status = expected_status_arg;
Andrzej Kurekf8816012021-12-19 17:00:12 +01004503 psa_status_t expected_setup_status = expected_setup_status_arg;
Paul Elliott9961a662021-09-17 19:19:02 +01004504 unsigned char *plaintext = NULL;
4505 unsigned char *finish_plaintext = NULL;
4506 size_t plaintext_size = 0;
4507 size_t plaintext_length = 0;
4508 size_t verify_plaintext_size = 0;
Paul Elliottbb979e72021-09-22 12:54:42 +01004509 tag_usage_method_t tag_usage = tag_usage_arg;
Paul Elliott1c67e0b2021-09-19 13:11:50 +01004510 unsigned char *tag_buffer = NULL;
4511 size_t tag_size = 0;
Paul Elliott9961a662021-09-17 19:19:02 +01004512
4513 PSA_ASSERT( psa_crypto_init( ) );
4514
4515 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
4516 psa_set_key_algorithm( &attributes, alg );
4517 psa_set_key_type( &attributes, key_type );
4518
4519 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
4520 &key ) );
4521
4522 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
4523
4524 plaintext_size = PSA_AEAD_UPDATE_OUTPUT_SIZE( key_type, alg,
4525 input_data->len );
4526
4527 ASSERT_ALLOC( plaintext, plaintext_size );
4528
4529 verify_plaintext_size = PSA_AEAD_VERIFY_OUTPUT_SIZE( key_type, alg );
4530
4531 ASSERT_ALLOC( finish_plaintext, verify_plaintext_size );
4532
Paul Elliott9961a662021-09-17 19:19:02 +01004533 status = psa_aead_decrypt_setup( &operation, key, alg );
4534
4535 /* If the operation is not supported, just skip and not fail in case the
4536 * encryption involves a common limitation of cryptography hardwares and
4537 * an alternative implementation. */
4538 if( status == PSA_ERROR_NOT_SUPPORTED )
4539 {
4540 MBEDTLS_TEST_PSA_SKIP_IF_ALT_AES_192( key_type, key_data->len * 8 );
4541 MBEDTLS_TEST_PSA_SKIP_IF_ALT_GCM_NOT_12BYTES_NONCE( alg, nonce->len );
4542 }
Andrzej Kurekf8816012021-12-19 17:00:12 +01004543 TEST_EQUAL( status, expected_setup_status );
4544
4545 if( status != PSA_SUCCESS )
4546 goto exit;
Paul Elliott9961a662021-09-17 19:19:02 +01004547
4548 PSA_ASSERT( status );
4549
4550 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
4551
Paul Elliottfec6f372021-10-06 17:15:02 +01004552 status = psa_aead_set_lengths( &operation, additional_data->len,
4553 input_data->len );
Andrzej Kurekf8816012021-12-19 17:00:12 +01004554 PSA_ASSERT( status );
Paul Elliottfec6f372021-10-06 17:15:02 +01004555
Paul Elliott9961a662021-09-17 19:19:02 +01004556 PSA_ASSERT( psa_aead_update_ad( &operation, additional_data->x,
4557 additional_data->len ) );
4558
4559 PSA_ASSERT( psa_aead_update( &operation, input_data->x,
4560 input_data->len,
4561 plaintext, plaintext_size,
4562 &plaintext_length ) );
4563
Paul Elliott1c67e0b2021-09-19 13:11:50 +01004564 if( tag_usage == USE_GIVEN_TAG )
4565 {
4566 tag_buffer = tag->x;
4567 tag_size = tag->len;
4568 }
4569
Paul Elliott9961a662021-09-17 19:19:02 +01004570 status = psa_aead_verify( &operation, finish_plaintext,
4571 verify_plaintext_size,
4572 &plaintext_length,
Paul Elliott1c67e0b2021-09-19 13:11:50 +01004573 tag_buffer, tag_size );
Paul Elliott9961a662021-09-17 19:19:02 +01004574
4575 TEST_EQUAL( status, expected_status );
4576
4577exit:
4578 psa_destroy_key( key );
4579 mbedtls_free( plaintext );
4580 mbedtls_free( finish_plaintext );
4581 psa_aead_abort( &operation );
4582 PSA_DONE( );
4583}
4584/* END_CASE */
4585
Paul Elliott9961a662021-09-17 19:19:02 +01004586/* BEGIN_CASE */
Paul Elliott5221ef62021-09-19 17:33:03 +01004587void aead_multipart_setup( int key_type_arg, data_t *key_data,
4588 int alg_arg, int expected_status_arg )
4589{
4590 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
4591 psa_key_type_t key_type = key_type_arg;
4592 psa_algorithm_t alg = alg_arg;
Paul Elliottfbb4c6d2021-09-22 16:44:21 +01004593 psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT;
Paul Elliott5221ef62021-09-19 17:33:03 +01004594 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4595 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
4596 psa_status_t expected_status = expected_status_arg;
4597
4598 PSA_ASSERT( psa_crypto_init( ) );
4599
4600 psa_set_key_usage_flags( &attributes,
4601 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
4602 psa_set_key_algorithm( &attributes, alg );
4603 psa_set_key_type( &attributes, key_type );
4604
4605 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
4606 &key ) );
4607
Paul Elliott5221ef62021-09-19 17:33:03 +01004608 status = psa_aead_encrypt_setup( &operation, key, alg );
4609
4610 TEST_EQUAL( status, expected_status );
4611
4612 psa_aead_abort( &operation );
4613
Paul Elliott5221ef62021-09-19 17:33:03 +01004614 status = psa_aead_decrypt_setup( &operation, key, alg );
4615
4616 TEST_EQUAL(status, expected_status );
4617
4618exit:
4619 psa_destroy_key( key );
4620 psa_aead_abort( &operation );
4621 PSA_DONE( );
4622}
4623/* END_CASE */
4624
4625/* BEGIN_CASE */
Paul Elliottc23a9a02021-06-21 18:32:46 +01004626void aead_multipart_state_test( int key_type_arg, data_t *key_data,
4627 int alg_arg,
4628 data_t *nonce,
4629 data_t *additional_data,
4630 data_t *input_data )
4631{
4632 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
4633 psa_key_type_t key_type = key_type_arg;
4634 psa_algorithm_t alg = alg_arg;
Paul Elliottfbb4c6d2021-09-22 16:44:21 +01004635 psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT;
Paul Elliottc23a9a02021-06-21 18:32:46 +01004636 unsigned char *output_data = NULL;
4637 unsigned char *final_data = NULL;
4638 size_t output_size = 0;
4639 size_t finish_output_size = 0;
4640 size_t output_length = 0;
4641 size_t key_bits = 0;
4642 size_t tag_length = 0;
4643 size_t tag_size = 0;
4644 size_t nonce_length = 0;
4645 uint8_t nonce_buffer[PSA_AEAD_NONCE_MAX_SIZE];
4646 uint8_t tag_buffer[PSA_AEAD_TAG_MAX_SIZE];
4647 size_t output_part_length = 0;
4648 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
4649
4650 PSA_ASSERT( psa_crypto_init( ) );
4651
4652 psa_set_key_usage_flags( & attributes,
4653 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
4654 psa_set_key_algorithm( & attributes, alg );
4655 psa_set_key_type( & attributes, key_type );
4656
4657 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
4658 &key ) );
4659
4660 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
4661 key_bits = psa_get_key_bits( &attributes );
4662
4663 tag_length = PSA_AEAD_TAG_LENGTH( key_type, key_bits, alg );
4664
4665 TEST_ASSERT( tag_length <= PSA_AEAD_TAG_MAX_SIZE );
4666
4667 output_size = PSA_AEAD_UPDATE_OUTPUT_SIZE( key_type, alg, input_data->len );
4668
4669 ASSERT_ALLOC( output_data, output_size );
4670
4671 finish_output_size = PSA_AEAD_FINISH_OUTPUT_SIZE( key_type, alg );
4672
4673 TEST_ASSERT( finish_output_size <= PSA_AEAD_FINISH_OUTPUT_MAX_SIZE );
4674
4675 ASSERT_ALLOC( final_data, finish_output_size );
4676
4677 /* Test all operations error without calling setup first. */
4678
Paul Elliottc23a9a02021-06-21 18:32:46 +01004679 TEST_EQUAL( psa_aead_set_nonce( &operation, nonce->x, nonce->len ),
4680 PSA_ERROR_BAD_STATE );
4681
4682 psa_aead_abort( &operation );
4683
Paul Elliottc23a9a02021-06-21 18:32:46 +01004684 TEST_EQUAL( psa_aead_generate_nonce( &operation, nonce_buffer,
4685 PSA_AEAD_NONCE_MAX_SIZE,
4686 &nonce_length ),
4687 PSA_ERROR_BAD_STATE );
4688
4689 psa_aead_abort( &operation );
4690
Paul Elliott481be342021-07-16 17:38:47 +01004691 /* ------------------------------------------------------- */
4692
Paul Elliottc23a9a02021-06-21 18:32:46 +01004693 TEST_EQUAL( psa_aead_set_lengths( &operation, additional_data->len,
4694 input_data->len ),
4695 PSA_ERROR_BAD_STATE );
4696
4697 psa_aead_abort( &operation );
4698
Paul Elliott481be342021-07-16 17:38:47 +01004699 /* ------------------------------------------------------- */
4700
Paul Elliottc23a9a02021-06-21 18:32:46 +01004701 TEST_EQUAL( psa_aead_update_ad( &operation, additional_data->x,
4702 additional_data->len ),
4703 PSA_ERROR_BAD_STATE );
4704
4705 psa_aead_abort( &operation );
4706
Paul Elliott481be342021-07-16 17:38:47 +01004707 /* ------------------------------------------------------- */
4708
Paul Elliottc23a9a02021-06-21 18:32:46 +01004709 TEST_EQUAL( psa_aead_update( &operation, input_data->x,
4710 input_data->len, output_data,
4711 output_size, &output_length ),
4712 PSA_ERROR_BAD_STATE );
4713
4714 psa_aead_abort( &operation );
4715
Paul Elliott481be342021-07-16 17:38:47 +01004716 /* ------------------------------------------------------- */
4717
Paul Elliottc23a9a02021-06-21 18:32:46 +01004718 TEST_EQUAL( psa_aead_finish( &operation, final_data,
4719 finish_output_size,
4720 &output_part_length,
4721 tag_buffer, tag_length,
4722 &tag_size ),
4723 PSA_ERROR_BAD_STATE );
4724
4725 psa_aead_abort( &operation );
4726
Paul Elliott481be342021-07-16 17:38:47 +01004727 /* ------------------------------------------------------- */
4728
Paul Elliottc23a9a02021-06-21 18:32:46 +01004729 TEST_EQUAL( psa_aead_verify( &operation, final_data,
4730 finish_output_size,
4731 &output_part_length,
4732 tag_buffer,
4733 tag_length ),
4734 PSA_ERROR_BAD_STATE );
4735
4736 psa_aead_abort( &operation );
4737
4738 /* Test for double setups. */
4739
Paul Elliottc23a9a02021-06-21 18:32:46 +01004740 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4741
4742 TEST_EQUAL( psa_aead_encrypt_setup( &operation, key, alg ),
4743 PSA_ERROR_BAD_STATE );
4744
4745 psa_aead_abort( &operation );
4746
Paul Elliott481be342021-07-16 17:38:47 +01004747 /* ------------------------------------------------------- */
4748
Paul Elliottc23a9a02021-06-21 18:32:46 +01004749 PSA_ASSERT( psa_aead_decrypt_setup( &operation, key, alg ) );
4750
4751 TEST_EQUAL( psa_aead_decrypt_setup( &operation, key, alg ),
4752 PSA_ERROR_BAD_STATE );
4753
4754 psa_aead_abort( &operation );
4755
Paul Elliott374a2be2021-07-16 17:53:40 +01004756 /* ------------------------------------------------------- */
4757
Paul Elliott374a2be2021-07-16 17:53:40 +01004758 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4759
4760 TEST_EQUAL( psa_aead_decrypt_setup( &operation, key, alg ),
4761 PSA_ERROR_BAD_STATE );
4762
4763 psa_aead_abort( &operation );
4764
4765 /* ------------------------------------------------------- */
4766
Paul Elliott374a2be2021-07-16 17:53:40 +01004767 PSA_ASSERT( psa_aead_decrypt_setup( &operation, key, alg ) );
4768
4769 TEST_EQUAL( psa_aead_encrypt_setup( &operation, key, alg ),
4770 PSA_ERROR_BAD_STATE );
4771
4772 psa_aead_abort( &operation );
4773
Paul Elliottc23a9a02021-06-21 18:32:46 +01004774 /* Test for not setting a nonce. */
4775
Paul Elliottc23a9a02021-06-21 18:32:46 +01004776 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4777
4778 TEST_EQUAL( psa_aead_update_ad( &operation, additional_data->x,
4779 additional_data->len ),
4780 PSA_ERROR_BAD_STATE );
4781
4782 psa_aead_abort( &operation );
4783
Paul Elliott7f628422021-09-01 12:08:29 +01004784 /* ------------------------------------------------------- */
4785
Paul Elliott7f628422021-09-01 12:08:29 +01004786 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4787
4788 TEST_EQUAL( psa_aead_update( &operation, input_data->x,
4789 input_data->len, output_data,
4790 output_size, &output_length ),
4791 PSA_ERROR_BAD_STATE );
4792
4793 psa_aead_abort( &operation );
4794
Paul Elliottbdc2c682021-09-21 18:37:10 +01004795 /* ------------------------------------------------------- */
4796
Paul Elliottbdc2c682021-09-21 18:37:10 +01004797 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4798
4799 TEST_EQUAL( psa_aead_finish( &operation, final_data,
4800 finish_output_size,
4801 &output_part_length,
4802 tag_buffer, tag_length,
4803 &tag_size ),
4804 PSA_ERROR_BAD_STATE );
4805
4806 psa_aead_abort( &operation );
4807
4808 /* ------------------------------------------------------- */
4809
Paul Elliottbdc2c682021-09-21 18:37:10 +01004810 PSA_ASSERT( psa_aead_decrypt_setup( &operation, key, alg ) );
4811
4812 TEST_EQUAL( psa_aead_verify( &operation, final_data,
4813 finish_output_size,
4814 &output_part_length,
4815 tag_buffer,
4816 tag_length ),
4817 PSA_ERROR_BAD_STATE );
4818
4819 psa_aead_abort( &operation );
4820
Paul Elliottc23a9a02021-06-21 18:32:46 +01004821 /* Test for double setting nonce. */
4822
Paul Elliottc23a9a02021-06-21 18:32:46 +01004823 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4824
4825 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
4826
4827 TEST_EQUAL( psa_aead_set_nonce( &operation, nonce->x, nonce->len ),
4828 PSA_ERROR_BAD_STATE );
4829
4830 psa_aead_abort( &operation );
4831
Paul Elliott374a2be2021-07-16 17:53:40 +01004832 /* Test for double generating nonce. */
4833
Paul Elliott374a2be2021-07-16 17:53:40 +01004834 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4835
4836 PSA_ASSERT( psa_aead_generate_nonce( &operation, nonce_buffer,
4837 PSA_AEAD_NONCE_MAX_SIZE,
4838 &nonce_length ) );
4839
4840 TEST_EQUAL( psa_aead_generate_nonce( &operation, nonce_buffer,
4841 PSA_AEAD_NONCE_MAX_SIZE,
4842 &nonce_length ),
4843 PSA_ERROR_BAD_STATE );
4844
4845
4846 psa_aead_abort( &operation );
4847
4848 /* Test for generate nonce then set and vice versa */
4849
Paul Elliott374a2be2021-07-16 17:53:40 +01004850 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4851
4852 PSA_ASSERT( psa_aead_generate_nonce( &operation, nonce_buffer,
4853 PSA_AEAD_NONCE_MAX_SIZE,
4854 &nonce_length ) );
4855
4856 TEST_EQUAL( psa_aead_set_nonce( &operation, nonce->x, nonce->len ),
4857 PSA_ERROR_BAD_STATE );
4858
4859 psa_aead_abort( &operation );
4860
Andrzej Kurekad837522021-12-15 15:28:49 +01004861 /* Test for generating nonce after calling set lengths */
4862
4863 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4864
4865 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
4866 input_data->len ) );
4867
4868 PSA_ASSERT( psa_aead_generate_nonce( &operation, nonce_buffer,
4869 PSA_AEAD_NONCE_MAX_SIZE,
4870 &nonce_length ) );
4871
4872 psa_aead_abort( &operation );
4873
Andrzej Kurek031df4a2022-01-19 12:44:49 -05004874 /* Test for generating nonce after calling set lengths with UINT32_MAX ad_data length */
Andrzej Kurekad837522021-12-15 15:28:49 +01004875
4876 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4877
4878 if( operation.alg == PSA_ALG_CCM )
4879 {
4880 TEST_EQUAL( psa_aead_set_lengths( &operation, UINT32_MAX,
4881 input_data->len ),
4882 PSA_ERROR_INVALID_ARGUMENT );
4883 TEST_EQUAL( psa_aead_generate_nonce( &operation, nonce_buffer,
4884 PSA_AEAD_NONCE_MAX_SIZE,
4885 &nonce_length ),
4886 PSA_ERROR_BAD_STATE );
4887 }
4888 else
4889 {
4890 PSA_ASSERT( psa_aead_set_lengths( &operation, UINT32_MAX,
4891 input_data->len ) );
4892 PSA_ASSERT( psa_aead_generate_nonce( &operation, nonce_buffer,
4893 PSA_AEAD_NONCE_MAX_SIZE,
4894 &nonce_length ) );
4895 }
4896
4897 psa_aead_abort( &operation );
4898
Andrzej Kurek031df4a2022-01-19 12:44:49 -05004899 /* Test for generating nonce after calling set lengths with SIZE_MAX ad_data length */
Andrzej Kurekad837522021-12-15 15:28:49 +01004900#if SIZE_MAX > UINT32_MAX
4901 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4902
4903 if( operation.alg == PSA_ALG_CCM || operation.alg == PSA_ALG_GCM )
4904 {
4905 TEST_EQUAL( psa_aead_set_lengths( &operation, SIZE_MAX,
4906 input_data->len ),
4907 PSA_ERROR_INVALID_ARGUMENT );
4908 TEST_EQUAL( psa_aead_generate_nonce( &operation, nonce_buffer,
4909 PSA_AEAD_NONCE_MAX_SIZE,
4910 &nonce_length ),
4911 PSA_ERROR_BAD_STATE );
4912 }
4913 else
4914 {
4915 PSA_ASSERT( psa_aead_set_lengths( &operation, SIZE_MAX,
4916 input_data->len ) );
4917 PSA_ASSERT( psa_aead_generate_nonce( &operation, nonce_buffer,
4918 PSA_AEAD_NONCE_MAX_SIZE,
4919 &nonce_length ) );
4920 }
4921
4922 psa_aead_abort( &operation );
4923#endif
4924
Andrzej Kurek031df4a2022-01-19 12:44:49 -05004925 /* Test for calling set lengths with a UINT32_MAX ad_data length, after generating nonce */
Andrzej Kurekad837522021-12-15 15:28:49 +01004926
4927 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4928
4929 PSA_ASSERT( psa_aead_generate_nonce( &operation, nonce_buffer,
4930 PSA_AEAD_NONCE_MAX_SIZE,
4931 &nonce_length ) );
4932
4933 if( operation.alg == PSA_ALG_CCM )
4934 {
4935 TEST_EQUAL( psa_aead_set_lengths( &operation, UINT32_MAX,
4936 input_data->len ),
4937 PSA_ERROR_INVALID_ARGUMENT );
4938 }
4939 else
4940 {
4941 PSA_ASSERT( psa_aead_set_lengths( &operation, UINT32_MAX,
4942 input_data->len ) );
4943 }
4944
4945 psa_aead_abort( &operation );
4946
Andrzej Kureke5f94fb2021-12-26 01:00:20 +01004947 /* ------------------------------------------------------- */
Andrzej Kurek1e8e1742021-12-25 23:50:53 +01004948 /* Test for setting nonce after calling set lengths */
4949
4950 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4951
4952 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
4953 input_data->len ) );
4954
4955 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
4956
4957 psa_aead_abort( &operation );
4958
Andrzej Kureke5f94fb2021-12-26 01:00:20 +01004959 /* Test for setting nonce after calling set lengths with UINT32_MAX ad_data length */
Andrzej Kurek1e8e1742021-12-25 23:50:53 +01004960
4961 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4962
4963 if( operation.alg == PSA_ALG_CCM )
4964 {
4965 TEST_EQUAL( psa_aead_set_lengths( &operation, UINT32_MAX,
4966 input_data->len ),
4967 PSA_ERROR_INVALID_ARGUMENT );
4968 TEST_EQUAL( psa_aead_set_nonce( &operation, nonce->x, nonce->len ),
4969 PSA_ERROR_BAD_STATE );
4970 }
4971 else
4972 {
4973 PSA_ASSERT( psa_aead_set_lengths( &operation, UINT32_MAX,
4974 input_data->len ) );
4975 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
4976 }
4977
4978 psa_aead_abort( &operation );
4979
Andrzej Kureke5f94fb2021-12-26 01:00:20 +01004980 /* Test for setting nonce after calling set lengths with SIZE_MAX ad_data length */
Andrzej Kurek1e8e1742021-12-25 23:50:53 +01004981#if SIZE_MAX > UINT32_MAX
4982 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
4983
4984 if( operation.alg == PSA_ALG_CCM || operation.alg == PSA_ALG_GCM )
4985 {
4986 TEST_EQUAL( psa_aead_set_lengths( &operation, SIZE_MAX,
4987 input_data->len ),
4988 PSA_ERROR_INVALID_ARGUMENT );
4989 TEST_EQUAL( psa_aead_set_nonce( &operation, nonce->x, nonce->len ),
4990 PSA_ERROR_BAD_STATE );
4991 }
4992 else
4993 {
4994 PSA_ASSERT( psa_aead_set_lengths( &operation, SIZE_MAX,
4995 input_data->len ) );
4996 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
4997 }
4998
4999 psa_aead_abort( &operation );
5000#endif
5001
Andrzej Kurek031df4a2022-01-19 12:44:49 -05005002 /* Test for calling set lengths with an ad_data length of UINT32_MAX, after setting nonce */
Andrzej Kurek1e8e1742021-12-25 23:50:53 +01005003
5004 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5005
5006 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5007
5008 if( operation.alg == PSA_ALG_CCM )
5009 {
5010 TEST_EQUAL( psa_aead_set_lengths( &operation, UINT32_MAX,
5011 input_data->len ),
5012 PSA_ERROR_INVALID_ARGUMENT );
5013 }
5014 else
5015 {
5016 PSA_ASSERT( psa_aead_set_lengths( &operation, UINT32_MAX,
5017 input_data->len ) );
5018 }
5019
5020 psa_aead_abort( &operation );
Andrzej Kurekad837522021-12-15 15:28:49 +01005021
Andrzej Kurek031df4a2022-01-19 12:44:49 -05005022 /* Test for setting nonce after calling set lengths with plaintext length of SIZE_MAX */
Andrzej Kureke5f94fb2021-12-26 01:00:20 +01005023#if SIZE_MAX > UINT32_MAX
5024 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5025
5026 if( operation.alg == PSA_ALG_GCM )
5027 {
5028 TEST_EQUAL( psa_aead_set_lengths( &operation, additional_data->len,
5029 SIZE_MAX ),
5030 PSA_ERROR_INVALID_ARGUMENT );
5031 TEST_EQUAL( psa_aead_set_nonce( &operation, nonce->x, nonce->len ),
5032 PSA_ERROR_BAD_STATE );
5033 }
5034 else if ( operation.alg != PSA_ALG_CCM )
5035 {
5036 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
5037 SIZE_MAX ) );
5038 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5039 }
5040
5041 psa_aead_abort( &operation );
5042
Andrzej Kurek031df4a2022-01-19 12:44:49 -05005043 /* Test for calling set lengths with an plaintext length of SIZE_MAX, after setting nonce */
Andrzej Kureke5f94fb2021-12-26 01:00:20 +01005044 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5045
5046 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5047
5048 if( operation.alg == PSA_ALG_GCM )
5049 {
5050 TEST_EQUAL( psa_aead_set_lengths( &operation, additional_data->len,
5051 SIZE_MAX ),
5052 PSA_ERROR_INVALID_ARGUMENT );
5053 }
5054 else if ( operation.alg != PSA_ALG_CCM )
5055 {
5056 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
5057 SIZE_MAX ) );
5058 }
5059
5060 psa_aead_abort( &operation );
5061#endif
Paul Elliott374a2be2021-07-16 17:53:40 +01005062
5063 /* ------------------------------------------------------- */
5064
Paul Elliott374a2be2021-07-16 17:53:40 +01005065 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5066
5067 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5068
5069 TEST_EQUAL( psa_aead_generate_nonce( &operation, nonce_buffer,
5070 PSA_AEAD_NONCE_MAX_SIZE,
5071 &nonce_length ),
5072 PSA_ERROR_BAD_STATE );
5073
5074 psa_aead_abort( &operation );
5075
Paul Elliott7220cae2021-06-22 17:25:57 +01005076 /* Test for generating nonce in decrypt setup. */
5077
Paul Elliott7220cae2021-06-22 17:25:57 +01005078 PSA_ASSERT( psa_aead_decrypt_setup( &operation, key, alg ) );
5079
5080 TEST_EQUAL( psa_aead_generate_nonce( &operation, nonce_buffer,
5081 PSA_AEAD_NONCE_MAX_SIZE,
5082 &nonce_length ),
5083 PSA_ERROR_BAD_STATE );
5084
5085 psa_aead_abort( &operation );
5086
Paul Elliottc23a9a02021-06-21 18:32:46 +01005087 /* Test for setting lengths twice. */
5088
Paul Elliottc23a9a02021-06-21 18:32:46 +01005089 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5090
5091 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5092
5093 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
5094 input_data->len ) );
5095
5096 TEST_EQUAL( psa_aead_set_lengths( &operation, additional_data->len,
5097 input_data->len ),
5098 PSA_ERROR_BAD_STATE );
5099
5100 psa_aead_abort( &operation );
5101
Andrzej Kurekad837522021-12-15 15:28:49 +01005102 /* Test for setting lengths after setting nonce + already starting data. */
Paul Elliottc23a9a02021-06-21 18:32:46 +01005103
Paul Elliottc23a9a02021-06-21 18:32:46 +01005104 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5105
5106 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5107
Andrzej Kurekad837522021-12-15 15:28:49 +01005108 if( operation.alg == PSA_ALG_CCM )
5109 {
Paul Elliottf94bd992021-09-19 18:15:59 +01005110
Andrzej Kurekad837522021-12-15 15:28:49 +01005111 TEST_EQUAL( psa_aead_update_ad( &operation, additional_data->x,
5112 additional_data->len ),
5113 PSA_ERROR_BAD_STATE );
5114 }
5115 else
5116 {
5117 PSA_ASSERT( psa_aead_update_ad( &operation, additional_data->x,
5118 additional_data->len ) );
Paul Elliottf94bd992021-09-19 18:15:59 +01005119
Andrzej Kurekad837522021-12-15 15:28:49 +01005120 TEST_EQUAL( psa_aead_set_lengths( &operation, additional_data->len,
5121 input_data->len ),
5122 PSA_ERROR_BAD_STATE );
5123 }
Paul Elliottf94bd992021-09-19 18:15:59 +01005124 psa_aead_abort( &operation );
5125
5126 /* ------------------------------------------------------- */
5127
Paul Elliottf94bd992021-09-19 18:15:59 +01005128 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5129
5130 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5131
Andrzej Kurekad837522021-12-15 15:28:49 +01005132 if( operation.alg == PSA_ALG_CCM )
5133 {
5134 TEST_EQUAL( psa_aead_update( &operation, input_data->x,
5135 input_data->len, output_data,
5136 output_size, &output_length ),
5137 PSA_ERROR_BAD_STATE );
Paul Elliottc23a9a02021-06-21 18:32:46 +01005138
Andrzej Kurekad837522021-12-15 15:28:49 +01005139 }
5140 else
5141 {
5142 PSA_ASSERT( psa_aead_update( &operation, input_data->x,
5143 input_data->len, output_data,
5144 output_size, &output_length ) );
Paul Elliottc23a9a02021-06-21 18:32:46 +01005145
Andrzej Kurekad837522021-12-15 15:28:49 +01005146 TEST_EQUAL( psa_aead_set_lengths( &operation, additional_data->len,
5147 input_data->len ),
5148 PSA_ERROR_BAD_STATE );
5149 }
5150 psa_aead_abort( &operation );
5151
5152 /* ------------------------------------------------------- */
5153
5154 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5155
5156 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5157
5158 if( operation.alg == PSA_ALG_CCM )
5159 {
5160 PSA_ASSERT( psa_aead_finish( &operation, final_data,
5161 finish_output_size,
5162 &output_part_length,
5163 tag_buffer, tag_length,
5164 &tag_size ) );
5165 }
5166 else
5167 {
5168 PSA_ASSERT( psa_aead_finish( &operation, final_data,
5169 finish_output_size,
5170 &output_part_length,
5171 tag_buffer, tag_length,
5172 &tag_size ) );
5173
5174 TEST_EQUAL( psa_aead_set_lengths( &operation, additional_data->len,
5175 input_data->len ),
5176 PSA_ERROR_BAD_STATE );
5177 }
5178 psa_aead_abort( &operation );
5179
5180 /* Test for setting lengths after generating nonce + already starting data. */
5181
5182 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5183
5184 PSA_ASSERT( psa_aead_generate_nonce( &operation, nonce_buffer,
5185 PSA_AEAD_NONCE_MAX_SIZE,
5186 &nonce_length ) );
5187 if( operation.alg == PSA_ALG_CCM )
5188 {
5189
5190 TEST_EQUAL( psa_aead_update_ad( &operation, additional_data->x,
5191 additional_data->len ),
5192 PSA_ERROR_BAD_STATE );
5193 }
5194 else
5195 {
5196 PSA_ASSERT( psa_aead_update_ad( &operation, additional_data->x,
5197 additional_data->len ) );
5198
5199 TEST_EQUAL( psa_aead_set_lengths( &operation, additional_data->len,
5200 input_data->len ),
5201 PSA_ERROR_BAD_STATE );
5202 }
5203 psa_aead_abort( &operation );
5204
5205 /* ------------------------------------------------------- */
5206
5207 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5208
5209 PSA_ASSERT( psa_aead_generate_nonce( &operation, nonce_buffer,
5210 PSA_AEAD_NONCE_MAX_SIZE,
5211 &nonce_length ) );
5212 if( operation.alg == PSA_ALG_CCM )
5213 {
5214 TEST_EQUAL( psa_aead_update( &operation, input_data->x,
5215 input_data->len, output_data,
5216 output_size, &output_length ),
5217 PSA_ERROR_BAD_STATE );
5218
5219 }
5220 else
5221 {
5222 PSA_ASSERT( psa_aead_update( &operation, input_data->x,
5223 input_data->len, output_data,
5224 output_size, &output_length ) );
5225
5226 TEST_EQUAL( psa_aead_set_lengths( &operation, additional_data->len,
5227 input_data->len ),
5228 PSA_ERROR_BAD_STATE );
5229 }
5230 psa_aead_abort( &operation );
5231
5232 /* ------------------------------------------------------- */
5233
5234 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5235
5236 PSA_ASSERT( psa_aead_generate_nonce( &operation, nonce_buffer,
5237 PSA_AEAD_NONCE_MAX_SIZE,
5238 &nonce_length ) );
5239 if( operation.alg == PSA_ALG_CCM )
5240 {
5241 PSA_ASSERT( psa_aead_finish( &operation, final_data,
5242 finish_output_size,
5243 &output_part_length,
5244 tag_buffer, tag_length,
5245 &tag_size ) );
5246 }
5247 else
5248 {
5249 PSA_ASSERT( psa_aead_finish( &operation, final_data,
5250 finish_output_size,
5251 &output_part_length,
5252 tag_buffer, tag_length,
5253 &tag_size ) );
5254
5255 TEST_EQUAL( psa_aead_set_lengths( &operation, additional_data->len,
5256 input_data->len ),
5257 PSA_ERROR_BAD_STATE );
5258 }
Paul Elliottc23a9a02021-06-21 18:32:46 +01005259 psa_aead_abort( &operation );
5260
Paul Elliott243080c2021-07-21 19:01:17 +01005261 /* Test for not sending any additional data or data after setting non zero
5262 * lengths for them. (encrypt) */
Paul Elliottc23a9a02021-06-21 18:32:46 +01005263
Paul Elliottc23a9a02021-06-21 18:32:46 +01005264 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5265
5266 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5267
5268 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
5269 input_data->len ) );
5270
5271 TEST_EQUAL( psa_aead_finish( &operation, final_data,
5272 finish_output_size,
5273 &output_part_length,
5274 tag_buffer, tag_length,
5275 &tag_size ),
5276 PSA_ERROR_INVALID_ARGUMENT );
5277
5278 psa_aead_abort( &operation );
5279
Paul Elliott243080c2021-07-21 19:01:17 +01005280 /* Test for not sending any additional data or data after setting non-zero
5281 * lengths for them. (decrypt) */
Paul Elliottc23a9a02021-06-21 18:32:46 +01005282
Paul Elliottc23a9a02021-06-21 18:32:46 +01005283 PSA_ASSERT( psa_aead_decrypt_setup( &operation, key, alg ) );
5284
5285 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5286
5287 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
5288 input_data->len ) );
5289
5290 TEST_EQUAL( psa_aead_verify( &operation, final_data,
5291 finish_output_size,
5292 &output_part_length,
5293 tag_buffer,
5294 tag_length ),
5295 PSA_ERROR_INVALID_ARGUMENT );
5296
5297 psa_aead_abort( &operation );
5298
Paul Elliott243080c2021-07-21 19:01:17 +01005299 /* Test for not sending any additional data after setting a non-zero length
5300 * for it. */
Paul Elliottc23a9a02021-06-21 18:32:46 +01005301
Paul Elliottc23a9a02021-06-21 18:32:46 +01005302 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5303
5304 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5305
5306 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
5307 input_data->len ) );
5308
5309 TEST_EQUAL( psa_aead_update( &operation, input_data->x,
5310 input_data->len, output_data,
5311 output_size, &output_length ),
5312 PSA_ERROR_INVALID_ARGUMENT );
5313
5314 psa_aead_abort( &operation );
5315
Paul Elliottf94bd992021-09-19 18:15:59 +01005316 /* Test for not sending any data after setting a non-zero length for it.*/
5317
Paul Elliottf94bd992021-09-19 18:15:59 +01005318 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5319
5320 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5321
5322 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
5323 input_data->len ) );
5324
5325 PSA_ASSERT( psa_aead_update_ad( &operation, additional_data->x,
5326 additional_data->len ) );
5327
5328 TEST_EQUAL( psa_aead_finish( &operation, final_data,
5329 finish_output_size,
5330 &output_part_length,
5331 tag_buffer, tag_length,
5332 &tag_size ),
5333 PSA_ERROR_INVALID_ARGUMENT );
5334
5335 psa_aead_abort( &operation );
5336
Paul Elliottb0450fe2021-09-01 15:06:26 +01005337 /* Test for sending too much additional data after setting lengths. */
5338
Paul Elliottb0450fe2021-09-01 15:06:26 +01005339 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5340
5341 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5342
5343 PSA_ASSERT( psa_aead_set_lengths( &operation, 0, 0 ) );
5344
5345
5346 TEST_EQUAL( psa_aead_update_ad( &operation, additional_data->x,
5347 additional_data->len ),
5348 PSA_ERROR_INVALID_ARGUMENT );
5349
5350 psa_aead_abort( &operation );
5351
Paul Elliotta2a09b02021-09-22 14:56:40 +01005352 /* ------------------------------------------------------- */
Paul Elliottfd0c154c2021-09-17 18:03:52 +01005353
5354 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5355
5356 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5357
5358 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
5359 input_data->len ) );
5360
5361 PSA_ASSERT( psa_aead_update_ad( &operation, additional_data->x,
5362 additional_data->len ) );
5363
5364 TEST_EQUAL( psa_aead_update_ad( &operation, additional_data->x,
5365 1 ),
5366 PSA_ERROR_INVALID_ARGUMENT );
5367
5368 psa_aead_abort( &operation );
5369
Paul Elliottb0450fe2021-09-01 15:06:26 +01005370 /* Test for sending too much data after setting lengths. */
5371
Paul Elliottb0450fe2021-09-01 15:06:26 +01005372 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5373
5374 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5375
5376 PSA_ASSERT( psa_aead_set_lengths( &operation, 0, 0 ) );
5377
5378 TEST_EQUAL( psa_aead_update( &operation, input_data->x,
5379 input_data->len, output_data,
5380 output_size, &output_length ),
5381 PSA_ERROR_INVALID_ARGUMENT );
5382
5383 psa_aead_abort( &operation );
5384
Paul Elliotta2a09b02021-09-22 14:56:40 +01005385 /* ------------------------------------------------------- */
Paul Elliottfd0c154c2021-09-17 18:03:52 +01005386
5387 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5388
5389 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5390
5391 PSA_ASSERT( psa_aead_set_lengths( &operation, additional_data->len,
5392 input_data->len ) );
5393
5394 PSA_ASSERT( psa_aead_update_ad( &operation, additional_data->x,
5395 additional_data->len ) );
5396
5397 PSA_ASSERT( psa_aead_update( &operation, input_data->x,
5398 input_data->len, output_data,
5399 output_size, &output_length ) );
5400
5401 TEST_EQUAL( psa_aead_update( &operation, input_data->x,
5402 1, output_data,
5403 output_size, &output_length ),
5404 PSA_ERROR_INVALID_ARGUMENT );
5405
5406 psa_aead_abort( &operation );
5407
Paul Elliottc23a9a02021-06-21 18:32:46 +01005408 /* Test sending additional data after data. */
5409
Paul Elliottc23a9a02021-06-21 18:32:46 +01005410 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5411
5412 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5413
Andrzej Kurekad837522021-12-15 15:28:49 +01005414 if( operation.alg != PSA_ALG_CCM )
5415 {
5416 PSA_ASSERT( psa_aead_update( &operation, input_data->x,
5417 input_data->len, output_data,
5418 output_size, &output_length ) );
Paul Elliottc23a9a02021-06-21 18:32:46 +01005419
Andrzej Kurekad837522021-12-15 15:28:49 +01005420 TEST_EQUAL( psa_aead_update_ad( &operation, additional_data->x,
5421 additional_data->len ),
5422 PSA_ERROR_BAD_STATE );
5423 }
Paul Elliottc23a9a02021-06-21 18:32:46 +01005424 psa_aead_abort( &operation );
5425
Paul Elliott534d0b42021-06-22 19:15:20 +01005426 /* Test calling finish on decryption. */
5427
Paul Elliott534d0b42021-06-22 19:15:20 +01005428 PSA_ASSERT( psa_aead_decrypt_setup( &operation, key, alg ) );
5429
5430 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5431
5432 TEST_EQUAL( psa_aead_finish( &operation, final_data,
5433 finish_output_size,
5434 &output_part_length,
5435 tag_buffer, tag_length,
5436 &tag_size ),
5437 PSA_ERROR_BAD_STATE );
5438
5439 psa_aead_abort( &operation );
5440
5441 /* Test calling verify on encryption. */
5442
Paul Elliott534d0b42021-06-22 19:15:20 +01005443 PSA_ASSERT( psa_aead_encrypt_setup( &operation, key, alg ) );
5444
5445 PSA_ASSERT( psa_aead_set_nonce( &operation, nonce->x, nonce->len ) );
5446
5447 TEST_EQUAL( psa_aead_verify( &operation, final_data,
5448 finish_output_size,
5449 &output_part_length,
5450 tag_buffer,
5451 tag_length ),
Paul Elliott5b065cb2021-06-23 08:33:22 +01005452 PSA_ERROR_BAD_STATE );
Paul Elliott534d0b42021-06-22 19:15:20 +01005453
5454 psa_aead_abort( &operation );
5455
5456
Paul Elliottc23a9a02021-06-21 18:32:46 +01005457exit:
5458 psa_destroy_key( key );
5459 psa_aead_abort( &operation );
5460 mbedtls_free( output_data );
5461 mbedtls_free( final_data );
5462 PSA_DONE( );
5463}
5464/* END_CASE */
5465
5466/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02005467void signature_size( int type_arg,
5468 int bits,
5469 int alg_arg,
5470 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +01005471{
5472 psa_key_type_t type = type_arg;
5473 psa_algorithm_t alg = alg_arg;
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005474 size_t actual_size = PSA_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskine841b14b2019-11-26 17:37:37 +01005475
Gilles Peskinefe11b722018-12-18 00:24:04 +01005476 TEST_EQUAL( actual_size, (size_t) expected_size_arg );
Gilles Peskine841b14b2019-11-26 17:37:37 +01005477
Gilles Peskinee59236f2018-01-27 23:32:46 +01005478exit:
5479 ;
5480}
5481/* END_CASE */
5482
5483/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02005484void sign_hash_deterministic( int key_type_arg, data_t *key_data,
5485 int alg_arg, data_t *input_data,
5486 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +01005487{
Ronald Cron5425a212020-08-04 14:58:35 +02005488 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinee59236f2018-01-27 23:32:46 +01005489 psa_key_type_t key_type = key_type_arg;
5490 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01005491 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +01005492 unsigned char *signature = NULL;
5493 size_t signature_size;
5494 size_t signature_length = 0xdeadbeef;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02005495 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01005496
Gilles Peskine8817f612018-12-18 00:18:46 +01005497 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01005498
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005499 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02005500 psa_set_key_algorithm( &attributes, alg );
5501 psa_set_key_type( &attributes, key_type );
mohammad1603a97cb8c2018-03-28 03:46:26 -07005502
Gilles Peskine049c7532019-05-15 20:22:09 +02005503 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02005504 &key ) );
5505 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02005506 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine20035e32018-02-03 22:44:14 +01005507
Gilles Peskine860ce9d2018-06-28 12:23:00 +02005508 /* Allocate a buffer which has the size advertized by the
5509 * library. */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005510 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02005511 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01005512 TEST_ASSERT( signature_size != 0 );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005513 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02005514 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01005515
Gilles Peskine860ce9d2018-06-28 12:23:00 +02005516 /* Perform the signature. */
Ronald Cron5425a212020-08-04 14:58:35 +02005517 PSA_ASSERT( psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005518 input_data->x, input_data->len,
5519 signature, signature_size,
5520 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02005521 /* Verify that the signature is what is expected. */
Gilles Peskinebd7dea92018-09-27 13:57:19 +02005522 ASSERT_COMPARE( output_data->x, output_data->len,
5523 signature, signature_length );
Gilles Peskine20035e32018-02-03 22:44:14 +01005524
5525exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005526 /*
5527 * Key attributes may have been returned by psa_get_key_attributes()
5528 * thus reset them as required.
5529 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005530 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005531
Ronald Cron5425a212020-08-04 14:58:35 +02005532 psa_destroy_key( key );
Gilles Peskine0189e752018-02-03 23:57:22 +01005533 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005534 PSA_DONE( );
Gilles Peskine20035e32018-02-03 22:44:14 +01005535}
5536/* END_CASE */
5537
5538/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02005539void sign_hash_fail( int key_type_arg, data_t *key_data,
5540 int alg_arg, data_t *input_data,
5541 int signature_size_arg, int expected_status_arg )
Gilles Peskine20035e32018-02-03 22:44:14 +01005542{
Ronald Cron5425a212020-08-04 14:58:35 +02005543 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01005544 psa_key_type_t key_type = key_type_arg;
5545 psa_algorithm_t alg = alg_arg;
Gilles Peskine860ce9d2018-06-28 12:23:00 +02005546 size_t signature_size = signature_size_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01005547 psa_status_t actual_status;
5548 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01005549 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01005550 size_t signature_length = 0xdeadbeef;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02005551 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine20035e32018-02-03 22:44:14 +01005552
Gilles Peskine8cebbba2018-09-27 13:54:18 +02005553 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01005554
Gilles Peskine8817f612018-12-18 00:18:46 +01005555 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01005556
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005557 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02005558 psa_set_key_algorithm( &attributes, alg );
5559 psa_set_key_type( &attributes, key_type );
mohammad1603a97cb8c2018-03-28 03:46:26 -07005560
Gilles Peskine049c7532019-05-15 20:22:09 +02005561 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02005562 &key ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01005563
Ronald Cron5425a212020-08-04 14:58:35 +02005564 actual_status = psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005565 input_data->x, input_data->len,
5566 signature, signature_size,
5567 &signature_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01005568 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine860ce9d2018-06-28 12:23:00 +02005569 /* The value of *signature_length is unspecified on error, but
5570 * whatever it is, it should be less than signature_size, so that
5571 * if the caller tries to read *signature_length bytes without
5572 * checking the error code then they don't overflow a buffer. */
5573 TEST_ASSERT( signature_length <= signature_size );
Gilles Peskine20035e32018-02-03 22:44:14 +01005574
5575exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005576 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02005577 psa_destroy_key( key );
Gilles Peskine20035e32018-02-03 22:44:14 +01005578 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005579 PSA_DONE( );
Gilles Peskine20035e32018-02-03 22:44:14 +01005580}
5581/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03005582
5583/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02005584void sign_verify_hash( int key_type_arg, data_t *key_data,
5585 int alg_arg, data_t *input_data )
Gilles Peskine9911b022018-06-29 17:30:48 +02005586{
Ronald Cron5425a212020-08-04 14:58:35 +02005587 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02005588 psa_key_type_t key_type = key_type_arg;
5589 psa_algorithm_t alg = alg_arg;
5590 size_t key_bits;
5591 unsigned char *signature = NULL;
5592 size_t signature_size;
5593 size_t signature_length = 0xdeadbeef;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02005594 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine9911b022018-06-29 17:30:48 +02005595
Gilles Peskine8817f612018-12-18 00:18:46 +01005596 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02005597
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005598 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02005599 psa_set_key_algorithm( &attributes, alg );
5600 psa_set_key_type( &attributes, key_type );
Gilles Peskine9911b022018-06-29 17:30:48 +02005601
Gilles Peskine049c7532019-05-15 20:22:09 +02005602 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02005603 &key ) );
5604 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02005605 key_bits = psa_get_key_bits( &attributes );
Gilles Peskine9911b022018-06-29 17:30:48 +02005606
5607 /* Allocate a buffer which has the size advertized by the
5608 * library. */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005609 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type,
Gilles Peskine9911b022018-06-29 17:30:48 +02005610 key_bits, alg );
5611 TEST_ASSERT( signature_size != 0 );
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005612 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02005613 ASSERT_ALLOC( signature, signature_size );
Gilles Peskine9911b022018-06-29 17:30:48 +02005614
5615 /* Perform the signature. */
Ronald Cron5425a212020-08-04 14:58:35 +02005616 PSA_ASSERT( psa_sign_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005617 input_data->x, input_data->len,
5618 signature, signature_size,
5619 &signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02005620 /* Check that the signature length looks sensible. */
5621 TEST_ASSERT( signature_length <= signature_size );
5622 TEST_ASSERT( signature_length > 0 );
5623
5624 /* Use the library to verify that the signature is correct. */
Ronald Cron5425a212020-08-04 14:58:35 +02005625 PSA_ASSERT( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005626 input_data->x, input_data->len,
5627 signature, signature_length ) );
Gilles Peskine9911b022018-06-29 17:30:48 +02005628
5629 if( input_data->len != 0 )
5630 {
5631 /* Flip a bit in the input and verify that the signature is now
5632 * detected as invalid. Flip a bit at the beginning, not at the end,
5633 * because ECDSA may ignore the last few bits of the input. */
5634 input_data->x[0] ^= 1;
Ronald Cron5425a212020-08-04 14:58:35 +02005635 TEST_EQUAL( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005636 input_data->x, input_data->len,
5637 signature, signature_length ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01005638 PSA_ERROR_INVALID_SIGNATURE );
Gilles Peskine9911b022018-06-29 17:30:48 +02005639 }
5640
5641exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005642 /*
5643 * Key attributes may have been returned by psa_get_key_attributes()
5644 * thus reset them as required.
5645 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005646 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01005647
Ronald Cron5425a212020-08-04 14:58:35 +02005648 psa_destroy_key( key );
Gilles Peskine9911b022018-06-29 17:30:48 +02005649 mbedtls_free( signature );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005650 PSA_DONE( );
Gilles Peskine9911b022018-06-29 17:30:48 +02005651}
5652/* END_CASE */
5653
5654/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02005655void verify_hash( int key_type_arg, data_t *key_data,
5656 int alg_arg, data_t *hash_data,
5657 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03005658{
Ronald Cron5425a212020-08-04 14:58:35 +02005659 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03005660 psa_key_type_t key_type = key_type_arg;
5661 psa_algorithm_t alg = alg_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02005662 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
itayzafrir5c753392018-05-08 11:18:38 +03005663
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005664 TEST_ASSERT( signature_data->len <= PSA_SIGNATURE_MAX_SIZE );
Gilles Peskine69c12672018-06-28 00:07:19 +02005665
Gilles Peskine8817f612018-12-18 00:18:46 +01005666 PSA_ASSERT( psa_crypto_init( ) );
itayzafrir5c753392018-05-08 11:18:38 +03005667
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005668 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02005669 psa_set_key_algorithm( &attributes, alg );
5670 psa_set_key_type( &attributes, key_type );
itayzafrir5c753392018-05-08 11:18:38 +03005671
Gilles Peskine049c7532019-05-15 20:22:09 +02005672 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02005673 &key ) );
itayzafrir5c753392018-05-08 11:18:38 +03005674
Ronald Cron5425a212020-08-04 14:58:35 +02005675 PSA_ASSERT( psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005676 hash_data->x, hash_data->len,
5677 signature_data->x, signature_data->len ) );
Gilles Peskine0627f982019-11-26 19:12:16 +01005678
itayzafrir5c753392018-05-08 11:18:38 +03005679exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005680 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02005681 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005682 PSA_DONE( );
itayzafrir5c753392018-05-08 11:18:38 +03005683}
5684/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03005685
5686/* BEGIN_CASE */
gabor-mezei-armb9530232021-04-16 14:21:21 +02005687void verify_hash_fail( int key_type_arg, data_t *key_data,
5688 int alg_arg, data_t *hash_data,
5689 data_t *signature_data,
5690 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03005691{
Ronald Cron5425a212020-08-04 14:58:35 +02005692 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03005693 psa_key_type_t key_type = key_type_arg;
5694 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03005695 psa_status_t actual_status;
5696 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02005697 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03005698
Gilles Peskine8817f612018-12-18 00:18:46 +01005699 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03005700
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005701 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02005702 psa_set_key_algorithm( &attributes, alg );
5703 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03005704
Gilles Peskine049c7532019-05-15 20:22:09 +02005705 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02005706 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03005707
Ronald Cron5425a212020-08-04 14:58:35 +02005708 actual_status = psa_verify_hash( key, alg,
Gilles Peskine89d8c5c2019-11-26 17:01:59 +01005709 hash_data->x, hash_data->len,
5710 signature_data->x, signature_data->len );
Gilles Peskinefe11b722018-12-18 00:24:04 +01005711 TEST_EQUAL( actual_status, expected_status );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03005712
5713exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02005714 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02005715 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02005716 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03005717}
5718/* END_CASE */
5719
Nir Sonnenschein39e59142018-05-02 23:16:26 +03005720/* BEGIN_CASE */
gabor-mezei-arm53028482021-04-15 18:19:50 +02005721void sign_message_deterministic( int key_type_arg,
5722 data_t *key_data,
5723 int alg_arg,
5724 data_t *input_data,
5725 data_t *output_data )
5726{
5727 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
5728 psa_key_type_t key_type = key_type_arg;
5729 psa_algorithm_t alg = alg_arg;
5730 size_t key_bits;
5731 unsigned char *signature = NULL;
5732 size_t signature_size;
5733 size_t signature_length = 0xdeadbeef;
5734 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
5735
5736 PSA_ASSERT( psa_crypto_init( ) );
5737
5738 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
5739 psa_set_key_algorithm( &attributes, alg );
5740 psa_set_key_type( &attributes, key_type );
5741
5742 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
5743 &key ) );
5744 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
5745 key_bits = psa_get_key_bits( &attributes );
5746
5747 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
5748 TEST_ASSERT( signature_size != 0 );
5749 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
5750 ASSERT_ALLOC( signature, signature_size );
5751
5752 PSA_ASSERT( psa_sign_message( key, alg,
5753 input_data->x, input_data->len,
5754 signature, signature_size,
5755 &signature_length ) );
5756
5757 ASSERT_COMPARE( output_data->x, output_data->len,
5758 signature, signature_length );
5759
5760exit:
5761 psa_reset_key_attributes( &attributes );
5762
5763 psa_destroy_key( key );
5764 mbedtls_free( signature );
5765 PSA_DONE( );
5766
5767}
5768/* END_CASE */
5769
5770/* BEGIN_CASE */
5771void sign_message_fail( int key_type_arg,
5772 data_t *key_data,
5773 int alg_arg,
5774 data_t *input_data,
5775 int signature_size_arg,
5776 int expected_status_arg )
5777{
5778 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
5779 psa_key_type_t key_type = key_type_arg;
5780 psa_algorithm_t alg = alg_arg;
5781 size_t signature_size = signature_size_arg;
5782 psa_status_t actual_status;
5783 psa_status_t expected_status = expected_status_arg;
5784 unsigned char *signature = NULL;
5785 size_t signature_length = 0xdeadbeef;
5786 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
5787
5788 ASSERT_ALLOC( signature, signature_size );
5789
5790 PSA_ASSERT( psa_crypto_init( ) );
5791
5792 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
5793 psa_set_key_algorithm( &attributes, alg );
5794 psa_set_key_type( &attributes, key_type );
5795
5796 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
5797 &key ) );
5798
5799 actual_status = psa_sign_message( key, alg,
5800 input_data->x, input_data->len,
5801 signature, signature_size,
5802 &signature_length );
5803 TEST_EQUAL( actual_status, expected_status );
5804 /* The value of *signature_length is unspecified on error, but
5805 * whatever it is, it should be less than signature_size, so that
5806 * if the caller tries to read *signature_length bytes without
5807 * checking the error code then they don't overflow a buffer. */
5808 TEST_ASSERT( signature_length <= signature_size );
5809
5810exit:
5811 psa_reset_key_attributes( &attributes );
5812 psa_destroy_key( key );
5813 mbedtls_free( signature );
5814 PSA_DONE( );
5815}
5816/* END_CASE */
5817
5818/* BEGIN_CASE */
5819void sign_verify_message( int key_type_arg,
5820 data_t *key_data,
5821 int alg_arg,
5822 data_t *input_data )
5823{
5824 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
5825 psa_key_type_t key_type = key_type_arg;
5826 psa_algorithm_t alg = alg_arg;
5827 size_t key_bits;
5828 unsigned char *signature = NULL;
5829 size_t signature_size;
5830 size_t signature_length = 0xdeadbeef;
5831 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
5832
5833 PSA_ASSERT( psa_crypto_init( ) );
5834
5835 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE |
5836 PSA_KEY_USAGE_VERIFY_MESSAGE );
5837 psa_set_key_algorithm( &attributes, alg );
5838 psa_set_key_type( &attributes, key_type );
5839
5840 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
5841 &key ) );
5842 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
5843 key_bits = psa_get_key_bits( &attributes );
5844
5845 signature_size = PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg );
5846 TEST_ASSERT( signature_size != 0 );
5847 TEST_ASSERT( signature_size <= PSA_SIGNATURE_MAX_SIZE );
5848 ASSERT_ALLOC( signature, signature_size );
5849
5850 PSA_ASSERT( psa_sign_message( key, alg,
5851 input_data->x, input_data->len,
5852 signature, signature_size,
5853 &signature_length ) );
5854 TEST_ASSERT( signature_length <= signature_size );
5855 TEST_ASSERT( signature_length > 0 );
5856
5857 PSA_ASSERT( psa_verify_message( key, alg,
5858 input_data->x, input_data->len,
5859 signature, signature_length ) );
5860
5861 if( input_data->len != 0 )
5862 {
5863 /* Flip a bit in the input and verify that the signature is now
5864 * detected as invalid. Flip a bit at the beginning, not at the end,
5865 * because ECDSA may ignore the last few bits of the input. */
5866 input_data->x[0] ^= 1;
5867 TEST_EQUAL( psa_verify_message( key, alg,
5868 input_data->x, input_data->len,
5869 signature, signature_length ),
5870 PSA_ERROR_INVALID_SIGNATURE );
5871 }
5872
5873exit:
5874 psa_reset_key_attributes( &attributes );
5875
5876 psa_destroy_key( key );
5877 mbedtls_free( signature );
5878 PSA_DONE( );
5879}
5880/* END_CASE */
5881
5882/* BEGIN_CASE */
5883void verify_message( int key_type_arg,
5884 data_t *key_data,
5885 int alg_arg,
5886 data_t *input_data,
5887 data_t *signature_data )
5888{
5889 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
5890 psa_key_type_t key_type = key_type_arg;
5891 psa_algorithm_t alg = alg_arg;
5892 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
5893
5894 TEST_ASSERT( signature_data->len <= PSA_SIGNATURE_MAX_SIZE );
5895
5896 PSA_ASSERT( psa_crypto_init( ) );
5897
5898 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_MESSAGE );
5899 psa_set_key_algorithm( &attributes, alg );
5900 psa_set_key_type( &attributes, key_type );
5901
5902 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
5903 &key ) );
5904
5905 PSA_ASSERT( psa_verify_message( key, alg,
5906 input_data->x, input_data->len,
5907 signature_data->x, signature_data->len ) );
5908
5909exit:
5910 psa_reset_key_attributes( &attributes );
5911 psa_destroy_key( key );
5912 PSA_DONE( );
5913}
5914/* END_CASE */
5915
5916/* BEGIN_CASE */
5917void verify_message_fail( int key_type_arg,
5918 data_t *key_data,
5919 int alg_arg,
5920 data_t *hash_data,
5921 data_t *signature_data,
5922 int expected_status_arg )
5923{
5924 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
5925 psa_key_type_t key_type = key_type_arg;
5926 psa_algorithm_t alg = alg_arg;
5927 psa_status_t actual_status;
5928 psa_status_t expected_status = expected_status_arg;
5929 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
5930
5931 PSA_ASSERT( psa_crypto_init( ) );
5932
5933 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_MESSAGE );
5934 psa_set_key_algorithm( &attributes, alg );
5935 psa_set_key_type( &attributes, key_type );
5936
5937 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
5938 &key ) );
5939
5940 actual_status = psa_verify_message( key, alg,
5941 hash_data->x, hash_data->len,
5942 signature_data->x,
5943 signature_data->len );
5944 TEST_EQUAL( actual_status, expected_status );
5945
5946exit:
5947 psa_reset_key_attributes( &attributes );
5948 psa_destroy_key( key );
5949 PSA_DONE( );
5950}
5951/* END_CASE */
5952
5953/* BEGIN_CASE */
Gilles Peskine656896e2018-06-29 19:12:28 +02005954void asymmetric_encrypt( int key_type_arg,
5955 data_t *key_data,
5956 int alg_arg,
5957 data_t *input_data,
Gilles Peskine68428122018-06-30 18:42:41 +02005958 data_t *label,
Gilles Peskine656896e2018-06-29 19:12:28 +02005959 int expected_output_length_arg,
5960 int expected_status_arg )
5961{
Ronald Cron5425a212020-08-04 14:58:35 +02005962 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02005963 psa_key_type_t key_type = key_type_arg;
5964 psa_algorithm_t alg = alg_arg;
5965 size_t expected_output_length = expected_output_length_arg;
5966 size_t key_bits;
5967 unsigned char *output = NULL;
5968 size_t output_size;
5969 size_t output_length = ~0;
5970 psa_status_t actual_status;
5971 psa_status_t expected_status = expected_status_arg;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02005972 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine656896e2018-06-29 19:12:28 +02005973
Gilles Peskine8817f612018-12-18 00:18:46 +01005974 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskinebdf309c2018-12-03 15:36:32 +01005975
Gilles Peskine656896e2018-06-29 19:12:28 +02005976 /* Import the key */
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02005977 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
5978 psa_set_key_algorithm( &attributes, alg );
5979 psa_set_key_type( &attributes, key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02005980 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02005981 &key ) );
Gilles Peskine656896e2018-06-29 19:12:28 +02005982
5983 /* Determine the maximum output length */
Ronald Cron5425a212020-08-04 14:58:35 +02005984 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02005985 key_bits = psa_get_key_bits( &attributes );
gabor-mezei-armceface22021-01-21 12:26:17 +01005986
Gilles Peskine656896e2018-06-29 19:12:28 +02005987 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
gabor-mezei-armceface22021-01-21 12:26:17 +01005988 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02005989 ASSERT_ALLOC( output, output_size );
Gilles Peskine656896e2018-06-29 19:12:28 +02005990
5991 /* Encrypt the input */
Ronald Cron5425a212020-08-04 14:58:35 +02005992 actual_status = psa_asymmetric_encrypt( key, alg,
Gilles Peskine656896e2018-06-29 19:12:28 +02005993 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02005994 label->x, label->len,
Gilles Peskine656896e2018-06-29 19:12:28 +02005995 output, output_size,
5996 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01005997 TEST_EQUAL( actual_status, expected_status );
5998 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine656896e2018-06-29 19:12:28 +02005999
Gilles Peskine68428122018-06-30 18:42:41 +02006000 /* If the label is empty, the test framework puts a non-null pointer
6001 * in label->x. Test that a null pointer works as well. */
6002 if( label->len == 0 )
6003 {
6004 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02006005 if( output_size != 0 )
6006 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02006007 actual_status = psa_asymmetric_encrypt( key, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02006008 input_data->x, input_data->len,
6009 NULL, label->len,
6010 output, output_size,
6011 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01006012 TEST_EQUAL( actual_status, expected_status );
6013 TEST_EQUAL( output_length, expected_output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02006014 }
6015
Gilles Peskine656896e2018-06-29 19:12:28 +02006016exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01006017 /*
6018 * Key attributes may have been returned by psa_get_key_attributes()
6019 * thus reset them as required.
6020 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02006021 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01006022
Ronald Cron5425a212020-08-04 14:58:35 +02006023 psa_destroy_key( key );
Gilles Peskine656896e2018-06-29 19:12:28 +02006024 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006025 PSA_DONE( );
Gilles Peskine656896e2018-06-29 19:12:28 +02006026}
6027/* END_CASE */
6028
6029/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02006030void asymmetric_encrypt_decrypt( int key_type_arg,
6031 data_t *key_data,
6032 int alg_arg,
6033 data_t *input_data,
6034 data_t *label )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006035{
Ronald Cron5425a212020-08-04 14:58:35 +02006036 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006037 psa_key_type_t key_type = key_type_arg;
6038 psa_algorithm_t alg = alg_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006039 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006040 unsigned char *output = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006041 size_t output_size;
6042 size_t output_length = ~0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03006043 unsigned char *output2 = NULL;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006044 size_t output2_size;
6045 size_t output2_length = ~0;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02006046 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006047
Gilles Peskine8817f612018-12-18 00:18:46 +01006048 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006049
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02006050 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT );
6051 psa_set_key_algorithm( &attributes, alg );
6052 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03006053
Gilles Peskine049c7532019-05-15 20:22:09 +02006054 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02006055 &key ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006056
6057 /* Determine the maximum ciphertext length */
Ronald Cron5425a212020-08-04 14:58:35 +02006058 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02006059 key_bits = psa_get_key_bits( &attributes );
gabor-mezei-armceface22021-01-21 12:26:17 +01006060
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006061 output_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
gabor-mezei-armceface22021-01-21 12:26:17 +01006062 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02006063 ASSERT_ALLOC( output, output_size );
gabor-mezei-armceface22021-01-21 12:26:17 +01006064
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006065 output2_size = input_data->len;
gabor-mezei-armceface22021-01-21 12:26:17 +01006066 TEST_ASSERT( output2_size <=
6067 PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE( key_type, key_bits, alg ) );
6068 TEST_ASSERT( output2_size <= PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02006069 ASSERT_ALLOC( output2, output2_size );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006070
Gilles Peskineeebd7382018-06-08 18:11:54 +02006071 /* We test encryption by checking that encrypt-then-decrypt gives back
6072 * the original plaintext because of the non-optional random
6073 * part of encryption process which prevents using fixed vectors. */
Ronald Cron5425a212020-08-04 14:58:35 +02006074 PSA_ASSERT( psa_asymmetric_encrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01006075 input_data->x, input_data->len,
6076 label->x, label->len,
6077 output, output_size,
6078 &output_length ) );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006079 /* We don't know what ciphertext length to expect, but check that
6080 * it looks sensible. */
6081 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03006082
Ronald Cron5425a212020-08-04 14:58:35 +02006083 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01006084 output, output_length,
6085 label->x, label->len,
6086 output2, output2_size,
6087 &output2_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02006088 ASSERT_COMPARE( input_data->x, input_data->len,
6089 output2, output2_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006090
6091exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01006092 /*
6093 * Key attributes may have been returned by psa_get_key_attributes()
6094 * thus reset them as required.
6095 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02006096 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01006097
Ronald Cron5425a212020-08-04 14:58:35 +02006098 psa_destroy_key( key );
itayzafrir3e02b3b2018-06-12 17:06:52 +03006099 mbedtls_free( output );
6100 mbedtls_free( output2 );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006101 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006102}
6103/* END_CASE */
6104
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006105/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02006106void asymmetric_decrypt( int key_type_arg,
6107 data_t *key_data,
6108 int alg_arg,
6109 data_t *input_data,
6110 data_t *label,
Gilles Peskine66763a02018-06-29 21:54:10 +02006111 data_t *expected_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006112{
Ronald Cron5425a212020-08-04 14:58:35 +02006113 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006114 psa_key_type_t key_type = key_type_arg;
6115 psa_algorithm_t alg = alg_arg;
gabor-mezei-armceface22021-01-21 12:26:17 +01006116 size_t key_bits;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006117 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03006118 size_t output_size = 0;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006119 size_t output_length = ~0;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02006120 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006121
Gilles Peskine8817f612018-12-18 00:18:46 +01006122 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006123
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02006124 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
6125 psa_set_key_algorithm( &attributes, alg );
6126 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03006127
Gilles Peskine049c7532019-05-15 20:22:09 +02006128 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02006129 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006130
gabor-mezei-armceface22021-01-21 12:26:17 +01006131 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
6132 key_bits = psa_get_key_bits( &attributes );
6133
6134 /* Determine the maximum ciphertext length */
6135 output_size = PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE( key_type, key_bits, alg );
6136 TEST_ASSERT( output_size <= PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE );
6137 ASSERT_ALLOC( output, output_size );
6138
Ronald Cron5425a212020-08-04 14:58:35 +02006139 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01006140 input_data->x, input_data->len,
6141 label->x, label->len,
6142 output,
6143 output_size,
6144 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02006145 ASSERT_COMPARE( expected_data->x, expected_data->len,
6146 output, output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006147
Gilles Peskine68428122018-06-30 18:42:41 +02006148 /* If the label is empty, the test framework puts a non-null pointer
6149 * in label->x. Test that a null pointer works as well. */
6150 if( label->len == 0 )
6151 {
6152 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02006153 if( output_size != 0 )
6154 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02006155 PSA_ASSERT( psa_asymmetric_decrypt( key, alg,
Gilles Peskine8817f612018-12-18 00:18:46 +01006156 input_data->x, input_data->len,
6157 NULL, label->len,
6158 output,
6159 output_size,
6160 &output_length ) );
Gilles Peskinebd7dea92018-09-27 13:57:19 +02006161 ASSERT_COMPARE( expected_data->x, expected_data->len,
6162 output, output_length );
Gilles Peskine68428122018-06-30 18:42:41 +02006163 }
6164
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006165exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02006166 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02006167 psa_destroy_key( key );
itayzafrir3e02b3b2018-06-12 17:06:52 +03006168 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006169 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006170}
6171/* END_CASE */
6172
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006173/* BEGIN_CASE */
Gilles Peskine68428122018-06-30 18:42:41 +02006174void asymmetric_decrypt_fail( int key_type_arg,
6175 data_t *key_data,
6176 int alg_arg,
6177 data_t *input_data,
6178 data_t *label,
Jaeden Amerof8daab72019-02-06 12:57:46 +00006179 int output_size_arg,
Gilles Peskine2d277862018-06-18 15:41:12 +02006180 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006181{
Ronald Cron5425a212020-08-04 14:58:35 +02006182 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006183 psa_key_type_t key_type = key_type_arg;
6184 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006185 unsigned char *output = NULL;
Jaeden Amerof8daab72019-02-06 12:57:46 +00006186 size_t output_size = output_size_arg;
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006187 size_t output_length = ~0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006188 psa_status_t actual_status;
6189 psa_status_t expected_status = expected_status_arg;
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02006190 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006191
Gilles Peskine8cebbba2018-09-27 13:54:18 +02006192 ASSERT_ALLOC( output, output_size );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02006193
Gilles Peskine8817f612018-12-18 00:18:46 +01006194 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006195
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02006196 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
6197 psa_set_key_algorithm( &attributes, alg );
6198 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03006199
Gilles Peskine049c7532019-05-15 20:22:09 +02006200 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02006201 &key ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006202
Ronald Cron5425a212020-08-04 14:58:35 +02006203 actual_status = psa_asymmetric_decrypt( key, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02006204 input_data->x, input_data->len,
Gilles Peskine68428122018-06-30 18:42:41 +02006205 label->x, label->len,
Gilles Peskine4abf7412018-06-18 16:35:34 +02006206 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02006207 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01006208 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006209 TEST_ASSERT( output_length <= output_size );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006210
Gilles Peskine68428122018-06-30 18:42:41 +02006211 /* If the label is empty, the test framework puts a non-null pointer
6212 * in label->x. Test that a null pointer works as well. */
6213 if( label->len == 0 )
6214 {
6215 output_length = ~0;
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02006216 if( output_size != 0 )
6217 memset( output, 0, output_size );
Ronald Cron5425a212020-08-04 14:58:35 +02006218 actual_status = psa_asymmetric_decrypt( key, alg,
Gilles Peskine68428122018-06-30 18:42:41 +02006219 input_data->x, input_data->len,
6220 NULL, label->len,
6221 output, output_size,
6222 &output_length );
Gilles Peskinefe11b722018-12-18 00:24:04 +01006223 TEST_EQUAL( actual_status, expected_status );
Gilles Peskine55c94dd2018-06-30 18:54:48 +02006224 TEST_ASSERT( output_length <= output_size );
Gilles Peskine68428122018-06-30 18:42:41 +02006225 }
6226
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006227exit:
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02006228 psa_reset_key_attributes( &attributes );
Ronald Cron5425a212020-08-04 14:58:35 +02006229 psa_destroy_key( key );
Gilles Peskine2d277862018-06-18 15:41:12 +02006230 mbedtls_free( output );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006231 PSA_DONE( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03006232}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02006233/* END_CASE */
Gilles Peskine05d69892018-06-19 22:00:52 +02006234
6235/* BEGIN_CASE */
Gilles Peskinecbe66502019-05-16 16:59:18 +02006236void key_derivation_init( )
Jaeden Amerod94d6712019-01-04 14:11:48 +00006237{
6238 /* Test each valid way of initializing the object, except for `= {0}`, as
6239 * Clang 5 complains when `-Wmissing-field-initializers` is used, even
6240 * though it's OK by the C standard. We could test for this, but we'd need
6241 * to supress the Clang warning for the test. */
Jaeden Amero5229bbb2019-02-07 16:33:37 +00006242 size_t capacity;
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02006243 psa_key_derivation_operation_t func = psa_key_derivation_operation_init( );
6244 psa_key_derivation_operation_t init = PSA_KEY_DERIVATION_OPERATION_INIT;
6245 psa_key_derivation_operation_t zero;
Jaeden Amerod94d6712019-01-04 14:11:48 +00006246
6247 memset( &zero, 0, sizeof( zero ) );
6248
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006249 /* A default operation should not be able to report its capacity. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02006250 TEST_EQUAL( psa_key_derivation_get_capacity( &func, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00006251 PSA_ERROR_BAD_STATE );
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02006252 TEST_EQUAL( psa_key_derivation_get_capacity( &init, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00006253 PSA_ERROR_BAD_STATE );
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02006254 TEST_EQUAL( psa_key_derivation_get_capacity( &zero, &capacity ),
Jaeden Amerocf2010c2019-02-15 13:05:49 +00006255 PSA_ERROR_BAD_STATE );
Jaeden Amero5229bbb2019-02-07 16:33:37 +00006256
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006257 /* A default operation should be abortable without error. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02006258 PSA_ASSERT( psa_key_derivation_abort(&func) );
6259 PSA_ASSERT( psa_key_derivation_abort(&init) );
6260 PSA_ASSERT( psa_key_derivation_abort(&zero) );
Jaeden Amerod94d6712019-01-04 14:11:48 +00006261}
6262/* END_CASE */
6263
Janos Follath16de4a42019-06-13 16:32:24 +01006264/* BEGIN_CASE */
6265void derive_setup( int alg_arg, int expected_status_arg )
Gilles Peskineea0fb492018-07-12 17:17:20 +02006266{
Gilles Peskineea0fb492018-07-12 17:17:20 +02006267 psa_algorithm_t alg = alg_arg;
Gilles Peskineea0fb492018-07-12 17:17:20 +02006268 psa_status_t expected_status = expected_status_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006269 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineea0fb492018-07-12 17:17:20 +02006270
Gilles Peskine8817f612018-12-18 00:18:46 +01006271 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskineea0fb492018-07-12 17:17:20 +02006272
Janos Follath16de4a42019-06-13 16:32:24 +01006273 TEST_EQUAL( psa_key_derivation_setup( &operation, alg ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01006274 expected_status );
Gilles Peskineea0fb492018-07-12 17:17:20 +02006275
6276exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006277 psa_key_derivation_abort( &operation );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006278 PSA_DONE( );
Gilles Peskineea0fb492018-07-12 17:17:20 +02006279}
6280/* END_CASE */
6281
Janos Follathaf3c2a02019-06-12 12:34:34 +01006282/* BEGIN_CASE */
Janos Follatha27c9272019-06-14 09:59:36 +01006283void derive_set_capacity( int alg_arg, int capacity_arg,
6284 int expected_status_arg )
6285{
6286 psa_algorithm_t alg = alg_arg;
6287 size_t capacity = capacity_arg;
6288 psa_status_t expected_status = expected_status_arg;
6289 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
6290
6291 PSA_ASSERT( psa_crypto_init( ) );
6292
6293 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
6294
6295 TEST_EQUAL( psa_key_derivation_set_capacity( &operation, capacity ),
6296 expected_status );
6297
6298exit:
6299 psa_key_derivation_abort( &operation );
6300 PSA_DONE( );
6301}
6302/* END_CASE */
6303
6304/* BEGIN_CASE */
Janos Follathaf3c2a02019-06-12 12:34:34 +01006305void derive_input( int alg_arg,
Gilles Peskine6842ba42019-09-23 13:49:33 +02006306 int step_arg1, int key_type_arg1, data_t *input1,
Janos Follathaf3c2a02019-06-12 12:34:34 +01006307 int expected_status_arg1,
Gilles Peskine2058c072019-09-24 17:19:33 +02006308 int step_arg2, int key_type_arg2, data_t *input2,
Janos Follathaf3c2a02019-06-12 12:34:34 +01006309 int expected_status_arg2,
Gilles Peskine2058c072019-09-24 17:19:33 +02006310 int step_arg3, int key_type_arg3, data_t *input3,
Gilles Peskine1a2904c2019-09-24 17:45:07 +02006311 int expected_status_arg3,
6312 int output_key_type_arg, int expected_output_status_arg )
Janos Follathaf3c2a02019-06-12 12:34:34 +01006313{
6314 psa_algorithm_t alg = alg_arg;
Gilles Peskine6842ba42019-09-23 13:49:33 +02006315 psa_key_derivation_step_t steps[] = {step_arg1, step_arg2, step_arg3};
6316 psa_key_type_t key_types[] = {key_type_arg1, key_type_arg2, key_type_arg3};
Janos Follathaf3c2a02019-06-12 12:34:34 +01006317 psa_status_t expected_statuses[] = {expected_status_arg1,
6318 expected_status_arg2,
6319 expected_status_arg3};
6320 data_t *inputs[] = {input1, input2, input3};
Ronald Cron5425a212020-08-04 14:58:35 +02006321 mbedtls_svc_key_id_t keys[] = { MBEDTLS_SVC_KEY_ID_INIT,
6322 MBEDTLS_SVC_KEY_ID_INIT,
6323 MBEDTLS_SVC_KEY_ID_INIT };
Janos Follathaf3c2a02019-06-12 12:34:34 +01006324 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
6325 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
6326 size_t i;
Gilles Peskine1a2904c2019-09-24 17:45:07 +02006327 psa_key_type_t output_key_type = output_key_type_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02006328 mbedtls_svc_key_id_t output_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine1a2904c2019-09-24 17:45:07 +02006329 psa_status_t expected_output_status = expected_output_status_arg;
6330 psa_status_t actual_output_status;
Janos Follathaf3c2a02019-06-12 12:34:34 +01006331
6332 PSA_ASSERT( psa_crypto_init( ) );
6333
6334 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
6335 psa_set_key_algorithm( &attributes, alg );
Janos Follathaf3c2a02019-06-12 12:34:34 +01006336
6337 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
6338
6339 for( i = 0; i < ARRAY_LENGTH( steps ); i++ )
6340 {
Gilles Peskine4023c012021-05-27 13:21:20 +02006341 mbedtls_test_set_step( i );
6342 if( steps[i] == 0 )
6343 {
6344 /* Skip this step */
6345 }
6346 else if( key_types[i] != PSA_KEY_TYPE_NONE )
Janos Follathaf3c2a02019-06-12 12:34:34 +01006347 {
Gilles Peskine6842ba42019-09-23 13:49:33 +02006348 psa_set_key_type( &attributes, key_types[i] );
6349 PSA_ASSERT( psa_import_key( &attributes,
6350 inputs[i]->x, inputs[i]->len,
Ronald Cron5425a212020-08-04 14:58:35 +02006351 &keys[i] ) );
Steven Cooreman0ee0d522020-10-05 16:03:42 +02006352 if( PSA_KEY_TYPE_IS_KEY_PAIR( key_types[i] ) &&
6353 steps[i] == PSA_KEY_DERIVATION_INPUT_SECRET )
6354 {
6355 // When taking a private key as secret input, use key agreement
6356 // to add the shared secret to the derivation
Gilles Peskinec18e25f2021-02-12 23:48:20 +01006357 TEST_EQUAL( mbedtls_test_psa_key_agreement_with_self(
6358 &operation, keys[i] ),
Steven Cooreman0ee0d522020-10-05 16:03:42 +02006359 expected_statuses[i] );
6360 }
6361 else
6362 {
6363 TEST_EQUAL( psa_key_derivation_input_key( &operation, steps[i],
Ronald Cron5425a212020-08-04 14:58:35 +02006364 keys[i] ),
Steven Cooreman0ee0d522020-10-05 16:03:42 +02006365 expected_statuses[i] );
6366 }
Gilles Peskine6842ba42019-09-23 13:49:33 +02006367 }
6368 else
6369 {
6370 TEST_EQUAL( psa_key_derivation_input_bytes(
6371 &operation, steps[i],
6372 inputs[i]->x, inputs[i]->len ),
6373 expected_statuses[i] );
Janos Follathaf3c2a02019-06-12 12:34:34 +01006374 }
6375 }
6376
Gilles Peskine1a2904c2019-09-24 17:45:07 +02006377 if( output_key_type != PSA_KEY_TYPE_NONE )
6378 {
6379 psa_reset_key_attributes( &attributes );
Dave Rodgman491d8492021-11-16 12:12:49 +00006380 psa_set_key_type( &attributes, output_key_type );
Gilles Peskine1a2904c2019-09-24 17:45:07 +02006381 psa_set_key_bits( &attributes, 8 );
6382 actual_output_status =
6383 psa_key_derivation_output_key( &attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02006384 &output_key );
Gilles Peskine1a2904c2019-09-24 17:45:07 +02006385 }
6386 else
6387 {
6388 uint8_t buffer[1];
6389 actual_output_status =
6390 psa_key_derivation_output_bytes( &operation,
6391 buffer, sizeof( buffer ) );
6392 }
6393 TEST_EQUAL( actual_output_status, expected_output_status );
6394
Janos Follathaf3c2a02019-06-12 12:34:34 +01006395exit:
6396 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02006397 for( i = 0; i < ARRAY_LENGTH( keys ); i++ )
6398 psa_destroy_key( keys[i] );
6399 psa_destroy_key( output_key );
Janos Follathaf3c2a02019-06-12 12:34:34 +01006400 PSA_DONE( );
6401}
6402/* END_CASE */
6403
Janos Follathd958bb72019-07-03 15:02:16 +01006404/* BEGIN_CASE */
Gilles Peskine1c77edd2021-05-27 11:55:02 +02006405void derive_over_capacity( int alg_arg )
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03006406{
Janos Follathd958bb72019-07-03 15:02:16 +01006407 psa_algorithm_t alg = alg_arg;
Ronald Cron5425a212020-08-04 14:58:35 +02006408 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Nir Sonnenschein4eda37b2018-10-31 12:15:58 +02006409 size_t key_type = PSA_KEY_TYPE_DERIVE;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006410 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Janos Follathd958bb72019-07-03 15:02:16 +01006411 unsigned char input1[] = "Input 1";
6412 size_t input1_length = sizeof( input1 );
6413 unsigned char input2[] = "Input 2";
6414 size_t input2_length = sizeof( input2 );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006415 uint8_t buffer[42];
Nir Sonnenschein1caf6d22018-11-01 12:27:20 +02006416 size_t capacity = sizeof( buffer );
Nir Sonnenscheindd69d8b2018-11-01 12:24:23 +02006417 const uint8_t key_data[22] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
6418 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
6419 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02006420 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03006421
Gilles Peskine8817f612018-12-18 00:18:46 +01006422 PSA_ASSERT( psa_crypto_init( ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006423
Gilles Peskine2c2cf0e2019-04-19 19:58:20 +02006424 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
6425 psa_set_key_algorithm( &attributes, alg );
6426 psa_set_key_type( &attributes, key_type );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006427
Gilles Peskine73676cb2019-05-15 20:15:10 +02006428 PSA_ASSERT( psa_import_key( &attributes,
6429 key_data, sizeof( key_data ),
Ronald Cron5425a212020-08-04 14:58:35 +02006430 &key ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006431
6432 /* valid key derivation */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01006433 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, key, alg,
6434 input1, input1_length,
6435 input2, input2_length,
6436 capacity ) )
Janos Follathd958bb72019-07-03 15:02:16 +01006437 goto exit;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006438
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006439 /* state of operation shouldn't allow additional generation */
Janos Follathd958bb72019-07-03 15:02:16 +01006440 TEST_EQUAL( psa_key_derivation_setup( &operation, alg ),
Gilles Peskinef812dcf2018-12-18 00:33:25 +01006441 PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006442
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006443 PSA_ASSERT( psa_key_derivation_output_bytes( &operation, buffer, capacity ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006444
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006445 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, buffer, capacity ),
David Saadab4ecc272019-02-14 13:48:10 +02006446 PSA_ERROR_INSUFFICIENT_DATA );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006447
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006448exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006449 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02006450 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006451 PSA_DONE( );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006452}
6453/* END_CASE */
6454
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006455/* BEGIN_CASE */
Gilles Peskine1c77edd2021-05-27 11:55:02 +02006456void derive_actions_without_setup( )
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006457{
6458 uint8_t output_buffer[16];
6459 size_t buffer_size = 16;
6460 size_t capacity = 0;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006461 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006462
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006463 TEST_ASSERT( psa_key_derivation_output_bytes( &operation,
6464 output_buffer, buffer_size )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00006465 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006466
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006467 TEST_ASSERT( psa_key_derivation_get_capacity( &operation, &capacity )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00006468 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006469
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006470 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006471
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006472 TEST_ASSERT( psa_key_derivation_output_bytes( &operation,
6473 output_buffer, buffer_size )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00006474 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006475
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006476 TEST_ASSERT( psa_key_derivation_get_capacity( &operation, &capacity )
Jaeden Amerocf2010c2019-02-15 13:05:49 +00006477 == PSA_ERROR_BAD_STATE );
Nir Sonnenscheinb46e7ca2018-10-25 14:46:09 +03006478
6479exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006480 psa_key_derivation_abort( &operation );
Nir Sonnenscheine5204c92018-10-22 17:24:55 +03006481}
6482/* END_CASE */
6483
6484/* BEGIN_CASE */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006485void derive_output( int alg_arg,
Gilles Peskine1468da72019-05-29 17:35:49 +02006486 int step1_arg, data_t *input1,
6487 int step2_arg, data_t *input2,
6488 int step3_arg, data_t *input3,
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006489 int requested_capacity_arg,
6490 data_t *expected_output1,
6491 data_t *expected_output2 )
6492{
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006493 psa_algorithm_t alg = alg_arg;
Gilles Peskine1468da72019-05-29 17:35:49 +02006494 psa_key_derivation_step_t steps[] = {step1_arg, step2_arg, step3_arg};
6495 data_t *inputs[] = {input1, input2, input3};
Ronald Cron5425a212020-08-04 14:58:35 +02006496 mbedtls_svc_key_id_t keys[] = { MBEDTLS_SVC_KEY_ID_INIT,
6497 MBEDTLS_SVC_KEY_ID_INIT,
6498 MBEDTLS_SVC_KEY_ID_INIT };
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006499 size_t requested_capacity = requested_capacity_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006500 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006501 uint8_t *expected_outputs[2] =
6502 {expected_output1->x, expected_output2->x};
6503 size_t output_sizes[2] =
6504 {expected_output1->len, expected_output2->len};
6505 size_t output_buffer_size = 0;
6506 uint8_t *output_buffer = NULL;
6507 size_t expected_capacity;
6508 size_t current_capacity;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006509 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006510 psa_status_t status;
Gilles Peskine1468da72019-05-29 17:35:49 +02006511 size_t i;
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006512
6513 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
6514 {
6515 if( output_sizes[i] > output_buffer_size )
6516 output_buffer_size = output_sizes[i];
6517 if( output_sizes[i] == 0 )
6518 expected_outputs[i] = NULL;
6519 }
Gilles Peskine8cebbba2018-09-27 13:54:18 +02006520 ASSERT_ALLOC( output_buffer, output_buffer_size );
Gilles Peskine8817f612018-12-18 00:18:46 +01006521 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006522
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006523 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
6524 psa_set_key_algorithm( &attributes, alg );
6525 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006526
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006527 /* Extraction phase. */
Gilles Peskine1468da72019-05-29 17:35:49 +02006528 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
6529 PSA_ASSERT( psa_key_derivation_set_capacity( &operation,
6530 requested_capacity ) );
6531 for( i = 0; i < ARRAY_LENGTH( steps ); i++ )
Gilles Peskineb70a0fd2019-01-07 22:59:38 +01006532 {
Gilles Peskine1468da72019-05-29 17:35:49 +02006533 switch( steps[i] )
6534 {
6535 case 0:
6536 break;
6537 case PSA_KEY_DERIVATION_INPUT_SECRET:
6538 PSA_ASSERT( psa_import_key( &attributes,
6539 inputs[i]->x, inputs[i]->len,
Ronald Cron5425a212020-08-04 14:58:35 +02006540 &keys[i] ) );
gabor-mezei-armceface22021-01-21 12:26:17 +01006541
6542 if ( PSA_ALG_IS_TLS12_PSK_TO_MS( alg ) )
6543 {
6544 PSA_ASSERT( psa_get_key_attributes( keys[i], &attributes ) );
6545 TEST_ASSERT( PSA_BITS_TO_BYTES( psa_get_key_bits( &attributes ) ) <=
6546 PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE );
6547 }
6548
Gilles Peskine1468da72019-05-29 17:35:49 +02006549 PSA_ASSERT( psa_key_derivation_input_key(
Ronald Cron5425a212020-08-04 14:58:35 +02006550 &operation, steps[i], keys[i] ) );
Gilles Peskine1468da72019-05-29 17:35:49 +02006551 break;
6552 default:
6553 PSA_ASSERT( psa_key_derivation_input_bytes(
6554 &operation, steps[i],
6555 inputs[i]->x, inputs[i]->len ) );
6556 break;
6557 }
Gilles Peskineb70a0fd2019-01-07 22:59:38 +01006558 }
Gilles Peskine1468da72019-05-29 17:35:49 +02006559
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006560 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006561 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01006562 TEST_EQUAL( current_capacity, requested_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006563 expected_capacity = requested_capacity;
6564
6565 /* Expansion phase. */
6566 for( i = 0; i < ARRAY_LENGTH( expected_outputs ); i++ )
6567 {
6568 /* Read some bytes. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006569 status = psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006570 output_buffer, output_sizes[i] );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006571 if( expected_capacity == 0 && output_sizes[i] == 0 )
6572 {
6573 /* Reading 0 bytes when 0 bytes are available can go either way. */
6574 TEST_ASSERT( status == PSA_SUCCESS ||
David Saadab4ecc272019-02-14 13:48:10 +02006575 status == PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006576 continue;
6577 }
6578 else if( expected_capacity == 0 ||
6579 output_sizes[i] > expected_capacity )
6580 {
6581 /* Capacity exceeded. */
David Saadab4ecc272019-02-14 13:48:10 +02006582 TEST_EQUAL( status, PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006583 expected_capacity = 0;
6584 continue;
6585 }
6586 /* Success. Check the read data. */
Gilles Peskine8817f612018-12-18 00:18:46 +01006587 PSA_ASSERT( status );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006588 if( output_sizes[i] != 0 )
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01006589 ASSERT_COMPARE( output_buffer, output_sizes[i],
6590 expected_outputs[i], output_sizes[i] );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006591 /* Check the operation status. */
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006592 expected_capacity -= output_sizes[i];
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006593 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006594 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01006595 TEST_EQUAL( expected_capacity, current_capacity );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006596 }
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006597 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006598
6599exit:
6600 mbedtls_free( output_buffer );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006601 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02006602 for( i = 0; i < ARRAY_LENGTH( keys ); i++ )
6603 psa_destroy_key( keys[i] );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006604 PSA_DONE( );
Gilles Peskine96ee5c72018-07-12 17:24:54 +02006605}
6606/* END_CASE */
6607
6608/* BEGIN_CASE */
Gilles Peskined54931c2018-07-17 21:06:59 +02006609void derive_full( int alg_arg,
6610 data_t *key_data,
Janos Follath47f27ed2019-06-25 13:24:52 +01006611 data_t *input1,
6612 data_t *input2,
Gilles Peskined54931c2018-07-17 21:06:59 +02006613 int requested_capacity_arg )
6614{
Ronald Cron5425a212020-08-04 14:58:35 +02006615 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02006616 psa_algorithm_t alg = alg_arg;
6617 size_t requested_capacity = requested_capacity_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006618 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02006619 unsigned char output_buffer[16];
6620 size_t expected_capacity = requested_capacity;
6621 size_t current_capacity;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006622 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskined54931c2018-07-17 21:06:59 +02006623
Gilles Peskine8817f612018-12-18 00:18:46 +01006624 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02006625
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006626 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
6627 psa_set_key_algorithm( &attributes, alg );
6628 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskined54931c2018-07-17 21:06:59 +02006629
Gilles Peskine049c7532019-05-15 20:22:09 +02006630 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02006631 &key ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02006632
Gilles Peskinec18e25f2021-02-12 23:48:20 +01006633 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, key, alg,
6634 input1->x, input1->len,
6635 input2->x, input2->len,
6636 requested_capacity ) )
Janos Follathf2815ea2019-07-03 12:41:36 +01006637 goto exit;
Janos Follath47f27ed2019-06-25 13:24:52 +01006638
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006639 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006640 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01006641 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02006642
6643 /* Expansion phase. */
6644 while( current_capacity > 0 )
6645 {
6646 size_t read_size = sizeof( output_buffer );
6647 if( read_size > current_capacity )
6648 read_size = current_capacity;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006649 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006650 output_buffer,
6651 read_size ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02006652 expected_capacity -= read_size;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006653 PSA_ASSERT( psa_key_derivation_get_capacity( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006654 &current_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01006655 TEST_EQUAL( current_capacity, expected_capacity );
Gilles Peskined54931c2018-07-17 21:06:59 +02006656 }
6657
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006658 /* Check that the operation refuses to go over capacity. */
6659 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, output_buffer, 1 ),
David Saadab4ecc272019-02-14 13:48:10 +02006660 PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskined54931c2018-07-17 21:06:59 +02006661
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006662 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskined54931c2018-07-17 21:06:59 +02006663
6664exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006665 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02006666 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006667 PSA_DONE( );
Gilles Peskined54931c2018-07-17 21:06:59 +02006668}
6669/* END_CASE */
6670
Janos Follathe60c9052019-07-03 13:51:30 +01006671/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02006672void derive_key_exercise( int alg_arg,
6673 data_t *key_data,
Janos Follathe60c9052019-07-03 13:51:30 +01006674 data_t *input1,
6675 data_t *input2,
Gilles Peskine0386fba2018-07-12 17:29:22 +02006676 int derived_type_arg,
6677 int derived_bits_arg,
6678 int derived_usage_arg,
6679 int derived_alg_arg )
6680{
Ronald Cron5425a212020-08-04 14:58:35 +02006681 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
6682 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02006683 psa_algorithm_t alg = alg_arg;
6684 psa_key_type_t derived_type = derived_type_arg;
6685 size_t derived_bits = derived_bits_arg;
6686 psa_key_usage_t derived_usage = derived_usage_arg;
6687 psa_algorithm_t derived_alg = derived_alg_arg;
6688 size_t capacity = PSA_BITS_TO_BYTES( derived_bits );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006689 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006690 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02006691 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02006692
Gilles Peskine8817f612018-12-18 00:18:46 +01006693 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006694
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006695 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
6696 psa_set_key_algorithm( &attributes, alg );
6697 psa_set_key_type( &attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02006698 PSA_ASSERT( psa_import_key( &attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02006699 &base_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006700
6701 /* Derive a key. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01006702 if ( mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
6703 input1->x, input1->len,
6704 input2->x, input2->len,
6705 capacity ) )
Janos Follathe60c9052019-07-03 13:51:30 +01006706 goto exit;
6707
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006708 psa_set_key_usage_flags( &attributes, derived_usage );
6709 psa_set_key_algorithm( &attributes, derived_alg );
6710 psa_set_key_type( &attributes, derived_type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02006711 psa_set_key_bits( &attributes, derived_bits );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006712 PSA_ASSERT( psa_key_derivation_output_key( &attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02006713 &derived_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006714
6715 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02006716 PSA_ASSERT( psa_get_key_attributes( derived_key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02006717 TEST_EQUAL( psa_get_key_type( &got_attributes ), derived_type );
6718 TEST_EQUAL( psa_get_key_bits( &got_attributes ), derived_bits );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006719
6720 /* Exercise the derived key. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01006721 if( ! mbedtls_test_psa_exercise_key( derived_key, derived_usage, derived_alg ) )
Gilles Peskine0386fba2018-07-12 17:29:22 +02006722 goto exit;
6723
6724exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01006725 /*
6726 * Key attributes may have been returned by psa_get_key_attributes()
6727 * thus reset them as required.
6728 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02006729 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01006730
6731 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02006732 psa_destroy_key( base_key );
6733 psa_destroy_key( derived_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006734 PSA_DONE( );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006735}
6736/* END_CASE */
6737
Janos Follath42fd8882019-07-03 14:17:09 +01006738/* BEGIN_CASE */
Gilles Peskine0386fba2018-07-12 17:29:22 +02006739void derive_key_export( int alg_arg,
6740 data_t *key_data,
Janos Follath42fd8882019-07-03 14:17:09 +01006741 data_t *input1,
6742 data_t *input2,
Gilles Peskine0386fba2018-07-12 17:29:22 +02006743 int bytes1_arg,
6744 int bytes2_arg )
6745{
Ronald Cron5425a212020-08-04 14:58:35 +02006746 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
6747 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02006748 psa_algorithm_t alg = alg_arg;
6749 size_t bytes1 = bytes1_arg;
6750 size_t bytes2 = bytes2_arg;
6751 size_t capacity = bytes1 + bytes2;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006752 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02006753 uint8_t *output_buffer = NULL;
6754 uint8_t *export_buffer = NULL;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006755 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
6756 psa_key_attributes_t derived_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine0386fba2018-07-12 17:29:22 +02006757 size_t length;
6758
Gilles Peskine8cebbba2018-09-27 13:54:18 +02006759 ASSERT_ALLOC( output_buffer, capacity );
6760 ASSERT_ALLOC( export_buffer, capacity );
Gilles Peskine8817f612018-12-18 00:18:46 +01006761 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006762
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006763 psa_set_key_usage_flags( &base_attributes, PSA_KEY_USAGE_DERIVE );
6764 psa_set_key_algorithm( &base_attributes, alg );
6765 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02006766 PSA_ASSERT( psa_import_key( &base_attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02006767 &base_key ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006768
6769 /* Derive some material and output it. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01006770 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
6771 input1->x, input1->len,
6772 input2->x, input2->len,
6773 capacity ) )
Janos Follath42fd8882019-07-03 14:17:09 +01006774 goto exit;
6775
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006776 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006777 output_buffer,
6778 capacity ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006779 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006780
6781 /* Derive the same output again, but this time store it in key objects. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01006782 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
6783 input1->x, input1->len,
6784 input2->x, input2->len,
6785 capacity ) )
Janos Follath42fd8882019-07-03 14:17:09 +01006786 goto exit;
6787
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006788 psa_set_key_usage_flags( &derived_attributes, PSA_KEY_USAGE_EXPORT );
6789 psa_set_key_algorithm( &derived_attributes, 0 );
6790 psa_set_key_type( &derived_attributes, PSA_KEY_TYPE_RAW_DATA );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02006791 psa_set_key_bits( &derived_attributes, PSA_BYTES_TO_BITS( bytes1 ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006792 PSA_ASSERT( psa_key_derivation_output_key( &derived_attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02006793 &derived_key ) );
6794 PSA_ASSERT( psa_export_key( derived_key,
Gilles Peskine8817f612018-12-18 00:18:46 +01006795 export_buffer, bytes1,
6796 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01006797 TEST_EQUAL( length, bytes1 );
Ronald Cron5425a212020-08-04 14:58:35 +02006798 PSA_ASSERT( psa_destroy_key( derived_key ) );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02006799 psa_set_key_bits( &derived_attributes, PSA_BYTES_TO_BITS( bytes2 ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006800 PSA_ASSERT( psa_key_derivation_output_key( &derived_attributes, &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02006801 &derived_key ) );
6802 PSA_ASSERT( psa_export_key( derived_key,
Gilles Peskine8817f612018-12-18 00:18:46 +01006803 export_buffer + bytes1, bytes2,
6804 &length ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01006805 TEST_EQUAL( length, bytes2 );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006806
6807 /* Compare the outputs from the two runs. */
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01006808 ASSERT_COMPARE( output_buffer, bytes1 + bytes2,
6809 export_buffer, capacity );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006810
6811exit:
6812 mbedtls_free( output_buffer );
6813 mbedtls_free( export_buffer );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006814 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02006815 psa_destroy_key( base_key );
6816 psa_destroy_key( derived_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006817 PSA_DONE( );
Gilles Peskine0386fba2018-07-12 17:29:22 +02006818}
6819/* END_CASE */
6820
6821/* BEGIN_CASE */
Gilles Peskine7c227ae2019-07-31 15:14:44 +02006822void derive_key( int alg_arg,
6823 data_t *key_data, data_t *input1, data_t *input2,
6824 int type_arg, int bits_arg,
Steven Cooreman83fdb702021-01-21 14:24:39 +01006825 int expected_status_arg,
6826 int is_large_output )
Gilles Peskinec744d992019-07-30 17:26:54 +02006827{
Ronald Cron5425a212020-08-04 14:58:35 +02006828 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
6829 mbedtls_svc_key_id_t derived_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec744d992019-07-30 17:26:54 +02006830 psa_algorithm_t alg = alg_arg;
Gilles Peskine7c227ae2019-07-31 15:14:44 +02006831 psa_key_type_t type = type_arg;
Gilles Peskinec744d992019-07-30 17:26:54 +02006832 size_t bits = bits_arg;
6833 psa_status_t expected_status = expected_status_arg;
6834 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
6835 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
6836 psa_key_attributes_t derived_attributes = PSA_KEY_ATTRIBUTES_INIT;
6837
6838 PSA_ASSERT( psa_crypto_init( ) );
6839
6840 psa_set_key_usage_flags( &base_attributes, PSA_KEY_USAGE_DERIVE );
6841 psa_set_key_algorithm( &base_attributes, alg );
6842 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
6843 PSA_ASSERT( psa_import_key( &base_attributes, key_data->x, key_data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02006844 &base_key ) );
Gilles Peskinec744d992019-07-30 17:26:54 +02006845
Gilles Peskinec18e25f2021-02-12 23:48:20 +01006846 if( !mbedtls_test_psa_setup_key_derivation_wrap( &operation, base_key, alg,
6847 input1->x, input1->len,
6848 input2->x, input2->len,
6849 SIZE_MAX ) )
Gilles Peskinec744d992019-07-30 17:26:54 +02006850 goto exit;
6851
6852 psa_set_key_usage_flags( &derived_attributes, PSA_KEY_USAGE_EXPORT );
6853 psa_set_key_algorithm( &derived_attributes, 0 );
Gilles Peskine7c227ae2019-07-31 15:14:44 +02006854 psa_set_key_type( &derived_attributes, type );
Gilles Peskinec744d992019-07-30 17:26:54 +02006855 psa_set_key_bits( &derived_attributes, bits );
Steven Cooreman83fdb702021-01-21 14:24:39 +01006856
6857 psa_status_t status =
6858 psa_key_derivation_output_key( &derived_attributes,
6859 &operation,
6860 &derived_key );
6861 if( is_large_output > 0 )
6862 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
6863 TEST_EQUAL( status, expected_status );
Gilles Peskinec744d992019-07-30 17:26:54 +02006864
6865exit:
6866 psa_key_derivation_abort( &operation );
Ronald Cron5425a212020-08-04 14:58:35 +02006867 psa_destroy_key( base_key );
6868 psa_destroy_key( derived_key );
Gilles Peskinec744d992019-07-30 17:26:54 +02006869 PSA_DONE( );
6870}
6871/* END_CASE */
6872
6873/* BEGIN_CASE */
Gilles Peskine01d718c2018-09-18 12:01:02 +02006874void key_agreement_setup( int alg_arg,
Steven Cooremance48e852020-10-05 16:02:45 +02006875 int our_key_type_arg, int our_key_alg_arg,
6876 data_t *our_key_data, data_t *peer_key_data,
Gilles Peskine01d718c2018-09-18 12:01:02 +02006877 int expected_status_arg )
6878{
Ronald Cron5425a212020-08-04 14:58:35 +02006879 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine01d718c2018-09-18 12:01:02 +02006880 psa_algorithm_t alg = alg_arg;
Steven Cooremanfa5e6312020-10-15 17:07:12 +02006881 psa_algorithm_t our_key_alg = our_key_alg_arg;
Gilles Peskine01d718c2018-09-18 12:01:02 +02006882 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006883 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006884 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine77f40d82019-04-11 21:27:06 +02006885 psa_status_t expected_status = expected_status_arg;
6886 psa_status_t status;
Gilles Peskine01d718c2018-09-18 12:01:02 +02006887
Gilles Peskine8817f612018-12-18 00:18:46 +01006888 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02006889
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006890 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
Steven Cooremanfa5e6312020-10-15 17:07:12 +02006891 psa_set_key_algorithm( &attributes, our_key_alg );
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006892 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02006893 PSA_ASSERT( psa_import_key( &attributes,
6894 our_key_data->x, our_key_data->len,
6895 &our_key ) );
Gilles Peskine01d718c2018-09-18 12:01:02 +02006896
Gilles Peskine77f40d82019-04-11 21:27:06 +02006897 /* The tests currently include inputs that should fail at either step.
6898 * Test cases that fail at the setup step should be changed to call
6899 * key_derivation_setup instead, and this function should be renamed
6900 * to key_agreement_fail. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006901 status = psa_key_derivation_setup( &operation, alg );
Gilles Peskine77f40d82019-04-11 21:27:06 +02006902 if( status == PSA_SUCCESS )
6903 {
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006904 TEST_EQUAL( psa_key_derivation_key_agreement(
6905 &operation, PSA_KEY_DERIVATION_INPUT_SECRET,
6906 our_key,
6907 peer_key_data->x, peer_key_data->len ),
Gilles Peskine77f40d82019-04-11 21:27:06 +02006908 expected_status );
6909 }
6910 else
6911 {
6912 TEST_ASSERT( status == expected_status );
6913 }
Gilles Peskine01d718c2018-09-18 12:01:02 +02006914
6915exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006916 psa_key_derivation_abort( &operation );
Gilles Peskine01d718c2018-09-18 12:01:02 +02006917 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006918 PSA_DONE( );
Gilles Peskine01d718c2018-09-18 12:01:02 +02006919}
6920/* END_CASE */
6921
6922/* BEGIN_CASE */
Gilles Peskinef0cba732019-04-11 22:12:38 +02006923void raw_key_agreement( int alg_arg,
6924 int our_key_type_arg, data_t *our_key_data,
6925 data_t *peer_key_data,
6926 data_t *expected_output )
6927{
Ronald Cron5425a212020-08-04 14:58:35 +02006928 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinef0cba732019-04-11 22:12:38 +02006929 psa_algorithm_t alg = alg_arg;
6930 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006931 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinef0cba732019-04-11 22:12:38 +02006932 unsigned char *output = NULL;
6933 size_t output_length = ~0;
gabor-mezei-armceface22021-01-21 12:26:17 +01006934 size_t key_bits;
Gilles Peskinef0cba732019-04-11 22:12:38 +02006935
6936 ASSERT_ALLOC( output, expected_output->len );
6937 PSA_ASSERT( psa_crypto_init( ) );
6938
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006939 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
6940 psa_set_key_algorithm( &attributes, alg );
6941 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02006942 PSA_ASSERT( psa_import_key( &attributes,
6943 our_key_data->x, our_key_data->len,
6944 &our_key ) );
Gilles Peskinef0cba732019-04-11 22:12:38 +02006945
gabor-mezei-armceface22021-01-21 12:26:17 +01006946 PSA_ASSERT( psa_get_key_attributes( our_key, &attributes ) );
6947 key_bits = psa_get_key_bits( &attributes );
6948
Gilles Peskinebe697d82019-05-16 18:00:41 +02006949 PSA_ASSERT( psa_raw_key_agreement( alg, our_key,
6950 peer_key_data->x, peer_key_data->len,
6951 output, expected_output->len,
6952 &output_length ) );
Gilles Peskinef0cba732019-04-11 22:12:38 +02006953 ASSERT_COMPARE( output, output_length,
6954 expected_output->x, expected_output->len );
gabor-mezei-armceface22021-01-21 12:26:17 +01006955 TEST_ASSERT( output_length <=
6956 PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE( our_key_type, key_bits ) );
6957 TEST_ASSERT( output_length <=
6958 PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE );
Gilles Peskinef0cba732019-04-11 22:12:38 +02006959
6960exit:
6961 mbedtls_free( output );
6962 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02006963 PSA_DONE( );
Gilles Peskinef0cba732019-04-11 22:12:38 +02006964}
6965/* END_CASE */
6966
6967/* BEGIN_CASE */
Gilles Peskine59685592018-09-18 12:11:34 +02006968void key_agreement_capacity( int alg_arg,
6969 int our_key_type_arg, data_t *our_key_data,
6970 data_t *peer_key_data,
6971 int expected_capacity_arg )
6972{
Ronald Cron5425a212020-08-04 14:58:35 +02006973 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02006974 psa_algorithm_t alg = alg_arg;
6975 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006976 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006977 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02006978 size_t actual_capacity;
Gilles Peskinebf491972018-10-25 22:36:12 +02006979 unsigned char output[16];
Gilles Peskine59685592018-09-18 12:11:34 +02006980
Gilles Peskine8817f612018-12-18 00:18:46 +01006981 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02006982
Gilles Peskineff5f0e72019-04-18 12:53:30 +02006983 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
6984 psa_set_key_algorithm( &attributes, alg );
6985 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02006986 PSA_ASSERT( psa_import_key( &attributes,
6987 our_key_data->x, our_key_data->len,
6988 &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02006989
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006990 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02006991 PSA_ASSERT( psa_key_derivation_key_agreement(
6992 &operation,
6993 PSA_KEY_DERIVATION_INPUT_SECRET, our_key,
6994 peer_key_data->x, peer_key_data->len ) );
Gilles Peskinef8a9d942019-04-11 22:13:20 +02006995 if( PSA_ALG_IS_HKDF( PSA_ALG_KEY_AGREEMENT_GET_KDF( alg ) ) )
6996 {
6997 /* The test data is for info="" */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02006998 PSA_ASSERT( psa_key_derivation_input_bytes( &operation,
Gilles Peskine03410b52019-05-16 16:05:19 +02006999 PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskinef8a9d942019-04-11 22:13:20 +02007000 NULL, 0 ) );
7001 }
Gilles Peskine59685592018-09-18 12:11:34 +02007002
Gilles Peskinebf491972018-10-25 22:36:12 +02007003 /* Test the advertized capacity. */
Gilles Peskinea99d3fb2019-05-16 15:28:51 +02007004 PSA_ASSERT( psa_key_derivation_get_capacity(
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007005 &operation, &actual_capacity ) );
Gilles Peskinefe11b722018-12-18 00:24:04 +01007006 TEST_EQUAL( actual_capacity, (size_t) expected_capacity_arg );
Gilles Peskine59685592018-09-18 12:11:34 +02007007
Gilles Peskinebf491972018-10-25 22:36:12 +02007008 /* Test the actual capacity by reading the output. */
7009 while( actual_capacity > sizeof( output ) )
7010 {
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007011 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02007012 output, sizeof( output ) ) );
Gilles Peskinebf491972018-10-25 22:36:12 +02007013 actual_capacity -= sizeof( output );
7014 }
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007015 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02007016 output, actual_capacity ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007017 TEST_EQUAL( psa_key_derivation_output_bytes( &operation, output, 1 ),
David Saadab4ecc272019-02-14 13:48:10 +02007018 PSA_ERROR_INSUFFICIENT_DATA );
Gilles Peskinebf491972018-10-25 22:36:12 +02007019
Gilles Peskine59685592018-09-18 12:11:34 +02007020exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007021 psa_key_derivation_abort( &operation );
Gilles Peskine59685592018-09-18 12:11:34 +02007022 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02007023 PSA_DONE( );
Gilles Peskine59685592018-09-18 12:11:34 +02007024}
7025/* END_CASE */
7026
7027/* BEGIN_CASE */
7028void key_agreement_output( int alg_arg,
7029 int our_key_type_arg, data_t *our_key_data,
7030 data_t *peer_key_data,
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02007031 data_t *expected_output1, data_t *expected_output2 )
Gilles Peskine59685592018-09-18 12:11:34 +02007032{
Ronald Cron5425a212020-08-04 14:58:35 +02007033 mbedtls_svc_key_id_t our_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine59685592018-09-18 12:11:34 +02007034 psa_algorithm_t alg = alg_arg;
7035 psa_key_type_t our_key_type = our_key_type_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007036 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02007037 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02007038 uint8_t *actual_output = NULL;
Gilles Peskine59685592018-09-18 12:11:34 +02007039
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02007040 ASSERT_ALLOC( actual_output, MAX( expected_output1->len,
7041 expected_output2->len ) );
Gilles Peskine59685592018-09-18 12:11:34 +02007042
Gilles Peskine8817f612018-12-18 00:18:46 +01007043 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine59685592018-09-18 12:11:34 +02007044
Gilles Peskineff5f0e72019-04-18 12:53:30 +02007045 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DERIVE );
7046 psa_set_key_algorithm( &attributes, alg );
7047 psa_set_key_type( &attributes, our_key_type );
Gilles Peskine049c7532019-05-15 20:22:09 +02007048 PSA_ASSERT( psa_import_key( &attributes,
7049 our_key_data->x, our_key_data->len,
7050 &our_key ) );
Gilles Peskine59685592018-09-18 12:11:34 +02007051
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007052 PSA_ASSERT( psa_key_derivation_setup( &operation, alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02007053 PSA_ASSERT( psa_key_derivation_key_agreement(
7054 &operation,
7055 PSA_KEY_DERIVATION_INPUT_SECRET, our_key,
7056 peer_key_data->x, peer_key_data->len ) );
Gilles Peskinef8a9d942019-04-11 22:13:20 +02007057 if( PSA_ALG_IS_HKDF( PSA_ALG_KEY_AGREEMENT_GET_KDF( alg ) ) )
7058 {
7059 /* The test data is for info="" */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007060 PSA_ASSERT( psa_key_derivation_input_bytes( &operation,
Gilles Peskine03410b52019-05-16 16:05:19 +02007061 PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskinef8a9d942019-04-11 22:13:20 +02007062 NULL, 0 ) );
7063 }
Gilles Peskine59685592018-09-18 12:11:34 +02007064
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007065 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02007066 actual_output,
7067 expected_output1->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01007068 ASSERT_COMPARE( actual_output, expected_output1->len,
7069 expected_output1->x, expected_output1->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02007070 if( expected_output2->len != 0 )
7071 {
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007072 PSA_ASSERT( psa_key_derivation_output_bytes( &operation,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02007073 actual_output,
7074 expected_output2->len ) );
Gilles Peskine0dfba2d2018-12-18 00:40:50 +01007075 ASSERT_COMPARE( actual_output, expected_output2->len,
7076 expected_output2->x, expected_output2->len );
Gilles Peskine3ec8ed82018-10-25 22:37:15 +02007077 }
Gilles Peskine59685592018-09-18 12:11:34 +02007078
7079exit:
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007080 psa_key_derivation_abort( &operation );
Gilles Peskine59685592018-09-18 12:11:34 +02007081 psa_destroy_key( our_key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02007082 PSA_DONE( );
Gilles Peskine59685592018-09-18 12:11:34 +02007083 mbedtls_free( actual_output );
7084}
7085/* END_CASE */
7086
7087/* BEGIN_CASE */
Gilles Peskinea50d7392018-06-21 10:22:13 +02007088void generate_random( int bytes_arg )
Gilles Peskine05d69892018-06-19 22:00:52 +02007089{
Gilles Peskinea50d7392018-06-21 10:22:13 +02007090 size_t bytes = bytes_arg;
Gilles Peskine8cebbba2018-09-27 13:54:18 +02007091 unsigned char *output = NULL;
7092 unsigned char *changed = NULL;
Gilles Peskinea50d7392018-06-21 10:22:13 +02007093 size_t i;
7094 unsigned run;
Gilles Peskine05d69892018-06-19 22:00:52 +02007095
Simon Butcher49f8e312020-03-03 15:51:50 +00007096 TEST_ASSERT( bytes_arg >= 0 );
7097
Gilles Peskine91892022021-02-08 19:50:26 +01007098 ASSERT_ALLOC( output, bytes );
Gilles Peskine8cebbba2018-09-27 13:54:18 +02007099 ASSERT_ALLOC( changed, bytes );
Gilles Peskine05d69892018-06-19 22:00:52 +02007100
Gilles Peskine8817f612018-12-18 00:18:46 +01007101 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine05d69892018-06-19 22:00:52 +02007102
Gilles Peskinea50d7392018-06-21 10:22:13 +02007103 /* Run several times, to ensure that every output byte will be
7104 * nonzero at least once with overwhelming probability
7105 * (2^(-8*number_of_runs)). */
7106 for( run = 0; run < 10; run++ )
Gilles Peskine05d69892018-06-19 22:00:52 +02007107 {
Gilles Peskinef7ab5ad2018-09-26 18:19:24 +02007108 if( bytes != 0 )
7109 memset( output, 0, bytes );
Gilles Peskine8817f612018-12-18 00:18:46 +01007110 PSA_ASSERT( psa_generate_random( output, bytes ) );
Gilles Peskinea50d7392018-06-21 10:22:13 +02007111
Gilles Peskinea50d7392018-06-21 10:22:13 +02007112 for( i = 0; i < bytes; i++ )
7113 {
7114 if( output[i] != 0 )
7115 ++changed[i];
7116 }
Gilles Peskine05d69892018-06-19 22:00:52 +02007117 }
Gilles Peskinea50d7392018-06-21 10:22:13 +02007118
7119 /* Check that every byte was changed to nonzero at least once. This
7120 * validates that psa_generate_random is overwriting every byte of
7121 * the output buffer. */
7122 for( i = 0; i < bytes; i++ )
7123 {
7124 TEST_ASSERT( changed[i] != 0 );
7125 }
Gilles Peskine05d69892018-06-19 22:00:52 +02007126
7127exit:
Gilles Peskine1153e7b2019-05-28 15:10:21 +02007128 PSA_DONE( );
Gilles Peskinea50d7392018-06-21 10:22:13 +02007129 mbedtls_free( output );
7130 mbedtls_free( changed );
Gilles Peskine05d69892018-06-19 22:00:52 +02007131}
7132/* END_CASE */
Gilles Peskine12313cd2018-06-20 00:20:32 +02007133
7134/* BEGIN_CASE */
7135void generate_key( int type_arg,
7136 int bits_arg,
7137 int usage_arg,
7138 int alg_arg,
Steven Cooreman83fdb702021-01-21 14:24:39 +01007139 int expected_status_arg,
7140 int is_large_key )
Gilles Peskine12313cd2018-06-20 00:20:32 +02007141{
Ronald Cron5425a212020-08-04 14:58:35 +02007142 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02007143 psa_key_type_t type = type_arg;
7144 psa_key_usage_t usage = usage_arg;
7145 size_t bits = bits_arg;
7146 psa_algorithm_t alg = alg_arg;
7147 psa_status_t expected_status = expected_status_arg;
Gilles Peskineff5f0e72019-04-18 12:53:30 +02007148 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02007149 psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine12313cd2018-06-20 00:20:32 +02007150
Gilles Peskine8817f612018-12-18 00:18:46 +01007151 PSA_ASSERT( psa_crypto_init( ) );
Gilles Peskine12313cd2018-06-20 00:20:32 +02007152
Gilles Peskineff5f0e72019-04-18 12:53:30 +02007153 psa_set_key_usage_flags( &attributes, usage );
7154 psa_set_key_algorithm( &attributes, alg );
7155 psa_set_key_type( &attributes, type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02007156 psa_set_key_bits( &attributes, bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02007157
7158 /* Generate a key */
Steven Cooreman83fdb702021-01-21 14:24:39 +01007159 psa_status_t status = psa_generate_key( &attributes, &key );
7160
7161 if( is_large_key > 0 )
7162 TEST_ASSUME( status != PSA_ERROR_INSUFFICIENT_MEMORY );
7163 TEST_EQUAL( status , expected_status );
Gilles Peskinee56e8782019-04-26 17:34:02 +02007164 if( expected_status != PSA_SUCCESS )
Gilles Peskineff5f0e72019-04-18 12:53:30 +02007165 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02007166
7167 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02007168 PSA_ASSERT( psa_get_key_attributes( key, &got_attributes ) );
Gilles Peskine8c8f2ab2019-04-18 21:44:46 +02007169 TEST_EQUAL( psa_get_key_type( &got_attributes ), type );
7170 TEST_EQUAL( psa_get_key_bits( &got_attributes ), bits );
Gilles Peskine12313cd2018-06-20 00:20:32 +02007171
Gilles Peskine818ca122018-06-20 18:16:48 +02007172 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01007173 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskine02b75072018-07-01 22:31:34 +02007174 goto exit;
Gilles Peskine12313cd2018-06-20 00:20:32 +02007175
7176exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01007177 /*
7178 * Key attributes may have been returned by psa_get_key_attributes()
7179 * thus reset them as required.
7180 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02007181 psa_reset_key_attributes( &got_attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01007182
Ronald Cron5425a212020-08-04 14:58:35 +02007183 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02007184 PSA_DONE( );
Gilles Peskine12313cd2018-06-20 00:20:32 +02007185}
7186/* END_CASE */
itayzafrir0adf0fc2018-09-06 16:24:41 +03007187
Ronald Cronee414c72021-03-18 18:50:08 +01007188/* 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 +02007189void generate_key_rsa( int bits_arg,
7190 data_t *e_arg,
7191 int expected_status_arg )
7192{
Ronald Cron5425a212020-08-04 14:58:35 +02007193 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinec93b80c2019-05-16 19:39:54 +02007194 psa_key_type_t type = PSA_KEY_TYPE_RSA_KEY_PAIR;
Gilles Peskinee56e8782019-04-26 17:34:02 +02007195 size_t bits = bits_arg;
7196 psa_key_usage_t usage = PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT;
7197 psa_algorithm_t alg = PSA_ALG_RSA_PKCS1V15_SIGN_RAW;
7198 psa_status_t expected_status = expected_status_arg;
7199 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
7200 uint8_t *exported = NULL;
7201 size_t exported_size =
gabor-mezei-armcbcec212020-12-18 14:23:51 +01007202 PSA_EXPORT_KEY_OUTPUT_SIZE( PSA_KEY_TYPE_RSA_PUBLIC_KEY, bits );
Gilles Peskinee56e8782019-04-26 17:34:02 +02007203 size_t exported_length = SIZE_MAX;
7204 uint8_t *e_read_buffer = NULL;
7205 int is_default_public_exponent = 0;
Gilles Peskineaa02c172019-04-28 11:44:17 +02007206 size_t e_read_size = PSA_KEY_DOMAIN_PARAMETERS_SIZE( type, bits );
Gilles Peskinee56e8782019-04-26 17:34:02 +02007207 size_t e_read_length = SIZE_MAX;
7208
7209 if( e_arg->len == 0 ||
7210 ( e_arg->len == 3 &&
7211 e_arg->x[0] == 1 && e_arg->x[1] == 0 && e_arg->x[2] == 1 ) )
7212 {
7213 is_default_public_exponent = 1;
7214 e_read_size = 0;
7215 }
7216 ASSERT_ALLOC( e_read_buffer, e_read_size );
7217 ASSERT_ALLOC( exported, exported_size );
7218
7219 PSA_ASSERT( psa_crypto_init( ) );
7220
7221 psa_set_key_usage_flags( &attributes, usage );
7222 psa_set_key_algorithm( &attributes, alg );
7223 PSA_ASSERT( psa_set_key_domain_parameters( &attributes, type,
7224 e_arg->x, e_arg->len ) );
7225 psa_set_key_bits( &attributes, bits );
7226
7227 /* Generate a key */
Ronald Cron5425a212020-08-04 14:58:35 +02007228 TEST_EQUAL( psa_generate_key( &attributes, &key ), expected_status );
Gilles Peskinee56e8782019-04-26 17:34:02 +02007229 if( expected_status != PSA_SUCCESS )
7230 goto exit;
7231
7232 /* Test the key information */
Ronald Cron5425a212020-08-04 14:58:35 +02007233 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Gilles Peskinee56e8782019-04-26 17:34:02 +02007234 TEST_EQUAL( psa_get_key_type( &attributes ), type );
7235 TEST_EQUAL( psa_get_key_bits( &attributes ), bits );
7236 PSA_ASSERT( psa_get_key_domain_parameters( &attributes,
7237 e_read_buffer, e_read_size,
7238 &e_read_length ) );
7239 if( is_default_public_exponent )
7240 TEST_EQUAL( e_read_length, 0 );
7241 else
7242 ASSERT_COMPARE( e_read_buffer, e_read_length, e_arg->x, e_arg->len );
7243
7244 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01007245 if( ! mbedtls_test_psa_exercise_key( key, usage, alg ) )
Gilles Peskinee56e8782019-04-26 17:34:02 +02007246 goto exit;
7247
7248 /* Export the key and check the public exponent. */
Ronald Cron5425a212020-08-04 14:58:35 +02007249 PSA_ASSERT( psa_export_public_key( key,
Gilles Peskinee56e8782019-04-26 17:34:02 +02007250 exported, exported_size,
7251 &exported_length ) );
7252 {
7253 uint8_t *p = exported;
7254 uint8_t *end = exported + exported_length;
7255 size_t len;
7256 /* RSAPublicKey ::= SEQUENCE {
7257 * modulus INTEGER, -- n
7258 * publicExponent INTEGER } -- e
7259 */
7260 TEST_EQUAL( 0, mbedtls_asn1_get_tag( &p, end, &len,
Gilles Peskinecf7292e2019-05-16 17:53:40 +02007261 MBEDTLS_ASN1_SEQUENCE |
7262 MBEDTLS_ASN1_CONSTRUCTED ) );
Gilles Peskine8e94efe2021-02-13 00:25:53 +01007263 TEST_ASSERT( mbedtls_test_asn1_skip_integer( &p, end, bits, bits, 1 ) );
Gilles Peskinee56e8782019-04-26 17:34:02 +02007264 TEST_EQUAL( 0, mbedtls_asn1_get_tag( &p, end, &len,
7265 MBEDTLS_ASN1_INTEGER ) );
7266 if( len >= 1 && p[0] == 0 )
7267 {
7268 ++p;
7269 --len;
7270 }
7271 if( e_arg->len == 0 )
7272 {
7273 TEST_EQUAL( len, 3 );
7274 TEST_EQUAL( p[0], 1 );
7275 TEST_EQUAL( p[1], 0 );
7276 TEST_EQUAL( p[2], 1 );
7277 }
7278 else
7279 ASSERT_COMPARE( p, len, e_arg->x, e_arg->len );
7280 }
7281
7282exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01007283 /*
7284 * Key attributes may have been returned by psa_get_key_attributes() or
7285 * set by psa_set_key_domain_parameters() thus reset them as required.
7286 */
Gilles Peskinee56e8782019-04-26 17:34:02 +02007287 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01007288
Ronald Cron5425a212020-08-04 14:58:35 +02007289 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02007290 PSA_DONE( );
Gilles Peskinee56e8782019-04-26 17:34:02 +02007291 mbedtls_free( e_read_buffer );
7292 mbedtls_free( exported );
7293}
7294/* END_CASE */
7295
Darryl Greend49a4992018-06-18 17:27:26 +01007296/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C */
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007297void persistent_key_load_key_from_storage( data_t *data,
7298 int type_arg, int bits_arg,
7299 int usage_flags_arg, int alg_arg,
7300 int generation_method )
Darryl Greend49a4992018-06-18 17:27:26 +01007301{
Ronald Cron71016a92020-08-28 19:01:50 +02007302 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make( 1, 1 );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007303 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Ronald Cron5425a212020-08-04 14:58:35 +02007304 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
7305 mbedtls_svc_key_id_t base_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007306 psa_key_type_t type = type_arg;
7307 size_t bits = bits_arg;
7308 psa_key_usage_t usage_flags = usage_flags_arg;
7309 psa_algorithm_t alg = alg_arg;
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007310 psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
Darryl Greend49a4992018-06-18 17:27:26 +01007311 unsigned char *first_export = NULL;
7312 unsigned char *second_export = NULL;
gabor-mezei-armcbcec212020-12-18 14:23:51 +01007313 size_t export_size = PSA_EXPORT_KEY_OUTPUT_SIZE( type, bits );
Darryl Greend49a4992018-06-18 17:27:26 +01007314 size_t first_exported_length;
7315 size_t second_exported_length;
7316
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007317 if( usage_flags & PSA_KEY_USAGE_EXPORT )
7318 {
7319 ASSERT_ALLOC( first_export, export_size );
7320 ASSERT_ALLOC( second_export, export_size );
7321 }
Darryl Greend49a4992018-06-18 17:27:26 +01007322
Gilles Peskine8817f612018-12-18 00:18:46 +01007323 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01007324
Gilles Peskinec87af662019-05-15 16:12:22 +02007325 psa_set_key_id( &attributes, key_id );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007326 psa_set_key_usage_flags( &attributes, usage_flags );
7327 psa_set_key_algorithm( &attributes, alg );
7328 psa_set_key_type( &attributes, type );
Gilles Peskine3a4f1f82019-04-26 13:49:28 +02007329 psa_set_key_bits( &attributes, bits );
Darryl Greend49a4992018-06-18 17:27:26 +01007330
Darryl Green0c6575a2018-11-07 16:05:30 +00007331 switch( generation_method )
7332 {
7333 case IMPORT_KEY:
7334 /* Import the key */
Gilles Peskine049c7532019-05-15 20:22:09 +02007335 PSA_ASSERT( psa_import_key( &attributes, data->x, data->len,
Ronald Cron5425a212020-08-04 14:58:35 +02007336 &key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00007337 break;
Darryl Greend49a4992018-06-18 17:27:26 +01007338
Darryl Green0c6575a2018-11-07 16:05:30 +00007339 case GENERATE_KEY:
7340 /* Generate a key */
Ronald Cron5425a212020-08-04 14:58:35 +02007341 PSA_ASSERT( psa_generate_key( &attributes, &key ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00007342 break;
7343
7344 case DERIVE_KEY:
Steven Cooreman70f654a2021-02-15 10:51:43 +01007345#if defined(PSA_WANT_ALG_HKDF) && defined(PSA_WANT_ALG_SHA_256)
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007346 {
7347 /* Create base key */
7348 psa_algorithm_t derive_alg = PSA_ALG_HKDF( PSA_ALG_SHA_256 );
7349 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
7350 psa_set_key_usage_flags( &base_attributes,
7351 PSA_KEY_USAGE_DERIVE );
7352 psa_set_key_algorithm( &base_attributes, derive_alg );
7353 psa_set_key_type( &base_attributes, PSA_KEY_TYPE_DERIVE );
Gilles Peskine049c7532019-05-15 20:22:09 +02007354 PSA_ASSERT( psa_import_key( &base_attributes,
7355 data->x, data->len,
7356 &base_key ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007357 /* Derive a key. */
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007358 PSA_ASSERT( psa_key_derivation_setup( &operation, derive_alg ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02007359 PSA_ASSERT( psa_key_derivation_input_key(
7360 &operation,
7361 PSA_KEY_DERIVATION_INPUT_SECRET, base_key ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007362 PSA_ASSERT( psa_key_derivation_input_bytes(
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007363 &operation, PSA_KEY_DERIVATION_INPUT_INFO,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007364 NULL, 0 ) );
Gilles Peskinecf7292e2019-05-16 17:53:40 +02007365 PSA_ASSERT( psa_key_derivation_output_key( &attributes,
7366 &operation,
Ronald Cron5425a212020-08-04 14:58:35 +02007367 &key ) );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007368 PSA_ASSERT( psa_key_derivation_abort( &operation ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007369 PSA_ASSERT( psa_destroy_key( base_key ) );
Ronald Cron5425a212020-08-04 14:58:35 +02007370 base_key = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007371 }
Gilles Peskine6fea21d2021-01-12 00:02:15 +01007372#else
7373 TEST_ASSUME( ! "KDF not supported in this configuration" );
7374#endif
7375 break;
7376
7377 default:
7378 TEST_ASSERT( ! "generation_method not implemented in test" );
7379 break;
Darryl Green0c6575a2018-11-07 16:05:30 +00007380 }
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007381 psa_reset_key_attributes( &attributes );
Darryl Greend49a4992018-06-18 17:27:26 +01007382
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007383 /* Export the key if permitted by the key policy. */
7384 if( usage_flags & PSA_KEY_USAGE_EXPORT )
7385 {
Ronald Cron5425a212020-08-04 14:58:35 +02007386 PSA_ASSERT( psa_export_key( key,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007387 first_export, export_size,
7388 &first_exported_length ) );
7389 if( generation_method == IMPORT_KEY )
7390 ASSERT_COMPARE( data->x, data->len,
7391 first_export, first_exported_length );
7392 }
Darryl Greend49a4992018-06-18 17:27:26 +01007393
7394 /* Shutdown and restart */
Ronald Cron5425a212020-08-04 14:58:35 +02007395 PSA_ASSERT( psa_purge_key( key ) );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02007396 PSA_DONE();
Gilles Peskine8817f612018-12-18 00:18:46 +01007397 PSA_ASSERT( psa_crypto_init() );
Darryl Greend49a4992018-06-18 17:27:26 +01007398
Darryl Greend49a4992018-06-18 17:27:26 +01007399 /* Check key slot still contains key data */
Ronald Cron5425a212020-08-04 14:58:35 +02007400 PSA_ASSERT( psa_get_key_attributes( key, &attributes ) );
Ronald Cronecfb2372020-07-23 17:13:42 +02007401 TEST_ASSERT( mbedtls_svc_key_id_equal(
7402 psa_get_key_id( &attributes ), key_id ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007403 TEST_EQUAL( psa_get_key_lifetime( &attributes ),
7404 PSA_KEY_LIFETIME_PERSISTENT );
7405 TEST_EQUAL( psa_get_key_type( &attributes ), type );
7406 TEST_EQUAL( psa_get_key_bits( &attributes ), bits );
gabor-mezei-arm4ff73032021-05-13 12:05:01 +02007407 TEST_EQUAL( psa_get_key_usage_flags( &attributes ),
gabor-mezei-arm98a34352021-06-28 14:05:00 +02007408 mbedtls_test_update_key_usage_flags( usage_flags ) );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007409 TEST_EQUAL( psa_get_key_algorithm( &attributes ), alg );
Darryl Greend49a4992018-06-18 17:27:26 +01007410
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007411 /* Export the key again if permitted by the key policy. */
7412 if( usage_flags & PSA_KEY_USAGE_EXPORT )
Darryl Green0c6575a2018-11-07 16:05:30 +00007413 {
Ronald Cron5425a212020-08-04 14:58:35 +02007414 PSA_ASSERT( psa_export_key( key,
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007415 second_export, export_size,
7416 &second_exported_length ) );
Darryl Green0c6575a2018-11-07 16:05:30 +00007417 ASSERT_COMPARE( first_export, first_exported_length,
7418 second_export, second_exported_length );
Darryl Green0c6575a2018-11-07 16:05:30 +00007419 }
7420
7421 /* Do something with the key according to its type and permitted usage. */
Gilles Peskinec18e25f2021-02-12 23:48:20 +01007422 if( ! mbedtls_test_psa_exercise_key( key, usage_flags, alg ) )
Darryl Green0c6575a2018-11-07 16:05:30 +00007423 goto exit;
Darryl Greend49a4992018-06-18 17:27:26 +01007424
7425exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01007426 /*
7427 * Key attributes may have been returned by psa_get_key_attributes()
7428 * thus reset them as required.
7429 */
Gilles Peskinea1ace9c2019-04-26 16:03:33 +02007430 psa_reset_key_attributes( &attributes );
Ronald Cron3a4f0e32020-11-19 17:55:23 +01007431
Darryl Greend49a4992018-06-18 17:27:26 +01007432 mbedtls_free( first_export );
7433 mbedtls_free( second_export );
Gilles Peskine51ae0e42019-05-16 17:31:03 +02007434 psa_key_derivation_abort( &operation );
Gilles Peskine5c648ab2019-04-19 14:06:53 +02007435 psa_destroy_key( base_key );
Ronald Cron5425a212020-08-04 14:58:35 +02007436 psa_destroy_key( key );
Gilles Peskine1153e7b2019-05-28 15:10:21 +02007437 PSA_DONE();
Darryl Greend49a4992018-06-18 17:27:26 +01007438}
7439/* END_CASE */