// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <lib/zircon-internal/debug.h>
#include <stddef.h>
#include <zircon/assert.h>
#include <zircon/types.h>

// See note in //zircon/third_party/ulib/boringssl/BUILD.gn
#define BORINGSSL_NO_CXX
#include <openssl/digest.h>

#include "src/security/fcrypto/digest.h"

#define ZXDEBUG 0

namespace crypto {
namespace digest {

// Gets a pointer to the opaque crypto implementation of the digest algorithm.
__EXPORT
zx_status_t GetDigest(Algorithm digest, uintptr_t* out) {
  ZX_DEBUG_ASSERT(out);
  const EVP_MD* md;
  switch (digest) {
    case digest::kUninitialized:
      xprintf("not initialized\n");
      return ZX_ERR_INVALID_ARGS;

    case digest::kSHA256:
      md = EVP_sha256();
      break;

    default:
      xprintf("invalid digest = %u\n", digest);
      return ZX_ERR_NOT_SUPPORTED;
  }
  *out = reinterpret_cast<uintptr_t>(md);

  return ZX_OK;
}

// Gets the minimum number of bytes needed for the digest produced by the given |version|.
__EXPORT
zx_status_t GetDigestLen(Algorithm digest, size_t* out) {
  zx_status_t rc;

  ZX_DEBUG_ASSERT(out);
  uintptr_t ptr;
  if ((rc = GetDigest(digest, &ptr)) != ZX_OK) {
    return rc;
  }
  *out = EVP_MD_size(reinterpret_cast<const EVP_MD*>(ptr));

  return ZX_OK;
}

}  // namespace digest
}  // namespace crypto
