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