// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include "internal/defs.h"

typedef enum sha_impl_e
{
  GENERIC_IMPL,

#if defined(X86_64)
  AVX_IMPL,
  OPENSSL_AVX_IMPL,
#endif

#if defined(AVX2_SUPPORT)
  AVX2_IMPL,
  OPENSSL_AVX2_IMPL,
#endif

#if defined(AVX512_SUPPORT)
  AVX512_IMPL,
#endif

#if defined(X86_64_SHA_SUPPORT)
  SHA_EXT_IMPL,
  OPENSSL_SHA_EXT_IMPL,
#endif

#if defined(NEON_SUPPORT)
  NEON_IMPL,
  OPENSSL_NEON_IMPL,
#endif

#if defined(AARCH64_SHA_SUPPORT)
  SHA_EXT_IMPL,
  OPENSSL_SHA_EXT_IMPL,
#endif

} sha_impl_t;

#define SHA256_HASH_BYTE_LEN 32
#define SHA512_HASH_BYTE_LEN 64

void sha256(OUT uint8_t *dgst,
            IN const uint8_t *data,
            IN size_t         byte_len,
            IN sha_impl_t     impl);

void sha512(OUT uint8_t *dgst,
            IN const uint8_t *data,
            IN size_t         byte_len,
            IN sha_impl_t     impl);