xref: /optee_os/core/lib/libtomcrypt/tomcrypt.c (revision 5edbd86a96a09538b07ec1f6c5db4277e1c82e96)
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>
8*5edbd86aSJens Wiklander #include <tee_api_defines.h>
978887e60SJens Wiklander #include <tomcrypt.h>
1078887e60SJens Wiklander #include "tomcrypt_mp.h"
1178887e60SJens Wiklander #include <trace.h>
1278887e60SJens Wiklander 
1378887e60SJens Wiklander #if defined(CFG_WITH_VFP)
1478887e60SJens Wiklander #include <tomcrypt_arm_neon.h>
1578887e60SJens Wiklander #include <kernel/thread.h>
1678887e60SJens Wiklander #endif
1778887e60SJens Wiklander 
1878887e60SJens Wiklander /* Random generator */
191f3b1115SJens Wiklander static int prng_crypto_start(union Prng_state *prng __unused)
2078887e60SJens Wiklander {
2178887e60SJens Wiklander 	return CRYPT_OK;
2278887e60SJens Wiklander }
2378887e60SJens Wiklander 
241f3b1115SJens Wiklander static int prng_crypto_add_entropy(const unsigned char *in __unused,
2578887e60SJens Wiklander 				   unsigned long inlen __unused,
2678887e60SJens Wiklander 				   union Prng_state *prng __unused)
2778887e60SJens Wiklander {
2878887e60SJens Wiklander 	/* No entropy is required */
2978887e60SJens Wiklander 	return CRYPT_OK;
3078887e60SJens Wiklander }
3178887e60SJens Wiklander 
321f3b1115SJens Wiklander static int prng_crypto_ready(union Prng_state *prng __unused)
3378887e60SJens Wiklander {
3478887e60SJens Wiklander 	return CRYPT_OK;
3578887e60SJens Wiklander }
3678887e60SJens Wiklander 
371f3b1115SJens Wiklander static unsigned long prng_crypto_read(unsigned char *out, unsigned long outlen,
3878887e60SJens Wiklander 				      union Prng_state *prng __unused)
3978887e60SJens Wiklander {
4078887e60SJens Wiklander 	if (crypto_rng_read(out, outlen))
4178887e60SJens Wiklander 		return 0;
4278887e60SJens Wiklander 
4378887e60SJens Wiklander 	return outlen;
4478887e60SJens Wiklander }
4578887e60SJens Wiklander 
461f3b1115SJens Wiklander static int prng_crypto_done(union Prng_state *prng __unused)
4778887e60SJens Wiklander {
4878887e60SJens Wiklander 	return CRYPT_OK;
4978887e60SJens Wiklander }
5078887e60SJens Wiklander 
511f3b1115SJens Wiklander static int prng_crypto_export(unsigned char *out __unused,
5278887e60SJens Wiklander 			      unsigned long *outlen __unused,
5378887e60SJens Wiklander 			      union Prng_state *prng __unused)
5478887e60SJens Wiklander {
5578887e60SJens Wiklander 	return CRYPT_OK;
5678887e60SJens Wiklander }
5778887e60SJens Wiklander 
581f3b1115SJens Wiklander static int prng_crypto_import(const unsigned char *in  __unused,
5978887e60SJens Wiklander 			      unsigned long inlen __unused,
6078887e60SJens Wiklander 			      union Prng_state *prng __unused)
6178887e60SJens Wiklander {
6278887e60SJens Wiklander 	return CRYPT_OK;
6378887e60SJens Wiklander }
6478887e60SJens Wiklander 
651f3b1115SJens Wiklander static int prng_crypto_test(void)
6678887e60SJens Wiklander {
6778887e60SJens Wiklander 	return CRYPT_OK;
6878887e60SJens Wiklander }
6978887e60SJens Wiklander 
701f3b1115SJens Wiklander static const struct ltc_prng_descriptor prng_crypto_desc = {
711f3b1115SJens Wiklander 	.name = "prng_crypto",
7278887e60SJens Wiklander 	.export_size = 64,
731f3b1115SJens Wiklander 	.start = &prng_crypto_start,
741f3b1115SJens Wiklander 	.add_entropy = &prng_crypto_add_entropy,
751f3b1115SJens Wiklander 	.ready = &prng_crypto_ready,
761f3b1115SJens Wiklander 	.read = &prng_crypto_read,
771f3b1115SJens Wiklander 	.done = &prng_crypto_done,
781f3b1115SJens Wiklander 	.pexport = &prng_crypto_export,
791f3b1115SJens Wiklander 	.pimport = &prng_crypto_import,
801f3b1115SJens Wiklander 	.test = &prng_crypto_test,
8178887e60SJens Wiklander };
8278887e60SJens Wiklander 
8378887e60SJens Wiklander /*
8478887e60SJens Wiklander  * tee_ltc_reg_algs(): Registers
8578887e60SJens Wiklander  *	- algorithms
8678887e60SJens Wiklander  *	- hash
8778887e60SJens Wiklander  *	- prng (pseudo random generator)
8878887e60SJens Wiklander  */
8978887e60SJens Wiklander 
9078887e60SJens Wiklander static void tee_ltc_reg_algs(void)
9178887e60SJens Wiklander {
9278887e60SJens Wiklander #if defined(CFG_CRYPTO_AES)
9378887e60SJens Wiklander 	register_cipher(&aes_desc);
9478887e60SJens Wiklander #endif
9578887e60SJens Wiklander #if defined(CFG_CRYPTO_DES)
9678887e60SJens Wiklander 	register_cipher(&des_desc);
9778887e60SJens Wiklander 	register_cipher(&des3_desc);
9878887e60SJens Wiklander #endif
9978887e60SJens Wiklander #if defined(CFG_CRYPTO_MD5)
10078887e60SJens Wiklander 	register_hash(&md5_desc);
10178887e60SJens Wiklander #endif
10278887e60SJens Wiklander #if defined(CFG_CRYPTO_SHA1)
10378887e60SJens Wiklander 	register_hash(&sha1_desc);
10478887e60SJens Wiklander #endif
10578887e60SJens Wiklander #if defined(CFG_CRYPTO_SHA224)
10678887e60SJens Wiklander 	register_hash(&sha224_desc);
10778887e60SJens Wiklander #endif
10878887e60SJens Wiklander #if defined(CFG_CRYPTO_SHA256)
10978887e60SJens Wiklander 	register_hash(&sha256_desc);
11078887e60SJens Wiklander #endif
11178887e60SJens Wiklander #if defined(CFG_CRYPTO_SHA384)
11278887e60SJens Wiklander 	register_hash(&sha384_desc);
11378887e60SJens Wiklander #endif
11478887e60SJens Wiklander #if defined(CFG_CRYPTO_SHA512)
11578887e60SJens Wiklander 	register_hash(&sha512_desc);
11678887e60SJens Wiklander #endif
1171f3b1115SJens Wiklander 	register_prng(&prng_crypto_desc);
11878887e60SJens Wiklander }
11978887e60SJens Wiklander 
12078887e60SJens Wiklander TEE_Result crypto_init(void)
12178887e60SJens Wiklander {
12278887e60SJens Wiklander 	init_mp_tomcrypt();
12378887e60SJens Wiklander 	tee_ltc_reg_algs();
12478887e60SJens Wiklander 
12578887e60SJens Wiklander 	return TEE_SUCCESS;
12678887e60SJens Wiklander }
12778887e60SJens Wiklander 
12878887e60SJens Wiklander #if defined(CFG_WITH_VFP)
12978887e60SJens Wiklander void tomcrypt_arm_neon_enable(struct tomcrypt_arm_neon_state *state)
13078887e60SJens Wiklander {
13178887e60SJens Wiklander 	state->state = thread_kernel_enable_vfp();
13278887e60SJens Wiklander }
13378887e60SJens Wiklander 
13478887e60SJens Wiklander void tomcrypt_arm_neon_disable(struct tomcrypt_arm_neon_state *state)
13578887e60SJens Wiklander {
13678887e60SJens Wiklander 	thread_kernel_disable_vfp(state->state);
13778887e60SJens Wiklander }
13878887e60SJens Wiklander #endif
139