xref: /optee_os/lib/libmbedtls/mbedtls/library/block_cipher.c (revision cb03400251f98aed22a2664509e3ed9e183800b0)
1b0563631STom Van Eyck /**
2b0563631STom Van Eyck  * \file block_cipher.c
3b0563631STom Van Eyck  *
4b0563631STom Van Eyck  * \brief Lightweight abstraction layer for block ciphers with 128 bit blocks,
5b0563631STom Van Eyck  * for use by the GCM and CCM modules.
6b0563631STom Van Eyck  */
7b0563631STom Van Eyck /*
8b0563631STom Van Eyck  *  Copyright The Mbed TLS Contributors
9b0563631STom Van Eyck  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
10b0563631STom Van Eyck  */
11b0563631STom Van Eyck 
12b0563631STom Van Eyck #include "common.h"
13b0563631STom Van Eyck 
14b0563631STom Van Eyck #if defined(MBEDTLS_BLOCK_CIPHER_SOME_PSA)
15b0563631STom Van Eyck #include "psa/crypto.h"
16b0563631STom Van Eyck #include "psa_crypto_core.h"
17b0563631STom Van Eyck #include "psa_util_internal.h"
18b0563631STom Van Eyck #endif
19b0563631STom Van Eyck 
20b0563631STom Van Eyck #include "block_cipher_internal.h"
21b0563631STom Van Eyck 
22b0563631STom Van Eyck #if defined(MBEDTLS_BLOCK_CIPHER_C)
23b0563631STom Van Eyck 
24b0563631STom Van Eyck #if defined(MBEDTLS_BLOCK_CIPHER_SOME_PSA)
psa_key_type_from_block_cipher_id(mbedtls_block_cipher_id_t cipher_id)25b0563631STom Van Eyck static psa_key_type_t psa_key_type_from_block_cipher_id(mbedtls_block_cipher_id_t cipher_id)
26b0563631STom Van Eyck {
27b0563631STom Van Eyck     switch (cipher_id) {
28b0563631STom Van Eyck #if defined(MBEDTLS_BLOCK_CIPHER_AES_VIA_PSA)
29b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_AES:
30b0563631STom Van Eyck             return PSA_KEY_TYPE_AES;
31b0563631STom Van Eyck #endif
32b0563631STom Van Eyck #if defined(MBEDTLS_BLOCK_CIPHER_ARIA_VIA_PSA)
33b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_ARIA:
34b0563631STom Van Eyck             return PSA_KEY_TYPE_ARIA;
35b0563631STom Van Eyck #endif
36b0563631STom Van Eyck #if defined(MBEDTLS_BLOCK_CIPHER_CAMELLIA_VIA_PSA)
37b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_CAMELLIA:
38b0563631STom Van Eyck             return PSA_KEY_TYPE_CAMELLIA;
39b0563631STom Van Eyck #endif
40b0563631STom Van Eyck         default:
41b0563631STom Van Eyck             return PSA_KEY_TYPE_NONE;
42b0563631STom Van Eyck     }
43b0563631STom Van Eyck }
44b0563631STom Van Eyck 
mbedtls_cipher_error_from_psa(psa_status_t status)45b0563631STom Van Eyck static int mbedtls_cipher_error_from_psa(psa_status_t status)
46b0563631STom Van Eyck {
47b0563631STom Van Eyck     return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_cipher_errors,
48b0563631STom Van Eyck                                    psa_generic_status_to_mbedtls);
49b0563631STom Van Eyck }
50b0563631STom Van Eyck #endif /* MBEDTLS_BLOCK_CIPHER_SOME_PSA */
51b0563631STom Van Eyck 
mbedtls_block_cipher_free(mbedtls_block_cipher_context_t * ctx)52b0563631STom Van Eyck void mbedtls_block_cipher_free(mbedtls_block_cipher_context_t *ctx)
53b0563631STom Van Eyck {
54*cb034002SJerome Forissier     if (ctx == NULL) {
55*cb034002SJerome Forissier         return;
56*cb034002SJerome Forissier     }
57*cb034002SJerome Forissier 
58b0563631STom Van Eyck #if defined(MBEDTLS_BLOCK_CIPHER_SOME_PSA)
59b0563631STom Van Eyck     if (ctx->engine == MBEDTLS_BLOCK_CIPHER_ENGINE_PSA) {
60b0563631STom Van Eyck         psa_destroy_key(ctx->psa_key_id);
61b0563631STom Van Eyck         return;
62b0563631STom Van Eyck     }
63b0563631STom Van Eyck #endif
64b0563631STom Van Eyck     switch (ctx->id) {
65b0563631STom Van Eyck #if defined(MBEDTLS_AES_C)
66b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_AES:
67b0563631STom Van Eyck             mbedtls_aes_free(&ctx->ctx.aes);
68b0563631STom Van Eyck             break;
69b0563631STom Van Eyck #endif
70b0563631STom Van Eyck #if defined(MBEDTLS_ARIA_C)
71b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_ARIA:
72b0563631STom Van Eyck             mbedtls_aria_free(&ctx->ctx.aria);
73b0563631STom Van Eyck             break;
74b0563631STom Van Eyck #endif
75b0563631STom Van Eyck #if defined(MBEDTLS_CAMELLIA_C)
76b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_CAMELLIA:
77b0563631STom Van Eyck             mbedtls_camellia_free(&ctx->ctx.camellia);
78b0563631STom Van Eyck             break;
79b0563631STom Van Eyck #endif
80b0563631STom Van Eyck         default:
81b0563631STom Van Eyck             break;
82b0563631STom Van Eyck     }
83b0563631STom Van Eyck     ctx->id = MBEDTLS_BLOCK_CIPHER_ID_NONE;
84b0563631STom Van Eyck }
85b0563631STom Van Eyck 
mbedtls_block_cipher_setup(mbedtls_block_cipher_context_t * ctx,mbedtls_cipher_id_t cipher_id)86b0563631STom Van Eyck int mbedtls_block_cipher_setup(mbedtls_block_cipher_context_t *ctx,
87b0563631STom Van Eyck                                mbedtls_cipher_id_t cipher_id)
88b0563631STom Van Eyck {
89b0563631STom Van Eyck     ctx->id = (cipher_id == MBEDTLS_CIPHER_ID_AES) ? MBEDTLS_BLOCK_CIPHER_ID_AES :
90b0563631STom Van Eyck               (cipher_id == MBEDTLS_CIPHER_ID_ARIA) ? MBEDTLS_BLOCK_CIPHER_ID_ARIA :
91b0563631STom Van Eyck               (cipher_id == MBEDTLS_CIPHER_ID_CAMELLIA) ? MBEDTLS_BLOCK_CIPHER_ID_CAMELLIA :
92b0563631STom Van Eyck               MBEDTLS_BLOCK_CIPHER_ID_NONE;
93b0563631STom Van Eyck 
94b0563631STom Van Eyck #if defined(MBEDTLS_BLOCK_CIPHER_SOME_PSA)
95b0563631STom Van Eyck     psa_key_type_t psa_key_type = psa_key_type_from_block_cipher_id(ctx->id);
96b0563631STom Van Eyck     if (psa_key_type != PSA_KEY_TYPE_NONE &&
97b0563631STom Van Eyck         psa_can_do_cipher(psa_key_type, PSA_ALG_ECB_NO_PADDING)) {
98b0563631STom Van Eyck         ctx->engine = MBEDTLS_BLOCK_CIPHER_ENGINE_PSA;
99b0563631STom Van Eyck         return 0;
100b0563631STom Van Eyck     }
101b0563631STom Van Eyck     ctx->engine = MBEDTLS_BLOCK_CIPHER_ENGINE_LEGACY;
102b0563631STom Van Eyck #endif
103b0563631STom Van Eyck 
104b0563631STom Van Eyck     switch (ctx->id) {
105b0563631STom Van Eyck #if defined(MBEDTLS_AES_C)
106b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_AES:
107b0563631STom Van Eyck             mbedtls_aes_init(&ctx->ctx.aes);
108b0563631STom Van Eyck             return 0;
109b0563631STom Van Eyck #endif
110b0563631STom Van Eyck #if defined(MBEDTLS_ARIA_C)
111b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_ARIA:
112b0563631STom Van Eyck             mbedtls_aria_init(&ctx->ctx.aria);
113b0563631STom Van Eyck             return 0;
114b0563631STom Van Eyck #endif
115b0563631STom Van Eyck #if defined(MBEDTLS_CAMELLIA_C)
116b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_CAMELLIA:
117b0563631STom Van Eyck             mbedtls_camellia_init(&ctx->ctx.camellia);
118b0563631STom Van Eyck             return 0;
119b0563631STom Van Eyck #endif
120b0563631STom Van Eyck         default:
121b0563631STom Van Eyck             ctx->id = MBEDTLS_BLOCK_CIPHER_ID_NONE;
122b0563631STom Van Eyck             return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
123b0563631STom Van Eyck     }
124b0563631STom Van Eyck }
125b0563631STom Van Eyck 
mbedtls_block_cipher_setkey(mbedtls_block_cipher_context_t * ctx,const unsigned char * key,unsigned key_bitlen)126b0563631STom Van Eyck int mbedtls_block_cipher_setkey(mbedtls_block_cipher_context_t *ctx,
127b0563631STom Van Eyck                                 const unsigned char *key,
128b0563631STom Van Eyck                                 unsigned key_bitlen)
129b0563631STom Van Eyck {
130b0563631STom Van Eyck #if defined(MBEDTLS_BLOCK_CIPHER_SOME_PSA)
131b0563631STom Van Eyck     if (ctx->engine == MBEDTLS_BLOCK_CIPHER_ENGINE_PSA) {
132b0563631STom Van Eyck         psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT;
133b0563631STom Van Eyck         psa_status_t status;
134b0563631STom Van Eyck 
135b0563631STom Van Eyck         psa_set_key_type(&key_attr, psa_key_type_from_block_cipher_id(ctx->id));
136b0563631STom Van Eyck         psa_set_key_bits(&key_attr, key_bitlen);
137b0563631STom Van Eyck         psa_set_key_algorithm(&key_attr, PSA_ALG_ECB_NO_PADDING);
138b0563631STom Van Eyck         psa_set_key_usage_flags(&key_attr, PSA_KEY_USAGE_ENCRYPT);
139b0563631STom Van Eyck 
140b0563631STom Van Eyck         status = psa_import_key(&key_attr, key, PSA_BITS_TO_BYTES(key_bitlen), &ctx->psa_key_id);
141b0563631STom Van Eyck         if (status != PSA_SUCCESS) {
142b0563631STom Van Eyck             return mbedtls_cipher_error_from_psa(status);
143b0563631STom Van Eyck         }
144b0563631STom Van Eyck         psa_reset_key_attributes(&key_attr);
145b0563631STom Van Eyck 
146b0563631STom Van Eyck         return 0;
147b0563631STom Van Eyck     }
148b0563631STom Van Eyck #endif /* MBEDTLS_BLOCK_CIPHER_SOME_PSA */
149b0563631STom Van Eyck 
150b0563631STom Van Eyck     switch (ctx->id) {
151b0563631STom Van Eyck #if defined(MBEDTLS_AES_C)
152b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_AES:
153b0563631STom Van Eyck             return mbedtls_aes_setkey_enc(&ctx->ctx.aes, key, key_bitlen);
154b0563631STom Van Eyck #endif
155b0563631STom Van Eyck #if defined(MBEDTLS_ARIA_C)
156b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_ARIA:
157b0563631STom Van Eyck             return mbedtls_aria_setkey_enc(&ctx->ctx.aria, key, key_bitlen);
158b0563631STom Van Eyck #endif
159b0563631STom Van Eyck #if defined(MBEDTLS_CAMELLIA_C)
160b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_CAMELLIA:
161b0563631STom Van Eyck             return mbedtls_camellia_setkey_enc(&ctx->ctx.camellia, key, key_bitlen);
162b0563631STom Van Eyck #endif
163b0563631STom Van Eyck         default:
164b0563631STom Van Eyck             return MBEDTLS_ERR_CIPHER_INVALID_CONTEXT;
165b0563631STom Van Eyck     }
166b0563631STom Van Eyck }
167b0563631STom Van Eyck 
mbedtls_block_cipher_encrypt(mbedtls_block_cipher_context_t * ctx,const unsigned char input[16],unsigned char output[16])168b0563631STom Van Eyck int mbedtls_block_cipher_encrypt(mbedtls_block_cipher_context_t *ctx,
169b0563631STom Van Eyck                                  const unsigned char input[16],
170b0563631STom Van Eyck                                  unsigned char output[16])
171b0563631STom Van Eyck {
172b0563631STom Van Eyck #if defined(MBEDTLS_BLOCK_CIPHER_SOME_PSA)
173b0563631STom Van Eyck     if (ctx->engine == MBEDTLS_BLOCK_CIPHER_ENGINE_PSA) {
174b0563631STom Van Eyck         psa_status_t status;
175b0563631STom Van Eyck         size_t olen;
176b0563631STom Van Eyck 
177b0563631STom Van Eyck         status = psa_cipher_encrypt(ctx->psa_key_id, PSA_ALG_ECB_NO_PADDING,
178b0563631STom Van Eyck                                     input, 16, output, 16, &olen);
179b0563631STom Van Eyck         if (status != PSA_SUCCESS) {
180b0563631STom Van Eyck             return mbedtls_cipher_error_from_psa(status);
181b0563631STom Van Eyck         }
182b0563631STom Van Eyck         return 0;
183b0563631STom Van Eyck     }
184b0563631STom Van Eyck #endif /* MBEDTLS_BLOCK_CIPHER_SOME_PSA */
185b0563631STom Van Eyck 
186b0563631STom Van Eyck     switch (ctx->id) {
187b0563631STom Van Eyck #if defined(MBEDTLS_AES_C)
188b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_AES:
189b0563631STom Van Eyck             return mbedtls_aes_crypt_ecb(&ctx->ctx.aes, MBEDTLS_AES_ENCRYPT,
190b0563631STom Van Eyck                                          input, output);
191b0563631STom Van Eyck #endif
192b0563631STom Van Eyck #if defined(MBEDTLS_ARIA_C)
193b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_ARIA:
194b0563631STom Van Eyck             return mbedtls_aria_crypt_ecb(&ctx->ctx.aria, input, output);
195b0563631STom Van Eyck #endif
196b0563631STom Van Eyck #if defined(MBEDTLS_CAMELLIA_C)
197b0563631STom Van Eyck         case MBEDTLS_BLOCK_CIPHER_ID_CAMELLIA:
198b0563631STom Van Eyck             return mbedtls_camellia_crypt_ecb(&ctx->ctx.camellia,
199b0563631STom Van Eyck                                               MBEDTLS_CAMELLIA_ENCRYPT,
200b0563631STom Van Eyck                                               input, output);
201b0563631STom Van Eyck #endif
202b0563631STom Van Eyck         default:
203b0563631STom Van Eyck             return MBEDTLS_ERR_CIPHER_INVALID_CONTEXT;
204b0563631STom Van Eyck     }
205b0563631STom Van Eyck }
206b0563631STom Van Eyck 
207b0563631STom Van Eyck #endif /* MBEDTLS_BLOCK_CIPHER_C */
208