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