1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3 * Copyright (c) 2014-2019, Linaro Limited
4 */
5
6 #include <crypto/crypto_accel.h>
7 #include <crypto/crypto.h>
8 #include <kernel/panic.h>
9 #include <tee_api_defines.h>
10 #include <tee_api_types.h>
11 #include <tomcrypt_private.h>
12
13 #define AES_ENC_KEY_LEN (sizeof(ulong32) * 60)
14
crypto_aes_expand_enc_key(const void * key,size_t key_len,void * enc_key,size_t enc_keylen,unsigned int * rounds)15 TEE_Result crypto_aes_expand_enc_key(const void *key, size_t key_len,
16 void *enc_key, size_t enc_keylen,
17 unsigned int *rounds)
18 {
19 #ifdef _CFG_CORE_LTC_AES_ACCEL
20 return crypto_accel_aes_expand_keys(key, key_len, enc_key, NULL,
21 enc_keylen, rounds);
22 #else
23 symmetric_key skey;
24
25 if (enc_keylen < AES_ENC_KEY_LEN)
26 return TEE_ERROR_BAD_PARAMETERS;
27
28 if (aes_setup(key, key_len, 0, &skey))
29 return TEE_ERROR_BAD_PARAMETERS;
30
31 memcpy(enc_key, skey.rijndael.eK, AES_ENC_KEY_LEN);
32 *rounds = skey.rijndael.Nr;
33 #endif
34 return TEE_SUCCESS;
35 }
36
crypto_aes_enc_block(const void * enc_key,size_t enc_keylen __maybe_unused,unsigned int rounds,const void * src,void * dst)37 void crypto_aes_enc_block(const void *enc_key, size_t enc_keylen __maybe_unused,
38 unsigned int rounds, const void *src, void *dst)
39 {
40 #ifdef _CFG_CORE_LTC_AES_ACCEL
41 crypto_accel_aes_ecb_enc(dst, src, enc_key, rounds, 1);
42 #else
43 symmetric_key skey = { };
44
45 assert(enc_keylen >= AES_ENC_KEY_LEN);
46 skey.rijndael.eK = LTC_ALIGN_BUF(skey.rijndael.K, 16);
47 memcpy(skey.rijndael.eK, enc_key, AES_ENC_KEY_LEN);
48 skey.rijndael.Nr = rounds;
49 if (aes_ecb_encrypt(src, dst, &skey))
50 panic();
51 #endif
52 }
53