#include <isc/sha2.h>
#include <string.h>
#include <isc/util.h>
void
isc_sha224_init(isc_sha224_t *context) {
if (context == (isc_sha224_t *)0) {
return;
}
context->ctx = EVP_MD_CTX_new();
RUNTIME_CHECK(context->ctx != NULL);
if (EVP_DigestInit(context->ctx, EVP_sha224()) != 1) {
FATAL_ERROR(__FILE__, __LINE__, "Cannot initialize SHA224.");
}
}
void
isc_sha224_update(isc_sha224_t *context, const uint8_t* data, size_t len) {
if (len == 0U) {
return;
}
REQUIRE(context != (isc_sha224_t *)0);
REQUIRE(context->ctx != (EVP_MD_CTX *)0);
REQUIRE(data != (uint8_t*)0);
RUNTIME_CHECK(EVP_DigestUpdate(context->ctx,
(const void *) data, len) == 1);
}
void
isc_sha224_final(uint8_t digest[ISC_SHA224_DIGESTLENGTH], isc_sha224_t *context) {
REQUIRE(context != (isc_sha224_t *)0);
REQUIRE(context->ctx != (EVP_MD_CTX *)0);
if (digest != (uint8_t*)0)
RUNTIME_CHECK(EVP_DigestFinal(context->ctx,
digest, NULL) == 1);
EVP_MD_CTX_free(context->ctx);
context->ctx = NULL;
}
void
isc_sha256_init(isc_sha256_t *context) {
if (context == (isc_sha256_t *)0) {
return;
}
context->ctx = EVP_MD_CTX_new();
RUNTIME_CHECK(context->ctx != NULL);
if (EVP_DigestInit(context->ctx, EVP_sha256()) != 1) {
FATAL_ERROR(__FILE__, __LINE__, "Cannot initialize SHA256.");
}
}
void
isc_sha256_update(isc_sha256_t *context, const uint8_t *data, size_t len) {
if (len == 0U) {
return;
}
REQUIRE(context != (isc_sha256_t *)0);
REQUIRE(context->ctx != (EVP_MD_CTX *)0);
REQUIRE(data != (uint8_t*)0);
RUNTIME_CHECK(EVP_DigestUpdate(context->ctx,
(const void *) data, len) == 1);
}
void
isc_sha256_final(uint8_t digest[ISC_SHA256_DIGESTLENGTH], isc_sha256_t *context) {
REQUIRE(context != (isc_sha256_t *)0);
REQUIRE(context->ctx != (EVP_MD_CTX *)0);
if (digest != (uint8_t*)0)
RUNTIME_CHECK(EVP_DigestFinal(context->ctx,
digest, NULL) == 1);
EVP_MD_CTX_free(context->ctx);
context->ctx = NULL;
}
void
isc_sha512_init(isc_sha512_t *context) {
if (context == (isc_sha512_t *)0) {
return;
}
context->ctx = EVP_MD_CTX_new();
RUNTIME_CHECK(context->ctx != NULL);
if (EVP_DigestInit(context->ctx, EVP_sha512()) != 1) {
FATAL_ERROR(__FILE__, __LINE__, "Cannot initialize SHA512.");
}
}
void isc_sha512_update(isc_sha512_t *context, const uint8_t *data, size_t len) {
if (len == 0U) {
return;
}
REQUIRE(context != (isc_sha512_t *)0);
REQUIRE(context->ctx != (EVP_MD_CTX *)0);
REQUIRE(data != (uint8_t*)0);
RUNTIME_CHECK(EVP_DigestUpdate(context->ctx,
(const void *) data, len) == 1);
}
void isc_sha512_final(uint8_t digest[ISC_SHA512_DIGESTLENGTH], isc_sha512_t *context) {
REQUIRE(context != (isc_sha512_t *)0);
REQUIRE(context->ctx != (EVP_MD_CTX *)0);
if (digest != (uint8_t*)0)
RUNTIME_CHECK(EVP_DigestFinal(context->ctx,
digest, NULL) == 1);
EVP_MD_CTX_free(context->ctx);
context->ctx = NULL;
}
void
isc_sha384_init(isc_sha384_t *context) {
if (context == (isc_sha384_t *)0) {
return;
}
context->ctx = EVP_MD_CTX_new();
RUNTIME_CHECK(context->ctx != NULL);
if (EVP_DigestInit(context->ctx, EVP_sha384()) != 1) {
FATAL_ERROR(__FILE__, __LINE__, "Cannot initialize SHA384.");
}
}
void
isc_sha384_update(isc_sha384_t *context, const uint8_t* data, size_t len) {
if (len == 0U) {
return;
}
REQUIRE(context != (isc_sha512_t *)0);
REQUIRE(context->ctx != (EVP_MD_CTX *)0);
REQUIRE(data != (uint8_t*)0);
RUNTIME_CHECK(EVP_DigestUpdate(context->ctx,
(const void *) data, len) == 1);
}
void
isc_sha384_final(uint8_t digest[ISC_SHA384_DIGESTLENGTH], isc_sha384_t *context) {
REQUIRE(context != (isc_sha384_t *)0);
REQUIRE(context->ctx != (EVP_MD_CTX *)0);
if (digest != (uint8_t*)0)
RUNTIME_CHECK(EVP_DigestFinal(context->ctx,
digest, NULL) == 1);
EVP_MD_CTX_free(context->ctx);
context->ctx = NULL;
}