blob: a294fb2d9f5bb3b0f4de81d8a1e321e861a35db4 [file] [log] [blame]
#include <common.h>
#include <watchdog.h>
#include <linux/string.h>
#include <sha256.h>
#include <tee.h>
#include <asm/arch/cpu.h>
void sha256_starts(sha256_context * ctx)
{
#ifdef CONFIG_ASR_TE200
if (cpu_is_asr1903_b0()) {
#ifdef CONFIG_TEE_OS
sha256_starts_optee(ctx);
if (ctx->tee_sha256 == TEE_SUCCESS)
return;
#else
return sha256_starts_te200(ctx);
#endif
}
#endif
#ifdef CONFIG_ASR_BCM
if (cpu_is_asr1901() || cpu_is_asr1906()) {
#ifdef CONFIG_TEE_OS
sha256_starts_optee(ctx);
if (ctx->tee_sha256 == TEE_SUCCESS)
return;
#else
return sha256_starts_bcm(ctx);
#endif
}
#endif
return sha256_starts_neon(ctx);
}
void sha256_update(sha256_context *ctx, const uint8_t *input, uint32_t length)
{
#ifdef CONFIG_ASR_TE200
if (cpu_is_asr1903_b0()) {
#ifdef CONFIG_TEE_OS
if (ctx->tee_sha256 == TEE_SUCCESS)
return sha256_update_optee(ctx, input, length);
#else
return sha256_update_te200(ctx, input, length);
#endif
}
#endif
#ifdef CONFIG_ASR_BCM
if (cpu_is_asr1901() || cpu_is_asr1906()) {
#ifdef CONFIG_TEE_OS
if (ctx->tee_sha256 == TEE_SUCCESS)
return sha256_update_optee(ctx, input, length);
#else
return sha256_update_bcm(ctx, input, length);
#endif
}
#endif
return sha256_update_neon(ctx, input, length);
}
void sha256_finish(sha256_context * ctx, uint8_t digest[32])
{
#ifdef CONFIG_ASR_TE200
if (cpu_is_asr1903_b0()) {
#ifdef CONFIG_TEE_OS
if (ctx->tee_sha256 == TEE_SUCCESS)
return sha256_finish_optee(ctx, digest);
#else
return sha256_finish_te200(ctx, digest);
#endif
}
#endif
#ifdef CONFIG_ASR_BCM
if (cpu_is_asr1901() || cpu_is_asr1906()) {
#ifdef CONFIG_TEE_OS
if (ctx->tee_sha256 == TEE_SUCCESS)
return sha256_finish_optee(ctx, digest);
#else
return sha256_finish_bcm(ctx, digest);
#endif
}
#endif
return sha256_finish_neon(ctx, digest);
}
void sha256_csum_wd(const unsigned char *input, unsigned int ilen,
unsigned char *output, unsigned int chunk_sz)
{
sha256_context ctx;
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
unsigned char *end, *curr;
int chunk;
#endif
sha256_starts(&ctx);
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
curr = input;
end = input + ilen;
while (curr < end) {
chunk = end - curr;
if (chunk > chunk_sz)
chunk = chunk_sz;
sha256_update(&ctx, curr, chunk);
curr += chunk;
WATCHDOG_RESET();
}
#else
sha256_update(&ctx, input, ilen);
#endif
sha256_finish(&ctx, output);
}