xref: /optee_os/core/lib/libtomcrypt/tomcrypt.c (revision c7e27e8340c4ce03dad5a92ac7716d147e584715)
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>
1078887e60SJens Wiklander #include "tomcrypt_mp.h"
1178887e60SJens Wiklander #include <trace.h>
1278887e60SJens Wiklander 
13a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_VFP)
1478887e60SJens Wiklander #include <tomcrypt_arm_neon.h>
1578887e60SJens Wiklander #include <kernel/thread.h>
1678887e60SJens Wiklander #endif
1778887e60SJens Wiklander 
18*c7e27e83SJens Wiklander #if defined(_CFG_CORE_LTC_ACIPHER)
1978887e60SJens Wiklander /* Random generator */
201f3b1115SJens Wiklander static int prng_crypto_start(union Prng_state *prng __unused)
2178887e60SJens Wiklander {
2278887e60SJens Wiklander 	return CRYPT_OK;
2378887e60SJens Wiklander }
2478887e60SJens Wiklander 
251f3b1115SJens Wiklander static int prng_crypto_add_entropy(const unsigned char *in __unused,
2678887e60SJens Wiklander 				   unsigned long inlen __unused,
2778887e60SJens Wiklander 				   union Prng_state *prng __unused)
2878887e60SJens Wiklander {
2978887e60SJens Wiklander 	/* No entropy is required */
3078887e60SJens Wiklander 	return CRYPT_OK;
3178887e60SJens Wiklander }
3278887e60SJens Wiklander 
331f3b1115SJens Wiklander static int prng_crypto_ready(union Prng_state *prng __unused)
3478887e60SJens Wiklander {
3578887e60SJens Wiklander 	return CRYPT_OK;
3678887e60SJens Wiklander }
3778887e60SJens Wiklander 
381f3b1115SJens Wiklander static unsigned long prng_crypto_read(unsigned char *out, unsigned long outlen,
3978887e60SJens Wiklander 				      union Prng_state *prng __unused)
4078887e60SJens Wiklander {
4178887e60SJens Wiklander 	if (crypto_rng_read(out, outlen))
4278887e60SJens Wiklander 		return 0;
4378887e60SJens Wiklander 
4478887e60SJens Wiklander 	return outlen;
4578887e60SJens Wiklander }
4678887e60SJens Wiklander 
471f3b1115SJens Wiklander static int prng_crypto_done(union Prng_state *prng __unused)
4878887e60SJens Wiklander {
4978887e60SJens Wiklander 	return CRYPT_OK;
5078887e60SJens Wiklander }
5178887e60SJens Wiklander 
521f3b1115SJens Wiklander static int prng_crypto_export(unsigned char *out __unused,
5378887e60SJens Wiklander 			      unsigned long *outlen __unused,
5478887e60SJens Wiklander 			      union Prng_state *prng __unused)
5578887e60SJens Wiklander {
5678887e60SJens Wiklander 	return CRYPT_OK;
5778887e60SJens Wiklander }
5878887e60SJens Wiklander 
591f3b1115SJens Wiklander static int prng_crypto_import(const unsigned char *in  __unused,
6078887e60SJens Wiklander 			      unsigned long inlen __unused,
6178887e60SJens Wiklander 			      union Prng_state *prng __unused)
6278887e60SJens Wiklander {
6378887e60SJens Wiklander 	return CRYPT_OK;
6478887e60SJens Wiklander }
6578887e60SJens Wiklander 
661f3b1115SJens Wiklander static int prng_crypto_test(void)
6778887e60SJens Wiklander {
6878887e60SJens Wiklander 	return CRYPT_OK;
6978887e60SJens Wiklander }
7078887e60SJens Wiklander 
711f3b1115SJens Wiklander static const struct ltc_prng_descriptor prng_crypto_desc = {
721f3b1115SJens Wiklander 	.name = "prng_crypto",
7378887e60SJens Wiklander 	.export_size = 64,
741f3b1115SJens Wiklander 	.start = &prng_crypto_start,
751f3b1115SJens Wiklander 	.add_entropy = &prng_crypto_add_entropy,
761f3b1115SJens Wiklander 	.ready = &prng_crypto_ready,
771f3b1115SJens Wiklander 	.read = &prng_crypto_read,
781f3b1115SJens Wiklander 	.done = &prng_crypto_done,
791f3b1115SJens Wiklander 	.pexport = &prng_crypto_export,
801f3b1115SJens Wiklander 	.pimport = &prng_crypto_import,
811f3b1115SJens Wiklander 	.test = &prng_crypto_test,
8278887e60SJens Wiklander };
83*c7e27e83SJens Wiklander #endif /*_CFG_CORE_LTC_ACIPHER*/
8478887e60SJens Wiklander 
8578887e60SJens Wiklander /*
8678887e60SJens Wiklander  * tee_ltc_reg_algs(): Registers
8778887e60SJens Wiklander  *	- algorithms
8878887e60SJens Wiklander  *	- hash
8978887e60SJens Wiklander  *	- prng (pseudo random generator)
9078887e60SJens Wiklander  */
9178887e60SJens Wiklander 
9278887e60SJens Wiklander static void tee_ltc_reg_algs(void)
9378887e60SJens Wiklander {
94a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_AES) || defined(_CFG_CORE_LTC_AES_DESC)
9578887e60SJens Wiklander 	register_cipher(&aes_desc);
9678887e60SJens Wiklander #endif
97a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_DES)
9878887e60SJens Wiklander 	register_cipher(&des_desc);
9978887e60SJens Wiklander 	register_cipher(&des3_desc);
10078887e60SJens Wiklander #endif
101a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_MD5)
10278887e60SJens Wiklander 	register_hash(&md5_desc);
10378887e60SJens Wiklander #endif
104a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_SHA1)
10578887e60SJens Wiklander 	register_hash(&sha1_desc);
10678887e60SJens Wiklander #endif
107a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_SHA224)
10878887e60SJens Wiklander 	register_hash(&sha224_desc);
10978887e60SJens Wiklander #endif
110a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_SHA256) || defined(_CFG_CORE_LTC_SHA256_DESC)
11178887e60SJens Wiklander 	register_hash(&sha256_desc);
11278887e60SJens Wiklander #endif
113a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_SHA384) || defined(_CFG_CORE_LTC_SHA384_DESC)
11478887e60SJens Wiklander 	register_hash(&sha384_desc);
11578887e60SJens Wiklander #endif
116a1cbb728SJens Wiklander #if defined(_CFG_CORE_LTC_SHA512) || defined(_CFG_CORE_LTC_SHA512_DESC)
11778887e60SJens Wiklander 	register_hash(&sha512_desc);
11878887e60SJens Wiklander #endif
119*c7e27e83SJens Wiklander #if defined(_CFG_CORE_LTC_ACIPHER)
1201f3b1115SJens Wiklander 	register_prng(&prng_crypto_desc);
121*c7e27e83SJens Wiklander #endif
12278887e60SJens Wiklander }
12378887e60SJens Wiklander 
12478887e60SJens Wiklander TEE_Result crypto_init(void)
12578887e60SJens Wiklander {
126*c7e27e83SJens Wiklander #if defined(_CFG_CORE_LTC_ACIPHER)
12778887e60SJens Wiklander 	init_mp_tomcrypt();
128*c7e27e83SJens Wiklander #endif
12978887e60SJens Wiklander 	tee_ltc_reg_algs();
13078887e60SJens Wiklander 
13178887e60SJens Wiklander 	return TEE_SUCCESS;
13278887e60SJens Wiklander }
13378887e60SJens Wiklander 
13478887e60SJens Wiklander #if defined(CFG_WITH_VFP)
13578887e60SJens Wiklander void tomcrypt_arm_neon_enable(struct tomcrypt_arm_neon_state *state)
13678887e60SJens Wiklander {
13778887e60SJens Wiklander 	state->state = thread_kernel_enable_vfp();
13878887e60SJens Wiklander }
13978887e60SJens Wiklander 
14078887e60SJens Wiklander void tomcrypt_arm_neon_disable(struct tomcrypt_arm_neon_state *state)
14178887e60SJens Wiklander {
14278887e60SJens Wiklander 	thread_kernel_disable_vfp(state->state);
14378887e60SJens Wiklander }
14478887e60SJens Wiklander #endif
145