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