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 
   73#define _SHA256_UNROLL2 
   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)) 
  148static 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};
 
  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 
  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++)
 
  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]));
 
  226   uint32_t curBufferPos = (uint32_t)p->
count & 0x3F;
 
  228      p->
buffer[curBufferPos++] = *data++;
 
  231      if (curBufferPos == 64) {
 
  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)
 
  248      p->
buffer[curBufferPos++] = 0;
 
  250   for (i = 0; i < 8; i++) {
 
  251      p->
buffer[curBufferPos++] = (
unsigned char)(lenInBits >> 56);
 
  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]);
 
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
 
unsigned long long ULong64_t
 
void sha256_update(sha256_t *p, const unsigned char *data, size_t size)
 
static void sha256_transform(uint32_t *state, const uint32_t *data)
 
static void sha256_write_byte_block(sha256_t *p)
 
static const uint32_t K[64]
 
void sha256_final(sha256_t *p, unsigned char *digest)
 
void sha256_init(sha256_t *p)
 
void sha256_hash(unsigned char *buf, const unsigned char *data, size_t size)
 
void Sha256(const unsigned char *data, int len, ULong64_t *fDigest)
 
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...