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