178887e60SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause 278887e60SJens Wiklander /* 378887e60SJens Wiklander * Copyright (c) 2014, 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 19*15cb2782SSohaib 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*15cb2782SSohaib ul Hassan #if defined(_CFG_CORE_LTC_ACIPHER) || defined(_CFG_CORE_LTC_EC25519) 1211f3b1115SJens Wiklander register_prng(&prng_crypto_desc); 122c7e27e83SJens Wiklander #endif 12378887e60SJens Wiklander } 12478887e60SJens Wiklander 125a70f4504SJens Wiklander static void ltc_init(void) 12678887e60SJens Wiklander { 127c7e27e83SJens Wiklander #if defined(_CFG_CORE_LTC_ACIPHER) 12878887e60SJens Wiklander init_mp_tomcrypt(); 129c7e27e83SJens Wiklander #endif 13078887e60SJens Wiklander tee_ltc_reg_algs(); 131a70f4504SJens Wiklander } 132a70f4504SJens Wiklander 133a70f4504SJens Wiklander #if defined(CFG_CRYPTOLIB_NAME_tomcrypt) 134a70f4504SJens Wiklander TEE_Result crypto_init(void) 135a70f4504SJens Wiklander { 136a70f4504SJens Wiklander ltc_init(); 13778887e60SJens Wiklander 13878887e60SJens Wiklander return TEE_SUCCESS; 13978887e60SJens Wiklander } 140a70f4504SJens Wiklander #else 141a70f4504SJens Wiklander void tomcrypt_init(void) 142a70f4504SJens Wiklander { 143a70f4504SJens Wiklander ltc_init(); 144a70f4504SJens Wiklander } 145a70f4504SJens Wiklander #endif 14678887e60SJens Wiklander 14778887e60SJens Wiklander #if defined(CFG_WITH_VFP) 14878887e60SJens Wiklander void tomcrypt_arm_neon_enable(struct tomcrypt_arm_neon_state *state) 14978887e60SJens Wiklander { 15078887e60SJens Wiklander state->state = thread_kernel_enable_vfp(); 15178887e60SJens Wiklander } 15278887e60SJens Wiklander 15378887e60SJens Wiklander void tomcrypt_arm_neon_disable(struct tomcrypt_arm_neon_state *state) 15478887e60SJens Wiklander { 15578887e60SJens Wiklander thread_kernel_disable_vfp(state->state); 15678887e60SJens Wiklander } 15778887e60SJens Wiklander #endif 158