xref: /optee_os/core/lib/libtomcrypt/aes.c (revision f94292665e294efe5df55d4551b9565df2655eba)
125cc72e0SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause
225cc72e0SJens Wiklander /*
325cc72e0SJens Wiklander  * Copyright (c) 2014-2019, Linaro Limited
425cc72e0SJens Wiklander  */
525cc72e0SJens Wiklander 
6*f9429266SJens 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 
1325cc72e0SJens Wiklander TEE_Result crypto_aes_expand_enc_key(const void *key, size_t key_len,
1425cc72e0SJens Wiklander 				     void *enc_key, size_t enc_keylen,
1525cc72e0SJens Wiklander 				     unsigned int *rounds)
1625cc72e0SJens Wiklander {
17*f9429266SJens Wiklander #ifdef _CFG_CORE_LTC_AES_ACCEL
18*f9429266SJens Wiklander 	return crypto_accel_aes_expand_keys(key, key_len, enc_key, NULL,
19*f9429266SJens Wiklander 					    enc_keylen, rounds);
20*f9429266SJens Wiklander #else
2125cc72e0SJens Wiklander 	symmetric_key skey;
2225cc72e0SJens Wiklander 
2325cc72e0SJens Wiklander 	if (enc_keylen < sizeof(skey.rijndael.eK))
2425cc72e0SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
2525cc72e0SJens Wiklander 
2625cc72e0SJens Wiklander 	if (aes_setup(key, key_len, 0, &skey))
2725cc72e0SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
2825cc72e0SJens Wiklander 
2925cc72e0SJens Wiklander 	memcpy(enc_key, skey.rijndael.eK, sizeof(skey.rijndael.eK));
3025cc72e0SJens Wiklander 	*rounds = skey.rijndael.Nr;
31*f9429266SJens Wiklander #endif
3225cc72e0SJens Wiklander 	return TEE_SUCCESS;
3325cc72e0SJens Wiklander }
3425cc72e0SJens Wiklander 
3525cc72e0SJens Wiklander void crypto_aes_enc_block(const void *enc_key, size_t enc_keylen __maybe_unused,
3625cc72e0SJens Wiklander 			  unsigned int rounds, const void *src, void *dst)
3725cc72e0SJens Wiklander {
38*f9429266SJens Wiklander #ifdef _CFG_CORE_LTC_AES_ACCEL
39*f9429266SJens Wiklander 	crypto_accel_aes_ecb_enc(dst, src, enc_key, rounds, 1);
40*f9429266SJens Wiklander #else
4125cc72e0SJens Wiklander 	symmetric_key skey;
4225cc72e0SJens Wiklander 
4325cc72e0SJens Wiklander 	assert(enc_keylen >= sizeof(skey.rijndael.eK));
4425cc72e0SJens Wiklander 	memcpy(skey.rijndael.eK, enc_key, sizeof(skey.rijndael.eK));
4525cc72e0SJens Wiklander 	skey.rijndael.Nr = rounds;
4625cc72e0SJens Wiklander 	if (aes_ecb_encrypt(src, dst, &skey))
4725cc72e0SJens Wiklander 		panic();
48*f9429266SJens Wiklander #endif
4925cc72e0SJens Wiklander }
50