28 #define ROTL32(v, n) _rotl((v), (n))
29 #define ROTL64(v, n) _rotl64((v), (n))
31 #define ROTR32(v, n) _rotr((v), (n))
32 #define ROTR64(v, n) _rotr64((v), (n))
36 #define U8V(v) ((uint8_t)(v)&0xFFU)
37 #define U16V(v) ((uint16_t)(v)&0xFFFFU)
38 #define U32V(v) ((uint32_t)(v)&0xFFFFFFFFU)
39 #define U64V(v) ((uint64_t)(v)&0xFFFFFFFFFFFFFFFFU)
41 #define ROTL32(v, n) (U32V((uint32_t)(v) << (n)) | ((uint32_t)(v) >> (32 - (n))))
44 #define ROTL64(v, n) (U64V((uint64_t)(v) << (n)) | ((uint64_t)(v) >> (64 - (n))))
46 #define ROTR32(v, n) ROTL32(v, 32 - (n))
47 #define ROTR64(v, n) ROTL64(v, 64 - (n))
51 #define ROTL8(v, n) (U8V((uint8_t)(v) << (n)) | ((uint8_t)(v) >> (8 - (n))))
53 #define ROTL16(v, n) (U16V((uint16_t)(v) << (n)) | ((uint16_t)(v) >> (16 - (n))))
55 #define ROTR8(v, n) ROTL8(v, 8 - (n))
56 #define ROTR16(v, n) ROTL16(v, 16 - (n))
58 #define SHA256_DIGEST_SIZE 32
60 typedef struct sha256_t {
63 unsigned char buffer[64];
66 void sha256_init(sha256_t *p);
67 void sha256_update(sha256_t *p,
const unsigned char *data,
size_t size);
68 void sha256_final(sha256_t *p,
unsigned char *digest);
69 void sha256_hash(
unsigned char *buf,
const unsigned char *data,
size_t size);
72 #define _SHA256_UNROLL
73 #define _SHA256_UNROLL2
75 void sha256_init(sha256_t *p)
77 p->state[0] = 0x6a09e667;
78 p->state[1] = 0xbb67ae85;
79 p->state[2] = 0x3c6ef372;
80 p->state[3] = 0xa54ff53a;
81 p->state[4] = 0x510e527f;
82 p->state[5] = 0x9b05688c;
83 p->state[6] = 0x1f83d9ab;
84 p->state[7] = 0x5be0cd19;
88 #define S0(x) (ROTR32(x, 2) ^ ROTR32(x, 13) ^ ROTR32(x, 22))
89 #define S1(x) (ROTR32(x, 6) ^ ROTR32(x, 11) ^ ROTR32(x, 25))
90 #define s0(x) (ROTR32(x, 7) ^ ROTR32(x, 18) ^ (x >> 3))
91 #define s1(x) (ROTR32(x, 17) ^ ROTR32(x, 19) ^ (x >> 10))
93 #define blk0(i) (W[i] = data[i])
94 #define blk2(i) (W[i & 15] += s1(W[(i - 2) & 15]) + W[(i - 7) & 15] + s0(W[(i - 15) & 15]))
96 #define Ch(x, y, z) (z ^ (x & (y ^ z)))
97 #define Maj(x, y, z) ((x & y) | (z & (x | y)))
99 #define a(i) T[(0 - (i)) & 7]
100 #define b(i) T[(1 - (i)) & 7]
101 #define c(i) T[(2 - (i)) & 7]
102 #define d(i) T[(3 - (i)) & 7]
103 #define e(i) T[(4 - (i)) & 7]
104 #define f(i) T[(5 - (i)) & 7]
105 #define g(i) T[(6 - (i)) & 7]
106 #define h(i) T[(7 - (i)) & 7]
108 #ifdef _SHA256_UNROLL2
110 #define R(a, b, c, d, e, f, g, h, i) \
111 h += S1(e) + Ch(e, f, g) + K[i + j] + (j ? blk2(i) : blk0(i)); \
113 h += S0(a) + Maj(a, b, c)
116 R(a, b, c, d, e, f, g, h, i); \
117 R(h, a, b, c, d, e, f, g, (i + 1)); \
118 R(g, h, a, b, c, d, e, f, (i + 2)); \
119 R(f, g, h, a, b, c, d, e, (i + 3)); \
120 R(e, f, g, h, a, b, c, d, (i + 4)); \
121 R(d, e, f, g, h, a, b, c, (i + 5)); \
122 R(c, d, e, f, g, h, a, b, (i + 6)); \
123 R(b, c, d, e, f, g, h, a, (i + 7))
128 h(i) += S1(e(i)) + Ch(e(i), f(i), g(i)) + K[i + j] + (j ? blk2(i) : blk0(i)); \
130 h(i) += S0(a(i)) + Maj(a(i), b(i), c(i))
132 #ifdef _SHA256_UNROLL
148 static const uint32_t K[64] = {
149 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
150 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
151 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
152 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
153 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
154 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
155 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
156 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2};
158 static void sha256_transform(uint32_t *state,
const uint32_t *data)
160 uint32_t W[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U};
162 #ifdef _SHA256_UNROLL2
163 uint32_t a, b, c, d, e, f, g, h;
174 for (j = 0; j < 8; j++)
178 for (j = 0; j < 64; j += 16) {
179 #if defined(_SHA256_UNROLL) || defined(_SHA256_UNROLL2)
184 for (i = 0; i < 16; i++) {
190 #ifdef _SHA256_UNROLL2
200 for (j = 0; j < 8; j++)
214 static void sha256_write_byte_block(sha256_t *p)
218 for (i = 0; i < 16; i++)
219 data32[i] = ((uint32_t)(p->buffer[i * 4]) << 24) + ((uint32_t)(p->buffer[i * 4 + 1]) << 16) +
220 ((uint32_t)(p->buffer[i * 4 + 2]) << 8) + ((uint32_t)(p->buffer[i * 4 + 3]));
221 sha256_transform(p->state, data32);
224 void sha256_update(sha256_t *p,
const unsigned char *data,
size_t size)
226 uint32_t curBufferPos = (uint32_t)p->count & 0x3F;
228 p->buffer[curBufferPos++] = *data++;
231 if (curBufferPos == 64) {
233 sha256_write_byte_block(p);
238 void sha256_final(sha256_t *p,
unsigned char *digest)
240 uint64_t lenInBits = (p->count << 3);
241 uint32_t curBufferPos = (uint32_t)p->count & 0x3F;
243 p->buffer[curBufferPos++] = 0x80;
244 while (curBufferPos != (64 - 8)) {
245 curBufferPos &= 0x3F;
246 if (curBufferPos == 0)
247 sha256_write_byte_block(p);
248 p->buffer[curBufferPos++] = 0;
250 for (i = 0; i < 8; i++) {
251 p->buffer[curBufferPos++] = (
unsigned char)(lenInBits >> 56);
254 sha256_write_byte_block(p);
256 for (i = 0; i < 8; i++) {
257 *digest++ = (
unsigned char)(p->state[i] >> 24);
258 *digest++ = (
unsigned char)(p->state[i] >> 16);
259 *digest++ = (
unsigned char)(p->state[i] >> 8);
260 *digest++ = (
unsigned char)(p->state[i]);
267 void Sha256(
const unsigned char *data,
int len, ULong64_t *fDigest)
271 SHA256::sha256_t hash;
272 SHA256::sha256_init(&hash);
273 SHA256::sha256_update(&hash, data, len);
274 SHA256::sha256_final(&hash, reinterpret_cast<unsigned char *>(fDigest));