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