blob: 69deba11e21be1fc38e4db2e9caaa0ea3dce3101 [file] [log] [blame]
Gilles Peskinee59236f2018-01-27 23:32:46 +01001/* BEGIN_HEADER */
itayzafrir3e02b3b2018-06-12 17:06:52 +03002#include <stdint.h>
Gilles Peskinee59236f2018-01-27 23:32:46 +01003#include "psa/crypto.h"
itayzafrir3e02b3b2018-06-12 17:06:52 +03004
5#if(UINT32_MAX > SIZE_MAX)
Gilles Peskine2d277862018-06-18 15:41:12 +02006#define PSA_CRYPTO_TEST_SIZE_T_RANGE( x ) ( ( x ) <= SIZE_MAX )
itayzafrir3e02b3b2018-06-12 17:06:52 +03007#else
Gilles Peskine2d277862018-06-18 15:41:12 +02008#define PSA_CRYPTO_TEST_SIZE_T_RANGE( x ) 1
itayzafrir3e02b3b2018-06-12 17:06:52 +03009#endif
Gilles Peskinee59236f2018-01-27 23:32:46 +010010/* END_HEADER */
11
12/* BEGIN_DEPENDENCIES
13 * depends_on:MBEDTLS_PSA_CRYPTO_C
14 * END_DEPENDENCIES
15 */
16
17/* BEGIN_CASE */
Gilles Peskine2d277862018-06-18 15:41:12 +020018void init_deinit( )
Gilles Peskinee59236f2018-01-27 23:32:46 +010019{
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010020 psa_status_t status;
Gilles Peskinee59236f2018-01-27 23:32:46 +010021 int i;
22 for( i = 0; i <= 1; i++ )
23 {
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010024 status = psa_crypto_init( );
25 TEST_ASSERT( status == PSA_SUCCESS );
26 status = psa_crypto_init( );
27 TEST_ASSERT( status == PSA_SUCCESS );
Gilles Peskinee59236f2018-01-27 23:32:46 +010028 mbedtls_psa_crypto_free( );
29 }
30}
31/* END_CASE */
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010032
33/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +030034void import( data_t *data, int type, int expected_status )
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010035{
36 int slot = 1;
37 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010038
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010039 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +030040 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010041 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
42
Gilles Peskine4abf7412018-06-18 16:35:34 +020043 status = psa_import_key( slot, type, data->x, data->len );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010044 TEST_ASSERT( status == (psa_status_t) expected_status );
45 if( status == PSA_SUCCESS )
46 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
47
48exit:
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010049 mbedtls_psa_crypto_free( );
50}
51/* END_CASE */
52
53/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +030054void import_export( data_t *data,
Moran Pekera964a8f2018-06-04 18:42:36 +030055 int type_arg,
56 int alg_arg,
57 int usage_arg,
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010058 int expected_bits,
59 int export_size_delta,
60 int expected_export_status,
61 int canonical_input )
62{
63 int slot = 1;
64 int slot2 = slot + 1;
65 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +020066 psa_algorithm_t alg = alg_arg;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010067 psa_status_t status;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010068 unsigned char *exported = NULL;
69 unsigned char *reexported = NULL;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010070 size_t export_size;
71 size_t exported_length;
72 size_t reexported_length;
73 psa_key_type_t got_type;
74 size_t got_bits;
Gilles Peskinedec72612018-06-18 18:12:37 +020075 psa_key_policy_t policy;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010076
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010077 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +030078 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
79 export_size = (ssize_t) data->len + export_size_delta;
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010080 exported = mbedtls_calloc( 1, export_size );
81 TEST_ASSERT( exported != NULL );
82 if( ! canonical_input )
83 {
84 reexported = mbedtls_calloc( 1, export_size );
85 TEST_ASSERT( reexported != NULL );
86 }
87 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
88
mohammad1603a97cb8c2018-03-28 03:46:26 -070089 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +020090 psa_key_policy_set_usage( &policy, usage_arg, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -070091 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
92
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010093 /* Import the key */
94 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +020095 data->x, data->len ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010096
97 /* Test the key information */
98 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskine4abf7412018-06-18 16:35:34 +020099 &got_type,
100 &got_bits ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100101 TEST_ASSERT( got_type == type );
102 TEST_ASSERT( got_bits == (size_t) expected_bits );
103
104 /* Export the key */
105 status = psa_export_key( slot,
106 exported, export_size,
107 &exported_length );
108 TEST_ASSERT( status == (psa_status_t) expected_export_status );
109 if( status != PSA_SUCCESS )
110 goto destroy;
111
112 if( canonical_input )
113 {
Gilles Peskine4abf7412018-06-18 16:35:34 +0200114 TEST_ASSERT( exported_length == data->len );
115 TEST_ASSERT( memcmp( exported, data->x, data->len ) == 0 );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100116 }
117 else
118 {
mohammad1603a97cb8c2018-03-28 03:46:26 -0700119 TEST_ASSERT( psa_set_key_policy( slot2, &policy ) == PSA_SUCCESS );
120
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100121 TEST_ASSERT( psa_import_key( slot2, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200122 exported,
123 export_size ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100124 TEST_ASSERT( psa_export_key( slot2,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200125 reexported,
126 export_size,
127 &reexported_length ) == PSA_SUCCESS );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100128 TEST_ASSERT( reexported_length == exported_length );
129 TEST_ASSERT( memcmp( reexported, exported,
130 exported_length ) == 0 );
131 }
132
133destroy:
134 /* Destroy the key */
135 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
136 TEST_ASSERT( psa_get_key_information(
137 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
138
139exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300140 mbedtls_free( exported );
141 mbedtls_free( reexported );
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100142 mbedtls_psa_crypto_free( );
143}
144/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100145
Moran Pekerf709f4a2018-06-06 17:26:04 +0300146/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300147void import_export_public_key( data_t *data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200148 int type_arg,
149 int alg_arg,
150 int expected_bits,
151 int public_key_expected_length,
152 int expected_export_status )
Moran Pekerf709f4a2018-06-06 17:26:04 +0300153{
154 int slot = 1;
155 psa_key_type_t type = type_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200156 psa_algorithm_t alg = alg_arg;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300157 psa_status_t status;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300158 unsigned char *exported = NULL;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300159 size_t export_size;
160 size_t exported_length;
161 psa_key_type_t got_type;
162 size_t got_bits;
Gilles Peskinedec72612018-06-18 18:12:37 +0200163 psa_key_policy_t policy;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300164
Moran Pekerf709f4a2018-06-06 17:26:04 +0300165 TEST_ASSERT( data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300166 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( data->len ) );
167 export_size = (ssize_t) data->len;
Moran Pekerf709f4a2018-06-06 17:26:04 +0300168 exported = mbedtls_calloc( 1, export_size );
169 TEST_ASSERT( exported != NULL );
170
171 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
172
173 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200174 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_EXPORT, alg );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300175 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
176
177 /* Import the key */
178 TEST_ASSERT( psa_import_key( slot, type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200179 data->x, data->len ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300180
181 /* Test the key information */
182 TEST_ASSERT( psa_get_key_information( slot,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200183 &got_type,
184 &got_bits ) == PSA_SUCCESS );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300185 TEST_ASSERT( got_type == type );
186 TEST_ASSERT( got_bits == (size_t) expected_bits );
187
188 /* Export the key */
189 status = psa_export_public_key( slot,
Gilles Peskine2d277862018-06-18 15:41:12 +0200190 exported, export_size,
191 &exported_length );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300192 TEST_ASSERT( status == (psa_status_t) expected_export_status );
193 if( status != PSA_SUCCESS )
194 goto destroy;
195
196 TEST_ASSERT( exported_length == (size_t) public_key_expected_length );
197
198destroy:
199 /* Destroy the key */
200 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
201 TEST_ASSERT( psa_get_key_information(
202 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
203
204exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300205 mbedtls_free( exported );
Moran Pekerf709f4a2018-06-06 17:26:04 +0300206 mbedtls_psa_crypto_free( );
207}
208/* END_CASE */
209
Gilles Peskine20035e32018-02-03 22:44:14 +0100210/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300211void hash_finish( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100212{
213 psa_algorithm_t alg = alg_arg;
Gilles Peskineb3e6e5d2018-06-18 22:16:43 +0200214 unsigned char actual_hash[PSA_HASH_MAX_SIZE];
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100215 size_t actual_hash_length;
216 psa_hash_operation_t operation;
217
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100218 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300219 TEST_ASSERT( expected_hash != NULL );
220 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
221 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100222
223 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
224
225 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
226 TEST_ASSERT( psa_hash_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200227 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100228 TEST_ASSERT( psa_hash_finish( &operation,
229 actual_hash, sizeof( actual_hash ),
230 &actual_hash_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200231 TEST_ASSERT( actual_hash_length == expected_hash->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300232 TEST_ASSERT( memcmp( expected_hash->x, actual_hash,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200233 expected_hash->len ) == 0 );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100234
235exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100236 mbedtls_psa_crypto_free( );
237}
238/* END_CASE */
239
240/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300241void hash_verify( int alg_arg, data_t *input, data_t *expected_hash )
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100242{
243 psa_algorithm_t alg = alg_arg;
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100244 psa_hash_operation_t operation;
245
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100246 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300247 TEST_ASSERT( expected_hash != NULL );
248 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
249 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_hash->len ) );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100250
251 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
252
253 TEST_ASSERT( psa_hash_start( &operation, alg ) == PSA_SUCCESS );
254 TEST_ASSERT( psa_hash_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200255 input->x,
256 input->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100257 TEST_ASSERT( psa_hash_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300258 expected_hash->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200259 expected_hash->len ) == PSA_SUCCESS );
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100260
261exit:
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100262 mbedtls_psa_crypto_free( );
263}
264/* END_CASE */
265
266/* BEGIN_CASE */
Gilles Peskinec0ec9722018-06-18 17:03:37 +0200267void mac_verify( int key_type_arg,
268 data_t *key,
269 int alg_arg,
270 data_t *input,
271 data_t *expected_mac )
Gilles Peskine8c9def32018-02-08 10:02:12 +0100272{
273 int key_slot = 1;
274 psa_key_type_t key_type = key_type_arg;
275 psa_algorithm_t alg = alg_arg;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100276 psa_mac_operation_t operation;
mohammad16036df908f2018-04-02 08:34:15 -0700277 psa_key_policy_t policy;
Gilles Peskine8c9def32018-02-08 10:02:12 +0100278
Gilles Peskine8c9def32018-02-08 10:02:12 +0100279 TEST_ASSERT( key != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100280 TEST_ASSERT( input != NULL );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100281 TEST_ASSERT( expected_mac != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300282 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300283 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
284 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_mac->len ) );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100285
286 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
287
mohammad16036df908f2018-04-02 08:34:15 -0700288 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200289 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
mohammad16036df908f2018-04-02 08:34:15 -0700290 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
291
Gilles Peskine8c9def32018-02-08 10:02:12 +0100292 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200293 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskinec0ec9722018-06-18 17:03:37 +0200294
Gilles Peskine8c9def32018-02-08 10:02:12 +0100295 TEST_ASSERT( psa_mac_start( &operation, key_slot, alg ) == PSA_SUCCESS );
296 TEST_ASSERT( psa_destroy_key( key_slot ) == PSA_SUCCESS );
297 TEST_ASSERT( psa_mac_update( &operation,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200298 input->x, input->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100299 TEST_ASSERT( psa_mac_verify( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300300 expected_mac->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200301 expected_mac->len ) == PSA_SUCCESS );
Gilles Peskine8c9def32018-02-08 10:02:12 +0100302
303exit:
Gilles Peskine8c9def32018-02-08 10:02:12 +0100304 psa_destroy_key( key_slot );
305 mbedtls_psa_crypto_free( );
306}
307/* END_CASE */
308
309/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +0200310void cipher_encrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300311 data_t *key,
312 data_t *input, data_t *expected_output,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200313 int expected_status )
314{
315 int key_slot = 1;
316 psa_status_t status;
317 psa_key_type_t key_type = key_type_arg;
318 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200319 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300320 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200321 size_t output_buffer_size = 0;
322 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200323 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200324 psa_cipher_operation_t operation;
325
Gilles Peskine50e586b2018-06-08 14:28:46 +0200326 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200327 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200328 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300329 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
330 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
331 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200332
333 memset( iv, 0x2a, sizeof( iv ) );
334
335 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
336
337 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200338 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200339
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200340 TEST_ASSERT( psa_encrypt_setup( &operation,
341 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200342
343 TEST_ASSERT( psa_encrypt_set_iv( &operation,
344 iv, sizeof( iv ) ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200345 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200346 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300347 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200348
Gilles Peskine4abf7412018-06-18 16:35:34 +0200349 TEST_ASSERT( psa_cipher_update( &operation,
350 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200351 output, output_buffer_size,
352 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200353 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200354 status = psa_cipher_finish( &operation,
355 output + function_output_length,
356 output_buffer_size,
357 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200358 total_output_length += function_output_length;
359
Gilles Peskine50e586b2018-06-08 14:28:46 +0200360 TEST_ASSERT( status == (psa_status_t) expected_status );
361 if( expected_status == PSA_SUCCESS )
362 {
363 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200364 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300365 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200366 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200367 }
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200368
Gilles Peskine50e586b2018-06-08 14:28:46 +0200369exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300370 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200371 psa_destroy_key( key_slot );
372 mbedtls_psa_crypto_free( );
373}
374/* END_CASE */
375
376/* BEGIN_CASE */
377void cipher_encrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300378 data_t *key,
379 data_t *input,
380 int first_part_size,
381 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +0200382{
383 int key_slot = 1;
384 psa_key_type_t key_type = key_type_arg;
385 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200386 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300387 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200388 size_t output_buffer_size = 0;
389 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200390 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200391 psa_cipher_operation_t operation;
392
Gilles Peskine50e586b2018-06-08 14:28:46 +0200393 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200394 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200395 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300396 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
397 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
398 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200399
400 memset( iv, 0x2a, sizeof( iv ) );
401
402 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
403
404 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200405 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200406
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200407 TEST_ASSERT( psa_encrypt_setup( &operation,
408 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200409
410 TEST_ASSERT( psa_encrypt_set_iv( &operation,
411 iv, sizeof( iv ) ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200412 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200413 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300414 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200415
Gilles Peskine4abf7412018-06-18 16:35:34 +0200416 TEST_ASSERT( (unsigned int) first_part_size < input->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300417 TEST_ASSERT( psa_cipher_update( &operation, input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200418 output, output_buffer_size,
419 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200420 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200421 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300422 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200423 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200424 output, output_buffer_size,
425 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200426 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200427 TEST_ASSERT( psa_cipher_finish( &operation,
428 output + function_output_length,
429 output_buffer_size,
430 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200431 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200432 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
433
Gilles Peskine4abf7412018-06-18 16:35:34 +0200434 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300435 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200436 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200437
438exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300439 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200440 psa_destroy_key( key_slot );
441 mbedtls_psa_crypto_free( );
442}
443/* END_CASE */
444
445/* BEGIN_CASE */
446void cipher_decrypt_multipart( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300447 data_t *key,
448 data_t *input,
449 int first_part_size,
450 data_t *expected_output )
Gilles Peskine50e586b2018-06-08 14:28:46 +0200451{
452 int key_slot = 1;
453
454 psa_key_type_t key_type = key_type_arg;
455 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200456 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300457 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200458 size_t output_buffer_size = 0;
459 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200460 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200461 psa_cipher_operation_t operation;
462
Gilles Peskine50e586b2018-06-08 14:28:46 +0200463 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200464 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200465 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300466 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
467 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
468 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200469
470 memset( iv, 0x2a, sizeof( iv ) );
471
472 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
473
474 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200475 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200476
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200477 TEST_ASSERT( psa_decrypt_setup( &operation,
478 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200479
480 TEST_ASSERT( psa_encrypt_set_iv( &operation,
481 iv, sizeof( iv ) ) == PSA_SUCCESS );
482
Gilles Peskine4abf7412018-06-18 16:35:34 +0200483 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200484 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300485 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200486
Gilles Peskine4abf7412018-06-18 16:35:34 +0200487 TEST_ASSERT( (unsigned int) first_part_size < input->len );
488 TEST_ASSERT( psa_cipher_update( &operation,
489 input->x, first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200490 output, output_buffer_size,
491 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200492 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200493 TEST_ASSERT( psa_cipher_update( &operation,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300494 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200495 input->len - first_part_size,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200496 output, output_buffer_size,
497 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200498 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200499 TEST_ASSERT( psa_cipher_finish( &operation,
500 output + function_output_length,
501 output_buffer_size,
502 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200503 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200504 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
505
Gilles Peskine4abf7412018-06-18 16:35:34 +0200506 TEST_ASSERT( total_output_length == expected_output->len );
Gilles Peskine2d277862018-06-18 15:41:12 +0200507 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200508 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200509
510exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300511 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200512 psa_destroy_key( key_slot );
513 mbedtls_psa_crypto_free( );
514}
515/* END_CASE */
516
Gilles Peskine50e586b2018-06-08 14:28:46 +0200517/* BEGIN_CASE */
518void cipher_decrypt( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300519 data_t *key,
520 data_t *input, data_t *expected_output,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200521 int expected_status )
522{
523 int key_slot = 1;
524 psa_status_t status;
525 psa_key_type_t key_type = key_type_arg;
526 psa_algorithm_t alg = alg_arg;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200527 unsigned char iv[16] = {0};
itayzafrir3e02b3b2018-06-12 17:06:52 +0300528 unsigned char *output = NULL;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200529 size_t output_buffer_size = 0;
530 size_t function_output_length = 0;
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200531 size_t total_output_length = 0;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200532 psa_cipher_operation_t operation;
533
Gilles Peskine50e586b2018-06-08 14:28:46 +0200534 TEST_ASSERT( key != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200535 TEST_ASSERT( input != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200536 TEST_ASSERT( expected_output != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300537 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
538 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
539 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_output->len ) );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200540
541 memset( iv, 0x2a, sizeof( iv ) );
542
543 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
544
545 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200546 key->x, key->len ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200547
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200548 TEST_ASSERT( psa_decrypt_setup( &operation,
549 key_slot, alg ) == PSA_SUCCESS );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200550
551 TEST_ASSERT( psa_encrypt_set_iv( &operation,
552 iv, sizeof( iv ) ) == PSA_SUCCESS );
553
Gilles Peskine4abf7412018-06-18 16:35:34 +0200554 output_buffer_size = input->len + operation.block_size;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200555 output = mbedtls_calloc( 1, output_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300556 TEST_ASSERT( output != NULL );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200557
Gilles Peskine4abf7412018-06-18 16:35:34 +0200558 TEST_ASSERT( psa_cipher_update( &operation,
559 input->x, input->len,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200560 output, output_buffer_size,
561 &function_output_length ) == PSA_SUCCESS );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200562 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200563 status = psa_cipher_finish( &operation,
564 output + function_output_length,
565 output_buffer_size,
566 &function_output_length );
Gilles Peskinea7ec95f2018-06-08 14:40:59 +0200567 total_output_length += function_output_length;
Gilles Peskine50e586b2018-06-08 14:28:46 +0200568 TEST_ASSERT( status == (psa_status_t) expected_status );
569
570 if( expected_status == PSA_SUCCESS )
571 {
572 TEST_ASSERT( psa_cipher_abort( &operation ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200573 TEST_ASSERT( total_output_length == expected_output->len );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300574 TEST_ASSERT( memcmp( expected_output->x, output,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200575 expected_output->len ) == 0 );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200576 }
577
Gilles Peskine50e586b2018-06-08 14:28:46 +0200578exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300579 mbedtls_free( output );
Gilles Peskine50e586b2018-06-08 14:28:46 +0200580 psa_destroy_key( key_slot );
581 mbedtls_psa_crypto_free( );
582}
583/* END_CASE */
584
Gilles Peskine50e586b2018-06-08 14:28:46 +0200585/* BEGIN_CASE */
586void cipher_verify_output( int alg_arg, int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300587 data_t *key,
588 data_t *input )
mohammad1603d7d7ba52018-03-12 18:51:53 +0200589{
590 int key_slot = 1;
591 psa_key_type_t key_type = key_type_arg;
592 psa_algorithm_t alg = alg_arg;
mohammad1603e6b67a12018-03-12 10:38:49 -0700593 unsigned char iv[16] = {0};
mohammad1603d7d7ba52018-03-12 18:51:53 +0200594 size_t iv_size = 16;
595 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300596 unsigned char *output1 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200597 size_t output1_size = 0;
598 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300599 unsigned char *output2 = NULL;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200600 size_t output2_size = 0;
601 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200602 size_t function_output_length = 0;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200603 psa_cipher_operation_t operation1;
604 psa_cipher_operation_t operation2;
605
mohammad1603d7d7ba52018-03-12 18:51:53 +0200606 TEST_ASSERT( key != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200607 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300608 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
609 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200610
mohammad1603d7d7ba52018-03-12 18:51:53 +0200611 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
612
613 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200614 key->x, key->len ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200615
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200616 TEST_ASSERT( psa_encrypt_setup( &operation1,
617 key_slot, alg ) == PSA_SUCCESS );
618 TEST_ASSERT( psa_decrypt_setup( &operation2,
619 key_slot, alg ) == PSA_SUCCESS );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200620
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200621 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
622 iv, iv_size,
623 &iv_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200624 output1_size = input->len + operation1.block_size;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200625 output1 = mbedtls_calloc( 1, output1_size );
626 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300627
Gilles Peskine4abf7412018-06-18 16:35:34 +0200628 TEST_ASSERT( psa_cipher_update( &operation1, input->x, input->len,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200629 output1, output1_size,
630 &output1_length ) == PSA_SUCCESS );
631 TEST_ASSERT( psa_cipher_finish( &operation1,
632 output1 + output1_length, output1_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200633 &function_output_length ) == PSA_SUCCESS );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200634
Gilles Peskine048b7f02018-06-08 14:20:49 +0200635 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300636
637 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
638
639 output2_size = output1_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200640 output2 = mbedtls_calloc( 1, output2_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300641 TEST_ASSERT( output2 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300642
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200643 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
644 iv, iv_length ) == PSA_SUCCESS );
645 TEST_ASSERT( psa_cipher_update( &operation2, output1, output1_length,
646 output2, output2_size,
647 &output2_length ) == PSA_SUCCESS );
Gilles Peskine048b7f02018-06-08 14:20:49 +0200648 function_output_length = 0;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200649 TEST_ASSERT( psa_cipher_finish( &operation2,
650 output2 + output2_length,
651 output2_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200652 &function_output_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300653
Gilles Peskine048b7f02018-06-08 14:20:49 +0200654 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200655
Moran Pekerded84402018-06-06 16:36:50 +0300656 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
657
Gilles Peskine4abf7412018-06-18 16:35:34 +0200658 TEST_ASSERT( input->len == output2_length );
659 TEST_ASSERT( memcmp( input->x, output2, input->len ) == 0 );
Moran Pekerded84402018-06-06 16:36:50 +0300660
661exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300662 mbedtls_free( output1 );
663 mbedtls_free( output2 );
Moran Pekerded84402018-06-06 16:36:50 +0300664 psa_destroy_key( key_slot );
665 mbedtls_psa_crypto_free( );
666}
667/* END_CASE */
668
669/* BEGIN_CASE */
Gilles Peskine50e586b2018-06-08 14:28:46 +0200670void cipher_verify_output_multipart( int alg_arg,
671 int key_type_arg,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300672 data_t *key,
673 data_t *input,
Gilles Peskine50e586b2018-06-08 14:28:46 +0200674 int first_part_size )
Moran Pekerded84402018-06-06 16:36:50 +0300675{
676 int key_slot = 1;
677 psa_key_type_t key_type = key_type_arg;
678 psa_algorithm_t alg = alg_arg;
Moran Pekerded84402018-06-06 16:36:50 +0300679 unsigned char iv[16] = {0};
680 size_t iv_size = 16;
681 size_t iv_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300682 unsigned char *output1 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200683 size_t output1_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +0300684 size_t output1_length = 0;
itayzafrir3e02b3b2018-06-12 17:06:52 +0300685 unsigned char *output2 = NULL;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200686 size_t output2_buffer_size = 0;
Moran Pekerded84402018-06-06 16:36:50 +0300687 size_t output2_length = 0;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200688 size_t function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300689 psa_cipher_operation_t operation1;
690 psa_cipher_operation_t operation2;
691
Moran Pekerded84402018-06-06 16:36:50 +0300692 TEST_ASSERT( key != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300693 TEST_ASSERT( input != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300694 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key->len ) );
695 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input->len ) );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200696
Moran Pekerded84402018-06-06 16:36:50 +0300697 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
698
699 TEST_ASSERT( psa_import_key( key_slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200700 key->x, key->len ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300701
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200702 TEST_ASSERT( psa_encrypt_setup( &operation1,
703 key_slot, alg ) == PSA_SUCCESS );
704 TEST_ASSERT( psa_decrypt_setup( &operation2,
705 key_slot, alg ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300706
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200707 TEST_ASSERT( psa_encrypt_generate_iv( &operation1,
708 iv, iv_size,
709 &iv_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +0200710 output1_buffer_size = input->len + operation1.block_size;
Gilles Peskine048b7f02018-06-08 14:20:49 +0200711 output1 = mbedtls_calloc( 1, output1_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300712 TEST_ASSERT( output1 != NULL );
Moran Pekerded84402018-06-06 16:36:50 +0300713
Gilles Peskine4abf7412018-06-18 16:35:34 +0200714 TEST_ASSERT( (unsigned int) first_part_size < input->len );
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200715
itayzafrir3e02b3b2018-06-12 17:06:52 +0300716 TEST_ASSERT( psa_cipher_update( &operation1, input->x, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200717 output1, output1_buffer_size,
718 &function_output_length ) == PSA_SUCCESS );
719 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300720
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200721 TEST_ASSERT( psa_cipher_update( &operation1,
itayzafrir3e02b3b2018-06-12 17:06:52 +0300722 input->x + first_part_size,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200723 input->len - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200724 output1, output1_buffer_size,
725 &function_output_length ) == PSA_SUCCESS );
726 output1_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300727
Gilles Peskine048b7f02018-06-08 14:20:49 +0200728 TEST_ASSERT( psa_cipher_finish( &operation1,
729 output1 + output1_length,
730 output1_buffer_size - output1_length,
731 &function_output_length ) == PSA_SUCCESS );
732 output1_length += function_output_length;
mohammad1603d7d7ba52018-03-12 18:51:53 +0200733
734 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
735
Gilles Peskine048b7f02018-06-08 14:20:49 +0200736 output2_buffer_size = output1_length;
737 output2 = mbedtls_calloc( 1, output2_buffer_size );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300738 TEST_ASSERT( output2 != NULL );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200739
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200740 TEST_ASSERT( psa_encrypt_set_iv( &operation2,
741 iv, iv_length ) == PSA_SUCCESS );
Moran Pekerded84402018-06-06 16:36:50 +0300742
743 TEST_ASSERT( psa_cipher_update( &operation2, output1, first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200744 output2, output2_buffer_size,
745 &function_output_length ) == PSA_SUCCESS );
746 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300747
Gilles Peskine048b7f02018-06-08 14:20:49 +0200748 TEST_ASSERT( psa_cipher_update( &operation2,
749 output1 + first_part_size,
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200750 output1_length - first_part_size,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200751 output2, output2_buffer_size,
752 &function_output_length ) == PSA_SUCCESS );
753 output2_length += function_output_length;
Moran Pekerded84402018-06-06 16:36:50 +0300754
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200755 TEST_ASSERT( psa_cipher_finish( &operation2,
756 output2 + output2_length,
Gilles Peskine048b7f02018-06-08 14:20:49 +0200757 output2_buffer_size - output2_length,
758 &function_output_length ) == PSA_SUCCESS );
759 output2_length += function_output_length;
Gilles Peskine4ca9c3f2018-06-06 18:44:09 +0200760
mohammad1603d7d7ba52018-03-12 18:51:53 +0200761 TEST_ASSERT( psa_cipher_abort( &operation1 ) == PSA_SUCCESS );
762
Gilles Peskine4abf7412018-06-18 16:35:34 +0200763 TEST_ASSERT( input->len == output2_length );
764 TEST_ASSERT( memcmp( input->x, output2, input->len ) == 0 );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200765
766exit:
itayzafrir3e02b3b2018-06-12 17:06:52 +0300767 mbedtls_free( output1 );
768 mbedtls_free( output2 );
mohammad1603d7d7ba52018-03-12 18:51:53 +0200769 psa_destroy_key( key_slot );
770 mbedtls_psa_crypto_free( );
771}
772/* END_CASE */
Gilles Peskine7268afc2018-06-06 15:19:24 +0200773
Gilles Peskine20035e32018-02-03 22:44:14 +0100774/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200775void aead_encrypt_decrypt( int key_type_arg,
776 data_t * key_data,
777 int alg_arg,
778 data_t * input_data,
779 data_t * nonce,
780 data_t * additional_data,
781 int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200782{
783 int slot = 1;
784 psa_key_type_t key_type = key_type_arg;
785 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200786 unsigned char *output_data = NULL;
787 size_t output_size = 0;
788 size_t output_length = 0;
789 unsigned char *output_data2 = NULL;
790 size_t output_length2 = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200791 size_t tag_length = 16;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200792 psa_status_t expected_result = expected_result_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +0200793 psa_key_policy_t policy;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200794
Gilles Peskinea1cac842018-06-11 19:33:02 +0200795 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200796 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300797 TEST_ASSERT( nonce != NULL );
798 TEST_ASSERT( additional_data != NULL );
799 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
800 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
801 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
802 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
803
Gilles Peskine4abf7412018-06-18 16:35:34 +0200804 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200805 output_data = mbedtls_calloc( 1, output_size );
806 TEST_ASSERT( output_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200807
808 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
809
810 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200811 psa_key_policy_set_usage( &policy,
812 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
813 alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200814 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
815
816 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200817 key_data->x, key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200818
819 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200820 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +0200821 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200822 additional_data->len,
823 input_data->x, input_data->len,
824 output_data, output_size,
825 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200826
827 if( PSA_SUCCESS == expected_result )
828 {
829 output_data2 = mbedtls_calloc( 1, output_length );
830 TEST_ASSERT( output_data2 != NULL );
831
832 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200833 nonce->x, nonce->len,
Gilles Peskine2d277862018-06-18 15:41:12 +0200834 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200835 additional_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200836 output_data, output_length,
837 output_data2, output_length,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200838 &output_length2 ) == expected_result );
Gilles Peskine2d277862018-06-18 15:41:12 +0200839
itayzafrir3e02b3b2018-06-12 17:06:52 +0300840 TEST_ASSERT( memcmp( input_data->x, output_data2,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200841 input_data->len ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200842 }
Gilles Peskine2d277862018-06-18 15:41:12 +0200843
Gilles Peskinea1cac842018-06-11 19:33:02 +0200844exit:
845 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200846 mbedtls_free( output_data );
847 mbedtls_free( output_data2 );
848 mbedtls_psa_crypto_free( );
849}
850/* END_CASE */
851
852/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300853void aead_encrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200854 int alg_arg, data_t * input_data,
855 data_t * additional_data, data_t * nonce,
856 data_t * expected_result )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200857{
858 int slot = 1;
859 psa_key_type_t key_type = key_type_arg;
860 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200861 unsigned char *output_data = NULL;
862 size_t output_size = 0;
863 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200864 size_t tag_length = 16;
Gilles Peskinedec72612018-06-18 18:12:37 +0200865 psa_key_policy_t policy;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200866
Gilles Peskinea1cac842018-06-11 19:33:02 +0200867 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200868 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300869 TEST_ASSERT( additional_data != NULL );
870 TEST_ASSERT( nonce != NULL );
871 TEST_ASSERT( expected_result != NULL );
872 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
873 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
874 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
875 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
876 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_result->len ) );
877
Gilles Peskine4abf7412018-06-18 16:35:34 +0200878 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200879 output_data = mbedtls_calloc( 1, output_size );
880 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +0200881
Gilles Peskinea1cac842018-06-11 19:33:02 +0200882 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
883
884 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200885 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200886 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
887
888 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200889 key_data->x,
890 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200891
892 TEST_ASSERT( psa_aead_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200893 nonce->x, nonce->len,
894 additional_data->x, additional_data->len,
895 input_data->x, input_data->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200896 output_data, output_size,
897 &output_length ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200898
itayzafrir3e02b3b2018-06-12 17:06:52 +0300899 TEST_ASSERT( memcmp( output_data, expected_result->x,
Gilles Peskine2d277862018-06-18 15:41:12 +0200900 output_length ) == 0 );
901
Gilles Peskinea1cac842018-06-11 19:33:02 +0200902exit:
903 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200904 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200905 mbedtls_psa_crypto_free( );
906}
907/* END_CASE */
908
909/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300910void aead_decrypt( int key_type_arg, data_t * key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +0200911 int alg_arg, data_t * input_data,
912 data_t * additional_data, data_t * nonce,
913 data_t * expected_data, int expected_result_arg )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200914{
915 int slot = 1;
916 psa_key_type_t key_type = key_type_arg;
917 psa_algorithm_t alg = alg_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200918 unsigned char *output_data = NULL;
919 size_t output_size = 0;
920 size_t output_length = 0;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200921 size_t tag_length = 16;
Gilles Peskinedec72612018-06-18 18:12:37 +0200922 psa_key_policy_t policy;
Gilles Peskine4abf7412018-06-18 16:35:34 +0200923 psa_status_t expected_result = expected_result_arg;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200924
Gilles Peskinea1cac842018-06-11 19:33:02 +0200925 TEST_ASSERT( key_data != NULL );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200926 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +0300927 TEST_ASSERT( additional_data != NULL );
928 TEST_ASSERT( nonce != NULL );
929 TEST_ASSERT( expected_data != NULL );
930 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
931 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
932 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( additional_data->len ) );
933 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( nonce->len ) );
934 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
935
Gilles Peskine4abf7412018-06-18 16:35:34 +0200936 output_size = input_data->len + tag_length;
Gilles Peskinea1cac842018-06-11 19:33:02 +0200937 output_data = mbedtls_calloc( 1, output_size );
938 TEST_ASSERT( output_data != NULL );
Gilles Peskine2d277862018-06-18 15:41:12 +0200939
Gilles Peskinea1cac842018-06-11 19:33:02 +0200940 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
941
942 psa_key_policy_init( &policy );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200943 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT , alg );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200944 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
945
946 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200947 key_data->x,
948 key_data->len ) == PSA_SUCCESS );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200949
950 TEST_ASSERT( psa_aead_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200951 nonce->x, nonce->len,
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200952 additional_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +0200953 additional_data->len,
954 input_data->x, input_data->len,
955 output_data, output_size,
956 &output_length ) == expected_result );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200957
Gilles Peskine2d277862018-06-18 15:41:12 +0200958 if( expected_result == PSA_SUCCESS )
Gilles Peskinea1cac842018-06-11 19:33:02 +0200959 {
itayzafrir3e02b3b2018-06-12 17:06:52 +0300960 TEST_ASSERT( memcmp( output_data, expected_data->x,
Gilles Peskine2d277862018-06-18 15:41:12 +0200961 output_length ) == 0 );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200962 }
963
Gilles Peskinea1cac842018-06-11 19:33:02 +0200964exit:
965 psa_destroy_key( slot );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200966 mbedtls_free( output_data );
Gilles Peskinea1cac842018-06-11 19:33:02 +0200967 mbedtls_psa_crypto_free( );
968}
969/* END_CASE */
970
971/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +0200972void signature_size( int type_arg,
973 int bits,
974 int alg_arg,
975 int expected_size_arg )
Gilles Peskinee59236f2018-01-27 23:32:46 +0100976{
977 psa_key_type_t type = type_arg;
978 psa_algorithm_t alg = alg_arg;
Gilles Peskine2d277862018-06-18 15:41:12 +0200979 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( type, bits, alg );
Gilles Peskinee59236f2018-01-27 23:32:46 +0100980 TEST_ASSERT( actual_size == (size_t) expected_size_arg );
981exit:
982 ;
983}
984/* END_CASE */
985
986/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +0300987void sign_deterministic( int key_type_arg, data_t *key_data,
988 int alg_arg, data_t *input_data,
989 data_t *output_data )
Gilles Peskinee59236f2018-01-27 23:32:46 +0100990{
991 int slot = 1;
992 psa_key_type_t key_type = key_type_arg;
993 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +0100994 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +0100995 unsigned char *signature = NULL;
996 size_t signature_size;
997 size_t signature_length = 0xdeadbeef;
Gilles Peskinedec72612018-06-18 18:12:37 +0200998 psa_key_policy_t policy;
Gilles Peskine20035e32018-02-03 22:44:14 +0100999
Gilles Peskine20035e32018-02-03 22:44:14 +01001000 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001001 TEST_ASSERT( input_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001002 TEST_ASSERT( output_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001003 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1004 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1005 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( output_data->len ) );
Gilles Peskine20035e32018-02-03 22:44:14 +01001006
1007 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1008
mohammad1603a97cb8c2018-03-28 03:46:26 -07001009 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001010 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001011 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1012
Gilles Peskine20035e32018-02-03 22:44:14 +01001013 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001014 key_data->x,
1015 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001016 TEST_ASSERT( psa_get_key_information( slot,
1017 NULL,
1018 &key_bits ) == PSA_SUCCESS );
1019
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001020 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type,
1021 key_bits, alg );
Gilles Peskine20035e32018-02-03 22:44:14 +01001022 TEST_ASSERT( signature_size != 0 );
1023 signature = mbedtls_calloc( 1, signature_size );
1024 TEST_ASSERT( signature != NULL );
1025
1026 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001027 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001028 NULL, 0,
1029 signature, signature_size,
1030 &signature_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001031 TEST_ASSERT( signature_length == output_data->len );
Gilles Peskine2d277862018-06-18 15:41:12 +02001032 TEST_ASSERT( memcmp( signature, output_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001033 output_data->len ) == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001034
1035exit:
1036 psa_destroy_key( slot );
Gilles Peskine0189e752018-02-03 23:57:22 +01001037 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +01001038 mbedtls_psa_crypto_free( );
1039}
1040/* END_CASE */
1041
1042/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001043void sign_fail( int key_type_arg, data_t *key_data,
1044 int alg_arg, data_t *input_data,
Gilles Peskine20035e32018-02-03 22:44:14 +01001045 int signature_size, int expected_status_arg )
1046{
1047 int slot = 1;
1048 psa_key_type_t key_type = key_type_arg;
1049 psa_algorithm_t alg = alg_arg;
Gilles Peskine20035e32018-02-03 22:44:14 +01001050 psa_status_t actual_status;
1051 psa_status_t expected_status = expected_status_arg;
Gilles Peskine40f68b92018-03-07 16:43:36 +01001052 unsigned char *signature = NULL;
Gilles Peskine93aa0332018-02-03 23:58:03 +01001053 size_t signature_length = 0xdeadbeef;
Gilles Peskinedec72612018-06-18 18:12:37 +02001054 psa_key_policy_t policy;
Gilles Peskine20035e32018-02-03 22:44:14 +01001055
Gilles Peskine20035e32018-02-03 22:44:14 +01001056 TEST_ASSERT( key_data != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +01001057 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001058 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1059 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1060
Gilles Peskine20035e32018-02-03 22:44:14 +01001061 signature = mbedtls_calloc( 1, signature_size );
1062 TEST_ASSERT( signature != NULL );
1063
1064 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1065
mohammad1603a97cb8c2018-03-28 03:46:26 -07001066 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001067 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN, alg );
mohammad1603a97cb8c2018-03-28 03:46:26 -07001068 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1069
Gilles Peskine20035e32018-02-03 22:44:14 +01001070 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001071 key_data->x,
1072 key_data->len ) == PSA_SUCCESS );
Gilles Peskine20035e32018-02-03 22:44:14 +01001073
1074 actual_status = psa_asymmetric_sign( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001075 input_data->x, input_data->len,
Gilles Peskine20035e32018-02-03 22:44:14 +01001076 NULL, 0,
1077 signature, signature_size,
1078 &signature_length );
1079 TEST_ASSERT( actual_status == expected_status );
Gilles Peskine93aa0332018-02-03 23:58:03 +01001080 TEST_ASSERT( signature_length == 0 );
Gilles Peskine20035e32018-02-03 22:44:14 +01001081
1082exit:
1083 psa_destroy_key( slot );
Gilles Peskine20035e32018-02-03 22:44:14 +01001084 mbedtls_free( signature );
1085 mbedtls_psa_crypto_free( );
1086}
1087/* END_CASE */
mohammad16038cc1cee2018-03-28 01:21:33 +03001088
1089/* BEGIN_CASE */
1090void key_policy( int usage_arg, int alg_arg )
1091{
1092 int key_slot = 1;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001093 psa_algorithm_t alg = alg_arg;
1094 psa_key_usage_t usage = usage_arg;
mohammad16034eed7572018-03-28 05:14:59 -07001095 psa_key_type_t key_type = PSA_KEY_TYPE_AES;
mohammad16038cc1cee2018-03-28 01:21:33 +03001096 unsigned char key[32] = {0};
Gilles Peskinedec72612018-06-18 18:12:37 +02001097 psa_key_policy_t policy_set;
1098 psa_key_policy_t policy_get;
mohammad1603804cd712018-03-20 22:44:08 +02001099
mohammad16038cc1cee2018-03-28 01:21:33 +03001100 memset( key, 0x2a, sizeof( key ) );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001101
mohammad16038cc1cee2018-03-28 01:21:33 +03001102 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1103
Gilles Peskine2d277862018-06-18 15:41:12 +02001104 psa_key_policy_init( &policy_set );
1105 psa_key_policy_init( &policy_get );
mohammad16038cc1cee2018-03-28 01:21:33 +03001106
Gilles Peskine4abf7412018-06-18 16:35:34 +02001107 psa_key_policy_set_usage( &policy_set, usage, alg );
mohammad16038cc1cee2018-03-28 01:21:33 +03001108
Gilles Peskine4abf7412018-06-18 16:35:34 +02001109 TEST_ASSERT( psa_key_policy_get_usage( &policy_set ) == usage );
1110 TEST_ASSERT( psa_key_policy_get_algorithm( &policy_set ) == alg );
mohammad16038cc1cee2018-03-28 01:21:33 +03001111 TEST_ASSERT( psa_set_key_policy( key_slot, &policy_set ) == PSA_SUCCESS );
1112
1113 TEST_ASSERT( psa_import_key( key_slot, key_type,
1114 key, sizeof( key ) ) == PSA_SUCCESS );
1115
1116 TEST_ASSERT( psa_get_key_policy( key_slot, &policy_get ) == PSA_SUCCESS );
1117
1118 TEST_ASSERT( policy_get.usage == policy_set.usage );
1119 TEST_ASSERT( policy_get.alg == policy_set.alg );
1120
1121exit:
1122 psa_destroy_key( key_slot );
1123 mbedtls_psa_crypto_free( );
1124}
1125/* END_CASE */
1126
mohammad16034eed7572018-03-28 05:14:59 -07001127/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001128void key_policy_fail( int usage_arg, int alg_arg, int expected_status,
1129 data_t *keypair )
mohammad16034eed7572018-03-28 05:14:59 -07001130{
1131 int key_slot = 1;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001132 psa_algorithm_t alg = alg_arg;
1133 psa_key_usage_t usage = usage_arg;
mohammad16034eed7572018-03-28 05:14:59 -07001134 size_t signature_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02001135 psa_key_policy_t policy;
mohammad16034eed7572018-03-28 05:14:59 -07001136 int actual_status = PSA_SUCCESS;
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001137
mohammad16034eed7572018-03-28 05:14:59 -07001138 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1139
1140 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001141 psa_key_policy_set_usage( &policy, usage, alg );
mohammad16034eed7572018-03-28 05:14:59 -07001142 TEST_ASSERT( psa_set_key_policy( key_slot, &policy ) == PSA_SUCCESS );
1143
Gilles Peskine4abf7412018-06-18 16:35:34 +02001144 if( usage & PSA_KEY_USAGE_EXPORT )
mohammad16034eed7572018-03-28 05:14:59 -07001145 {
mohammad16036df908f2018-04-02 08:34:15 -07001146 TEST_ASSERT( keypair != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001147 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001148 TEST_ASSERT( psa_import_key( key_slot,
1149 PSA_KEY_TYPE_RSA_KEYPAIR,
1150 keypair->x,
1151 keypair->len ) == PSA_SUCCESS );
1152 actual_status = psa_asymmetric_sign( key_slot, alg,
Gilles Peskine2d277862018-06-18 15:41:12 +02001153 NULL, 0,
1154 NULL, 0,
1155 NULL, 0, &signature_length );
mohammad16036df908f2018-04-02 08:34:15 -07001156 }
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001157
Gilles Peskine4abf7412018-06-18 16:35:34 +02001158 if( usage & PSA_KEY_USAGE_SIGN )
mohammad16036df908f2018-04-02 08:34:15 -07001159 {
mohammad1603d926b882018-04-16 01:53:20 -07001160 TEST_ASSERT( keypair != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001161 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( keypair->len ) );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001162 TEST_ASSERT( psa_import_key( key_slot,
1163 PSA_KEY_TYPE_RSA_KEYPAIR,
1164 keypair->x,
1165 keypair->len ) == PSA_SUCCESS );
mohammad16036df908f2018-04-02 08:34:15 -07001166 actual_status = psa_export_key( key_slot, NULL, 0, NULL );
mohammad16034eed7572018-03-28 05:14:59 -07001167 }
1168
1169 TEST_ASSERT( actual_status == expected_status );
1170
1171exit:
1172 psa_destroy_key( key_slot );
1173 mbedtls_psa_crypto_free( );
1174}
1175/* END_CASE */
Gilles Peskinea0655c32018-04-30 17:06:50 +02001176
1177/* BEGIN_CASE */
1178void key_lifetime( int lifetime_arg )
1179{
1180 int key_slot = 1;
1181 psa_key_type_t key_type = PSA_ALG_CBC_BASE;
1182 unsigned char key[32] = {0};
Gilles Peskine4abf7412018-06-18 16:35:34 +02001183 psa_key_lifetime_t lifetime_set = lifetime_arg;
Gilles Peskinea0655c32018-04-30 17:06:50 +02001184 psa_key_lifetime_t lifetime_get;
Gilles Peskine7268afc2018-06-06 15:19:24 +02001185
Gilles Peskinea0655c32018-04-30 17:06:50 +02001186 memset( key, 0x2a, sizeof( key ) );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001187
Gilles Peskinea0655c32018-04-30 17:06:50 +02001188 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001189
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001190 TEST_ASSERT( psa_set_key_lifetime( key_slot,
Gilles Peskine2d277862018-06-18 15:41:12 +02001191 lifetime_set ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001192
Gilles Peskinea0655c32018-04-30 17:06:50 +02001193 TEST_ASSERT( psa_import_key( key_slot, key_type,
1194 key, sizeof( key ) ) == PSA_SUCCESS );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001195
1196 TEST_ASSERT( psa_get_key_lifetime( key_slot,
Gilles Peskine2d277862018-06-18 15:41:12 +02001197 &lifetime_get ) == PSA_SUCCESS );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001198
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001199 TEST_ASSERT( lifetime_get == lifetime_set );
Gilles Peskine7268afc2018-06-06 15:19:24 +02001200
Gilles Peskinea0655c32018-04-30 17:06:50 +02001201exit:
1202 psa_destroy_key( key_slot );
1203 mbedtls_psa_crypto_free( );
1204}
1205/* END_CASE */
mohammad1603804cd712018-03-20 22:44:08 +02001206
1207/* BEGIN_CASE */
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001208void key_lifetime_set_fail( int key_slot_arg,
1209 int lifetime_arg,
1210 int expected_status_arg )
mohammad1603804cd712018-03-20 22:44:08 +02001211{
Gilles Peskine01b929c2018-06-18 16:40:34 +02001212 psa_key_slot_t key_slot = key_slot_arg;
Gilles Peskine4abf7412018-06-18 16:35:34 +02001213 psa_key_lifetime_t lifetime_set = lifetime_arg;
mohammad1603804cd712018-03-20 22:44:08 +02001214 psa_status_t actual_status;
1215 psa_status_t expected_status = expected_status_arg;
1216
mohammad1603804cd712018-03-20 22:44:08 +02001217 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1218
Gilles Peskine01b929c2018-06-18 16:40:34 +02001219 actual_status = psa_set_key_lifetime( key_slot, lifetime_set );
mohammad1603804cd712018-03-20 22:44:08 +02001220
1221 if( actual_status == PSA_SUCCESS )
Gilles Peskine01b929c2018-06-18 16:40:34 +02001222 actual_status = psa_set_key_lifetime( key_slot, lifetime_set );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001223
mohammad1603804cd712018-03-20 22:44:08 +02001224 TEST_ASSERT( expected_status == actual_status );
1225
1226exit:
mohammad1603804cd712018-03-20 22:44:08 +02001227 psa_destroy_key( key_slot );
1228 mbedtls_psa_crypto_free( );
1229}
1230/* END_CASE */
itayzafrir5c753392018-05-08 11:18:38 +03001231
1232/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001233void asymmetric_verify( int key_type_arg, data_t *key_data,
1234 int alg_arg, data_t *hash_data,
1235 data_t *signature_data )
itayzafrir5c753392018-05-08 11:18:38 +03001236{
1237 int slot = 1;
1238 psa_key_type_t key_type = key_type_arg;
1239 psa_algorithm_t alg = alg_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001240 psa_key_policy_t policy;
itayzafrir5c753392018-05-08 11:18:38 +03001241
itayzafrir5c753392018-05-08 11:18:38 +03001242 TEST_ASSERT( key_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001243 TEST_ASSERT( hash_data != NULL );
itayzafrir5c753392018-05-08 11:18:38 +03001244 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001245 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1246 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1247 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
itayzafrir5c753392018-05-08 11:18:38 +03001248
1249 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1250
1251 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001252 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
itayzafrir5c753392018-05-08 11:18:38 +03001253 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1254
1255 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001256 key_data->x,
1257 key_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001258
1259 TEST_ASSERT( psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001260 hash_data->x, hash_data->len,
itayzafrir5c753392018-05-08 11:18:38 +03001261 NULL, 0,
itayzafrir3e02b3b2018-06-12 17:06:52 +03001262 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001263 signature_data->len ) == PSA_SUCCESS );
itayzafrir5c753392018-05-08 11:18:38 +03001264exit:
1265 psa_destroy_key( slot );
itayzafrir5c753392018-05-08 11:18:38 +03001266 mbedtls_psa_crypto_free( );
1267}
1268/* END_CASE */
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001269
1270/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001271void asymmetric_verify_fail( int key_type_arg, data_t *key_data,
1272 int alg_arg, data_t *hash_data,
1273 data_t *signature_data,
1274 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001275{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001276 int slot = 1;
1277 psa_key_type_t key_type = key_type_arg;
1278 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001279 psa_status_t actual_status;
1280 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001281 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001282
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001283 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001284 TEST_ASSERT( hash_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001285 TEST_ASSERT( signature_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001286 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1287 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( hash_data->len ) );
1288 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( signature_data->len ) );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001289
1290 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1291
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001292 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001293 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_VERIFY, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001294 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1295
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001296 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001297 key_data->x,
1298 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001299
1300 actual_status = psa_asymmetric_verify( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001301 hash_data->x, hash_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001302 NULL, 0,
1303 signature_data->x,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001304 signature_data->len );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001305
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001306 TEST_ASSERT( actual_status == expected_status );
1307
1308exit:
1309 psa_destroy_key( slot );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001310 mbedtls_psa_crypto_free( );
1311}
1312/* END_CASE */
1313
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001314/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001315void asymmetric_encrypt_decrypt( int key_type_arg, data_t *key_data,
1316 int alg_arg, data_t *input_data )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001317{
1318 int slot = 1;
1319 psa_key_type_t key_type = key_type_arg;
1320 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001321 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001322 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001323 size_t output_length = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001324 unsigned char *output2 = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001325 size_t output2_size = 0;
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001326 size_t output2_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02001327 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001328
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001329 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001330 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001331 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1332 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1333
Gilles Peskine4abf7412018-06-18 16:35:34 +02001334 output_size = key_data->len;
itayzafrir3e02b3b2018-06-12 17:06:52 +03001335 output2_size = output_size;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001336 output = mbedtls_calloc( 1, output_size );
1337 TEST_ASSERT( output != NULL );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001338 output2 = mbedtls_calloc( 1, output2_size );
1339 TEST_ASSERT( output2 != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001340
1341 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1342
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001343 psa_key_policy_init( &policy );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001344 psa_key_policy_set_usage( &policy,
1345 PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001346 alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001347 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1348
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001349 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001350 key_data->x,
1351 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001352
Gilles Peskineeebd7382018-06-08 18:11:54 +02001353 /* We test encryption by checking that encrypt-then-decrypt gives back
1354 * the original plaintext because of the non-optional random
1355 * part of encryption process which prevents using fixed vectors. */
Gilles Peskine2d277862018-06-18 15:41:12 +02001356 TEST_ASSERT( psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001357 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001358 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001359 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001360 &output_length ) == PSA_SUCCESS );
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001361
Gilles Peskine2d277862018-06-18 15:41:12 +02001362 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001363 output, output_length,
Gilles Peskine2d277862018-06-18 15:41:12 +02001364 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001365 output2, output2_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001366 &output2_length ) == PSA_SUCCESS );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001367 TEST_ASSERT( memcmp( input_data->x, output2,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001368 input_data->len ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001369
1370exit:
1371 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001372 mbedtls_free( output );
1373 mbedtls_free( output2 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001374 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001375}
1376/* END_CASE */
1377
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001378/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001379void asymmetric_encrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001380 int alg_arg, data_t *input_data,
1381 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001382{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001383 int slot = 1;
1384 psa_key_type_t key_type = key_type_arg;
1385 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001386 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001387 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001388 size_t output_length = 0;
1389 psa_status_t actual_status;
1390 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001391 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001392
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001393 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001394 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001395 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1396 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1397
Gilles Peskine4abf7412018-06-18 16:35:34 +02001398 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001399 output = mbedtls_calloc( 1, output_size );
1400 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001401
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001402 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1403
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001404 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001405 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_ENCRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001406 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1407
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001408 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001409 key_data->x,
1410 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001411
Gilles Peskine2d277862018-06-18 15:41:12 +02001412 actual_status = psa_asymmetric_encrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001413 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001414 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001415 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001416 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001417 TEST_ASSERT( actual_status == expected_status );
1418
1419exit:
1420 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001421 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001422 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001423}
1424/* END_CASE */
1425
1426/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001427void asymmetric_decrypt( int key_type_arg, data_t *key_data,
1428 int alg_arg, data_t *input_data,
1429 data_t *expected_data, int expected_size )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001430{
1431 int slot = 1;
1432 psa_key_type_t key_type = key_type_arg;
1433 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001434 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001435 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001436 size_t output_length = 0;
Gilles Peskinedec72612018-06-18 18:12:37 +02001437 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001438
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001439 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001440 TEST_ASSERT( input_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001441 TEST_ASSERT( expected_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001442 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1443 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1444 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( expected_data->len ) );
1445
Gilles Peskine4abf7412018-06-18 16:35:34 +02001446 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001447 output = mbedtls_calloc( 1, output_size );
1448 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001449
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001450 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1451
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001452 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001453 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001454 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1455
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001456 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001457 key_data->x,
1458 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001459
Nir Sonnenschein0f3bdbd2018-05-02 23:56:12 +03001460 TEST_ASSERT( psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001461 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001462 NULL, 0,
1463 output,
1464 output_size,
1465 &output_length ) == PSA_SUCCESS );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001466 TEST_ASSERT( (size_t) expected_size == output_length );
Gilles Peskinec1bb6c82018-06-18 16:04:39 +02001467 TEST_ASSERT( memcmp( expected_data->x, output, output_length ) == 0 );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001468
1469exit:
1470 psa_destroy_key( slot );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001471 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001472 mbedtls_psa_crypto_free( );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001473}
1474/* END_CASE */
1475
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001476/* BEGIN_CASE */
itayzafrir3e02b3b2018-06-12 17:06:52 +03001477void asymmetric_decrypt_fail( int key_type_arg, data_t *key_data,
Gilles Peskine2d277862018-06-18 15:41:12 +02001478 int alg_arg, data_t *input_data,
1479 int expected_status_arg )
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001480{
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001481 int slot = 1;
1482 psa_key_type_t key_type = key_type_arg;
1483 psa_algorithm_t alg = alg_arg;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001484 unsigned char *output = NULL;
Nir Sonnenscheind70bc482018-06-04 16:31:13 +03001485 size_t output_size = 0;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001486 size_t output_length = 0;
1487 psa_status_t actual_status;
1488 psa_status_t expected_status = expected_status_arg;
Gilles Peskinedec72612018-06-18 18:12:37 +02001489 psa_key_policy_t policy;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001490
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001491 TEST_ASSERT( key_data != NULL );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001492 TEST_ASSERT( input_data != NULL );
itayzafrir3e02b3b2018-06-12 17:06:52 +03001493 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( key_data->len ) );
1494 TEST_ASSERT( PSA_CRYPTO_TEST_SIZE_T_RANGE( input_data->len ) );
1495
Gilles Peskine4abf7412018-06-18 16:35:34 +02001496 output_size = key_data->len;
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001497 output = mbedtls_calloc( 1, output_size );
1498 TEST_ASSERT( output != NULL );
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001499
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001500 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
1501
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001502 psa_key_policy_init( &policy );
Gilles Peskine4abf7412018-06-18 16:35:34 +02001503 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_DECRYPT, alg );
Nir Sonnenscheind7082602018-06-04 16:45:27 +03001504 TEST_ASSERT( psa_set_key_policy( slot, &policy ) == PSA_SUCCESS );
1505
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001506 TEST_ASSERT( psa_import_key( slot, key_type,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001507 key_data->x,
1508 key_data->len ) == PSA_SUCCESS );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001509
Gilles Peskine2d277862018-06-18 15:41:12 +02001510 actual_status = psa_asymmetric_decrypt( slot, alg,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001511 input_data->x, input_data->len,
Gilles Peskine2d277862018-06-18 15:41:12 +02001512 NULL, 0,
Gilles Peskine4abf7412018-06-18 16:35:34 +02001513 output, output_size,
Gilles Peskine2d277862018-06-18 15:41:12 +02001514 &output_length );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001515 TEST_ASSERT( actual_status == expected_status );
1516
1517exit:
1518 psa_destroy_key( slot );
Gilles Peskine2d277862018-06-18 15:41:12 +02001519 mbedtls_free( output );
Nir Sonnenschein39e59142018-05-02 23:16:26 +03001520 mbedtls_psa_crypto_free( );
1521}
Gilles Peskine5b051bc2018-05-31 13:25:48 +02001522/* END_CASE */