xref: /optee_os/core/lib/libtomcrypt/aes.c (revision 2a65ecaf7d6f855e24ce1a117fe1931f7378f82c)
125cc72e0SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause
225cc72e0SJens Wiklander /*
325cc72e0SJens Wiklander  * Copyright (c) 2014-2019, Linaro Limited
425cc72e0SJens Wiklander  */
525cc72e0SJens Wiklander 
6f9429266SJens Wiklander #include <crypto/crypto_accel.h>
725cc72e0SJens Wiklander #include <crypto/crypto.h>
825cc72e0SJens Wiklander #include <kernel/panic.h>
925cc72e0SJens Wiklander #include <tee_api_defines.h>
1025cc72e0SJens Wiklander #include <tee_api_types.h>
115a913ee7SJerome Forissier #include <tomcrypt_private.h>
1225cc72e0SJens Wiklander 
13*2a65ecafSJens Wiklander #define AES_ENC_KEY_LEN	(sizeof(ulong32) * 60)
14*2a65ecafSJens Wiklander 
1525cc72e0SJens Wiklander TEE_Result crypto_aes_expand_enc_key(const void *key, size_t key_len,
1625cc72e0SJens Wiklander 				     void *enc_key, size_t enc_keylen,
1725cc72e0SJens Wiklander 				     unsigned int *rounds)
1825cc72e0SJens Wiklander {
19f9429266SJens Wiklander #ifdef _CFG_CORE_LTC_AES_ACCEL
20f9429266SJens Wiklander 	return crypto_accel_aes_expand_keys(key, key_len, enc_key, NULL,
21f9429266SJens Wiklander 					    enc_keylen, rounds);
22f9429266SJens Wiklander #else
2325cc72e0SJens Wiklander 	symmetric_key skey;
2425cc72e0SJens Wiklander 
25*2a65ecafSJens Wiklander 	if (enc_keylen < AES_ENC_KEY_LEN)
2625cc72e0SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
2725cc72e0SJens Wiklander 
2825cc72e0SJens Wiklander 	if (aes_setup(key, key_len, 0, &skey))
2925cc72e0SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
3025cc72e0SJens Wiklander 
31*2a65ecafSJens Wiklander 	memcpy(enc_key, skey.rijndael.eK, AES_ENC_KEY_LEN);
3225cc72e0SJens Wiklander 	*rounds = skey.rijndael.Nr;
33f9429266SJens Wiklander #endif
3425cc72e0SJens Wiklander 	return TEE_SUCCESS;
3525cc72e0SJens Wiklander }
3625cc72e0SJens Wiklander 
3725cc72e0SJens Wiklander void crypto_aes_enc_block(const void *enc_key, size_t enc_keylen __maybe_unused,
3825cc72e0SJens Wiklander 			  unsigned int rounds, const void *src, void *dst)
3925cc72e0SJens Wiklander {
40f9429266SJens Wiklander #ifdef _CFG_CORE_LTC_AES_ACCEL
41f9429266SJens Wiklander 	crypto_accel_aes_ecb_enc(dst, src, enc_key, rounds, 1);
42f9429266SJens Wiklander #else
43*2a65ecafSJens Wiklander 	symmetric_key skey = { };
4425cc72e0SJens Wiklander 
45*2a65ecafSJens Wiklander 	assert(enc_keylen >= AES_ENC_KEY_LEN);
46*2a65ecafSJens Wiklander 	skey.rijndael.eK = LTC_ALIGN_BUF(skey.rijndael.K, 16);
47*2a65ecafSJens Wiklander 	memcpy(skey.rijndael.eK, enc_key, AES_ENC_KEY_LEN);
4825cc72e0SJens Wiklander 	skey.rijndael.Nr = rounds;
4925cc72e0SJens Wiklander 	if (aes_ecb_encrypt(src, dst, &skey))
5025cc72e0SJens Wiklander 		panic();
51f9429266SJens Wiklander #endif
5225cc72e0SJens Wiklander }
53