33static inline std::uint32_t
min(std::uint32_t x, std::uint32_t y) {
37static inline void store64h(std::uint64_t x,
unsigned char* y) {
38 for (
int i = 0; i != 8; ++i)
39 y[i] = (x >> ((7 - i) * 8)) & 255;
41static inline std::uint32_t
load32h(
const std::uint8_t* y) {
42 return (std::uint32_t(y[0]) << 24) | (std::uint32_t(y[1]) << 16) |
43 (std::uint32_t(y[2]) << 8) | (std::uint32_t(y[3]) << 0);
45static inline void store32h(std::uint32_t x, std::uint8_t* y) {
46 for (
int i = 0; i != 4; ++i)
47 y[i] = (x >> ((3 - i) * 8)) & 255;
51std::uint32_t
F0(
const std::uint32_t& x,
const std::uint32_t& y,
const std::uint32_t& z) {
52 return (z ^ (x & (y ^ z)));
55std::uint32_t
F1(
const std::uint32_t& x,
const std::uint32_t& y,
const std::uint32_t& z) {
59std::uint32_t
F2(
const std::uint32_t& x,
const std::uint32_t& y,
const std::uint32_t& z) {
60 return ((x & y) | (z & (x | y)));
63std::uint32_t
F3(
const std::uint32_t& x,
const std::uint32_t& y,
const std::uint32_t& z) {
67static void sha1_compress(std::uint32_t state[4],
const std::uint8_t* buf) {
68 std::uint32_t a, b, c, d, e, W[80], i, t;
71 for (i = 0; i < 16; i++) {
83 for (i = 16; i < 80; i++) {
84 W[i] =
rol32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
88 for (i = 0; i < 20; ++i) {
89 e = (
rol32(a, 5) +
F0(b, c, d) + e + W[i] + 0x5a827999UL);
91 t = e, e = d, d = c, c = b, b = a, a = t;
93 for ( ; i < 40; ++i) {
94 e = (
rol32(a, 5) +
F1(b, c, d) + e + W[i] + 0x6ed9eba1UL);
96 t = e, e = d, d = c, c = b, b = a, a = t;
98 for ( ; i < 60; ++i) {
99 e = (
rol32(a, 5) +
F2(b, c, d) + e + W[i] + 0x8f1bbcdcUL);
101 t = e, e = d, d = c, c = b, b = a, a = t;
103 for ( ; i < 80; ++i) {
104 e = (
rol32(a, 5) +
F3(b, c, d) + e + W[i] + 0xca62c1d6UL);
106 t = e, e = d, d = c, c = b, b = a, a = t;
110 state[0] = state[0] + a;
111 state[1] = state[1] + b;
112 state[2] = state[2] + c;
113 state[3] = state[3] + d;
114 state[4] = state[4] + e;
138 const std::uint32_t block_size =
sizeof(
SHA1::buf_);
139 auto in =
static_cast<const std::uint8_t*
>(data);
143 if (
curlen_ == 0 && size >= block_size)
154 for (
const std::uint8_t* a = in; a != in + n; ++a, ++b) {
172 return process(str.data(), str.size());
201 for (
size_t i = 0; i < 5; i++)
207 finalize(
const_cast<char*
>(out.data()));
223std::string
sha1_hex(
const void* data, std::uint32_t size) {
SHA-1 processor without external dependencies.
void finalize(void *digest)
finalize computation and output 20 byte (160 bit) digest
std::string digest_hex()
finalize computation and return 20 byte (160 bit) digest hex encoded
std::string digest()
finalize computation and return 20 byte (160 bit) digest
std::string digest_hex_uc()
finalize computation and return 20 byte (160 bit) digest upper-case hex
static constexpr size_t kDigestLength
digest length in bytes
void process(const void *data, std::uint32_t size)
process more data
SHA1()
construct empty object.
std::string sha1_hex_uc(const void *data, std::uint32_t size)
process data and return 20 byte (160 bit) digest upper-case hex encoded
std::string sha1_hex(const void *data, std::uint32_t size)
process data and return 20 byte (160 bit) digest hex encoded
static std::uint32_t rol32(const std::uint32_t &x, int i)
rol32 - generic
std::string hexdump_lc(const void *const data, size_t size)
Dump a (binary) string as a sequence of lowercase hexadecimal pairs.
std::string hexdump(const void *const data, size_t size)
Dump a (binary) string as a sequence of uppercase hexadecimal pairs.
static void sha1_compress(std::uint32_t state[4], const std::uint8_t *buf)
static std::uint32_t min(std::uint32_t x, std::uint32_t y)
static void store64h(std::uint64_t x, unsigned char *y)
static std::uint32_t F0(const std::uint32_t &x, const std::uint32_t &y, const std::uint32_t &z)
static std::uint32_t F1(const std::uint32_t &x, const std::uint32_t &y, const std::uint32_t &z)
static std::uint32_t load32h(const std::uint8_t *y)
static std::uint32_t F2(const std::uint32_t &x, const std::uint32_t &y, const std::uint32_t &z)
static std::uint32_t F3(const std::uint32_t &x, const std::uint32_t &y, const std::uint32_t &z)
static void store32h(std::uint32_t x, std::uint8_t *y)