1#ifndef SECP256K1_SHA256_HPP
2#define SECP256K1_SHA256_HPP
21#if defined(__GNUC__) || defined(__clang__)
25 std::uint32_t state[8])
noexcept;
35 state_[0] = 0x6a09e667u; state_[1] = 0xbb67ae85u;
36 state_[2] = 0x3c6ef372u; state_[3] = 0xa54ff53au;
37 state_[4] = 0x510e527fu; state_[5] = 0x9b05688cu;
38 state_[6] = 0x1f83d9abu; state_[7] = 0x5be0cd19u;
43 void update(
const void* data, std::size_t len)
noexcept {
44 auto ptr =
static_cast<const std::uint8_t*
>(data);
48 std::size_t
const fill = 64 - buf_len_;
50 std::memcpy(buf_ + buf_len_, ptr, len);
54 std::memcpy(buf_ + buf_len_, ptr, fill);
68 std::memcpy(buf_, ptr, len);
74 std::uint64_t
const bits = total_ * 8;
79 if (buf_len_ >= 64) buf_len_ = 0;
80 std::size_t
const pos = buf_len_;
88 std::memset(buf_ + buf_len_, 0, 64 - buf_len_);
95 std::memset(buf_ + buf_len_, 0, 56 - buf_len_);
98 buf_[56] =
static_cast<std::uint8_t
>(bits >> 56);
99 buf_[57] =
static_cast<std::uint8_t
>(bits >> 48);
100 buf_[58] =
static_cast<std::uint8_t
>(bits >> 40);
101 buf_[59] =
static_cast<std::uint8_t
>(bits >> 32);
102 buf_[60] =
static_cast<std::uint8_t
>(bits >> 24);
103 buf_[61] =
static_cast<std::uint8_t
>(bits >> 16);
104 buf_[62] =
static_cast<std::uint8_t
>(bits >> 8);
105 buf_[63] =
static_cast<std::uint8_t
>(bits);
110 for (std::size_t i = 0; i < 8; ++i) {
111 out[i * 4 + 0] =
static_cast<std::uint8_t
>(state_[i] >> 24);
112 out[i * 4 + 1] =
static_cast<std::uint8_t
>(state_[i] >> 16);
113 out[i * 4 + 2] =
static_cast<std::uint8_t
>(state_[i] >> 8);
114 out[i * 4 + 3] =
static_cast<std::uint8_t
>(state_[i]);
128 auto h1 =
hash(data, len);
129 return hash(h1.data(), h1.size());
133 std::uint32_t state_[8]{};
134 std::uint8_t buf_[64]{};
135 std::size_t buf_len_ = 0;
136 std::uint64_t total_ = 0;
static digest_type hash(const void *data, std::size_t len) noexcept
static digest_type hash256(const void *data, std::size_t len) noexcept
digest_type finalize() noexcept
void update(const void *data, std::size_t len) noexcept
std::array< std::uint8_t, 32 > digest_type
void sha256_compress_dispatch(const std::uint8_t block[64], std::uint32_t state[8]) noexcept