blob: deed9f5f1fba593c0adf4556004657efae1e13c6 [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
// ----------------
/*
This test program is typically run indirectly, by the "wuffs test" or "wuffs
bench" commands. These commands take an optional "-mimic" flag to check that
Wuffs' output mimics (i.e. exactly matches) other libraries' output, such as
giflib for GIF, libpng for PNG, etc.
To manually run this test:
for CC in clang gcc; do
$CC -std=c99 -Wall -Werror sha256.c && ./a.out
rm -f a.out
done
Each edition should print "PASS", amongst other information, and exit(0).
Add the "wuffs mimic cflags" (everything after the colon below) to the C
compiler flags (after the .c file) to run the mimic tests.
To manually run the benchmarks, replace "-Wall -Werror" with "-O3" and replace
the first "./a.out" with "./a.out -bench". Combine these changes with the
"wuffs mimic cflags" to run the mimic benchmarks.
*/
// ¿ wuffs mimic cflags: -DWUFFS_MIMIC -lcrypto -lssl
// Wuffs ships as a "single file C library" or "header file library" as per
// https://github.com/nothings/stb/blob/master/docs/stb_howto.txt
//
// To use that single file as a "foo.c"-like implementation, instead of a
// "foo.h"-like header, #define WUFFS_IMPLEMENTATION before #include'ing or
// compiling it.
#define WUFFS_IMPLEMENTATION
// Defining the WUFFS_CONFIG__MODULE* macros are optional, but it lets users of
// release/c/etc.c choose which parts of Wuffs to build. That file contains the
// entire Wuffs standard library, implementing a variety of codecs and file
// formats. Without this macro definition, an optimizing compiler or linker may
// very well discard Wuffs code for unused codecs, but listing the Wuffs
// modules we use makes that process explicit. Preprocessing means that such
// code simply isn't compiled.
#define WUFFS_CONFIG__MODULES
#define WUFFS_CONFIG__MODULE__BASE
#define WUFFS_CONFIG__MODULE__SHA256
// If building this program in an environment that doesn't easily accommodate
// relative includes, you can use the script/inline-c-relative-includes.go
// program to generate a stand-alone C file.
#include "../../../release/c/wuffs-unsupported-snapshot.c"
#include "../testlib/testlib.c"
#ifdef WUFFS_MIMIC
#include "../mimiclib/openssl.c"
#endif
// ---------------- Golden Tests
golden_test g_sha256_midsummer_gt = {
.src_filename = "test/data/midsummer.txt",
};
golden_test g_sha256_pi_gt = {
.src_filename = "test/data/pi.txt",
};
// ---------------- SHA256 Tests
const char* //
test_wuffs_sha256_interface() {
CHECK_FOCUS(__func__);
wuffs_sha256__hasher h;
CHECK_STATUS("initialize",
wuffs_sha256__hasher__initialize(
&h, sizeof h, WUFFS_VERSION,
WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
return do_test__wuffs_base__hasher_bitvec256(
wuffs_sha256__hasher__upcast_as__wuffs_base__hasher_bitvec256(&h),
"test/data/hat.lossy.webp", 0, SIZE_MAX,
wuffs_base__make_bitvec256(0x5CC50E1942D6F258, 0x6AB8300CEABA7095,
0x204081787511F1A3, 0xC3E4E8E405B501CB));
}
const char* //
test_wuffs_sha256_golden() {
CHECK_FOCUS(__func__);
struct {
const char* filename;
// The want values are determined by script/checksum.go.
wuffs_base__bitvec256 want;
} test_cases[] = {
{
.filename = "test/data/hat.bmp",
.want = wuffs_base__make_bitvec256(
0x2FC725BA7661C777, 0x5D80DB0568DB9741, 0x14CE2B683B211925,
0x0EE3A9C0B94EBD3E),
},
{
.filename = "test/data/hat.gif",
.want = wuffs_base__make_bitvec256(
0x64E368566B47BA08, 0xF37522D2D09BF24A, 0x483A2E527CC031B0,
0xDA46A35274A6B3DB),
},
{
.filename = "test/data/hat.jpeg",
.want = wuffs_base__make_bitvec256(
0x2C6B9551F7574AB3, 0x7486DECA160CA57C, 0x50F1B82175229C03,
0x6085C5A688495233),
},
{
.filename = "test/data/hat.lossless.webp",
.want = wuffs_base__make_bitvec256(
0x7AC2F1DC78F9AC80, 0xCC1142375132C3C2, 0x311B3C16A251A65E,
0xD91429191B532107),
},
{
.filename = "test/data/hat.lossy.webp",
.want = wuffs_base__make_bitvec256(
0x5CC50E1942D6F258, 0x6AB8300CEABA7095, 0x204081787511F1A3,
0xC3E4E8E405B501CB),
},
{
.filename = "test/data/hat.png",
.want = wuffs_base__make_bitvec256(
0x23958198999B6D59, 0x2DF493278110663A, 0x7A1BDBCAE77A1D75,
0xD3F360AF629B5780),
},
{
.filename = "test/data/hat.tiff",
.want = wuffs_base__make_bitvec256(
0xFAC8637F04EC2392, 0x373D5F707D803B99, 0x852E5F5F54D5BBD0,
0xF44307C419C5F9BB),
},
};
for (size_t tc = 0; tc < WUFFS_TESTLIB_ARRAY_SIZE(test_cases); tc++) {
wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
.data = g_src_slice_u8,
});
CHECK_STRING(read_file(&src, test_cases[tc].filename));
for (int j = 0; j < 2; j++) {
wuffs_sha256__hasher checksum;
CHECK_STATUS("initialize",
wuffs_sha256__hasher__initialize(
&checksum, sizeof checksum, WUFFS_VERSION,
WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
wuffs_base__bitvec256 have = wuffs_base__make_bitvec256(0u, 0u, 0u, 0u);
size_t num_fragments = 0;
size_t num_bytes = 0;
do {
wuffs_base__slice_u8 data = ((wuffs_base__slice_u8){
.ptr = src.data.ptr + num_bytes,
.len = src.meta.wi - num_bytes,
});
size_t limit = 101 + 103 * num_fragments;
if ((j > 0) && (data.len > limit)) {
data.len = limit;
}
have = wuffs_sha256__hasher__update_bitvec256(&checksum, data);
num_fragments++;
num_bytes += data.len;
} while (num_bytes < src.meta.wi);
if ((have.elements_u64[0] != test_cases[tc].want.elements_u64[0]) ||
(have.elements_u64[1] != test_cases[tc].want.elements_u64[1]) ||
(have.elements_u64[2] != test_cases[tc].want.elements_u64[2]) ||
(have.elements_u64[3] != test_cases[tc].want.elements_u64[3])) {
RETURN_FAIL(
"tc=%zu, j=%d, filename=\"%s\": " //
"have 0x%016" PRIX64 "_%016" PRIX64 //
"_%016" PRIX64 "_%016" PRIX64 //
", want 0x%016" PRIX64 "_%016" PRIX64 //
"_%016" PRIX64 "_%016" PRIX64, //
tc, j, test_cases[tc].filename, //
have.elements_u64[3], have.elements_u64[2], //
have.elements_u64[1], have.elements_u64[0], //
test_cases[tc].want.elements_u64[3], //
test_cases[tc].want.elements_u64[2], //
test_cases[tc].want.elements_u64[1], //
test_cases[tc].want.elements_u64[0]);
}
}
}
return NULL;
}
const char* //
do_test_xxxxx_sha256_pi(bool mimic) {
const char* digits =
"3."
"141592653589793238462643383279502884197169399375105820974944592307816406"
"2862089986280348253421170";
if (strlen(digits) != 99) {
RETURN_FAIL("strlen(digits): have %d, want 99", (int)(strlen(digits)));
}
// The want values are determined by script/checksum.go.
//
// wants[(4*i) .. ((4*i)+4)] is the checksum of the first i bytes of the
// digits string.
uint64_t wants[400] = {
0xA495991B7852B855, 0x27AE41E4649B934C, 0x9AFBF4C8996FB924,
0xE3B0C44298FC1C14, 0x640B7E4729B49FCE, 0x16B72230967DE01F,
0x60CE05C1DECFE3AD, 0x4E07408562BEDB8B, 0x614E6AB3B84FA55C,
0xD208FA9C2FAFD974, 0x9BD88B9F5D1962D3, 0x267C23695B6E8FC2,
0xF9E34E60E3AE4F44, 0xF59FCAAF3A56B538, 0xA8D86E4F33294BE0,
0x35EFC6DED4E13F29, 0x7EE6614143500215, 0x7107CA98B0A6C242,
0xD6698EA1047F5C0A, 0x2EFFF1261C25D94D, 0x00EC68941F27440C,
0x038F6515DC7AD2A2, 0x02A4C5061F8AD16C, 0xA4F7BA76DB1A09F4,
0x3A3A1DD8934D1958, 0xCE872F8C370A08DC, 0xF91001FCB6DAB28B,
0x4E25F49BC91285E1, 0x527E79D0A3035852, 0xCC0BF86F2A60ED7E,
0x9C8D5AB452E8B69B, 0xC0740DD25C9DE39B, 0x5D827521BB8D54DF,
0x0C44B4C673812078, 0x0A05F1DE66EE555F, 0x8C954CD9B6C8F818,
0x2FC3A26B33A91CD8, 0x2AF07CC393025875, 0xFF121FED87539C49,
0x8721D1333B764926, 0xA4CD30C8355943FD, 0x4481071EAFEDEB1E,
0x19B8C4ECE54CA63D, 0xCAAC67952F8CD5C1, 0xD21560096807F0CB,
0xD2D991AF41C5EF75, 0x7FB2FADEB54168EC, 0x3DEC3E77C7B4AE98,
0xFEEF53EFE3CBEE09, 0x7C1533C0CB71A163, 0x612F6D5C2BA2B291,
0x330548C742A7C77A, 0xAA3566FE98696357, 0x5C595BAB01FDBDFB,
0xB3150FCE2878C94A, 0x32FA47541DA9C49E, 0x8A2BAD94F28B1D20,
0x423A5FB1BBFF501E, 0xE9F3784E332A1CCA, 0x1F0960C3EF5338A9,
0x0CCCEEC918ED7221, 0xF989C8334DAABE36, 0xA6983AEDD3CAD63F,
0x1564E00B0413DB17, 0xFAE59D87E444EA39, 0x76DDEB33198A342C,
0x07E4D2A1F7B2225A, 0xB9A283FF2DBC461A, 0x71263158DFFB4E87,
0x1DA33E2623A69F0A, 0x0D28F3CC44E9A624, 0xF0A1B7875844C3AE,
0x21FBDC5793903EB6, 0x1192B6E4BDEC029C, 0x280ABB25EE957ACB,
0xF983F1F5CF4BD0F5, 0x8F8DA51908599678, 0x8BF1794930B31D48,
0xE035C38FE2581543, 0x99B340ACCCD6137D, 0x76610E7F8041E29D,
0x79C81D3CF596E134, 0xB5E234BF4F2E2F2F, 0xA630621B389E0269,
0xA32BEE851AA8195F, 0x1916D3919A37F28B, 0x52BD93F5CF2BB1C9,
0x203A83F7BC429000, 0xB941961D7FD0DC88, 0x52AE42D747CC9B7F,
0x779C702B13086F27, 0x2C40420C10F6C5C9, 0x89E082DA67E7A2BA,
0xD62C06AE3B1262D5, 0x4E0846AEFE097B34, 0x5E6DED4E901BE009,
0x9A74E9A524DEF058, 0x13FA1A8D6184DE71, 0x1BEDE46B96346B8E,
0x8BFE4F313A316226, 0x0D2B653DA3F00458, 0x676C5640EC523D07,
0xDA7B1A41CCAE7D4E, 0x641FB4D8D2D13726, 0xCEE611F144692B66,
0x987643879977A1BD, 0xFB1904FC6EE0D915, 0x70FE652365FEDCF9,
0x124A7D6202DE83FC, 0x137C66C93DD8A735, 0x4A43DA05BCD32DBA,
0x6E172C87859B68E3, 0xD909261806A23376, 0x71DCC0C5DB9810FE,
0x1743C2DA282BE204, 0xE574568E07C2F447, 0x47004C6705CF1330,
0x189F8C3D310C9189, 0xFFBB604311CBA061, 0x57C45B1D54E9293D,
0x407FD98EA2EC9790, 0xA3A1BA2CAD658AEF, 0xE177F3D9A301E214,
0xEBF75EB10D6B8225, 0x9449C881047FEF89, 0x345EAEF124098DFF,
0x76293F79FA5D6837, 0xBA81CC1276BFF143, 0x8194DA38905F2A76,
0x57496BFA62C36212, 0x5CC7F80FCA76488B, 0x27F6EF06C05A6667,
0x859A911428426908, 0xAC839788AD1E3AFE, 0xBBCF0E62C9C98465,
0x16C99E22FE8F336D, 0x7944DCB715D2B48E, 0x6D500BA806F21FED,
0xE2C0783E3EA9F6BE, 0xAD95772328B63AA4, 0x9F2DAA9DD934B738,
0x19B67552963DBA24, 0x4AA889C916C78EEC, 0xE183CB786F7D0225,
0x8204624FB1DF4072, 0x1C52B79198588F75, 0x5215491F588E9061,
0xC0ECB4BF497B3D24, 0xA3DDCF951C863B90, 0x3DC34E03715D1E86,
0x93C7003309B2B16D, 0xDB8DC55940E6D405, 0x22A674F0A5C51BEE,
0xB9CC42BE352273A4, 0x5288081DC7BE6307, 0x3ABFFE72285284CB,
0xB03A58DF3811A955, 0x4D937AB0E3F28BC7, 0xFF1260C7907EBD92,
0xEA012389BB29FCFA, 0xA6F634F7B0A91D90, 0xA1C732F0466BA190,
0x1694A93FA04F924F, 0x7A68A298FBBE78F8, 0x688784515705B894,
0x7BF3B2235A9BFCCF, 0x3A8D7B10D3E16143, 0xBEA09BF0EBEC453C,
0x7A964C634DF35A00, 0xA578BC3FB1805216, 0x22511DCBA44BE006,
0x473CF801B7E7DC82, 0x2E61B3D57F5A6400, 0xECFA2730978ECD31,
0x4D76B0F79873109D, 0xA5E570AA856BEFC9, 0x85D50A9055BCC917,
0x09B71ACFE36EC46A, 0xB7219D64858B1D1B, 0x6322E0AEA4762644,
0x6110A33948746949, 0xA3834380FA84B98C, 0x416827D9BD10517B,
0x205191477BA5E2D4, 0x8583927ED0D61E42, 0xF23C26620985246C,
0x463FA0BD48E2D9CD, 0x5BE1E31786234856, 0x076B608F1F16EC54,
0xFCF291E7DE66100D, 0x027B9593BE686708, 0xF7ECCC236C2F031F,
0x101C24CB8038FFA2, 0x36FBD8565EE584ED, 0x981E43EE73218C77,
0xE99B6E19BF8CE8DA, 0x5A45E8D434AD96C8, 0x949668B5F689B688,
0x2596516D1350B71E, 0x6739DB9427BB8C02, 0x8031B2D3C446DD6E,
0x4C2224CC1742F920, 0x59093F03EDBA8CD1, 0x7CB4BB75F9E08F1A,
0x6B64AEB9CD1CDFF5, 0x2CA127A0C57C6D6C, 0xE1D9E0F0471EB1AC,
0x3A335F3D7180856D, 0xD87D65A08487BF82, 0x07864D342C10C819,
0x511BF7E38AF42BAE, 0x8B5D843EC502DA3B, 0x80125447E4888B8F,
0xA1CC69B692DEA1B2, 0xDDD2B9DB35EEFC4E, 0x49F11DA1947B362E,
0x34E40280999D3EA6, 0xA491F7A67A19442E, 0x38CD84D6A14D87F1,
0xD3A19502C9450B5F, 0xDF47D72860C62910, 0xB29D464603F6E8F0,
0x82F22502D37F5561, 0x4B4450DC4DC1583D, 0x85BADFAFE321525E,
0x8296939672321D16, 0x36E12D7A4AB1B08A, 0x860650B802184FD4,
0xE94462C6B55C3FF6, 0xE83FED74E65B3EDD, 0x3EE9B1254D10432D,
0x78E5956D6BC70090, 0xF6F0EB6D1E334F56, 0xD7452F3FB84E4A36,
0x6B6356F7826A9DD1, 0xF8B38562F8AF7F5A, 0x83442AE9FE5BE79B,
0x9B6E82F6BCF031AB, 0xF36FDF177673476D, 0x112E1F92164E0E52,
0x0BFA74605FB8A9B8, 0x48E45F150E86DEC8, 0xC4BA24790041D453,
0x9AA2B91B81053FC2, 0x2A7A944B1AF44A23, 0x4A471FF96E24FDB7,
0x9A2C561F8A2401C2, 0xA7AF4303D32EF538, 0xF6D40B18E4846693,
0xF73C7D03097E2A85, 0x5963AAAC8B2E391A, 0x2326CF3AD8A24949,
0x2955AA4CFD0955B0, 0xEFB503670B6B1CDA, 0x8F36DD3C25A09004,
0x72C73ED09101189B, 0xE48C7DBF4C345FFA, 0xF465188486D12732,
0x8F7191F537DC3023, 0xD76FBBE816AB8193, 0x78971FF1C5759434,
0x9EBB4D1E515EE18A, 0x9F34BC53A2BEACEF, 0xA0DA75B06F9F8EA6,
0x38E11C269938E34C, 0x47ADCCF552546D6D, 0x4728ED1535C94B4A,
0xEC794468363C2E0E, 0x2938E9D38B388722, 0x2DC07DBB29AF4947,
0x1E3B4531213FFBA2, 0x957E8DCC3E00727C, 0xD6C75341415F04D6,
0xE336F0579666B64F, 0x1BA3345394F98EB3, 0x375B0F6C5B15DD3D,
0xE04DB04888B4380D, 0xF83213CF696EE88C, 0x9B31BCE678AD6B18,
0xF8EFC9964ADE38E4, 0xBC2004109A0E3AFA, 0xFAF1EA27888B1A3C,
0x5E98EAF21609A0A7, 0x118C1DB41DA78E81, 0x86C4619A31B85BFC,
0x5F8C9067ACAA4269, 0xF0B267621ACC79EA, 0x9C6050C66D54D3BC,
0x24818E3F7A769CBD, 0x2250FA7C3FCB1CBB, 0xB61B7A8E81ED778D,
0x4538060EB1141D17, 0xA221626CF97D97CB, 0x8A7723D63091967E,
0x080F04C095C14517, 0x323E944917F9EB93, 0xA3EF852EDF53A001,
0xA4353F820201EE29, 0x4F73E39FEE8BDBFE, 0xF0ACAAA72D2B62F7,
0x1BE147496E7750CA, 0x91189876D80EDE4C, 0x3389F591EE806FBB,
0x7C74F4B2303DAD0D, 0x5FBECE9186741846, 0xB04B9AE381183FAE,
0xEE6D1C39B794CE62, 0x9016FB0579FA9402, 0x97EC8D2C65EA43B8,
0xF2D37ED8E008422A, 0xA88DFD8B0F3AAB89, 0xD7CF6CDF34BFD209,
0xE3628B3721931FDB, 0x0C451B3E3B436D15, 0x239BB072E5B34E41,
0x3DC51A97B5A940C1, 0xAC0161A0DA84D53B, 0x345394823D66FC62,
0x1B7F7E176A836AEE, 0x6612B6D3AFB30CA8, 0x01C47C26E7B2CC00,
0x043B730599D20260, 0x3F9E463CB7C946B2, 0x4A8DAAEBFB336D43,
0xF9B617983070ED60, 0x9AF2AF0BA91EA0D7, 0x0AC44EF9103AE372,
0x8B66DBF1D2C5E991, 0xC3B16BB058908557, 0xBD8240471D86C144,
0x3E2C14E27BC64098, 0xDDCD99498E58F066, 0xE388E41366082790,
0xA63D08B8AF4977D9, 0x0BCF499AFA092637, 0xDBB0A064FFA9E303,
0xBD45DDD5BA1477EE, 0xB8F750B4D84076E9, 0x3A535BB3BDE3D3D9,
0x9525F2A6EE6F38D3, 0x6CDF53C189D3E726, 0x538AB825624B96DD,
0x730DE4A6B79DD8B1, 0x51B74D121690D957, 0x8E3E7626617E0B24,
0xC44263402923D601, 0xD0530C69581EF7EF, 0xBA6C3F80FCF5DB55,
0x4B7E7C204C8ACD97, 0xB0E7053FD43FACD4, 0xED5F518F302EFD69,
0x1624AE47324832FC, 0x7F17547B953914AD, 0x525C47949C18BCEA,
0x313955A415351A58, 0x307E18AD60ED4B54, 0xB03344E911DF01D6,
0x20C38803D44CF9CD, 0xDDB3956944628B64, 0x11A5DEA12D3DB3EC,
0x593659D66BC87815, 0xE5AF653BAE6F1869, 0xF47815E9DE6A716E,
0x2508DCD62F17EAD9, 0x64A61858259ED57B, 0xFDAAE31E9178B455,
0x266008D2BEBD6ECC, 0x01A7BC2FBD4F1FF1, 0x75D074C7FE629A1D,
0x726F46CB272A92A1, 0x217F12238920FE7A, 0x99A0B1A4A8EB311C,
0x48E5BD99F0A5CDDE, 0x0CC73F9EFFEA61E2, 0x142BADB1DCD76ED6,
0x6B6696D8D16E993E, 0xF73977B29D3332B2, 0x3532EC396A463E8D,
0x08485AF320F6EF4A, 0x3BE313B7F5F5462D, 0xC7EDDABFD3A52DEC,
0xE3C0AE2EE970AB95, 0x59DACF3BB3C53E2B, 0x3E135135F158E39C,
0x4B25757F5EF36523, 0xDCE58EEC3A4E8B12, 0x27A7532E62B6147F,
0xAA5D819242B97295, 0x815E4E99C89F0115, 0x90AD0232C1A6A145,
0xE6FC5968AC8C1AFE, 0xB24A3CF866116B23, 0x3134AEF31EA120B2,
0xFBD01F222353BCFA, 0xC5C85E7FE228C34A, 0x385ABA08C78A08FB,
0x28EEFFB4F741E27D, 0x10F7CA989D8373CE, 0x99E053B9784F8535,
0x350A957CEEA5AA93,
};
for (int i = 0; i < 100; i++) {
wuffs_base__bitvec256 have = wuffs_base__make_bitvec256(0u, 0u, 0u, 0u);
wuffs_base__slice_u8 data = ((wuffs_base__slice_u8){
.ptr = (uint8_t*)(digits),
.len = (size_t)(i),
});
if (mimic) {
#ifdef WUFFS_MIMIC
have = mimic_sha256_one_shot_checksum_bitvec256(data);
#endif // WUFFS_MIMIC
} else {
wuffs_sha256__hasher checksum;
CHECK_STATUS("initialize",
wuffs_sha256__hasher__initialize(
&checksum, sizeof checksum, WUFFS_VERSION,
WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
have = wuffs_sha256__hasher__update_bitvec256(&checksum, data);
}
if ((have.elements_u64[0] != wants[(4 * i) + 0]) ||
(have.elements_u64[1] != wants[(4 * i) + 1]) ||
(have.elements_u64[2] != wants[(4 * i) + 2]) ||
(have.elements_u64[3] != wants[(4 * i) + 3])) {
RETURN_FAIL(
"i=%d: " //
"have 0x%016" PRIX64 "_%016" PRIX64 //
"_%016" PRIX64 "_%016" PRIX64 //
", want 0x%016" PRIX64 "_%016" PRIX64 //
"_%016" PRIX64 "_%016" PRIX64, //
i, //
have.elements_u64[3], have.elements_u64[2], //
have.elements_u64[1], have.elements_u64[0], //
wants[(4 * i) + 3], wants[(4 * i) + 2], //
wants[(4 * i) + 1], wants[(4 * i) + 0]);
}
}
return NULL;
}
const char* //
test_wuffs_sha256_pi() {
CHECK_FOCUS(__func__);
return do_test_xxxxx_sha256_pi(false);
}
// ---------------- Mimic Tests
#ifdef WUFFS_MIMIC
const char* //
test_mimic_sha256_pi() {
CHECK_FOCUS(__func__);
return do_test_xxxxx_sha256_pi(true);
}
#endif // WUFFS_MIMIC
// ---------------- SHA256 Benches
wuffs_base__bitvec256 g_wuffs_sha256_unused_bitvec256;
const char* //
wuffs_bench_sha256(wuffs_base__io_buffer* dst,
wuffs_base__io_buffer* src,
uint32_t wuffs_initialize_flags,
uint64_t wlimit,
uint64_t rlimit) {
uint64_t len = src->meta.wi - src->meta.ri;
if (rlimit) {
len = wuffs_base__u64__min(len, rlimit);
}
wuffs_sha256__hasher checksum = {0};
CHECK_STATUS("initialize", wuffs_sha256__hasher__initialize(
&checksum, sizeof checksum, WUFFS_VERSION,
wuffs_initialize_flags));
g_wuffs_sha256_unused_bitvec256 = wuffs_sha256__hasher__update_bitvec256(
&checksum, ((wuffs_base__slice_u8){
.ptr = src->data.ptr + src->meta.ri,
.len = len,
}));
src->meta.ri += len;
return NULL;
}
const char* //
bench_wuffs_sha256_10k() {
CHECK_FOCUS(__func__);
return do_bench_io_buffers(
wuffs_bench_sha256,
WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tcounter_src,
&g_sha256_midsummer_gt, UINT64_MAX, UINT64_MAX, 100);
}
const char* //
bench_wuffs_sha256_100k() {
CHECK_FOCUS(__func__);
return do_bench_io_buffers(
wuffs_bench_sha256,
WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tcounter_src,
&g_sha256_pi_gt, UINT64_MAX, UINT64_MAX, 10);
}
// ---------------- Mimic Benches
#ifdef WUFFS_MIMIC
const char* //
bench_mimic_sha256_10k() {
CHECK_FOCUS(__func__);
return do_bench_io_buffers(
mimic_bench_sha256,
WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tcounter_src,
&g_sha256_midsummer_gt, UINT64_MAX, UINT64_MAX, 100);
}
const char* //
bench_mimic_sha256_100k() {
CHECK_FOCUS(__func__);
return do_bench_io_buffers(
mimic_bench_sha256,
WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tcounter_src,
&g_sha256_pi_gt, UINT64_MAX, UINT64_MAX, 10);
}
#endif // WUFFS_MIMIC
// ---------------- Manifest
proc g_tests[] = {
test_wuffs_sha256_golden,
test_wuffs_sha256_interface,
test_wuffs_sha256_pi,
#ifdef WUFFS_MIMIC
test_mimic_sha256_pi,
#endif // WUFFS_MIMIC
NULL,
};
proc g_benches[] = {
bench_wuffs_sha256_10k,
bench_wuffs_sha256_100k,
#ifdef WUFFS_MIMIC
bench_mimic_sha256_10k,
bench_mimic_sha256_100k,
#endif // WUFFS_MIMIC
NULL,
};
int //
main(int argc, char** argv) {
g_proc_package_name = "std/sha256";
return test_main(argc, argv, g_tests, g_benches);
}