| // 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 <stddef.h> |
| |
| #include <crypto/digest.h> |
| #include <lib/zircon-internal/debug.h> |
| #include <zircon/assert.h> |
| #include <zircon/types.h> |
| |
| // See note in //zircon/third_party/ulib/uboringssl/rules.mk |
| #define BORINGSSL_NO_CXX |
| #include <openssl/digest.h> |
| |
| #define ZXDEBUG 0 |
| |
| namespace crypto { |
| namespace digest { |
| |
| // Gets a pointer to the opaque crypto implementation of the digest algorithm. |
| 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|. |
| 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 |