xref: /optee_os/core/lib/libtomcrypt/tomcrypt.c (revision 1f3b11151257f0984bf32070f56b542e58b788a0)
178887e60SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause
278887e60SJens Wiklander /*
378887e60SJens Wiklander  * Copyright (c) 2014, Linaro Limited
478887e60SJens Wiklander  */
578887e60SJens Wiklander 
678887e60SJens Wiklander #include <assert.h>
778887e60SJens Wiklander #include <crypto/crypto.h>
878887e60SJens Wiklander #include <kernel/panic.h>
978887e60SJens Wiklander #include <stdlib.h>
1078887e60SJens Wiklander #include <string_ext.h>
1178887e60SJens Wiklander #include <string.h>
1278887e60SJens Wiklander #include <tee_api_types.h>
1378887e60SJens Wiklander #include <tee_api_defines_extensions.h>
1478887e60SJens Wiklander #include <tee/tee_cryp_utl.h>
1578887e60SJens Wiklander #include <tomcrypt.h>
1678887e60SJens Wiklander #include "tomcrypt_mp.h"
1778887e60SJens Wiklander #include <trace.h>
1878887e60SJens Wiklander #include <utee_defines.h>
1978887e60SJens Wiklander #include <util.h>
2078887e60SJens Wiklander 
2178887e60SJens Wiklander #if defined(CFG_WITH_VFP)
2278887e60SJens Wiklander #include <tomcrypt_arm_neon.h>
2378887e60SJens Wiklander #include <kernel/thread.h>
2478887e60SJens Wiklander #endif
2578887e60SJens Wiklander 
2678887e60SJens Wiklander /* Random generator */
27*1f3b1115SJens Wiklander static int prng_crypto_start(union Prng_state *prng __unused)
2878887e60SJens Wiklander {
2978887e60SJens Wiklander 	return CRYPT_OK;
3078887e60SJens Wiklander }
3178887e60SJens Wiklander 
32*1f3b1115SJens Wiklander static int prng_crypto_add_entropy(const unsigned char *in __unused,
3378887e60SJens Wiklander 				   unsigned long inlen __unused,
3478887e60SJens Wiklander 				   union Prng_state *prng __unused)
3578887e60SJens Wiklander {
3678887e60SJens Wiklander 	/* No entropy is required */
3778887e60SJens Wiklander 	return CRYPT_OK;
3878887e60SJens Wiklander }
3978887e60SJens Wiklander 
40*1f3b1115SJens Wiklander static int prng_crypto_ready(union Prng_state *prng __unused)
4178887e60SJens Wiklander {
4278887e60SJens Wiklander 	return CRYPT_OK;
4378887e60SJens Wiklander }
4478887e60SJens Wiklander 
45*1f3b1115SJens Wiklander static unsigned long prng_crypto_read(unsigned char *out, unsigned long outlen,
4678887e60SJens Wiklander 				      union Prng_state *prng __unused)
4778887e60SJens Wiklander {
4878887e60SJens Wiklander 	if (crypto_rng_read(out, outlen))
4978887e60SJens Wiklander 		return 0;
5078887e60SJens Wiklander 
5178887e60SJens Wiklander 	return outlen;
5278887e60SJens Wiklander }
5378887e60SJens Wiklander 
54*1f3b1115SJens Wiklander static int prng_crypto_done(union Prng_state *prng __unused)
5578887e60SJens Wiklander {
5678887e60SJens Wiklander 	return CRYPT_OK;
5778887e60SJens Wiklander }
5878887e60SJens Wiklander 
59*1f3b1115SJens Wiklander static int prng_crypto_export(unsigned char *out __unused,
6078887e60SJens Wiklander 			      unsigned long *outlen __unused,
6178887e60SJens Wiklander 			      union Prng_state *prng __unused)
6278887e60SJens Wiklander {
6378887e60SJens Wiklander 	return CRYPT_OK;
6478887e60SJens Wiklander }
6578887e60SJens Wiklander 
66*1f3b1115SJens Wiklander static int prng_crypto_import(const unsigned char *in  __unused,
6778887e60SJens Wiklander 			      unsigned long inlen __unused,
6878887e60SJens Wiklander 			      union Prng_state *prng __unused)
6978887e60SJens Wiklander {
7078887e60SJens Wiklander 	return CRYPT_OK;
7178887e60SJens Wiklander }
7278887e60SJens Wiklander 
73*1f3b1115SJens Wiklander static int prng_crypto_test(void)
7478887e60SJens Wiklander {
7578887e60SJens Wiklander 	return CRYPT_OK;
7678887e60SJens Wiklander }
7778887e60SJens Wiklander 
78*1f3b1115SJens Wiklander static const struct ltc_prng_descriptor prng_crypto_desc = {
79*1f3b1115SJens Wiklander 	.name = "prng_crypto",
8078887e60SJens Wiklander 	.export_size = 64,
81*1f3b1115SJens Wiklander 	.start = &prng_crypto_start,
82*1f3b1115SJens Wiklander 	.add_entropy = &prng_crypto_add_entropy,
83*1f3b1115SJens Wiklander 	.ready = &prng_crypto_ready,
84*1f3b1115SJens Wiklander 	.read = &prng_crypto_read,
85*1f3b1115SJens Wiklander 	.done = &prng_crypto_done,
86*1f3b1115SJens Wiklander 	.pexport = &prng_crypto_export,
87*1f3b1115SJens Wiklander 	.pimport = &prng_crypto_import,
88*1f3b1115SJens Wiklander 	.test = &prng_crypto_test,
8978887e60SJens Wiklander };
9078887e60SJens Wiklander 
9178887e60SJens Wiklander /*
9278887e60SJens Wiklander  * tee_ltc_reg_algs(): Registers
9378887e60SJens Wiklander  *	- algorithms
9478887e60SJens Wiklander  *	- hash
9578887e60SJens Wiklander  *	- prng (pseudo random generator)
9678887e60SJens Wiklander  */
9778887e60SJens Wiklander 
9878887e60SJens Wiklander static void tee_ltc_reg_algs(void)
9978887e60SJens Wiklander {
10078887e60SJens Wiklander #if defined(CFG_CRYPTO_AES)
10178887e60SJens Wiklander 	register_cipher(&aes_desc);
10278887e60SJens Wiklander #endif
10378887e60SJens Wiklander #if defined(CFG_CRYPTO_DES)
10478887e60SJens Wiklander 	register_cipher(&des_desc);
10578887e60SJens Wiklander 	register_cipher(&des3_desc);
10678887e60SJens Wiklander #endif
10778887e60SJens Wiklander #if defined(CFG_CRYPTO_MD5)
10878887e60SJens Wiklander 	register_hash(&md5_desc);
10978887e60SJens Wiklander #endif
11078887e60SJens Wiklander #if defined(CFG_CRYPTO_SHA1)
11178887e60SJens Wiklander 	register_hash(&sha1_desc);
11278887e60SJens Wiklander #endif
11378887e60SJens Wiklander #if defined(CFG_CRYPTO_SHA224)
11478887e60SJens Wiklander 	register_hash(&sha224_desc);
11578887e60SJens Wiklander #endif
11678887e60SJens Wiklander #if defined(CFG_CRYPTO_SHA256)
11778887e60SJens Wiklander 	register_hash(&sha256_desc);
11878887e60SJens Wiklander #endif
11978887e60SJens Wiklander #if defined(CFG_CRYPTO_SHA384)
12078887e60SJens Wiklander 	register_hash(&sha384_desc);
12178887e60SJens Wiklander #endif
12278887e60SJens Wiklander #if defined(CFG_CRYPTO_SHA512)
12378887e60SJens Wiklander 	register_hash(&sha512_desc);
12478887e60SJens Wiklander #endif
125*1f3b1115SJens Wiklander 	register_prng(&prng_crypto_desc);
12678887e60SJens Wiklander }
12778887e60SJens Wiklander 
12878887e60SJens Wiklander TEE_Result crypto_init(void)
12978887e60SJens Wiklander {
13078887e60SJens Wiklander 	init_mp_tomcrypt();
13178887e60SJens Wiklander 	tee_ltc_reg_algs();
13278887e60SJens Wiklander 
13378887e60SJens Wiklander 	return TEE_SUCCESS;
13478887e60SJens Wiklander }
13578887e60SJens Wiklander 
13678887e60SJens Wiklander #if defined(CFG_WITH_VFP)
13778887e60SJens Wiklander void tomcrypt_arm_neon_enable(struct tomcrypt_arm_neon_state *state)
13878887e60SJens Wiklander {
13978887e60SJens Wiklander 	state->state = thread_kernel_enable_vfp();
14078887e60SJens Wiklander }
14178887e60SJens Wiklander 
14278887e60SJens Wiklander void tomcrypt_arm_neon_disable(struct tomcrypt_arm_neon_state *state)
14378887e60SJens Wiklander {
14478887e60SJens Wiklander 	thread_kernel_disable_vfp(state->state);
14578887e60SJens Wiklander }
14678887e60SJens Wiklander #endif
147