178887e60SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause
278887e60SJens Wiklander /*
31478437eSJens 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 */
prng_crypto_start(prng_state * prng __unused)215a913ee7SJerome Forissier static int prng_crypto_start(prng_state *prng __unused)
2278887e60SJens Wiklander {
2378887e60SJens Wiklander return CRYPT_OK;
2478887e60SJens Wiklander }
2578887e60SJens Wiklander
prng_crypto_add_entropy(const unsigned char * in __unused,unsigned long inlen __unused,prng_state * prng __unused)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
prng_crypto_ready(prng_state * prng __unused)345a913ee7SJerome Forissier static int prng_crypto_ready(prng_state *prng __unused)
3578887e60SJens Wiklander {
3678887e60SJens Wiklander return CRYPT_OK;
3778887e60SJens Wiklander }
3878887e60SJens Wiklander
prng_crypto_read(unsigned char * out,unsigned long outlen,prng_state * prng __unused)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
prng_crypto_done(prng_state * prng __unused)485a913ee7SJerome Forissier static int prng_crypto_done(prng_state *prng __unused)
4978887e60SJens Wiklander {
5078887e60SJens Wiklander return CRYPT_OK;
5178887e60SJens Wiklander }
5278887e60SJens Wiklander
prng_crypto_export(unsigned char * out __unused,unsigned long * outlen __unused,prng_state * prng __unused)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
prng_crypto_import(const unsigned char * in __unused,unsigned long inlen __unused,prng_state * prng __unused)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
prng_crypto_test(void)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
tee_ltc_reg_algs(void)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
102*32b31808SJens Wiklander #if defined(_CFG_CORE_LTC_MD5_DESC)
10378887e60SJens Wiklander register_hash(&md5_desc);
10478887e60SJens Wiklander #endif
105*32b31808SJens Wiklander #if defined(_CFG_CORE_LTC_SHA1) || defined(_CFG_CORE_LTC_SHA1_DESC)
10678887e60SJens Wiklander register_hash(&sha1_desc);
10778887e60SJens Wiklander #endif
108*32b31808SJens Wiklander #if defined(_CFG_CORE_LTC_SHA224) || defined(_CFG_CORE_LTC_SHA224_DESC)
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
1201478437eSJens 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
1231478437eSJens 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
1261478437eSJens 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
1291478437eSJens 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
ltc_init(void)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)
crypto_init(void)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
tomcrypt_init(void)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)
tomcrypt_arm_neon_enable(struct tomcrypt_arm_neon_state * state)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
tomcrypt_arm_neon_disable(struct tomcrypt_arm_neon_state * state)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