// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#include "hw_sha256.h"

#include "hmac.h"

static const HASH_VTAB HW_SHA256_VTAB = {.init = &hw_SHA256_init,
                                         .update = &hw_SHA256_update,
                                         .final = &hw_SHA256_final,
                                         .hash = &hw_SHA256_hash,
                                         .size = SHA256_DIGEST_SIZE};

static void sha256_init() {
  hmac_cfg_t config = {.mode = HMAC_OP_SHA256,
                       .input_endian_swap = 1,
                       .digest_endian_swap = 1,
                       .keys = {0}};
  hmac_init(config);
}

void hw_SHA256_init(HW_SHA256_CTX *ctx) {
  // TODO: For security, need to make sure HMAC is not stuck in progress.
  ctx->f = &HW_SHA256_VTAB;
  sha256_init();
}

void hw_SHA256_update(HW_SHA256_CTX *ctx, const void *data, size_t len) {
  hmac_update(data, len);
}

const uint8_t *hw_SHA256_final(HW_SHA256_CTX *ctx) {
  hmac_done((uint32_t *)ctx->buf);
  return ctx->buf;
}

const uint8_t *hw_SHA256_hash(const void *data, size_t len, uint8_t *digest) {
  sha256_init();
  hmac_update(data, len);
  hmac_done((uint32_t *)digest);
  return digest;
}
