diff options
Diffstat (limited to 'src/sha1/sha1.hpp')
| -rw-r--r-- | src/sha1/sha1.hpp | 255 |
1 files changed, 0 insertions, 255 deletions
diff --git a/src/sha1/sha1.hpp b/src/sha1/sha1.hpp deleted file mode 100644 index 3baeec4..0000000 --- a/src/sha1/sha1.hpp +++ /dev/null @@ -1,255 +0,0 @@ -#include <stdint.h> -#include <string.h> - -#define SHA1_HEX_SIZE (40 + 1) -#define SHA1_BASE64_SIZE (28 + 1) - -class sha1 { -private: - - void add_byte_dont_count_bits(uint8_t x) { - buf[i++] = x; - - if (i >= sizeof(buf)) { - i = 0; - process_block(buf); - } - } - - static uint32_t rol32(uint32_t x, uint32_t n) { - return (x << n) | (x >> (32 - n)); - } - - static uint32_t make_word(const uint8_t *p) { - return - ((uint32_t) p[0] << 3 * 8) | - ((uint32_t) p[1] << 2 * 8) | - ((uint32_t) p[2] << 1 * 8) | - ((uint32_t) p[3] << 0 * 8); - } - - void process_block(const uint8_t *ptr) { - const uint32_t c0 = 0x5a827999; - const uint32_t c1 = 0x6ed9eba1; - const uint32_t c2 = 0x8f1bbcdc; - const uint32_t c3 = 0xca62c1d6; - - uint32_t a = state[0]; - uint32_t b = state[1]; - uint32_t c = state[2]; - uint32_t d = state[3]; - uint32_t e = state[4]; - - uint32_t w[16]; - - for (int i = 0; i < 16; i++) w[i] = make_word(ptr + i * 4); - -#define SHA1_LOAD(i) w[i&15] = rol32(w[(i+13)&15] ^ w[(i+8)&15] ^ w[(i+2)&15] ^ w[i&15], 1); -#define SHA1_ROUND_0(v, u, x, y, z, i) z += ((u & (x ^ y)) ^ y) + w[i&15] + c0 + rol32(v, 5); u = rol32(u, 30); -#define SHA1_ROUND_1(v, u, x, y, z, i) SHA1_LOAD(i) z += ((u & (x ^ y)) ^ y) + w[i&15] + c0 + rol32(v, 5); u = rol32(u, 30); -#define SHA1_ROUND_2(v, u, x, y, z, i) SHA1_LOAD(i) z += (u ^ x ^ y) + w[i&15] + c1 + rol32(v, 5); u = rol32(u, 30); -#define SHA1_ROUND_3(v, u, x, y, z, i) SHA1_LOAD(i) z += (((u | x) & y) | (u & x)) + w[i&15] + c2 + rol32(v, 5); u = rol32(u, 30); -#define SHA1_ROUND_4(v, u, x, y, z, i) SHA1_LOAD(i) z += (u ^ x ^ y) + w[i&15] + c3 + rol32(v, 5); u = rol32(u, 30); - - SHA1_ROUND_0(a, b, c, d, e, 0); - SHA1_ROUND_0(e, a, b, c, d, 1); - SHA1_ROUND_0(d, e, a, b, c, 2); - SHA1_ROUND_0(c, d, e, a, b, 3); - SHA1_ROUND_0(b, c, d, e, a, 4); - SHA1_ROUND_0(a, b, c, d, e, 5); - SHA1_ROUND_0(e, a, b, c, d, 6); - SHA1_ROUND_0(d, e, a, b, c, 7); - SHA1_ROUND_0(c, d, e, a, b, 8); - SHA1_ROUND_0(b, c, d, e, a, 9); - SHA1_ROUND_0(a, b, c, d, e, 10); - SHA1_ROUND_0(e, a, b, c, d, 11); - SHA1_ROUND_0(d, e, a, b, c, 12); - SHA1_ROUND_0(c, d, e, a, b, 13); - SHA1_ROUND_0(b, c, d, e, a, 14); - SHA1_ROUND_0(a, b, c, d, e, 15); - SHA1_ROUND_1(e, a, b, c, d, 16); - SHA1_ROUND_1(d, e, a, b, c, 17); - SHA1_ROUND_1(c, d, e, a, b, 18); - SHA1_ROUND_1(b, c, d, e, a, 19); - SHA1_ROUND_2(a, b, c, d, e, 20); - SHA1_ROUND_2(e, a, b, c, d, 21); - SHA1_ROUND_2(d, e, a, b, c, 22); - SHA1_ROUND_2(c, d, e, a, b, 23); - SHA1_ROUND_2(b, c, d, e, a, 24); - SHA1_ROUND_2(a, b, c, d, e, 25); - SHA1_ROUND_2(e, a, b, c, d, 26); - SHA1_ROUND_2(d, e, a, b, c, 27); - SHA1_ROUND_2(c, d, e, a, b, 28); - SHA1_ROUND_2(b, c, d, e, a, 29); - SHA1_ROUND_2(a, b, c, d, e, 30); - SHA1_ROUND_2(e, a, b, c, d, 31); - SHA1_ROUND_2(d, e, a, b, c, 32); - SHA1_ROUND_2(c, d, e, a, b, 33); - SHA1_ROUND_2(b, c, d, e, a, 34); - SHA1_ROUND_2(a, b, c, d, e, 35); - SHA1_ROUND_2(e, a, b, c, d, 36); - SHA1_ROUND_2(d, e, a, b, c, 37); - SHA1_ROUND_2(c, d, e, a, b, 38); - SHA1_ROUND_2(b, c, d, e, a, 39); - SHA1_ROUND_3(a, b, c, d, e, 40); - SHA1_ROUND_3(e, a, b, c, d, 41); - SHA1_ROUND_3(d, e, a, b, c, 42); - SHA1_ROUND_3(c, d, e, a, b, 43); - SHA1_ROUND_3(b, c, d, e, a, 44); - SHA1_ROUND_3(a, b, c, d, e, 45); - SHA1_ROUND_3(e, a, b, c, d, 46); - SHA1_ROUND_3(d, e, a, b, c, 47); - SHA1_ROUND_3(c, d, e, a, b, 48); - SHA1_ROUND_3(b, c, d, e, a, 49); - SHA1_ROUND_3(a, b, c, d, e, 50); - SHA1_ROUND_3(e, a, b, c, d, 51); - SHA1_ROUND_3(d, e, a, b, c, 52); - SHA1_ROUND_3(c, d, e, a, b, 53); - SHA1_ROUND_3(b, c, d, e, a, 54); - SHA1_ROUND_3(a, b, c, d, e, 55); - SHA1_ROUND_3(e, a, b, c, d, 56); - SHA1_ROUND_3(d, e, a, b, c, 57); - SHA1_ROUND_3(c, d, e, a, b, 58); - SHA1_ROUND_3(b, c, d, e, a, 59); - SHA1_ROUND_4(a, b, c, d, e, 60); - SHA1_ROUND_4(e, a, b, c, d, 61); - SHA1_ROUND_4(d, e, a, b, c, 62); - SHA1_ROUND_4(c, d, e, a, b, 63); - SHA1_ROUND_4(b, c, d, e, a, 64); - SHA1_ROUND_4(a, b, c, d, e, 65); - SHA1_ROUND_4(e, a, b, c, d, 66); - SHA1_ROUND_4(d, e, a, b, c, 67); - SHA1_ROUND_4(c, d, e, a, b, 68); - SHA1_ROUND_4(b, c, d, e, a, 69); - SHA1_ROUND_4(a, b, c, d, e, 70); - SHA1_ROUND_4(e, a, b, c, d, 71); - SHA1_ROUND_4(d, e, a, b, c, 72); - SHA1_ROUND_4(c, d, e, a, b, 73); - SHA1_ROUND_4(b, c, d, e, a, 74); - SHA1_ROUND_4(a, b, c, d, e, 75); - SHA1_ROUND_4(e, a, b, c, d, 76); - SHA1_ROUND_4(d, e, a, b, c, 77); - SHA1_ROUND_4(c, d, e, a, b, 78); - SHA1_ROUND_4(b, c, d, e, a, 79); - -#undef SHA1_LOAD -#undef SHA1_ROUND_0 -#undef SHA1_ROUND_1 -#undef SHA1_ROUND_2 -#undef SHA1_ROUND_3 -#undef SHA1_ROUND_4 - - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - } - -public: - - uint32_t state[5]; - uint8_t buf[64]; - uint32_t i; - uint64_t n_bits; - - sha1(const char *text = NULL) : i(0), n_bits(0) { - state[0] = 0x67452301; - state[1] = 0xEFCDAB89; - state[2] = 0x98BADCFE; - state[3] = 0x10325476; - state[4] = 0xC3D2E1F0; - if (text) add(text); - } - - sha1 &add(uint8_t x) { - add_byte_dont_count_bits(x); - n_bits += 8; - return *this; - } - - sha1 &add(char c) { - return add(*(uint8_t *) &c); - } - - sha1 &add(const void *data, uint32_t n) { - if (!data) return *this; - - const uint8_t *ptr = (const uint8_t *) data; - - // fill up block if not full - for (; n && i % sizeof(buf); n--) add(*ptr++); - - // process full blocks - for (; n >= sizeof(buf); n -= sizeof(buf)) { - process_block(ptr); - ptr += sizeof(buf); - n_bits += sizeof(buf) * 8; - } - - // process remaining part of block - for (; n; n--) add(*ptr++); - - return *this; - } - - sha1 &add(const char *text) { - if (!text) return *this; - return add(text, strlen(text)); - } - - sha1 &finalize() { - // hashed text ends with 0x80, some padding 0x00 and the length in bits - add_byte_dont_count_bits(0x80); - while (i % 64 != 56) add_byte_dont_count_bits(0x00); - for (int j = 7; j >= 0; j--) add_byte_dont_count_bits(n_bits >> j * 8); - - return *this; - } - - const sha1 &print_hex( - char *hex, - bool zero_terminate = true, - const char *alphabet = "0123456789abcdef" - ) const { - // print hex - int k = 0; - for (int i = 0; i < 5; i++) { - for (int j = 7; j >= 0; j--) { - hex[k++] = alphabet[(state[i] >> j * 4) & 0xf]; - } - } - if (zero_terminate) hex[k] = '\0'; - return *this; - } - - const sha1 &print_base64(char *base64, bool zero_terminate = true) const { - static const uint8_t *table = (const uint8_t *) - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789" - "+/"; - - uint32_t triples[7] = { - ((state[0] & 0xffffff00) >> 1 * 8), - ((state[0] & 0x000000ff) << 2 * 8) | ((state[1] & 0xffff0000) >> 2 * 8), - ((state[1] & 0x0000ffff) << 1 * 8) | ((state[2] & 0xff000000) >> 3 * 8), - ((state[2] & 0x00ffffff) << 0 * 8), - ((state[3] & 0xffffff00) >> 1 * 8), - ((state[3] & 0x000000ff) << 2 * 8) | ((state[4] & 0xffff0000) >> 2 * 8), - ((state[4] & 0x0000ffff) << 1 * 8), - }; - - for (int i = 0; i < 7; i++) { - uint32_t x = triples[i]; - base64[i * 4 + 0] = table[(x >> 3 * 6) % 64]; - base64[i * 4 + 1] = table[(x >> 2 * 6) % 64]; - base64[i * 4 + 2] = table[(x >> 1 * 6) % 64]; - base64[i * 4 + 3] = table[(x >> 0 * 6) % 64]; - } - - base64[SHA1_BASE64_SIZE - 2] = '='; - if (zero_terminate) base64[SHA1_BASE64_SIZE - 1] = '\0'; - return *this; - } -}; |