xref: /optee_os/core/lib/libtomcrypt/aes.c (revision 1868eb206733e931b6c6c2d85d55e646bc8a2496)
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 
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 
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