10#ifndef M5_UTILITY_SHA1_HPP
11#define M5_UTILITY_SHA1_HPP
33 _state[0] = 0x67452301;
34 _state[1] = 0xEFCDAB89;
35 _state[2] = 0x98BADCFE;
36 _state[3] = 0x10325476;
37 _state[4] = 0xC3D2E1F0;
40 memset(_buffer, 0,
sizeof(_buffer));
43 void update(
const uint8_t* data,
size_t len)
45 _count +=
static_cast<uint64_t
>(len) << 3;
46 size_t fill{64 - _bufferLen};
49 memcpy(_buffer + _bufferLen, data, fill);
50 transform(_state, _buffer);
56 transform(_state, data);
62 memcpy(_buffer + _bufferLen, data, len);
66 void finalize(uint8_t digest[20])
68 uint8_t padding[64]{0x80};
71 memcpy(length, &count_be, 8);
73 size_t padLen = (_bufferLen < 56) ? (56 - _bufferLen) : (120 - _bufferLen);
74 update(padding, padLen);
77 for (
size_t i = 0; i < 5; ++i) {
79 memcpy(digest + i * 4, &be, 4);
83 static void sha1(uint8_t digest[20],
const uint8_t* data,
size_t len)
86 ctx.update(data, len);
91 void transform(uint32_t state[5],
const uint8_t buffer[64])
93 uint32_t a = state[0], b = state[1], c = state[2], d = state[3], e = state[4];
96 for (
int i = 0; i < 16; ++i) {
97 block[i] = (uint32_t(buffer[i * 4 + 0]) << 24) | (uint32_t(buffer[i * 4 + 1]) << 16) |
98 (uint32_t(buffer[i * 4 + 2]) << 8) | (uint32_t(buffer[i * 4 + 3]));
100 for (
int i = 16; i < 80; ++i) {
101 block[i] = rol(block[i - 3] ^ block[i - 8] ^ block[i - 14] ^ block[i - 16], 1);
104 for (
int i = 0; i < 80; ++i) {
107 f = (b & c) | ((~b) & d);
113 f = (b & c) | (b & d) | (c & d);
120 uint32_t temp = rol(a, 5) + f + e + k + block[i];
135 inline uint32_t rol(uint32_t value, uint32_t bits)
137 return (value << bits) | (value >> (32 - bits));
140 uint32_t _state[5]{0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0};
142 uint8_t _buffer[64]{};
std::byteswap for less than C++23
constexpr T byteswap(T v) noexcept
byteswap for integral type
Definition byteswap.hpp:193
Top level namespace of M5.
Definition base64.cpp:39