barretenberg
Loading...
Searching...
No Matches
sha256.hpp
1#pragma once
2
3#include "barretenberg/ecc/curves/bn254/fr.hpp"
4#include "stdint.h"
5#include <array>
6#include <iomanip>
7#include <ostream>
8#include <vector>
9
10namespace sha256 {
11
12using hash = std::array<uint8_t, 32>;
13
14hash sha256_block(const std::vector<uint8_t>& input);
15
16template <typename T> hash sha256(const T& input);
17
18extern template hash sha256<std::vector<uint8_t>>(const std::vector<uint8_t>& input);
19extern template hash sha256<std::array<uint8_t, 32>>(const std::array<uint8_t, 32>& input);
20extern template hash sha256<std::string>(const std::string& input);
21
22inline barretenberg::fr sha256_to_field(std::vector<uint8_t> const& input)
23{
24 auto result = sha256::sha256(input);
25 return from_buffer<barretenberg::fr>(&result[0]);
26}
27
28inline bool operator==(hash const& lhs, std::vector<uint8_t> const& rhs)
29{
30 return std::equal(lhs.begin(), lhs.end(), rhs.begin());
31}
32
33} // namespace sha256
34
35namespace std {
36inline bool operator==(std::vector<uint8_t> const& lhs, sha256::hash const& rhs)
37{
38 return std::equal(lhs.begin(), lhs.end(), rhs.begin());
39}
40
41inline std::ostream& operator<<(std::ostream& os, sha256::hash const& arr)
42{
43 std::ios_base::fmtflags f(os.flags());
44 os << std::hex << std::setfill('0');
45 for (auto byte : arr) {
46 os << std::setw(2) << +(unsigned char)byte;
47 }
48 os.flags(f);
49 return os;
50}
51} // namespace std