75 constexpr uint32_t init_constants[8]{ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
76 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 };
78 constexpr uint32_t round_constants[64]{
79 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
80 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
81 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
82 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
83 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
84 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
85 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
86 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
88 uint32_t
a = init_constants[0];
89 uint32_t
b = init_constants[1];
90 uint32_t c = init_constants[2];
91 uint32_t d = init_constants[3];
92 uint32_t e = init_constants[4];
93 uint32_t f = init_constants[5];
94 uint32_t
g = init_constants[6];
95 uint32_t h = init_constants[7];
96 for (
size_t i = 0; i < 64; ++i) {
99 uint32_t ch = (e & f) ^ (~e &
g);
100 uint32_t temp1 = h + S1 + ch + round_constants[i] + (uint32_t)w[i];
103 uint32_t maj = (
a &
b) ^ (
a & c) ^ (
b & c);
104 uint32_t temp2 = S0 + maj;
120 output[0] = (uint32_t)(
a + init_constants[0]);
121 output[1] = (uint32_t)(
b + init_constants[1]);
122 output[2] = (uint32_t)(c + init_constants[2]);
123 output[3] = (uint32_t)(d + init_constants[3]);
124 output[4] = (uint32_t)(e + init_constants[4]);
125 output[5] = (uint32_t)(f + init_constants[5]);
126 output[6] = (uint32_t)(
g + init_constants[6]);
127 output[7] = (uint32_t)(h + init_constants[7]);
163TEST(stdlib_sha256, test_plookup_55_bytes)
175 EXPECT_EQ(
uint256_t(output[0].get_value()), 0x51b2529fU);
176 EXPECT_EQ(
uint256_t(output[1].get_value()), 0x872e839aU);
177 EXPECT_EQ(
uint256_t(output[2].get_value()), 0xb686c3c2U);
178 EXPECT_EQ(
uint256_t(output[3].get_value()), 0x483c872eU);
179 EXPECT_EQ(
uint256_t(output[4].get_value()), 0x975bd672U);
180 EXPECT_EQ(
uint256_t(output[5].get_value()), 0xbde22ab0U);
181 EXPECT_EQ(
uint256_t(output[6].get_value()), 0x54a8fac7U);
182 EXPECT_EQ(
uint256_t(output[7].get_value()), 0x93791fc7U);
183 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
186 EXPECT_EQ(proof_result,
true);
189TEST(stdlib_sha256, test_55_bytes)
200 EXPECT_EQ(output[0].get_value(),
fr(0x51b2529fULL));
201 EXPECT_EQ(output[1].get_value(),
fr(0x872e839aULL));
202 EXPECT_EQ(output[2].get_value(),
fr(0xb686c3c2ULL));
203 EXPECT_EQ(output[3].get_value(),
fr(0x483c872eULL));
204 EXPECT_EQ(output[4].get_value(),
fr(0x975bd672ULL));
205 EXPECT_EQ(output[5].get_value(),
fr(0xbde22ab0ULL));
206 EXPECT_EQ(output[6].get_value(),
fr(0x54a8fac7ULL));
207 EXPECT_EQ(output[7].get_value(),
fr(0x93791fc7ULL));
208 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
211 EXPECT_EQ(proof_result,
true);
214TEST(stdlib_sha256, test_NIST_vector_one_byte_array)
222 EXPECT_EQ(
uint256_t(output[0].get_value()).
data[0], (uint64_t)0xBA7816BFU);
223 EXPECT_EQ(
uint256_t(output[1].get_value()).
data[0], (uint64_t)0x8F01CFEAU);
224 EXPECT_EQ(
uint256_t(output[2].get_value()).
data[0], (uint64_t)0x414140DEU);
225 EXPECT_EQ(
uint256_t(output[3].get_value()).
data[0], (uint64_t)0x5DAE2223U);
226 EXPECT_EQ(
uint256_t(output[4].get_value()).
data[0], (uint64_t)0xB00361A3U);
227 EXPECT_EQ(
uint256_t(output[5].get_value()).
data[0], (uint64_t)0x96177A9CU);
228 EXPECT_EQ(
uint256_t(output[6].get_value()).
data[0], (uint64_t)0xB410FF61U);
229 EXPECT_EQ(
uint256_t(output[7].get_value()).
data[0], (uint64_t)0xF20015ADU);
230 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
233 EXPECT_EQ(proof_result,
true);
236TEST(stdlib_sha256, test_NIST_vector_one)
247 EXPECT_EQ(output[0].get_value(),
fr(0xBA7816BFULL));
248 EXPECT_EQ(output[1].get_value(),
fr(0x8F01CFEAULL));
249 EXPECT_EQ(output[2].get_value(),
fr(0x414140DEULL));
250 EXPECT_EQ(output[3].get_value(),
fr(0x5DAE2223ULL));
251 EXPECT_EQ(output[4].get_value(),
fr(0xB00361A3ULL));
252 EXPECT_EQ(output[5].get_value(),
fr(0x96177A9CULL));
253 EXPECT_EQ(output[6].get_value(),
fr(0xB410FF61ULL));
254 EXPECT_EQ(output[7].get_value(),
fr(0xF20015ADULL));
255 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
258 EXPECT_EQ(proof_result,
true);
261TEST(stdlib_sha256, test_NIST_vector_two)
271 EXPECT_EQ(output[0].get_value(), 0x248D6A61ULL);
272 EXPECT_EQ(output[1].get_value(), 0xD20638B8ULL);
273 EXPECT_EQ(output[2].get_value(), 0xE5C02693ULL);
274 EXPECT_EQ(output[3].get_value(), 0x0C3E6039ULL);
275 EXPECT_EQ(output[4].get_value(), 0xA33CE459ULL);
276 EXPECT_EQ(output[5].get_value(), 0x64FF2167ULL);
277 EXPECT_EQ(output[6].get_value(), 0xF6ECEDD4ULL);
278 EXPECT_EQ(output[7].get_value(), 0x19DB06C1ULL);
279 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
282 EXPECT_EQ(proof_result,
true);
285TEST(stdlib_sha256, test_NIST_vector_three)
296 EXPECT_EQ(output[0].get_value(), 0x68325720ULL);
297 EXPECT_EQ(output[1].get_value(), 0xaabd7c82ULL);
298 EXPECT_EQ(output[2].get_value(), 0xf30f554bULL);
299 EXPECT_EQ(output[3].get_value(), 0x313d0570ULL);
300 EXPECT_EQ(output[4].get_value(), 0xc95accbbULL);
301 EXPECT_EQ(output[5].get_value(), 0x7dc4b5aaULL);
302 EXPECT_EQ(output[6].get_value(), 0xe11204c0ULL);
303 EXPECT_EQ(output[7].get_value(), 0x8ffe732bULL);
304 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
307 EXPECT_EQ(proof_result,
true);
310TEST(stdlib_sha256, test_NIST_vector_four)
321 EXPECT_EQ(output[0].get_value(), 0x7abc22c0ULL);
322 EXPECT_EQ(output[1].get_value(), 0xae5af26cULL);
323 EXPECT_EQ(output[2].get_value(), 0xe93dbb94ULL);
324 EXPECT_EQ(output[3].get_value(), 0x433a0e0bULL);
325 EXPECT_EQ(output[4].get_value(), 0x2e119d01ULL);
326 EXPECT_EQ(output[5].get_value(), 0x4f8e7f65ULL);
327 EXPECT_EQ(output[6].get_value(), 0xbd56c61cULL);
328 EXPECT_EQ(output[7].get_value(), 0xcccd9504ULL);
330 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
333 EXPECT_EQ(proof_result,
true);
343 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
344 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
345 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
346 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
347 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
348 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
349 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
350 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
351 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
358 EXPECT_EQ(output[0].get_value(), 0xc2e68682ULL);
359 EXPECT_EQ(output[1].get_value(), 0x3489ced2ULL);
360 EXPECT_EQ(output[2].get_value(), 0x017f6059ULL);
361 EXPECT_EQ(output[3].get_value(), 0xb8b23931ULL);
362 EXPECT_EQ(output[4].get_value(), 0x8b6364f6ULL);
363 EXPECT_EQ(output[5].get_value(), 0xdcd835d0ULL);
364 EXPECT_EQ(output[6].get_value(), 0xa519105aULL);
365 EXPECT_EQ(output[7].get_value(), 0x1eadd6e4ULL);
367 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
370 EXPECT_EQ(proof_result,
true);
373TEST(stdlib_sha256, test_input_len_multiple)
377 std::vector<uint32_t> input_sizes = { 1, 7, 15, 16, 30, 32, 55, 64, 90, 128, 512, 700 };
379 for (
auto& inp : input_sizes) {
380 auto input_buf = std::vector<uint8_t>(inp, 1);
385 auto circuit_output = output_bytes.
get_value();
389 EXPECT_EQ(circuit_output, expected);
393TEST(stdlib_sha256, test_input_str_len_multiple)
397 std::vector<std::string> input_strings = {
402 "dbxldszbrgdmyvncpeifhnelmlulqo",
403 "qdnsbdlamrivgzbktsyyijethtvuzzrk",
404 "qhpqepdogwsiuyfwqgbqcikeywbgyjznoswitwddhytzkrkdjykvflg",
405 "fmsityhwkevuctwwsosjyrznibbpfcawmkoatqaaojeahnldcnrwijqpwiuvdeyp",
406 "utszdtjhsqjeakhczzusnntdrtxbljvhqdndaybosjgaufvnjxmnidcvvedgszbspaycosgwauyttmbdvqogakiktp",
407 "enbgynwxnnymvqeqbojewmzwowfbpetrerntwtkgwnvtdopjssnddzxjnkqwicthufgpbwrmmhiwpyxlpskxgarmrtvketlvkmdvnsqgdftfhw"
408 "dvgmlfjrqoviqrhuon",
409 "nngsypjgwnazpjdxovbqnevgrqxwzuljdqqiahpgwvvmgjdzfwjsjwwxcadhluzqxezlrznuoiuobpmkhqibphwvfjicmpxkshiizlgpyloxyx"
410 "fljwgwlazfidiylowazmguxxxjzimizxrzllescpactcpzeaeuyhjxgkmktkqslxripwwgragpvwknphwifojuqatlraacymbwfaohhhzstnil"
411 "tqvukrienivisigkoefkqejdagylahffwvloqtqjkmtgxenxviqutsjjgffmolrwqbwgigyrhbpqsnyyzmvvyehcsyzxxskkyxiuqvagakutcu"
412 "lqowtykszgnpmeebrksyaqezflhdbrgswpwnrknjnfhnfqfwquooxazubnccawwvldpihkhjkwmwceuvorfeuwvzjzzceywuimfzunordhixpo"
413 "rqveoywjgdbnmgiywcwwcybhoqvhentbwxfvouauviyqbnphtfotgwtitxutdfxjforuyaau",
414 "lbfeywyqvybssdvmorkyltmgxvjezwltijsqfnpaexqyzfppmnpsxlhqwdojjqsqlfybpxskexswevngctedgvhbdwszxqxqoqbhmshmpmdrpy"
415 "akejsoevkfrtvgfzcvockujdynvxfaxsdavmwlpxfwftczoduqdfxrkksnqygdsarhaszezxndalitvvsziyeklymrytdkunnxpvwvkzldrrzw"
416 "ccxghwdnufkxsvpumhhszzjpmwuxvfjxfccltjqlwkyleyoydzpqqfnkkuvdgbvuqqsnpexuoqupakvhvqfucbkzoyzehocvkzsngtwkyqklhk"
417 "qdtszsbtyzxzdeipjsbmzrpqlkhlkqimoiiblhrrymyafvtdbrmbixuzwhvnkcroanyvxvbaaznpgoadhmltgcweqajbnnkzuxihlcqurjzkxb"
418 "pxqjyvutmgqquavwpkdgkppctvybdikwvqxgifgfbgzywijqtcyvfqdsbbxsknqejhrwuhlnqjgdcpipxxwbguzgsjygbdgqczmqxcnzieoyok"
419 "oraykfcqzctnjgjcdyhnxnuorvaxhsdbeosqhvqebccfxiefubecprupofnkkpafpmlzcqbcnojbelemuqlxoiqqwhtrddqqwurvgyretfvhuh"
420 "fzkbvfywmrqpjqxdrvlrmvlbmmfeldmwvxmpohle"
423 for (
auto& input_str : input_strings) {
424 auto input_buf = std::vector<uint8_t>(input_str.begin(), input_str.end());
429 auto circuit_output = output_bytes.
get_value();
433 EXPECT_EQ(circuit_output, expected);