1d2e5e90eSEdison Ai // SPDX-License-Identifier: BSD-2-Clause
2d2e5e90eSEdison Ai /*
3d2e5e90eSEdison Ai * Copyright (C) 2019, Linaro Limited
4*9c525fe4SJerome Forissier * Copyright (C) 2021, Huawei Technologies Co., Ltd
5d2e5e90eSEdison Ai */
6d2e5e90eSEdison Ai
7d2e5e90eSEdison Ai #include <assert.h>
8d2e5e90eSEdison Ai #include <compiler.h>
910b90791SJens Wiklander #include <crypto/crypto_accel.h>
10d2e5e90eSEdison Ai #include <crypto/crypto.h>
11d2e5e90eSEdison Ai #include <crypto/crypto_impl.h>
12d2e5e90eSEdison Ai #include <mbedtls/aes.h>
13d2e5e90eSEdison Ai #include <stdlib.h>
14d2e5e90eSEdison Ai #include <string.h>
15d2e5e90eSEdison Ai #include <tee_api_types.h>
16d2e5e90eSEdison Ai #include <utee_defines.h>
17d2e5e90eSEdison Ai #include <util.h>
18d2e5e90eSEdison Ai
19*9c525fe4SJerome Forissier #include "mbed_helpers.h"
20*9c525fe4SJerome Forissier
21d2e5e90eSEdison Ai struct mbed_aes_ecb_ctx {
22d2e5e90eSEdison Ai struct crypto_cipher_ctx ctx;
23d2e5e90eSEdison Ai int mbed_mode;
24d2e5e90eSEdison Ai mbedtls_aes_context aes_ctx;
25d2e5e90eSEdison Ai };
26d2e5e90eSEdison Ai
27d2e5e90eSEdison Ai static const struct crypto_cipher_ops mbed_aes_ecb_ops;
28d2e5e90eSEdison Ai
to_aes_ecb_ctx(struct crypto_cipher_ctx * ctx)29d2e5e90eSEdison Ai static struct mbed_aes_ecb_ctx *to_aes_ecb_ctx(struct crypto_cipher_ctx *ctx)
30d2e5e90eSEdison Ai {
31d2e5e90eSEdison Ai assert(ctx && ctx->ops == &mbed_aes_ecb_ops);
32d2e5e90eSEdison Ai
33d2e5e90eSEdison Ai return container_of(ctx, struct mbed_aes_ecb_ctx, ctx);
34d2e5e90eSEdison Ai }
35d2e5e90eSEdison Ai
mbed_aes_ecb_init(struct crypto_cipher_ctx * ctx,TEE_OperationMode mode,const uint8_t * key1,size_t key1_len,const uint8_t * key2 __unused,size_t key2_len __unused,const uint8_t * iv __unused,size_t iv_len __unused)36d2e5e90eSEdison Ai static TEE_Result mbed_aes_ecb_init(struct crypto_cipher_ctx *ctx,
37d2e5e90eSEdison Ai TEE_OperationMode mode, const uint8_t *key1,
38d2e5e90eSEdison Ai size_t key1_len,
39d2e5e90eSEdison Ai const uint8_t *key2 __unused,
40d2e5e90eSEdison Ai size_t key2_len __unused,
41d2e5e90eSEdison Ai const uint8_t *iv __unused,
42d2e5e90eSEdison Ai size_t iv_len __unused)
43d2e5e90eSEdison Ai {
44d2e5e90eSEdison Ai struct mbed_aes_ecb_ctx *c = to_aes_ecb_ctx(ctx);
45d2e5e90eSEdison Ai int mbed_res = 0;
46d2e5e90eSEdison Ai
47d2e5e90eSEdison Ai mbedtls_aes_init(&c->aes_ctx);
48d2e5e90eSEdison Ai
49d2e5e90eSEdison Ai if (mode == TEE_MODE_ENCRYPT) {
50d2e5e90eSEdison Ai c->mbed_mode = MBEDTLS_AES_ENCRYPT;
51d2e5e90eSEdison Ai mbed_res = mbedtls_aes_setkey_enc(&c->aes_ctx, key1,
52d2e5e90eSEdison Ai key1_len * 8);
53d2e5e90eSEdison Ai } else {
54d2e5e90eSEdison Ai c->mbed_mode = MBEDTLS_AES_DECRYPT;
55d2e5e90eSEdison Ai mbed_res = mbedtls_aes_setkey_dec(&c->aes_ctx, key1,
56d2e5e90eSEdison Ai key1_len * 8);
57d2e5e90eSEdison Ai }
58d2e5e90eSEdison Ai
59d2e5e90eSEdison Ai if (mbed_res)
60d2e5e90eSEdison Ai return TEE_ERROR_BAD_STATE;
61d2e5e90eSEdison Ai
62d2e5e90eSEdison Ai return TEE_SUCCESS;
63d2e5e90eSEdison Ai }
64d2e5e90eSEdison Ai
mbed_aes_ecb_update(struct crypto_cipher_ctx * ctx,bool last_block __unused,const uint8_t * data,size_t len,uint8_t * dst)65d2e5e90eSEdison Ai static TEE_Result mbed_aes_ecb_update(struct crypto_cipher_ctx *ctx,
66d2e5e90eSEdison Ai bool last_block __unused,
67d2e5e90eSEdison Ai const uint8_t *data, size_t len,
68d2e5e90eSEdison Ai uint8_t *dst)
69d2e5e90eSEdison Ai {
70d2e5e90eSEdison Ai struct mbed_aes_ecb_ctx *c = to_aes_ecb_ctx(ctx);
71d2e5e90eSEdison Ai size_t block_size = TEE_AES_BLOCK_SIZE;
72d2e5e90eSEdison Ai size_t offs = 0;
73d2e5e90eSEdison Ai
74d2e5e90eSEdison Ai if (len % block_size)
75d2e5e90eSEdison Ai return TEE_ERROR_BAD_PARAMETERS;
76d2e5e90eSEdison Ai
77d2e5e90eSEdison Ai for (offs = 0; offs < len; offs += block_size) {
78d2e5e90eSEdison Ai if (mbedtls_aes_crypt_ecb(&c->aes_ctx, c->mbed_mode,
79d2e5e90eSEdison Ai data + offs, dst + offs))
80d2e5e90eSEdison Ai return TEE_ERROR_BAD_STATE;
81d2e5e90eSEdison Ai }
82d2e5e90eSEdison Ai
83d2e5e90eSEdison Ai return TEE_SUCCESS;
84d2e5e90eSEdison Ai }
85d2e5e90eSEdison Ai
mbed_aes_ecb_final(struct crypto_cipher_ctx * ctx)86d2e5e90eSEdison Ai static void mbed_aes_ecb_final(struct crypto_cipher_ctx *ctx)
87d2e5e90eSEdison Ai {
88d2e5e90eSEdison Ai mbedtls_aes_free(&to_aes_ecb_ctx(ctx)->aes_ctx);
89d2e5e90eSEdison Ai }
90d2e5e90eSEdison Ai
mbed_aes_ecb_free_ctx(struct crypto_cipher_ctx * ctx)91d2e5e90eSEdison Ai static void mbed_aes_ecb_free_ctx(struct crypto_cipher_ctx *ctx)
92d2e5e90eSEdison Ai {
93d2e5e90eSEdison Ai free(to_aes_ecb_ctx(ctx));
94d2e5e90eSEdison Ai }
95d2e5e90eSEdison Ai
mbed_aes_ecb_copy_state(struct crypto_cipher_ctx * dst_ctx,struct crypto_cipher_ctx * src_ctx)96d2e5e90eSEdison Ai static void mbed_aes_ecb_copy_state(struct crypto_cipher_ctx *dst_ctx,
97d2e5e90eSEdison Ai struct crypto_cipher_ctx *src_ctx)
98d2e5e90eSEdison Ai {
99d2e5e90eSEdison Ai struct mbed_aes_ecb_ctx *src = to_aes_ecb_ctx(src_ctx);
100d2e5e90eSEdison Ai struct mbed_aes_ecb_ctx *dst = to_aes_ecb_ctx(dst_ctx);
101d2e5e90eSEdison Ai
102d2e5e90eSEdison Ai dst->mbed_mode = src->mbed_mode;
103*9c525fe4SJerome Forissier mbed_copy_mbedtls_aes_context(&dst->aes_ctx, &src->aes_ctx);
104d2e5e90eSEdison Ai }
105d2e5e90eSEdison Ai
106d2e5e90eSEdison Ai static const struct crypto_cipher_ops mbed_aes_ecb_ops = {
107d2e5e90eSEdison Ai .init = mbed_aes_ecb_init,
108d2e5e90eSEdison Ai .update = mbed_aes_ecb_update,
109d2e5e90eSEdison Ai .final = mbed_aes_ecb_final,
110d2e5e90eSEdison Ai .free_ctx = mbed_aes_ecb_free_ctx,
111d2e5e90eSEdison Ai .copy_state = mbed_aes_ecb_copy_state,
112d2e5e90eSEdison Ai };
113d2e5e90eSEdison Ai
crypto_aes_ecb_alloc_ctx(struct crypto_cipher_ctx ** ctx_ret)114d2e5e90eSEdison Ai TEE_Result crypto_aes_ecb_alloc_ctx(struct crypto_cipher_ctx **ctx_ret)
115d2e5e90eSEdison Ai {
116d2e5e90eSEdison Ai struct mbed_aes_ecb_ctx *c = NULL;
117d2e5e90eSEdison Ai
118d2e5e90eSEdison Ai c = calloc(1, sizeof(*c));
119d2e5e90eSEdison Ai if (!c)
120d2e5e90eSEdison Ai return TEE_ERROR_OUT_OF_MEMORY;
121d2e5e90eSEdison Ai
122d2e5e90eSEdison Ai c->ctx.ops = &mbed_aes_ecb_ops;
123d2e5e90eSEdison Ai *ctx_ret = &c->ctx;
124d2e5e90eSEdison Ai
125d2e5e90eSEdison Ai return TEE_SUCCESS;
126d2e5e90eSEdison Ai }
12710b90791SJens Wiklander
12810b90791SJens Wiklander #if defined(MBEDTLS_AES_ALT)
mbedtls_aes_crypt_ecb(mbedtls_aes_context * ctx,int mode,const unsigned char input[16],unsigned char output[16])12910b90791SJens Wiklander int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx, int mode,
13010b90791SJens Wiklander const unsigned char input[16],
13110b90791SJens Wiklander unsigned char output[16])
13210b90791SJens Wiklander
13310b90791SJens Wiklander {
13410b90791SJens Wiklander if (mode == MBEDTLS_AES_ENCRYPT)
13510b90791SJens Wiklander crypto_accel_aes_ecb_enc(output, input, ctx->key,
13610b90791SJens Wiklander ctx->round_count, 1);
13710b90791SJens Wiklander else
13810b90791SJens Wiklander crypto_accel_aes_ecb_dec(output, input, ctx->key,
13910b90791SJens Wiklander ctx->round_count, 1);
14010b90791SJens Wiklander
14110b90791SJens Wiklander return 0;
14210b90791SJens Wiklander }
14310b90791SJens Wiklander #endif /*MBEDTLS_AES_ALT*/
144