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