30constexpr std::array<uint32_t, 8>
SHA256_IV = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
31 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 };
35 0x00000000, 0x00000000, 0x00000000, 0x00000000,
36 0x00000000, 0x00000000, 0x00000000, 0x00000000,
37 0x00000000, 0x00000000, 0x00000000, 0x00000018 };
106 0x61626364, 0x62636465, 0x63646566, 0x64656667,
107 0x65666768, 0x66676869, 0x6768696a, 0x68696a6b,
108 0x696a6b6c, 0x6a6b6c6d, 0x6b6c6d6e, 0x6c6d6e6f,
109 0x6d6e6f70, 0x6e6f7071, 0x80000000, 0x00000000
113 0x00000000, 0x00000000, 0x00000000, 0x00000000,
114 0x00000000, 0x00000000, 0x00000000, 0x00000000,
115 0x00000000, 0x00000000, 0x00000000, 0x000001c0 };
117 constexpr std::array<uint32_t, 8> EXPECTED = { 0x248d6a61, 0xd20638b8, 0xe5c02693, 0x0c3e6039,
118 0xa33ce459, 0x64ff2167, 0xf6ecedd4, 0x19db06c1 };
123 for (
size_t i = 0; i < 8; i++) {
124 EXPECT_EQ(native_output[i], EXPECTED[i]) <<
"Native mismatch at index " << i;
129 for (
size_t i = 0; i < 8; i++) {
134 for (
size_t i = 0; i < 16; i++) {
142 for (
size_t i = 0; i < 16; i++) {
149 for (
size_t i = 0; i < 8; i++) {
150 uint32_t circuit_val =
static_cast<uint32_t
>(
uint256_t(circuit_output[i].get_value()));
151 EXPECT_EQ(circuit_val, EXPECTED[i]) <<
"Circuit mismatch at index " << i;
154 check_circuit_and_gate_count(
builder, 10646);
155 EXPECT_EQ(
builder.get_tables_size(), 35992);
324 for (
size_t i = 0; i < 16; i++) {
325 if (i == 0 || i == 15) {
336 std::array<uint32_t, 64> w_native;
337 for (
size_t i = 0; i < 16; i++) {
340 for (
size_t i = 16; i < 64; i++) {
341 uint32_t s0 = std::rotr(w_native[i - 15], 7) ^ std::rotr(w_native[i - 15], 18) ^ (w_native[i - 15] >> 3);
342 uint32_t s1 = std::rotr(w_native[i - 2], 17) ^ std::rotr(w_native[i - 2], 19) ^ (w_native[i - 2] >> 10);
343 w_native[i] = w_native[i - 16] + s0 + w_native[i - 7] + s1;
347 for (
size_t i = 0; i < 64; i++) {
348 uint32_t circuit_val =
static_cast<uint32_t
>(
uint256_t(w_ext[i].get_value()));
349 EXPECT_EQ(circuit_val, w_native[i]) <<
"extend_witness mismatch at index " << i;
352 check_circuit_and_gate_count(
builder, 3815);
353 EXPECT_EQ(
builder.get_tables_size(), 20872);
374 for (
size_t i = 0; i < 16; i++) {
388 bool any_modification_passed =
false;
389 for (
auto& single_extended_witness : w_ext) {
391 uint32_t variable_index = single_extended_witness.get_witness_index();
394 while (
builder.get_variable(variable_index) ==
fr(random32bits)) {
398 auto backup =
builder.get_variable(variable_index);
399 builder.set_variable(variable_index,
fr(random32bits));
403 any_modification_passed =
true;
406 builder.set_variable(variable_index, backup);
410 EXPECT_FALSE(any_modification_passed);
static std::array< field_ct, 8 > sha256_block(const std::array< field_ct, 8 > &h_init, const std::array< field_ct, 16 > &input)
Apply the SHA-256 compression function to a single 512-bit message block.
std::array< uint32_t, 8 > sha256_block(const std::array< uint32_t, 8 > &h_init, const std::array< uint32_t, 16 > &input)
SHA-256 compression function (FIPS 180-4 Section 6.2.2)