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#if defined(__GNUC__) && !defined(__clang__)
44#pragma GCC diagnostic push
45#pragma GCC diagnostic ignored "-Wstringop-overflow"
47 void update(
const void* data, std::size_t len)
noexcept {
48 auto ptr =
static_cast<const std::uint8_t*
>(data);
52 std::size_t
const fill = 64 - buf_len_;
54#if defined(__GNUC__) && !defined(__clang__)
55#pragma GCC diagnostic push
56#pragma GCC diagnostic ignored "-Wstringop-overflow"
58 std::memcpy(buf_ + buf_len_, ptr, len);
59#if defined(__GNUC__) && !defined(__clang__)
60#pragma GCC diagnostic pop
65#if defined(__GNUC__) && !defined(__clang__)
66#pragma GCC diagnostic push
67#pragma GCC diagnostic ignored "-Wstringop-overflow"
69 std::memcpy(buf_ + buf_len_, ptr, fill);
70#if defined(__GNUC__) && !defined(__clang__)
71#pragma GCC diagnostic pop
86 std::memcpy(buf_, ptr, len);
90#if defined(__GNUC__) && !defined(__clang__)
91#pragma GCC diagnostic pop
95 std::uint64_t
const bits = total_ * 8;
100 if (buf_len_ >= 64) buf_len_ = 0;
101 std::size_t
const pos = buf_len_;
109 std::memset(buf_ + buf_len_, 0, 64 - buf_len_);
116 std::memset(buf_ + buf_len_, 0, 56 - buf_len_);
119 buf_[56] =
static_cast<std::uint8_t
>(bits >> 56);
120 buf_[57] =
static_cast<std::uint8_t
>(bits >> 48);
121 buf_[58] =
static_cast<std::uint8_t
>(bits >> 40);
122 buf_[59] =
static_cast<std::uint8_t
>(bits >> 32);
123 buf_[60] =
static_cast<std::uint8_t
>(bits >> 24);
124 buf_[61] =
static_cast<std::uint8_t
>(bits >> 16);
125 buf_[62] =
static_cast<std::uint8_t
>(bits >> 8);
126 buf_[63] =
static_cast<std::uint8_t
>(bits);
131 for (std::size_t i = 0; i < 8; ++i) {
132 out[i * 4 + 0] =
static_cast<std::uint8_t
>(state_[i] >> 24);
133 out[i * 4 + 1] =
static_cast<std::uint8_t
>(state_[i] >> 16);
134 out[i * 4 + 2] =
static_cast<std::uint8_t
>(state_[i] >> 8);
135 out[i * 4 + 3] =
static_cast<std::uint8_t
>(state_[i]);
149 auto h1 =
hash(data, len);
150 return hash(h1.data(), h1.size());
154 std::uint32_t state_[8]{};
155 std::uint8_t buf_[64]{};
156 std::size_t buf_len_ = 0;
157 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