blob: 6d475335300905d24877d5a311eeb40db5a6ec11 [file] [log] [blame]
// 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