blob: 2213ad0c2a0214e969c8b4bffad64d11c544a080 [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
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200166 mbedtls_cipher_init( &operation->ctx.cipher );
Ronald Crond6d28882020-12-14 14:56:02 +0100167
Ronald Cron6e412a72021-03-10 09:58:47 +0100168 operation->alg = alg;
Ronald Crond6d28882020-12-14 14:56:02 +0100169 key_bits = attributes->core.bits;
170 cipher_info = mbedtls_cipher_info_from_psa( alg, key_type,
171 key_bits, NULL );
172 if( cipher_info == NULL )
173 return( PSA_ERROR_NOT_SUPPORTED );
174
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200175 ret = mbedtls_cipher_setup( &operation->ctx.cipher, cipher_info );
Ronald Crond6d28882020-12-14 14:56:02 +0100176 if( ret != 0 )
177 goto exit;
178
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100179#if defined(BUILTIN_KEY_TYPE_DES)
Ronald Crond6d28882020-12-14 14:56:02 +0100180 if( key_type == PSA_KEY_TYPE_DES && key_bits == 128 )
181 {
182 /* Two-key Triple-DES is 3-key Triple-DES with K1=K3 */
183 uint8_t keys[24];
184 memcpy( keys, key_buffer, 16 );
185 memcpy( keys + 16, key_buffer, 8 );
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200186 ret = mbedtls_cipher_setkey( &operation->ctx.cipher,
Ronald Crond6d28882020-12-14 14:56:02 +0100187 keys,
188 192, cipher_operation );
189 }
190 else
191#endif
192 {
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200193 ret = mbedtls_cipher_setkey( &operation->ctx.cipher, key_buffer,
Ronald Crond6d28882020-12-14 14:56:02 +0100194 (int) key_bits, cipher_operation );
195 }
196 if( ret != 0 )
197 goto exit;
198
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100199#if defined(BUILTIN_ALG_CBC_NO_PADDING) || \
200 defined(BUILTIN_ALG_CBC_PKCS7)
Ronald Crond6d28882020-12-14 14:56:02 +0100201 switch( alg )
202 {
203 case PSA_ALG_CBC_NO_PADDING:
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200204 ret = mbedtls_cipher_set_padding_mode( &operation->ctx.cipher,
Ronald Crond6d28882020-12-14 14:56:02 +0100205 MBEDTLS_PADDING_NONE );
206 break;
207 case PSA_ALG_CBC_PKCS7:
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200208 ret = mbedtls_cipher_set_padding_mode( &operation->ctx.cipher,
Ronald Crond6d28882020-12-14 14:56:02 +0100209 MBEDTLS_PADDING_PKCS7 );
210 break;
211 default:
212 /* The algorithm doesn't involve padding. */
213 ret = 0;
214 break;
215 }
216 if( ret != 0 )
217 goto exit;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100218#endif /* BUILTIN_ALG_CBC_NO_PADDING || BUILTIN_ALG_CBC_PKCS7 */
Ronald Crond6d28882020-12-14 14:56:02 +0100219
Ronald Cron6ad554c2021-03-26 09:29:09 +0100220 operation->block_length = ( PSA_ALG_IS_STREAM_CIPHER( alg ) ? 1 :
221 PSA_BLOCK_CIPHER_BLOCK_LENGTH( key_type ) );
Ronald Cronc17e8a92021-03-19 14:12:26 +0100222 operation->iv_length = PSA_CIPHER_IV_LENGTH( key_type, alg );
Ronald Crond6d28882020-12-14 14:56:02 +0100223
224exit:
225 return( mbedtls_to_psa_error( ret ) );
226}
227
Ronald Cron8287e6b2021-03-12 10:35:18 +0100228static psa_status_t cipher_encrypt_setup(
Ronald Cron6e412a72021-03-10 09:58:47 +0100229 mbedtls_psa_cipher_operation_t *operation,
Ronald Crond6d28882020-12-14 14:56:02 +0100230 const psa_key_attributes_t *attributes,
231 const uint8_t *key_buffer, size_t key_buffer_size,
232 psa_algorithm_t alg )
233{
234 return( cipher_setup( operation, attributes,
235 key_buffer, key_buffer_size,
236 alg, MBEDTLS_ENCRYPT ) );
237}
238
Ronald Cron8287e6b2021-03-12 10:35:18 +0100239static psa_status_t cipher_decrypt_setup(
Ronald Cron6e412a72021-03-10 09:58:47 +0100240 mbedtls_psa_cipher_operation_t *operation,
Ronald Crond6d28882020-12-14 14:56:02 +0100241 const psa_key_attributes_t *attributes,
242 const uint8_t *key_buffer, size_t key_buffer_size,
243 psa_algorithm_t alg )
244{
245 return( cipher_setup( operation, attributes,
246 key_buffer, key_buffer_size,
247 alg, MBEDTLS_DECRYPT ) );
248}
Ronald Cron6d051732020-10-01 14:10:20 +0200249
Ronald Cron8287e6b2021-03-12 10:35:18 +0100250static psa_status_t cipher_set_iv( mbedtls_psa_cipher_operation_t *operation,
251 const uint8_t *iv, size_t iv_length )
252{
Ronald Cron6ad554c2021-03-26 09:29:09 +0100253 if( iv_length != operation->iv_length )
Ronald Cron8287e6b2021-03-12 10:35:18 +0100254 return( PSA_ERROR_INVALID_ARGUMENT );
255
256 return( mbedtls_to_psa_error(
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200257 mbedtls_cipher_set_iv( &operation->ctx.cipher,
Ronald Cron8287e6b2021-03-12 10:35:18 +0100258 iv, iv_length ) ) );
259}
260
Ronald Cron6d051732020-10-01 14:10:20 +0200261/* Process input for which the algorithm is set to ECB mode. This requires
262 * manual processing, since the PSA API is defined as being able to process
263 * arbitrary-length calls to psa_cipher_update() with ECB mode, but the
264 * underlying mbedtls_cipher_update only takes full blocks. */
265static psa_status_t psa_cipher_update_ecb(
266 mbedtls_cipher_context_t *ctx,
267 const uint8_t *input,
268 size_t input_length,
269 uint8_t *output,
270 size_t output_size,
271 size_t *output_length )
272{
273 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
274 size_t block_size = ctx->cipher_info->block_size;
275 size_t internal_output_length = 0;
276 *output_length = 0;
277
278 if( input_length == 0 )
279 {
280 status = PSA_SUCCESS;
281 goto exit;
282 }
283
284 if( ctx->unprocessed_len > 0 )
285 {
286 /* Fill up to block size, and run the block if there's a full one. */
287 size_t bytes_to_copy = block_size - ctx->unprocessed_len;
288
289 if( input_length < bytes_to_copy )
290 bytes_to_copy = input_length;
291
292 memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ),
293 input, bytes_to_copy );
294 input_length -= bytes_to_copy;
295 input += bytes_to_copy;
296 ctx->unprocessed_len += bytes_to_copy;
297
298 if( ctx->unprocessed_len == block_size )
299 {
300 status = mbedtls_to_psa_error(
301 mbedtls_cipher_update( ctx,
302 ctx->unprocessed_data,
303 block_size,
304 output, &internal_output_length ) );
305
306 if( status != PSA_SUCCESS )
307 goto exit;
308
309 output += internal_output_length;
310 output_size -= internal_output_length;
311 *output_length += internal_output_length;
312 ctx->unprocessed_len = 0;
313 }
314 }
315
316 while( input_length >= block_size )
317 {
318 /* Run all full blocks we have, one by one */
319 status = mbedtls_to_psa_error(
320 mbedtls_cipher_update( ctx, input,
321 block_size,
322 output, &internal_output_length ) );
323
324 if( status != PSA_SUCCESS )
325 goto exit;
326
327 input_length -= block_size;
328 input += block_size;
329
330 output += internal_output_length;
331 output_size -= internal_output_length;
332 *output_length += internal_output_length;
333 }
334
335 if( input_length > 0 )
336 {
337 /* Save unprocessed bytes for later processing */
338 memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ),
339 input, input_length );
340 ctx->unprocessed_len += input_length;
341 }
342
343 status = PSA_SUCCESS;
344
345exit:
346 return( status );
347}
348
Ronald Cron8287e6b2021-03-12 10:35:18 +0100349static psa_status_t cipher_update( mbedtls_psa_cipher_operation_t *operation,
350 const uint8_t *input,
351 size_t input_length,
352 uint8_t *output,
353 size_t output_size,
354 size_t *output_length )
Ronald Cron6d051732020-10-01 14:10:20 +0200355{
356 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
357 size_t expected_output_size;
358
Ronald Cron6e412a72021-03-10 09:58:47 +0100359 if( ! PSA_ALG_IS_STREAM_CIPHER( operation->alg ) )
Ronald Cron6d051732020-10-01 14:10:20 +0200360 {
361 /* Take the unprocessed partial block left over from previous
362 * update calls, if any, plus the input to this call. Remove
363 * the last partial block, if any. You get the data that will be
364 * output in this call. */
365 expected_output_size =
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200366 ( operation->ctx.cipher.unprocessed_len + input_length )
Ronald Cron6ad554c2021-03-26 09:29:09 +0100367 / operation->block_length * operation->block_length;
Ronald Cron6d051732020-10-01 14:10:20 +0200368 }
369 else
370 {
371 expected_output_size = input_length;
372 }
373
374 if( output_size < expected_output_size )
375 return( PSA_ERROR_BUFFER_TOO_SMALL );
376
Ronald Cron6e412a72021-03-10 09:58:47 +0100377 if( operation->alg == PSA_ALG_ECB_NO_PADDING )
Ronald Cron6d051732020-10-01 14:10:20 +0200378 {
379 /* mbedtls_cipher_update has an API inconsistency: it will only
380 * process a single block at a time in ECB mode. Abstract away that
381 * inconsistency here to match the PSA API behaviour. */
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200382 status = psa_cipher_update_ecb( &operation->ctx.cipher,
Ronald Cron6d051732020-10-01 14:10:20 +0200383 input,
384 input_length,
385 output,
386 output_size,
387 output_length );
388 }
389 else
390 {
391 status = mbedtls_to_psa_error(
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200392 mbedtls_cipher_update( &operation->ctx.cipher, input,
Ronald Cron6d051732020-10-01 14:10:20 +0200393 input_length, output, output_length ) );
gabor-mezei-arm42373bd2021-06-29 16:41:25 +0200394
395 if( *output_length > output_size )
gabor-mezei-arm25230452021-06-29 19:06:30 +0200396 return( PSA_ERROR_CORRUPTION_DETECTED );
Ronald Cron6d051732020-10-01 14:10:20 +0200397 }
398
399 return( status );
400}
401
Ronald Cron8287e6b2021-03-12 10:35:18 +0100402static psa_status_t cipher_finish( mbedtls_psa_cipher_operation_t *operation,
403 uint8_t *output,
404 size_t output_size,
405 size_t *output_length )
Ronald Cron6d051732020-10-01 14:10:20 +0200406{
407 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
408 uint8_t temp_output_buffer[MBEDTLS_MAX_BLOCK_LENGTH];
409
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200410 if( operation->ctx.cipher.unprocessed_len != 0 )
Ronald Cron6d051732020-10-01 14:10:20 +0200411 {
Ronald Cron6e412a72021-03-10 09:58:47 +0100412 if( operation->alg == PSA_ALG_ECB_NO_PADDING ||
413 operation->alg == PSA_ALG_CBC_NO_PADDING )
Ronald Cron6d051732020-10-01 14:10:20 +0200414 {
415 status = PSA_ERROR_INVALID_ARGUMENT;
416 goto exit;
417 }
418 }
419
420 status = mbedtls_to_psa_error(
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200421 mbedtls_cipher_finish( &operation->ctx.cipher,
Ronald Cron6d051732020-10-01 14:10:20 +0200422 temp_output_buffer,
423 output_length ) );
424 if( status != PSA_SUCCESS )
425 goto exit;
426
427 if( *output_length == 0 )
428 ; /* Nothing to copy. Note that output may be NULL in this case. */
429 else if( output_size >= *output_length )
430 memcpy( output, temp_output_buffer, *output_length );
431 else
432 status = PSA_ERROR_BUFFER_TOO_SMALL;
433
434exit:
435 mbedtls_platform_zeroize( temp_output_buffer,
436 sizeof( temp_output_buffer ) );
437
438 return( status );
439}
440
Ronald Cron8287e6b2021-03-12 10:35:18 +0100441static psa_status_t cipher_abort( mbedtls_psa_cipher_operation_t *operation )
Ronald Cron6d051732020-10-01 14:10:20 +0200442{
Ronald Cron937dfee2021-03-10 09:17:32 +0100443 /* Sanity check (shouldn't happen: operation->alg should
444 * always have been initialized to a valid value). */
Ronald Cron6e412a72021-03-10 09:58:47 +0100445 if( ! PSA_ALG_IS_CIPHER( operation->alg ) )
Ronald Cron937dfee2021-03-10 09:17:32 +0100446 return( PSA_ERROR_BAD_STATE );
447
gabor-mezei-armf67d8af2021-04-12 15:47:35 +0200448 mbedtls_cipher_free( &operation->ctx.cipher );
Ronald Cron6d051732020-10-01 14:10:20 +0200449
450 return( PSA_SUCCESS );
451}
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100452
453static psa_status_t cipher_encrypt( const psa_key_attributes_t *attributes,
454 const uint8_t *key_buffer,
455 size_t key_buffer_size,
456 psa_algorithm_t alg,
457 const uint8_t *input,
458 size_t input_length,
459 uint8_t *output,
460 size_t output_size,
461 size_t *output_length )
462{
463 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
464 mbedtls_psa_cipher_operation_t operation = MBEDTLS_PSA_CIPHER_OPERATION_INIT;
gabor-mezei-arm7fbea092021-06-25 15:23:05 +0200465 size_t olength, accumulated_length;
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100466
gabor-mezei-arm0e1d31b2021-06-25 15:44:47 +0200467 status = cipher_encrypt_setup( &operation, attributes,
468 key_buffer, key_buffer_size, alg );
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100469 if( status != PSA_SUCCESS )
470 goto exit;
471
gabor-mezei-arm7fbea092021-06-25 15:23:05 +0200472 accumulated_length = 0;
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100473 if( operation.iv_length > 0 )
474 {
475 status = cipher_set_iv( &operation, output, operation.iv_length );
476 if( status != PSA_SUCCESS )
477 goto exit;
478
gabor-mezei-arm7fbea092021-06-25 15:23:05 +0200479 accumulated_length = operation.iv_length;
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100480 }
481
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100482 status = cipher_update( &operation, input, input_length,
gabor-mezei-arm7fbea092021-06-25 15:23:05 +0200483 output + operation.iv_length,
484 output_size - operation.iv_length,
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100485 &olength );
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100486 if( status != PSA_SUCCESS )
487 goto exit;
488
gabor-mezei-arm809634d2021-06-29 16:42:13 +0200489 accumulated_length += olength;
490
gabor-mezei-arm7fbea092021-06-25 15:23:05 +0200491 status = cipher_finish( &operation, output + accumulated_length,
492 output_size - accumulated_length, &olength );
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100493 if( status != PSA_SUCCESS )
494 goto exit;
495
gabor-mezei-arm25230452021-06-29 19:06:30 +0200496 *output_length = accumulated_length + olength;
gabor-mezei-arm7fbea092021-06-25 15:23:05 +0200497
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100498exit:
499 if( status == PSA_SUCCESS )
500 status = cipher_abort( &operation );
501 else
502 cipher_abort( &operation );
503 return( status );
504}
505
506static psa_status_t cipher_decrypt( const psa_key_attributes_t *attributes,
507 const uint8_t *key_buffer,
508 size_t key_buffer_size,
509 psa_algorithm_t alg,
510 const uint8_t *input,
511 size_t input_length,
512 uint8_t *output,
513 size_t output_size,
514 size_t *output_length )
515{
516 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
517 mbedtls_psa_cipher_operation_t operation = MBEDTLS_PSA_CIPHER_OPERATION_INIT;
gabor-mezei-arm7fbea092021-06-25 15:23:05 +0200518 size_t olength, accumulated_length;
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100519
520 status = cipher_decrypt_setup( &operation, attributes,
521 key_buffer, key_buffer_size, alg );
522 if( status != PSA_SUCCESS )
523 goto exit;
524
525 if( operation.iv_length > 0 )
526 {
527 status = cipher_set_iv( &operation, input, operation.iv_length );
528 if( status != PSA_SUCCESS )
529 goto exit;
530 }
531
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100532 status = cipher_update( &operation, input + operation.iv_length,
533 input_length - operation.iv_length,
534 output, output_size, &olength );
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100535 if( status != PSA_SUCCESS )
536 goto exit;
537
gabor-mezei-arm809634d2021-06-29 16:42:13 +0200538 accumulated_length = olength;
gabor-mezei-arm3fd792d2021-06-25 15:25:38 +0200539
gabor-mezei-arm7fbea092021-06-25 15:23:05 +0200540 status = cipher_finish( &operation, output + accumulated_length,
541 output_size - accumulated_length, &olength );
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100542 if( status != PSA_SUCCESS )
543 goto exit;
544
gabor-mezei-arm25230452021-06-29 19:06:30 +0200545 *output_length = accumulated_length + olength;
gabor-mezei-arm7fbea092021-06-25 15:23:05 +0200546
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100547exit:
548 if ( status == PSA_SUCCESS )
549 status = cipher_abort( &operation );
550 else
551 cipher_abort( &operation );
552 return( status );
553}
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100554#endif /* MBEDTLS_PSA_BUILTIN_CIPHER || PSA_CRYPTO_DRIVER_TEST */
Ronald Cron6d051732020-10-01 14:10:20 +0200555
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100556#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron8287e6b2021-03-12 10:35:18 +0100557psa_status_t mbedtls_psa_cipher_encrypt_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_encrypt_setup(
564 operation, attributes, key_buffer, key_buffer_size, alg ) );
565}
566
567psa_status_t mbedtls_psa_cipher_decrypt_setup(
568 mbedtls_psa_cipher_operation_t *operation,
569 const psa_key_attributes_t *attributes,
570 const uint8_t *key_buffer, size_t key_buffer_size,
571 psa_algorithm_t alg )
572{
573 return( cipher_decrypt_setup(
574 operation, attributes, key_buffer, key_buffer_size, alg ) );
575}
576
Ronald Cron8287e6b2021-03-12 10:35:18 +0100577psa_status_t mbedtls_psa_cipher_set_iv( mbedtls_psa_cipher_operation_t *operation,
578 const uint8_t *iv,
579 size_t iv_length )
580{
581 return( cipher_set_iv( operation, iv, iv_length ) );
582}
583
584psa_status_t mbedtls_psa_cipher_update( mbedtls_psa_cipher_operation_t *operation,
585 const uint8_t *input,
586 size_t input_length,
587 uint8_t *output,
588 size_t output_size,
589 size_t *output_length )
590{
591 return( cipher_update( operation, input, input_length,
592 output, output_size, output_length ) );
593}
594
595psa_status_t mbedtls_psa_cipher_finish( mbedtls_psa_cipher_operation_t *operation,
596 uint8_t *output,
597 size_t output_size,
598 size_t *output_length )
599{
600 return( cipher_finish( operation, output, output_size, output_length ) );
601}
602
603psa_status_t mbedtls_psa_cipher_abort( mbedtls_psa_cipher_operation_t *operation )
604{
605 return( cipher_abort( operation ) );
606}
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100607
608psa_status_t mbedtls_psa_cipher_encrypt( const psa_key_attributes_t *attributes,
609 const uint8_t *key_buffer,
610 size_t key_buffer_size,
611 psa_algorithm_t alg,
612 const uint8_t *input,
613 size_t input_length,
614 uint8_t *output,
615 size_t output_size,
616 size_t *output_length )
617{
618 return( cipher_encrypt( attributes, key_buffer, key_buffer_size,
619 alg, input, input_length,
620 output, output_size, output_length ) );
621}
622
623psa_status_t mbedtls_psa_cipher_decrypt( const psa_key_attributes_t *attributes,
624 const uint8_t *key_buffer,
625 size_t key_buffer_size,
626 psa_algorithm_t alg,
627 const uint8_t *input,
628 size_t input_length,
629 uint8_t *output,
630 size_t output_size,
631 size_t *output_length )
632{
633 return( cipher_decrypt( attributes, key_buffer, key_buffer_size,
634 alg, input, input_length,
635 output, output_size, output_length ) );
636}
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100637#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron8287e6b2021-03-12 10:35:18 +0100638
Ronald Cron3522e322021-03-12 11:08:49 +0100639/*
640 * BEYOND THIS POINT, TEST DRIVER ENTRY POINTS ONLY.
641 */
642
643#if defined(PSA_CRYPTO_DRIVER_TEST)
644psa_status_t mbedtls_transparent_test_driver_cipher_encrypt_setup(
645 mbedtls_psa_cipher_operation_t *operation,
646 const psa_key_attributes_t *attributes,
647 const uint8_t *key_buffer, size_t key_buffer_size,
648 psa_algorithm_t alg )
649{
650 return( cipher_encrypt_setup(
651 operation, attributes, key_buffer, key_buffer_size, alg ) );
652}
653
654psa_status_t mbedtls_transparent_test_driver_cipher_decrypt_setup(
655 mbedtls_psa_cipher_operation_t *operation,
656 const psa_key_attributes_t *attributes,
657 const uint8_t *key_buffer, size_t key_buffer_size,
658 psa_algorithm_t alg )
659{
660 return( cipher_decrypt_setup(
661 operation, attributes, key_buffer, key_buffer_size, alg ) );
662}
663
Ronald Cron3522e322021-03-12 11:08:49 +0100664psa_status_t mbedtls_transparent_test_driver_cipher_set_iv(
665 mbedtls_psa_cipher_operation_t *operation,
666 const uint8_t *iv, size_t iv_length )
667{
668 return( cipher_set_iv( operation, iv, iv_length ) );
669}
670
671psa_status_t mbedtls_transparent_test_driver_cipher_update(
672 mbedtls_psa_cipher_operation_t *operation,
673 const uint8_t *input, size_t input_length,
674 uint8_t *output, size_t output_size, size_t *output_length )
675{
676 return( cipher_update( operation, input, input_length,
677 output, output_size, output_length ) );
678}
679
680psa_status_t mbedtls_transparent_test_driver_cipher_finish(
681 mbedtls_psa_cipher_operation_t *operation,
682 uint8_t *output, size_t output_size, size_t *output_length )
683{
684 return( cipher_finish( operation, output, output_size, output_length ) );
685}
686
687psa_status_t mbedtls_transparent_test_driver_cipher_abort(
688 mbedtls_psa_cipher_operation_t *operation )
689{
690 return( cipher_abort( operation ) );
691}
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100692
693psa_status_t mbedtls_transparent_test_driver_cipher_encrypt(
694 const psa_key_attributes_t *attributes,
695 const uint8_t *key_buffer,
696 size_t key_buffer_size,
697 psa_algorithm_t alg,
698 const uint8_t *input,
699 size_t input_length,
700 uint8_t *output,
701 size_t output_size,
702 size_t *output_length )
703{
704 return( cipher_encrypt( attributes, key_buffer, key_buffer_size,
705 alg, input, input_length,
706 output, output_size, output_length ) );
707}
708
709psa_status_t mbedtls_transparent_test_driver_cipher_decrypt(
710 const psa_key_attributes_t *attributes,
711 const uint8_t *key_buffer,
712 size_t key_buffer_size,
713 psa_algorithm_t alg,
714 const uint8_t *input,
715 size_t input_length,
716 uint8_t *output,
717 size_t output_size,
718 size_t *output_length )
719{
720 return( cipher_decrypt( attributes, key_buffer, key_buffer_size,
721 alg, input, input_length,
722 output, output_size, output_length ) );
723}
Ronald Cron3522e322021-03-12 11:08:49 +0100724#endif /* PSA_CRYPTO_DRIVER_TEST */
725
Ronald Cron0ff57952021-03-08 16:46:35 +0100726#endif /* MBEDTLS_PSA_CRYPTO_C */