blob: 80c95e636d5b89524f150b63a83895c9636a9a22 [file] [log] [blame]
// Copyright 2023 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
#include "openssl/evp.h"
const char* //
mimic_bench_sha256(wuffs_base__io_buffer* dst,
wuffs_base__io_buffer* src,
uint32_t wuffs_initialize_flags,
uint64_t wlimit,
uint64_t rlimit) {
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
if (!ctx) {
return "EVP_MD_CTX_new failed";
} else if (!EVP_DigestInit_ex(ctx, EVP_sha256(), NULL)) {
return "EVP_DigestInit_ex failed";
}
while (src->meta.ri < src->meta.wi) {
uint8_t* ptr = src->data.ptr + src->meta.ri;
size_t len = src->meta.wi - src->meta.ri;
if (len > 0x7FFFFFFF) {
return "src length is too large";
} else if (len > rlimit) {
len = rlimit;
}
if (!EVP_DigestUpdate(ctx, ptr, len)) {
return "EVP_DigestUpdate failed";
}
src->meta.ri += len;
}
uint8_t results[EVP_MAX_MD_SIZE] = {0};
if (!EVP_DigestFinal_ex(ctx, results, NULL)) {
return "EVP_DigestFinal_ex failed";
}
return NULL;
}
wuffs_base__bitvec256 //
mimic_sha256_one_shot_checksum_bitvec256(wuffs_base__slice_u8 data) {
uint8_t results[EVP_MAX_MD_SIZE] = {0};
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
if (ctx) {
if (EVP_DigestInit_ex(ctx, EVP_sha256(), NULL) && //
EVP_DigestUpdate(ctx, data.ptr, data.len) && //
EVP_DigestFinal_ex(ctx, results, NULL)) {
// No-op.
}
EVP_MD_CTX_free(ctx);
}
return wuffs_base__make_bitvec256(
wuffs_base__peek_u64be__no_bounds_check(results + 0x18),
wuffs_base__peek_u64be__no_bounds_check(results + 0x10),
wuffs_base__peek_u64be__no_bounds_check(results + 0x08),
wuffs_base__peek_u64be__no_bounds_check(results + 0x00));
}