| // SPDX-License-Identifier: BSD-2-Clause |
| /* |
| * Copyright (C) 2018, ARM Limited |
| * Copyright (C) 2019, Linaro Limited |
| */ |
| |
| #include <crypto/crypto.h> |
| #include <kernel/panic.h> |
| #include <mbedtls/aes.h> |
| #include <string.h> |
| |
| TEE_Result crypto_aes_expand_enc_key(const void *key, size_t key_len, |
| void *enc_key, size_t enc_keylen, |
| unsigned int *rounds) |
| { |
| mbedtls_aes_context ctx; |
| |
| memset(&ctx, 0, sizeof(ctx)); |
| mbedtls_aes_init(&ctx); |
| if (mbedtls_aes_setkey_enc(&ctx, key, key_len * 8) != 0) |
| return TEE_ERROR_BAD_PARAMETERS; |
| |
| if (enc_keylen > sizeof(ctx.buf)) |
| return TEE_ERROR_BAD_PARAMETERS; |
| memcpy(enc_key, ctx.buf, enc_keylen); |
| *rounds = ctx.nr; |
| mbedtls_aes_free(&ctx); |
| return TEE_SUCCESS; |
| } |
| |
| void crypto_aes_enc_block(const void *enc_key, size_t enc_keylen, |
| unsigned int rounds, const void *src, void *dst) |
| { |
| mbedtls_aes_context ctx; |
| |
| memset(&ctx, 0, sizeof(ctx)); |
| mbedtls_aes_init(&ctx); |
| if (enc_keylen > sizeof(ctx.buf)) |
| panic(); |
| memcpy(ctx.buf, enc_key, enc_keylen); |
| ctx.rk = ctx.buf; |
| ctx.nr = rounds; |
| mbedtls_aes_encrypt(&ctx, src, dst); |
| mbedtls_aes_free(&ctx); |
| } |