153 {
154 std::array<std::uint32_t, 64> schedule {};
155 for (std::size_t index = 0; index < 16U; ++index) {
156 schedule[index] =
load_be32(block + index * 4U);
157 }
158 for (std::size_t index = 16; index < schedule.size(); ++index) {
159 const std::uint32_t s0 = std::rotr(schedule[index - 15U], 7)
160 ^ std::rotr(schedule[index - 15U], 18)
161 ^ (schedule[index - 15U] >> 3U);
162 const std::uint32_t s1 = std::rotr(schedule[index - 2U], 17)
163 ^ std::rotr(schedule[index - 2U], 19)
164 ^ (schedule[index - 2U] >> 10U);
165 schedule[index]
166 = schedule[index - 16U] + s0 + schedule[index - 7U] + s1;
167 }
168
169 std::uint32_t a =
state_[0];
170 std::uint32_t b =
state_[1];
171 std::uint32_t c =
state_[2];
172 std::uint32_t d =
state_[3];
173 std::uint32_t e =
state_[4];
174 std::uint32_t f =
state_[5];
175 std::uint32_t g =
state_[6];
176 std::uint32_t h =
state_[7];
177
178 for (std::size_t index = 0; index < schedule.size(); ++index) {
179 const std::uint32_t sum1
180 = std::rotr(e, 6) ^ std::rotr(e, 11) ^ std::rotr(e, 25);
181 const std::uint32_t choose = (e & f) ^ (~e & g);
182 const std::uint32_t temporary1
184 const std::uint32_t sum0
185 = std::rotr(a, 2) ^ std::rotr(a, 13) ^ std::rotr(a, 22);
186 const std::uint32_t majority = (a & b) ^ (a & c) ^ (b & c);
187 const std::uint32_t temporary2 = sum0 + majority;
188
189 h = g;
190 g = f;
191 f = e;
192 e = d + temporary1;
193 d = c;
194 c = b;
195 b = a;
196 a = temporary1 + temporary2;
197 }
198
207}
constexpr std::array< std::uint32_t, 64 > round_constants
std::uint32_t load_be32(const std::byte *bytes) noexcept