Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
pure_sha256.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
11
12using ::testing::ElementsAreArray;
13
14namespace bb::avm2::simulation {
15namespace {
16
17class PureSha256Test : public ::testing::Test {
18 protected:
19 MemoryStore memory;
20 PureSha256 sha256;
21};
22
23TEST_F(PureSha256Test, CompressionMatchesCryptoImplementation)
24{
25 std::array<uint32_t, 8> state = {
26 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
27 };
28
30 0x61626380, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
31 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000018,
32 };
33
34 MemoryAddress state_addr = 100;
35 MemoryAddress input_addr = 200;
36 MemoryAddress output_addr = 300;
37
38 // Set up memory
39 for (size_t i = 0; i < 8; ++i) {
40 memory.set(static_cast<MemoryAddress>(state_addr + i), MemoryValue::from<uint32_t>(state[i]));
41 }
42 for (size_t i = 0; i < 16; ++i) {
43 memory.set(static_cast<MemoryAddress>(input_addr + i), MemoryValue::from<uint32_t>(input[i]));
44 }
45
46 // Run compression
47 sha256.compression(memory, state_addr, input_addr, output_addr);
48
49 // Expected result using crypto library directly
50 std::array<uint32_t, 8> expected_output = crypto::sha256_block(state, input);
51
52 // Verify output
53 std::array<uint32_t, 8> actual_output;
54 for (size_t i = 0; i < 8; ++i) {
55 MemoryValue val = memory.get(static_cast<MemoryAddress>(output_addr + i));
56 EXPECT_EQ(val.get_tag(), MemoryTag::U32);
57 actual_output[i] = val.as<uint32_t>();
58 }
59
60 EXPECT_THAT(actual_output, ElementsAreArray(expected_output));
61}
62
63TEST_F(PureSha256Test, InvalidStateTagThrows)
64{
65 MemoryAddress state_addr = 100;
66 MemoryAddress input_addr = 200;
67 MemoryAddress output_addr = 300;
68
69 // Set one state value to wrong tag (e.g. U64)
70 for (size_t i = 0; i < 8; ++i) {
71 memory.set(static_cast<MemoryAddress>(state_addr + i), MemoryValue::from<uint32_t>(0));
72 }
73 memory.set(state_addr, MemoryValue::from<uint64_t>(0)); // Wrong tag
74
75 for (size_t i = 0; i < 16; ++i) {
76 memory.set(static_cast<MemoryAddress>(input_addr + i), MemoryValue::from<uint32_t>(0));
77 }
78
79 EXPECT_THROW_WITH_MESSAGE(sha256.compression(memory, state_addr, input_addr, output_addr),
80 "Sha256CompressionException: Invalid tag for sha256 state values.");
81}
82
83TEST_F(PureSha256Test, InvalidInputTagThrows)
84{
85 MemoryAddress state_addr = 100;
86 MemoryAddress input_addr = 200;
87 MemoryAddress output_addr = 300;
88
89 for (size_t i = 0; i < 8; ++i) {
90 memory.set(static_cast<MemoryAddress>(state_addr + i), MemoryValue::from<uint32_t>(0));
91 }
92 for (size_t i = 0; i < 16; ++i) {
93 memory.set(static_cast<MemoryAddress>(input_addr + i), MemoryValue::from<uint32_t>(0));
94 }
95 // Set one input value to wrong tag
96 memory.set(static_cast<MemoryAddress>(input_addr + 5), MemoryValue::from<uint64_t>(0));
97
98 EXPECT_THROW_WITH_MESSAGE(sha256.compression(memory, state_addr, input_addr, output_addr),
99 "Sha256CompressionException: Invalid tag for sha256 input values.");
100}
101
102TEST_F(PureSha256Test, StateAddressOutOfRangeThrows)
103{
104 MemoryAddress state_addr = AVM_HIGHEST_MEM_ADDRESS - 6; // state_addr + 7 > HIGHEST
105 MemoryAddress input_addr = 200;
106 MemoryAddress output_addr = 300;
107
108 EXPECT_THROW_WITH_MESSAGE(sha256.compression(memory, state_addr, input_addr, output_addr),
109 "Sha256CompressionException: Memory address out of range for sha256 compression.");
110}
111
112TEST_F(PureSha256Test, InputAddressOutOfRangeThrows)
113{
114 MemoryAddress state_addr = 100;
115 MemoryAddress input_addr = AVM_HIGHEST_MEM_ADDRESS - 14; // input_addr + 15 > HIGHEST
116 MemoryAddress output_addr = 300;
117
118 EXPECT_THROW_WITH_MESSAGE(sha256.compression(memory, state_addr, input_addr, output_addr),
119 "Sha256CompressionException: Memory address out of range for sha256 compression.");
120}
121
122TEST_F(PureSha256Test, OutputAddressOutOfRangeThrows)
123{
124 MemoryAddress state_addr = 100;
125 MemoryAddress input_addr = 200;
126 MemoryAddress output_addr = AVM_HIGHEST_MEM_ADDRESS - 6; // output_addr + 7 > HIGHEST
127
128 EXPECT_THROW_WITH_MESSAGE(sha256.compression(memory, state_addr, input_addr, output_addr),
129 "Sha256CompressionException: Memory address out of range for sha256 compression.");
130}
131
132} // namespace
133} // namespace bb::avm2::simulation
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
Definition assert.hpp:192
#define AVM_HIGHEST_MEM_ADDRESS
void set(MemoryAddress index, MemoryValue value) override
const MemoryValue & get(MemoryAddress index) const override
void compression(MemoryInterface &memory, MemoryAddress state_addr, MemoryAddress input_addr, MemoryAddress output_addr) override
TaggedValue MemoryValue
uint32_t MemoryAddress
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)
Definition sha256.cpp:73
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:185
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
PureSha256 sha256
MemoryStore memory