xref: /optee_os/core/lib/libtomcrypt/tomcrypt.c (revision a70f4504e3fa19452f19948e6fe6e139f74c31a4)
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>
978887e60SJens Wiklander #include <tomcrypt.h>
10*a70f4504SJens 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 
19c7e27e83SJens Wiklander #if defined(_CFG_CORE_LTC_ACIPHER)
2078887e60SJens Wiklander /* Random generator */
211f3b1115SJens Wiklander static int prng_crypto_start(union 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,
2878887e60SJens Wiklander 				   union Prng_state *prng __unused)
2978887e60SJens Wiklander {
3078887e60SJens Wiklander 	/* No entropy is required */
3178887e60SJens Wiklander 	return CRYPT_OK;
3278887e60SJens Wiklander }
3378887e60SJens Wiklander 
341f3b1115SJens Wiklander static int prng_crypto_ready(union 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,
4078887e60SJens Wiklander 				      union 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 
481f3b1115SJens Wiklander static int prng_crypto_done(union 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,
5578887e60SJens Wiklander 			      union 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,
6278887e60SJens Wiklander 			      union 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,
751f3b1115SJens Wiklander 	.start = &prng_crypto_start,
761f3b1115SJens Wiklander 	.add_entropy = &prng_crypto_add_entropy,
771f3b1115SJens Wiklander 	.ready = &prng_crypto_ready,
781f3b1115SJens Wiklander 	.read = &prng_crypto_read,
791f3b1115SJens Wiklander 	.done = &prng_crypto_done,
801f3b1115SJens Wiklander 	.pexport = &prng_crypto_export,
811f3b1115SJens Wiklander 	.pimport = &prng_crypto_import,
821f3b1115SJens Wiklander 	.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
120c7e27e83SJens Wiklander #if defined(_CFG_CORE_LTC_ACIPHER)
1211f3b1115SJens Wiklander 	register_prng(&prng_crypto_desc);
122c7e27e83SJens Wiklander #endif
12378887e60SJens Wiklander }
12478887e60SJens Wiklander 
125*a70f4504SJens 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();
131*a70f4504SJens Wiklander }
132*a70f4504SJens Wiklander 
133*a70f4504SJens Wiklander #if defined(CFG_CRYPTOLIB_NAME_tomcrypt)
134*a70f4504SJens Wiklander TEE_Result crypto_init(void)
135*a70f4504SJens Wiklander {
136*a70f4504SJens Wiklander 	ltc_init();
13778887e60SJens Wiklander 
13878887e60SJens Wiklander 	return TEE_SUCCESS;
13978887e60SJens Wiklander }
140*a70f4504SJens Wiklander #else
141*a70f4504SJens Wiklander void tomcrypt_init(void)
142*a70f4504SJens Wiklander {
143*a70f4504SJens Wiklander 	ltc_init();
144*a70f4504SJens Wiklander }
145*a70f4504SJens 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