178887e60SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause 278887e60SJens Wiklander /* 3*1478437eSJens Wiklander * Copyright (c) 2014-2023, Linaro Limited 478887e60SJens Wiklander */ 578887e60SJens Wiklander 678887e60SJens Wiklander #include <crypto/crypto.h> 778887e60SJens Wiklander #include <tee_api_types.h> 85edbd86aSJens Wiklander #include <tee_api_defines.h> 95a913ee7SJerome Forissier #include <tomcrypt_private.h> 10a70f4504SJens Wiklander #include <tomcrypt_init.h> 1178887e60SJens Wiklander #include "tomcrypt_mp.h" 1278887e60SJens Wiklander #include <trace.h> 1378887e60SJens Wiklander 14a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_VFP) 1578887e60SJens Wiklander #include <tomcrypt_arm_neon.h> 1678887e60SJens Wiklander #include <kernel/thread.h> 1778887e60SJens Wiklander #endif 1878887e60SJens Wiklander 1915cb2782SSohaib ul Hassan #if defined(_CFG_CORE_LTC_ACIPHER) || defined(_CFG_CORE_LTC_EC25519) 2078887e60SJens Wiklander /* Random generator */ 215a913ee7SJerome Forissier static int prng_crypto_start(prng_state *prng __unused) 2278887e60SJens Wiklander { 2378887e60SJens Wiklander return CRYPT_OK; 2478887e60SJens Wiklander } 2578887e60SJens Wiklander 261f3b1115SJens Wiklander static int prng_crypto_add_entropy(const unsigned char *in __unused, 2778887e60SJens Wiklander unsigned long inlen __unused, 285a913ee7SJerome Forissier prng_state *prng __unused) 2978887e60SJens Wiklander { 3078887e60SJens Wiklander /* No entropy is required */ 3178887e60SJens Wiklander return CRYPT_OK; 3278887e60SJens Wiklander } 3378887e60SJens Wiklander 345a913ee7SJerome Forissier static int prng_crypto_ready(prng_state *prng __unused) 3578887e60SJens Wiklander { 3678887e60SJens Wiklander return CRYPT_OK; 3778887e60SJens Wiklander } 3878887e60SJens Wiklander 391f3b1115SJens Wiklander static unsigned long prng_crypto_read(unsigned char *out, unsigned long outlen, 405a913ee7SJerome Forissier prng_state *prng __unused) 4178887e60SJens Wiklander { 4278887e60SJens Wiklander if (crypto_rng_read(out, outlen)) 4378887e60SJens Wiklander return 0; 4478887e60SJens Wiklander 4578887e60SJens Wiklander return outlen; 4678887e60SJens Wiklander } 4778887e60SJens Wiklander 485a913ee7SJerome Forissier static int prng_crypto_done(prng_state *prng __unused) 4978887e60SJens Wiklander { 5078887e60SJens Wiklander return CRYPT_OK; 5178887e60SJens Wiklander } 5278887e60SJens Wiklander 531f3b1115SJens Wiklander static int prng_crypto_export(unsigned char *out __unused, 5478887e60SJens Wiklander unsigned long *outlen __unused, 555a913ee7SJerome Forissier prng_state *prng __unused) 5678887e60SJens Wiklander { 5778887e60SJens Wiklander return CRYPT_OK; 5878887e60SJens Wiklander } 5978887e60SJens Wiklander 601f3b1115SJens Wiklander static int prng_crypto_import(const unsigned char *in __unused, 6178887e60SJens Wiklander unsigned long inlen __unused, 625a913ee7SJerome Forissier prng_state *prng __unused) 6378887e60SJens Wiklander { 6478887e60SJens Wiklander return CRYPT_OK; 6578887e60SJens Wiklander } 6678887e60SJens Wiklander 671f3b1115SJens Wiklander static int prng_crypto_test(void) 6878887e60SJens Wiklander { 6978887e60SJens Wiklander return CRYPT_OK; 7078887e60SJens Wiklander } 7178887e60SJens Wiklander 721f3b1115SJens Wiklander static const struct ltc_prng_descriptor prng_crypto_desc = { 731f3b1115SJens Wiklander .name = "prng_crypto", 7478887e60SJens Wiklander .export_size = 64, 7555b5758dSJerome Forissier .start = prng_crypto_start, 7655b5758dSJerome Forissier .add_entropy = prng_crypto_add_entropy, 7755b5758dSJerome Forissier .ready = prng_crypto_ready, 7855b5758dSJerome Forissier .read = prng_crypto_read, 7955b5758dSJerome Forissier .done = prng_crypto_done, 8055b5758dSJerome Forissier .pexport = prng_crypto_export, 8155b5758dSJerome Forissier .pimport = prng_crypto_import, 8255b5758dSJerome Forissier .test = prng_crypto_test, 8378887e60SJens Wiklander }; 84c7e27e83SJens Wiklander #endif /*_CFG_CORE_LTC_ACIPHER*/ 8578887e60SJens Wiklander 8678887e60SJens Wiklander /* 8778887e60SJens Wiklander * tee_ltc_reg_algs(): Registers 8878887e60SJens Wiklander * - algorithms 8978887e60SJens Wiklander * - hash 9078887e60SJens Wiklander * - prng (pseudo random generator) 9178887e60SJens Wiklander */ 9278887e60SJens Wiklander 9378887e60SJens Wiklander static void tee_ltc_reg_algs(void) 9478887e60SJens Wiklander { 95a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_AES) || defined(_CFG_CORE_LTC_AES_DESC) 9678887e60SJens Wiklander register_cipher(&aes_desc); 9778887e60SJens Wiklander #endif 98a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_DES) 9978887e60SJens Wiklander register_cipher(&des_desc); 10078887e60SJens Wiklander register_cipher(&des3_desc); 10178887e60SJens Wiklander #endif 102a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_MD5) 10378887e60SJens Wiklander register_hash(&md5_desc); 10478887e60SJens Wiklander #endif 105a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_SHA1) 10678887e60SJens Wiklander register_hash(&sha1_desc); 10778887e60SJens Wiklander #endif 108a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_SHA224) 10978887e60SJens Wiklander register_hash(&sha224_desc); 11078887e60SJens Wiklander #endif 111a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_SHA256) || defined(_CFG_CORE_LTC_SHA256_DESC) 11278887e60SJens Wiklander register_hash(&sha256_desc); 11378887e60SJens Wiklander #endif 114a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_SHA384) || defined(_CFG_CORE_LTC_SHA384_DESC) 11578887e60SJens Wiklander register_hash(&sha384_desc); 11678887e60SJens Wiklander #endif 117a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_SHA512) || defined(_CFG_CORE_LTC_SHA512_DESC) 11878887e60SJens Wiklander register_hash(&sha512_desc); 11978887e60SJens Wiklander #endif 120*1478437eSJens Wiklander #if defined(_CFG_CORE_LTC_SHA3_224) || defined(_CFG_CORE_LTC_SHA3_224_DESC) 1217dfcefdaSJens Wiklander register_hash(&sha3_224_desc); 1227dfcefdaSJens Wiklander #endif 123*1478437eSJens Wiklander #if defined(_CFG_CORE_LTC_SHA3_256) || defined(_CFG_CORE_LTC_SHA3_256_DESC) 1247dfcefdaSJens Wiklander register_hash(&sha3_256_desc); 1257dfcefdaSJens Wiklander #endif 126*1478437eSJens Wiklander #if defined(_CFG_CORE_LTC_SHA3_384) || defined(_CFG_CORE_LTC_SHA3_384_DESC) 1277dfcefdaSJens Wiklander register_hash(&sha3_384_desc); 1287dfcefdaSJens Wiklander #endif 129*1478437eSJens Wiklander #if defined(_CFG_CORE_LTC_SHA3_512) || defined(_CFG_CORE_LTC_SHA3_512_DESC) 1307dfcefdaSJens Wiklander register_hash(&sha3_512_desc); 1317dfcefdaSJens Wiklander #endif 13215cb2782SSohaib ul Hassan #if defined(_CFG_CORE_LTC_ACIPHER) || defined(_CFG_CORE_LTC_EC25519) 1331f3b1115SJens Wiklander register_prng(&prng_crypto_desc); 134c7e27e83SJens Wiklander #endif 13578887e60SJens Wiklander } 13678887e60SJens Wiklander 137a70f4504SJens Wiklander static void ltc_init(void) 13878887e60SJens Wiklander { 139c7e27e83SJens Wiklander #if defined(_CFG_CORE_LTC_ACIPHER) 14078887e60SJens Wiklander init_mp_tomcrypt(); 141c7e27e83SJens Wiklander #endif 14278887e60SJens Wiklander tee_ltc_reg_algs(); 143a70f4504SJens Wiklander } 144a70f4504SJens Wiklander 145a70f4504SJens Wiklander #if defined(CFG_CRYPTOLIB_NAME_tomcrypt) 146a70f4504SJens Wiklander TEE_Result crypto_init(void) 147a70f4504SJens Wiklander { 148a70f4504SJens Wiklander ltc_init(); 14978887e60SJens Wiklander 15078887e60SJens Wiklander return TEE_SUCCESS; 15178887e60SJens Wiklander } 152a70f4504SJens Wiklander #else 153a70f4504SJens Wiklander void tomcrypt_init(void) 154a70f4504SJens Wiklander { 155a70f4504SJens Wiklander ltc_init(); 156a70f4504SJens Wiklander } 157a70f4504SJens Wiklander #endif 15878887e60SJens Wiklander 15978887e60SJens Wiklander #if defined(CFG_WITH_VFP) 16078887e60SJens Wiklander void tomcrypt_arm_neon_enable(struct tomcrypt_arm_neon_state *state) 16178887e60SJens Wiklander { 16278887e60SJens Wiklander state->state = thread_kernel_enable_vfp(); 16378887e60SJens Wiklander } 16478887e60SJens Wiklander 16578887e60SJens Wiklander void tomcrypt_arm_neon_disable(struct tomcrypt_arm_neon_state *state) 16678887e60SJens Wiklander { 16778887e60SJens Wiklander thread_kernel_disable_vfp(state->state); 16878887e60SJens Wiklander } 16978887e60SJens Wiklander #endif 170