blob: 5440e45a63a0e6be6155e2a74e8d092c3f760006 [file] [log] [blame]
Ronald Cron0ff57952021-03-08 16:46:35 +01001/*
2 * PSA cipher driver entry points
3 */
4/*
5 * Copyright The Mbed TLS Contributors
6 * SPDX-License-Identifier: Apache-2.0
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License"); you may
9 * not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20
21#include "common.h"
22
23#if defined(MBEDTLS_PSA_CRYPTO_C)
24
25#include <psa_crypto_cipher.h>
Ronald Crond6d28882020-12-14 14:56:02 +010026#include "psa_crypto_core.h"
Ronald Cron6d051732020-10-01 14:10:20 +020027#include "psa_crypto_random_impl.h"
28
Ronald Crond6d28882020-12-14 14:56:02 +010029#include "mbedtls/cipher.h"
Ronald Cron6d051732020-10-01 14:10:20 +020030#include "mbedtls/error.h"
Ronald Cron0ff57952021-03-08 16:46:35 +010031
Ronald Crond6d28882020-12-14 14:56:02 +010032#include <string.h>
33
Ronald Cron5d9b00d2021-03-10 14:43:20 +010034#if ( defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES) || \
35 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
36 defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_DES) ) )
37#define BUILTIN_KEY_TYPE_DES 1
38#endif
39
40#if ( defined(MBEDTLS_PSA_BUILTIN_ALG_CBC_NO_PADDING) || \
41 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
42 defined(MBEDTLS_PSA_ACCEL_ALG_CBC_NO_PADDING) ) )
43#define BUILTIN_ALG_CBC_NO_PADDING 1
44#endif
45
46#if ( defined(MBEDTLS_PSA_BUILTIN_ALG_CBC_PKCS7) || \
47 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
48 defined(MBEDTLS_PSA_ACCEL_ALG_CBC_PKCS7) ) )
49#define BUILTIN_ALG_CBC_PKCS7 1
50#endif
51
52#if ( defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_CHACHA20) || \
53 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
54 defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_CHACHA20) ) )
55#define BUILTIN_KEY_TYPE_CHACHA20 1
56#endif
57
Ronald Cron75e6ae22021-03-17 14:46:05 +010058const mbedtls_cipher_info_t *mbedtls_cipher_info_from_psa(
59 psa_algorithm_t alg,
60 psa_key_type_t key_type,
61 size_t key_bits,
62 mbedtls_cipher_id_t* cipher_id )
63{
64 mbedtls_cipher_mode_t mode;
65 mbedtls_cipher_id_t cipher_id_tmp;
66
67 if( PSA_ALG_IS_AEAD( alg ) )
68 alg = PSA_ALG_AEAD_WITH_SHORTENED_TAG( alg, 0 );
69
70 if( PSA_ALG_IS_CIPHER( alg ) || PSA_ALG_IS_AEAD( alg ) )
71 {
72 switch( alg )
73 {
74 case PSA_ALG_STREAM_CIPHER:
75 mode = MBEDTLS_MODE_STREAM;
76 break;
77 case PSA_ALG_CTR:
78 mode = MBEDTLS_MODE_CTR;
79 break;
80 case PSA_ALG_CFB:
81 mode = MBEDTLS_MODE_CFB;
82 break;
83 case PSA_ALG_OFB:
84 mode = MBEDTLS_MODE_OFB;
85 break;
86 case PSA_ALG_ECB_NO_PADDING:
87 mode = MBEDTLS_MODE_ECB;
88 break;
89 case PSA_ALG_CBC_NO_PADDING:
90 mode = MBEDTLS_MODE_CBC;
91 break;
92 case PSA_ALG_CBC_PKCS7:
93 mode = MBEDTLS_MODE_CBC;
94 break;
95 case PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, 0 ):
96 mode = MBEDTLS_MODE_CCM;
97 break;
98 case PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_GCM, 0 ):
99 mode = MBEDTLS_MODE_GCM;
100 break;
101 case PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CHACHA20_POLY1305, 0 ):
102 mode = MBEDTLS_MODE_CHACHAPOLY;
103 break;
104 default:
105 return( NULL );
106 }
107 }
108 else if( alg == PSA_ALG_CMAC )
109 mode = MBEDTLS_MODE_ECB;
110 else
111 return( NULL );
112
113 switch( key_type )
114 {
115 case PSA_KEY_TYPE_AES:
116 cipher_id_tmp = MBEDTLS_CIPHER_ID_AES;
117 break;
118 case PSA_KEY_TYPE_DES:
119 /* key_bits is 64 for Single-DES, 128 for two-key Triple-DES,
120 * and 192 for three-key Triple-DES. */
121 if( key_bits == 64 )
122 cipher_id_tmp = MBEDTLS_CIPHER_ID_DES;
123 else
124 cipher_id_tmp = MBEDTLS_CIPHER_ID_3DES;
125 /* mbedtls doesn't recognize two-key Triple-DES as an algorithm,
126 * but two-key Triple-DES is functionally three-key Triple-DES
127 * with K1=K3, so that's how we present it to mbedtls. */
128 if( key_bits == 128 )
129 key_bits = 192;
130 break;
131 case PSA_KEY_TYPE_CAMELLIA:
132 cipher_id_tmp = MBEDTLS_CIPHER_ID_CAMELLIA;
133 break;
134 case PSA_KEY_TYPE_ARC4:
135 cipher_id_tmp = MBEDTLS_CIPHER_ID_ARC4;
136 break;
137 case PSA_KEY_TYPE_CHACHA20:
138 cipher_id_tmp = MBEDTLS_CIPHER_ID_CHACHA20;
139 break;
140 default:
141 return( NULL );
142 }
143 if( cipher_id != NULL )
144 *cipher_id = cipher_id_tmp;
145
146 return( mbedtls_cipher_info_from_values( cipher_id_tmp,
147 (int) key_bits, mode ) );
148}
149
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100150#if defined(MBEDTLS_PSA_BUILTIN_CIPHER) || defined(PSA_CRYPTO_DRIVER_TEST)
151
Ronald Crond6d28882020-12-14 14:56:02 +0100152static psa_status_t cipher_setup(
Ronald Cron6e412a72021-03-10 09:58:47 +0100153 mbedtls_psa_cipher_operation_t *operation,
Ronald Crond6d28882020-12-14 14:56:02 +0100154 const psa_key_attributes_t *attributes,
155 const uint8_t *key_buffer, size_t key_buffer_size,
156 psa_algorithm_t alg,
157 mbedtls_operation_t cipher_operation )
158{
159 int ret = 0;
160 size_t key_bits;
161 const mbedtls_cipher_info_t *cipher_info = NULL;
162 psa_key_type_t key_type = attributes->core.type;
163
164 (void)key_buffer_size;
165
166 /* Proceed with initializing an mbed TLS cipher context if no driver is
167 * available for the given algorithm & key. */
Ronald Cron6e412a72021-03-10 09:58:47 +0100168 mbedtls_cipher_init( &operation->cipher );
Ronald Crond6d28882020-12-14 14:56:02 +0100169
Ronald Cron6e412a72021-03-10 09:58:47 +0100170 operation->alg = alg;
Ronald Crond6d28882020-12-14 14:56:02 +0100171 key_bits = attributes->core.bits;
172 cipher_info = mbedtls_cipher_info_from_psa( alg, key_type,
173 key_bits, NULL );
174 if( cipher_info == NULL )
175 return( PSA_ERROR_NOT_SUPPORTED );
176
Ronald Cron6e412a72021-03-10 09:58:47 +0100177 ret = mbedtls_cipher_setup( &operation->cipher, cipher_info );
Ronald Crond6d28882020-12-14 14:56:02 +0100178 if( ret != 0 )
179 goto exit;
180
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100181#if defined(BUILTIN_KEY_TYPE_DES)
Ronald Crond6d28882020-12-14 14:56:02 +0100182 if( key_type == PSA_KEY_TYPE_DES && key_bits == 128 )
183 {
184 /* Two-key Triple-DES is 3-key Triple-DES with K1=K3 */
185 uint8_t keys[24];
186 memcpy( keys, key_buffer, 16 );
187 memcpy( keys + 16, key_buffer, 8 );
Ronald Cron6e412a72021-03-10 09:58:47 +0100188 ret = mbedtls_cipher_setkey( &operation->cipher,
Ronald Crond6d28882020-12-14 14:56:02 +0100189 keys,
190 192, cipher_operation );
191 }
192 else
193#endif
194 {
Ronald Cron6e412a72021-03-10 09:58:47 +0100195 ret = mbedtls_cipher_setkey( &operation->cipher, key_buffer,
Ronald Crond6d28882020-12-14 14:56:02 +0100196 (int) key_bits, cipher_operation );
197 }
198 if( ret != 0 )
199 goto exit;
200
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100201#if defined(BUILTIN_ALG_CBC_NO_PADDING) || \
202 defined(BUILTIN_ALG_CBC_PKCS7)
Ronald Crond6d28882020-12-14 14:56:02 +0100203 switch( alg )
204 {
205 case PSA_ALG_CBC_NO_PADDING:
Ronald Cron6e412a72021-03-10 09:58:47 +0100206 ret = mbedtls_cipher_set_padding_mode( &operation->cipher,
Ronald Crond6d28882020-12-14 14:56:02 +0100207 MBEDTLS_PADDING_NONE );
208 break;
209 case PSA_ALG_CBC_PKCS7:
Ronald Cron6e412a72021-03-10 09:58:47 +0100210 ret = mbedtls_cipher_set_padding_mode( &operation->cipher,
Ronald Crond6d28882020-12-14 14:56:02 +0100211 MBEDTLS_PADDING_PKCS7 );
212 break;
213 default:
214 /* The algorithm doesn't involve padding. */
215 ret = 0;
216 break;
217 }
218 if( ret != 0 )
219 goto exit;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100220#endif /* BUILTIN_ALG_CBC_NO_PADDING || BUILTIN_ALG_CBC_PKCS7 */
Ronald Crond6d28882020-12-14 14:56:02 +0100221
Ronald Cron6e412a72021-03-10 09:58:47 +0100222 operation->block_size = ( PSA_ALG_IS_STREAM_CIPHER( alg ) ? 1 :
Ronald Crond6d28882020-12-14 14:56:02 +0100223 PSA_BLOCK_CIPHER_BLOCK_LENGTH( key_type ) );
224 if( ( alg & PSA_ALG_CIPHER_FROM_BLOCK_FLAG ) != 0 &&
225 alg != PSA_ALG_ECB_NO_PADDING )
226 {
Ronald Cron6e412a72021-03-10 09:58:47 +0100227 operation->iv_size = PSA_BLOCK_CIPHER_BLOCK_LENGTH( key_type );
Ronald Crond6d28882020-12-14 14:56:02 +0100228 }
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100229#if defined(BUILTIN_KEY_TYPE_CHACHA20)
Ronald Crond6d28882020-12-14 14:56:02 +0100230 else
231 if( ( alg == PSA_ALG_STREAM_CIPHER ) &&
232 ( key_type == PSA_KEY_TYPE_CHACHA20 ) )
Ronald Cron6e412a72021-03-10 09:58:47 +0100233 operation->iv_size = 12;
Ronald Crond6d28882020-12-14 14:56:02 +0100234#endif
235
236exit:
237 return( mbedtls_to_psa_error( ret ) );
238}
239
Ronald Cron8287e6b2021-03-12 10:35:18 +0100240static psa_status_t cipher_encrypt_setup(
Ronald Cron6e412a72021-03-10 09:58:47 +0100241 mbedtls_psa_cipher_operation_t *operation,
Ronald Crond6d28882020-12-14 14:56:02 +0100242 const psa_key_attributes_t *attributes,
243 const uint8_t *key_buffer, size_t key_buffer_size,
244 psa_algorithm_t alg )
245{
246 return( cipher_setup( operation, attributes,
247 key_buffer, key_buffer_size,
248 alg, MBEDTLS_ENCRYPT ) );
249}
250
Ronald Cron8287e6b2021-03-12 10:35:18 +0100251static psa_status_t cipher_decrypt_setup(
Ronald Cron6e412a72021-03-10 09:58:47 +0100252 mbedtls_psa_cipher_operation_t *operation,
Ronald Crond6d28882020-12-14 14:56:02 +0100253 const psa_key_attributes_t *attributes,
254 const uint8_t *key_buffer, size_t key_buffer_size,
255 psa_algorithm_t alg )
256{
257 return( cipher_setup( operation, attributes,
258 key_buffer, key_buffer_size,
259 alg, MBEDTLS_DECRYPT ) );
260}
Ronald Cron6d051732020-10-01 14:10:20 +0200261
Ronald Cron8287e6b2021-03-12 10:35:18 +0100262static psa_status_t cipher_set_iv( mbedtls_psa_cipher_operation_t *operation,
263 const uint8_t *iv, size_t iv_length )
264{
265 if( iv_length != operation->iv_size )
266 return( PSA_ERROR_INVALID_ARGUMENT );
267
268 return( mbedtls_to_psa_error(
269 mbedtls_cipher_set_iv( &operation->cipher,
270 iv, iv_length ) ) );
271}
272
273static psa_status_t cipher_generate_iv(
Ronald Cron6e412a72021-03-10 09:58:47 +0100274 mbedtls_psa_cipher_operation_t *operation,
Ronald Cron6d051732020-10-01 14:10:20 +0200275 uint8_t *iv, size_t iv_size, size_t *iv_length )
276{
277 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
278
Ronald Cron6e412a72021-03-10 09:58:47 +0100279 if( iv_size < operation->iv_size )
Ronald Cron6d051732020-10-01 14:10:20 +0200280 return( PSA_ERROR_BUFFER_TOO_SMALL );
281
282 ret = mbedtls_psa_get_random( MBEDTLS_PSA_RANDOM_STATE,
Ronald Cron6e412a72021-03-10 09:58:47 +0100283 iv, operation->iv_size );
Ronald Cron6d051732020-10-01 14:10:20 +0200284 if( ret != 0 )
285 return( mbedtls_to_psa_error( ret ) );
286
Ronald Cron6e412a72021-03-10 09:58:47 +0100287 *iv_length = operation->iv_size;
Ronald Cron6d051732020-10-01 14:10:20 +0200288
Ronald Cron8287e6b2021-03-12 10:35:18 +0100289 return( cipher_set_iv( operation, iv, *iv_length ) );
Ronald Cron6d051732020-10-01 14:10:20 +0200290}
291
292/* Process input for which the algorithm is set to ECB mode. This requires
293 * manual processing, since the PSA API is defined as being able to process
294 * arbitrary-length calls to psa_cipher_update() with ECB mode, but the
295 * underlying mbedtls_cipher_update only takes full blocks. */
296static psa_status_t psa_cipher_update_ecb(
297 mbedtls_cipher_context_t *ctx,
298 const uint8_t *input,
299 size_t input_length,
300 uint8_t *output,
301 size_t output_size,
302 size_t *output_length )
303{
304 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
305 size_t block_size = ctx->cipher_info->block_size;
306 size_t internal_output_length = 0;
307 *output_length = 0;
308
309 if( input_length == 0 )
310 {
311 status = PSA_SUCCESS;
312 goto exit;
313 }
314
315 if( ctx->unprocessed_len > 0 )
316 {
317 /* Fill up to block size, and run the block if there's a full one. */
318 size_t bytes_to_copy = block_size - ctx->unprocessed_len;
319
320 if( input_length < bytes_to_copy )
321 bytes_to_copy = input_length;
322
323 memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ),
324 input, bytes_to_copy );
325 input_length -= bytes_to_copy;
326 input += bytes_to_copy;
327 ctx->unprocessed_len += bytes_to_copy;
328
329 if( ctx->unprocessed_len == block_size )
330 {
331 status = mbedtls_to_psa_error(
332 mbedtls_cipher_update( ctx,
333 ctx->unprocessed_data,
334 block_size,
335 output, &internal_output_length ) );
336
337 if( status != PSA_SUCCESS )
338 goto exit;
339
340 output += internal_output_length;
341 output_size -= internal_output_length;
342 *output_length += internal_output_length;
343 ctx->unprocessed_len = 0;
344 }
345 }
346
347 while( input_length >= block_size )
348 {
349 /* Run all full blocks we have, one by one */
350 status = mbedtls_to_psa_error(
351 mbedtls_cipher_update( ctx, input,
352 block_size,
353 output, &internal_output_length ) );
354
355 if( status != PSA_SUCCESS )
356 goto exit;
357
358 input_length -= block_size;
359 input += block_size;
360
361 output += internal_output_length;
362 output_size -= internal_output_length;
363 *output_length += internal_output_length;
364 }
365
366 if( input_length > 0 )
367 {
368 /* Save unprocessed bytes for later processing */
369 memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ),
370 input, input_length );
371 ctx->unprocessed_len += input_length;
372 }
373
374 status = PSA_SUCCESS;
375
376exit:
377 return( status );
378}
379
Ronald Cron8287e6b2021-03-12 10:35:18 +0100380static psa_status_t cipher_update( mbedtls_psa_cipher_operation_t *operation,
381 const uint8_t *input,
382 size_t input_length,
383 uint8_t *output,
384 size_t output_size,
385 size_t *output_length )
Ronald Cron6d051732020-10-01 14:10:20 +0200386{
387 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
388 size_t expected_output_size;
389
Ronald Cron6e412a72021-03-10 09:58:47 +0100390 if( ! PSA_ALG_IS_STREAM_CIPHER( operation->alg ) )
Ronald Cron6d051732020-10-01 14:10:20 +0200391 {
392 /* Take the unprocessed partial block left over from previous
393 * update calls, if any, plus the input to this call. Remove
394 * the last partial block, if any. You get the data that will be
395 * output in this call. */
396 expected_output_size =
Ronald Cron6e412a72021-03-10 09:58:47 +0100397 ( operation->cipher.unprocessed_len + input_length )
398 / operation->block_size * operation->block_size;
Ronald Cron6d051732020-10-01 14:10:20 +0200399 }
400 else
401 {
402 expected_output_size = input_length;
403 }
404
405 if( output_size < expected_output_size )
406 return( PSA_ERROR_BUFFER_TOO_SMALL );
407
Ronald Cron6e412a72021-03-10 09:58:47 +0100408 if( operation->alg == PSA_ALG_ECB_NO_PADDING )
Ronald Cron6d051732020-10-01 14:10:20 +0200409 {
410 /* mbedtls_cipher_update has an API inconsistency: it will only
411 * process a single block at a time in ECB mode. Abstract away that
412 * inconsistency here to match the PSA API behaviour. */
Ronald Cron6e412a72021-03-10 09:58:47 +0100413 status = psa_cipher_update_ecb( &operation->cipher,
Ronald Cron6d051732020-10-01 14:10:20 +0200414 input,
415 input_length,
416 output,
417 output_size,
418 output_length );
419 }
420 else
421 {
422 status = mbedtls_to_psa_error(
Ronald Cron6e412a72021-03-10 09:58:47 +0100423 mbedtls_cipher_update( &operation->cipher, input,
Ronald Cron6d051732020-10-01 14:10:20 +0200424 input_length, output, output_length ) );
425 }
426
427 return( status );
428}
429
Ronald Cron8287e6b2021-03-12 10:35:18 +0100430static psa_status_t cipher_finish( mbedtls_psa_cipher_operation_t *operation,
431 uint8_t *output,
432 size_t output_size,
433 size_t *output_length )
Ronald Cron6d051732020-10-01 14:10:20 +0200434{
435 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
436 uint8_t temp_output_buffer[MBEDTLS_MAX_BLOCK_LENGTH];
437
Ronald Cron6e412a72021-03-10 09:58:47 +0100438 if( operation->cipher.unprocessed_len != 0 )
Ronald Cron6d051732020-10-01 14:10:20 +0200439 {
Ronald Cron6e412a72021-03-10 09:58:47 +0100440 if( operation->alg == PSA_ALG_ECB_NO_PADDING ||
441 operation->alg == PSA_ALG_CBC_NO_PADDING )
Ronald Cron6d051732020-10-01 14:10:20 +0200442 {
443 status = PSA_ERROR_INVALID_ARGUMENT;
444 goto exit;
445 }
446 }
447
448 status = mbedtls_to_psa_error(
Ronald Cron6e412a72021-03-10 09:58:47 +0100449 mbedtls_cipher_finish( &operation->cipher,
Ronald Cron6d051732020-10-01 14:10:20 +0200450 temp_output_buffer,
451 output_length ) );
452 if( status != PSA_SUCCESS )
453 goto exit;
454
455 if( *output_length == 0 )
456 ; /* Nothing to copy. Note that output may be NULL in this case. */
457 else if( output_size >= *output_length )
458 memcpy( output, temp_output_buffer, *output_length );
459 else
460 status = PSA_ERROR_BUFFER_TOO_SMALL;
461
462exit:
463 mbedtls_platform_zeroize( temp_output_buffer,
464 sizeof( temp_output_buffer ) );
465
466 return( status );
467}
468
Ronald Cron8287e6b2021-03-12 10:35:18 +0100469static psa_status_t cipher_abort( mbedtls_psa_cipher_operation_t *operation )
Ronald Cron6d051732020-10-01 14:10:20 +0200470{
Ronald Cron937dfee2021-03-10 09:17:32 +0100471 /* Sanity check (shouldn't happen: operation->alg should
472 * always have been initialized to a valid value). */
Ronald Cron6e412a72021-03-10 09:58:47 +0100473 if( ! PSA_ALG_IS_CIPHER( operation->alg ) )
Ronald Cron937dfee2021-03-10 09:17:32 +0100474 return( PSA_ERROR_BAD_STATE );
475
Ronald Cron6e412a72021-03-10 09:58:47 +0100476 mbedtls_cipher_free( &operation->cipher );
Ronald Cron6d051732020-10-01 14:10:20 +0200477
478 return( PSA_SUCCESS );
479}
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100480#endif /* MBEDTLS_PSA_BUILTIN_CIPHER || PSA_CRYPTO_DRIVER_TEST */
Ronald Cron6d051732020-10-01 14:10:20 +0200481
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100482#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron8287e6b2021-03-12 10:35:18 +0100483psa_status_t mbedtls_psa_cipher_encrypt_setup(
484 mbedtls_psa_cipher_operation_t *operation,
485 const psa_key_attributes_t *attributes,
486 const uint8_t *key_buffer, size_t key_buffer_size,
487 psa_algorithm_t alg )
488{
489 return( cipher_encrypt_setup(
490 operation, attributes, key_buffer, key_buffer_size, alg ) );
491}
492
493psa_status_t mbedtls_psa_cipher_decrypt_setup(
494 mbedtls_psa_cipher_operation_t *operation,
495 const psa_key_attributes_t *attributes,
496 const uint8_t *key_buffer, size_t key_buffer_size,
497 psa_algorithm_t alg )
498{
499 return( cipher_decrypt_setup(
500 operation, attributes, key_buffer, key_buffer_size, alg ) );
501}
502
503psa_status_t mbedtls_psa_cipher_generate_iv(
504 mbedtls_psa_cipher_operation_t *operation,
505 uint8_t *iv, size_t iv_size, size_t *iv_length )
506{
507 return( cipher_generate_iv( operation, iv, iv_size, iv_length ) );
508}
509
510psa_status_t mbedtls_psa_cipher_set_iv( mbedtls_psa_cipher_operation_t *operation,
511 const uint8_t *iv,
512 size_t iv_length )
513{
514 return( cipher_set_iv( operation, iv, iv_length ) );
515}
516
517psa_status_t mbedtls_psa_cipher_update( mbedtls_psa_cipher_operation_t *operation,
518 const uint8_t *input,
519 size_t input_length,
520 uint8_t *output,
521 size_t output_size,
522 size_t *output_length )
523{
524 return( cipher_update( operation, input, input_length,
525 output, output_size, output_length ) );
526}
527
528psa_status_t mbedtls_psa_cipher_finish( mbedtls_psa_cipher_operation_t *operation,
529 uint8_t *output,
530 size_t output_size,
531 size_t *output_length )
532{
533 return( cipher_finish( operation, output, output_size, output_length ) );
534}
535
536psa_status_t mbedtls_psa_cipher_abort( mbedtls_psa_cipher_operation_t *operation )
537{
538 return( cipher_abort( operation ) );
539}
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100540#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron8287e6b2021-03-12 10:35:18 +0100541
Ronald Cron3522e322021-03-12 11:08:49 +0100542/*
543 * BEYOND THIS POINT, TEST DRIVER ENTRY POINTS ONLY.
544 */
545
546#if defined(PSA_CRYPTO_DRIVER_TEST)
547psa_status_t mbedtls_transparent_test_driver_cipher_encrypt_setup(
548 mbedtls_psa_cipher_operation_t *operation,
549 const psa_key_attributes_t *attributes,
550 const uint8_t *key_buffer, size_t key_buffer_size,
551 psa_algorithm_t alg )
552{
553 return( cipher_encrypt_setup(
554 operation, attributes, key_buffer, key_buffer_size, alg ) );
555}
556
557psa_status_t mbedtls_transparent_test_driver_cipher_decrypt_setup(
558 mbedtls_psa_cipher_operation_t *operation,
559 const psa_key_attributes_t *attributes,
560 const uint8_t *key_buffer, size_t key_buffer_size,
561 psa_algorithm_t alg )
562{
563 return( cipher_decrypt_setup(
564 operation, attributes, key_buffer, key_buffer_size, alg ) );
565}
566
567psa_status_t mbedtls_transparent_test_driver_cipher_generate_iv(
568 mbedtls_psa_cipher_operation_t *operation,
569 uint8_t *iv, size_t iv_size, size_t *iv_length )
570{
571 return( cipher_generate_iv( operation, iv, iv_size, iv_length ) );
572}
573
574psa_status_t mbedtls_transparent_test_driver_cipher_set_iv(
575 mbedtls_psa_cipher_operation_t *operation,
576 const uint8_t *iv, size_t iv_length )
577{
578 return( cipher_set_iv( operation, iv, iv_length ) );
579}
580
581psa_status_t mbedtls_transparent_test_driver_cipher_update(
582 mbedtls_psa_cipher_operation_t *operation,
583 const uint8_t *input, size_t input_length,
584 uint8_t *output, size_t output_size, size_t *output_length )
585{
586 return( cipher_update( operation, input, input_length,
587 output, output_size, output_length ) );
588}
589
590psa_status_t mbedtls_transparent_test_driver_cipher_finish(
591 mbedtls_psa_cipher_operation_t *operation,
592 uint8_t *output, size_t output_size, size_t *output_length )
593{
594 return( cipher_finish( operation, output, output_size, output_length ) );
595}
596
597psa_status_t mbedtls_transparent_test_driver_cipher_abort(
598 mbedtls_psa_cipher_operation_t *operation )
599{
600 return( cipher_abort( operation ) );
601}
602#endif /* PSA_CRYPTO_DRIVER_TEST */
603
Ronald Cron0ff57952021-03-08 16:46:35 +0100604#endif /* MBEDTLS_PSA_CRYPTO_C */