| // SPDX-License-Identifier: BSD-2-Clause |
| /* |
| * Copyright (c) 2014, Linaro Limited |
| */ |
| |
| #include <crypto/crypto.h> |
| #include <tee_api_types.h> |
| #include <tee_api_defines.h> |
| #include <tomcrypt_private.h> |
| #include <tomcrypt_init.h> |
| #include "tomcrypt_mp.h" |
| #include <trace.h> |
| |
| #if defined(_CFG_CORE_LTC_VFP) |
| #include <tomcrypt_arm_neon.h> |
| #include <kernel/thread.h> |
| #endif |
| |
| #if defined(_CFG_CORE_LTC_ACIPHER) |
| /* Random generator */ |
| static int prng_crypto_start(prng_state *prng __unused) |
| { |
| return CRYPT_OK; |
| } |
| |
| static int prng_crypto_add_entropy(const unsigned char *in __unused, |
| unsigned long inlen __unused, |
| prng_state *prng __unused) |
| { |
| /* No entropy is required */ |
| return CRYPT_OK; |
| } |
| |
| static int prng_crypto_ready(prng_state *prng __unused) |
| { |
| return CRYPT_OK; |
| } |
| |
| static unsigned long prng_crypto_read(unsigned char *out, unsigned long outlen, |
| prng_state *prng __unused) |
| { |
| if (crypto_rng_read(out, outlen)) |
| return 0; |
| |
| return outlen; |
| } |
| |
| static int prng_crypto_done(prng_state *prng __unused) |
| { |
| return CRYPT_OK; |
| } |
| |
| static int prng_crypto_export(unsigned char *out __unused, |
| unsigned long *outlen __unused, |
| prng_state *prng __unused) |
| { |
| return CRYPT_OK; |
| } |
| |
| static int prng_crypto_import(const unsigned char *in __unused, |
| unsigned long inlen __unused, |
| prng_state *prng __unused) |
| { |
| return CRYPT_OK; |
| } |
| |
| static int prng_crypto_test(void) |
| { |
| return CRYPT_OK; |
| } |
| |
| static const struct ltc_prng_descriptor prng_crypto_desc = { |
| .name = "prng_crypto", |
| .export_size = 64, |
| .start = &prng_crypto_start, |
| .add_entropy = &prng_crypto_add_entropy, |
| .ready = &prng_crypto_ready, |
| .read = &prng_crypto_read, |
| .done = &prng_crypto_done, |
| .pexport = &prng_crypto_export, |
| .pimport = &prng_crypto_import, |
| .test = &prng_crypto_test, |
| }; |
| #endif /*_CFG_CORE_LTC_ACIPHER*/ |
| |
| /* |
| * tee_ltc_reg_algs(): Registers |
| * - algorithms |
| * - hash |
| * - prng (pseudo random generator) |
| */ |
| |
| static void tee_ltc_reg_algs(void) |
| { |
| #if defined(_CFG_CORE_LTC_AES) || defined(_CFG_CORE_LTC_AES_DESC) |
| register_cipher(&aes_desc); |
| #endif |
| #if defined(_CFG_CORE_LTC_DES) |
| register_cipher(&des_desc); |
| register_cipher(&des3_desc); |
| #endif |
| #if defined(_CFG_CORE_LTC_MD5) |
| register_hash(&md5_desc); |
| #endif |
| #if defined(_CFG_CORE_LTC_SHA1) |
| register_hash(&sha1_desc); |
| #endif |
| #if defined(_CFG_CORE_LTC_SHA224) |
| register_hash(&sha224_desc); |
| #endif |
| #if defined(_CFG_CORE_LTC_SHA256) || defined(_CFG_CORE_LTC_SHA256_DESC) |
| register_hash(&sha256_desc); |
| #endif |
| #if defined(_CFG_CORE_LTC_SHA384) || defined(_CFG_CORE_LTC_SHA384_DESC) |
| register_hash(&sha384_desc); |
| #endif |
| #if defined(_CFG_CORE_LTC_SHA512) || defined(_CFG_CORE_LTC_SHA512_DESC) |
| register_hash(&sha512_desc); |
| #endif |
| #if defined(_CFG_CORE_LTC_ACIPHER) |
| register_prng(&prng_crypto_desc); |
| #endif |
| } |
| |
| static void ltc_init(void) |
| { |
| #if defined(_CFG_CORE_LTC_ACIPHER) |
| init_mp_tomcrypt(); |
| #endif |
| tee_ltc_reg_algs(); |
| } |
| |
| #if defined(CFG_CRYPTOLIB_NAME_tomcrypt) |
| TEE_Result crypto_init(void) |
| { |
| ltc_init(); |
| |
| return TEE_SUCCESS; |
| } |
| #else |
| void tomcrypt_init(void) |
| { |
| ltc_init(); |
| } |
| #endif |
| |
| #if defined(CFG_WITH_VFP) |
| void tomcrypt_arm_neon_enable(struct tomcrypt_arm_neon_state *state) |
| { |
| state->state = thread_kernel_enable_vfp(); |
| } |
| |
| void tomcrypt_arm_neon_disable(struct tomcrypt_arm_neon_state *state) |
| { |
| thread_kernel_disable_vfp(state->state); |
| } |
| #endif |