25 #include "utility/RotateUtil.h" 
   26 #include "utility/EndianUtil.h" 
   27 #include "utility/ProgMemUtil.h" 
   78     state.h[0] = 0x6a09e667;
 
   79     state.h[1] = 0xbb67ae85;
 
   80     state.h[2] = 0x3c6ef372;
 
   81     state.h[3] = 0xa54ff53a,
 
   82     state.h[4] = 0x510e527f;
 
   83     state.h[5] = 0x9b05688c;
 
   84     state.h[6] = 0x1f83d9ab;
 
   85     state.h[7] = 0x5be0cd19;
 
   93     state.length += ((uint64_t)len) << 3;
 
   96     const uint8_t *d = (
const uint8_t *)data;
 
   98         uint8_t size = 64 - state.chunkSize;
 
  101         memcpy(((uint8_t *)state.w) + state.chunkSize, d, size);
 
  102         state.chunkSize += size;
 
  105         if (state.chunkSize == 64) {
 
  116     uint8_t *wbytes = (uint8_t *)state.w;
 
  117     if (state.chunkSize <= (64 - 9)) {
 
  118         wbytes[state.chunkSize] = 0x80;
 
  119         memset(wbytes + state.chunkSize + 1, 0x00, 64 - 8 - (state.chunkSize + 1));
 
  120         state.w[14] = htobe32((uint32_t)(state.length >> 32));
 
  121         state.w[15] = htobe32((uint32_t)state.length);
 
  124         wbytes[state.chunkSize] = 0x80;
 
  125         memset(wbytes + state.chunkSize + 1, 0x00, 64 - (state.chunkSize + 1));
 
  127         memset(wbytes, 0x00, 64 - 8);
 
  128         state.w[14] = htobe32((uint32_t)(state.length >> 32));
 
  129         state.w[15] = htobe32((uint32_t)state.length);
 
  134     for (uint8_t posn = 0; posn < 8; ++posn)
 
  135         state.w[posn] = htobe32(state.h[posn]);
 
  139     if (len > maxHashSize)
 
  141     memcpy(hash, state.w, len);
 
  153     state.length += 64 * 8;
 
  162     state.length += 64 * 8;
 
  177     static uint32_t 
const k[64] PROGMEM = {
 
  178         0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
 
  179         0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
 
  180         0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
 
  181         0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
 
  182         0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
 
  183         0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
 
  184         0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
 
  185         0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
 
  186         0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
 
  187         0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
 
  188         0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
 
  189         0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
 
  190         0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
 
  191         0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
 
  192         0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
 
  193         0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
 
  198     for (index = 0; index < 16; ++index)
 
  199         state.w[index] = be32toh(state.w[index]);
 
  202     uint32_t a = state.h[0];
 
  203     uint32_t b = state.h[1];
 
  204     uint32_t c = state.h[2];
 
  205     uint32_t d = state.h[3];
 
  206     uint32_t e = state.h[4];
 
  207     uint32_t f = state.h[5];
 
  208     uint32_t g = state.h[6];
 
  209     uint32_t h = state.h[7];
 
  212     uint32_t temp1, temp2;
 
  213     for (index = 0; index < 16; ++index) {
 
  214         temp1 = h + pgm_read_dword(k + index) + state.w[index] +
 
  215                 (rightRotate6(e) ^ rightRotate11(e) ^ rightRotate25(e)) +
 
  216                 ((e & f) ^ ((~e) & g));
 
  217         temp2 = (rightRotate2(a) ^ rightRotate13(a) ^ rightRotate22(a)) +
 
  218                 ((a & b) ^ (a & c) ^ (b & c));
 
  232     for (; index < 64; ++index) {
 
  234         temp1 = state.w[(index - 15) & 0x0F];
 
  235         temp2 = state.w[(index - 2) & 0x0F];
 
  236         temp1 = state.w[index & 0x0F] =
 
  237             state.w[(index - 16) & 0x0F] + state.w[(index - 7) & 0x0F] +
 
  238                 (rightRotate7(temp1) ^ rightRotate18(temp1) ^ (temp1 >> 3)) +
 
  239                 (rightRotate17(temp2) ^ rightRotate19(temp2) ^ (temp2 >> 10));
 
  242         temp1 = h + pgm_read_dword(k + index) + temp1 +
 
  243                 (rightRotate6(e) ^ rightRotate11(e) ^ rightRotate25(e)) +
 
  244                 ((e & f) ^ ((~e) & g));
 
  245         temp2 = (rightRotate2(a) ^ rightRotate13(a) ^ rightRotate22(a)) +
 
  246                 ((a & b) ^ (a & c) ^ (b & c));
 
  268     a = b = c = d = e = f = g = h = temp1 = temp2 = 0;
 
void formatHMACKey(void *block, const void *key, size_t len, uint8_t pad)
Formats a HMAC key into a block.
void resetHMAC(const void *key, size_t keyLen)
Resets the hash ready for a new HMAC hashing process.
void finalizeHMAC(const void *key, size_t keyLen, void *hash, size_t hashLen)
Finalizes the HMAC hashing process and returns the hash.
void update(const void *data, size_t len)
Updates the hash with more data.
void finalize(void *hash, size_t len)
Finalizes the hashing process and returns the hash.
size_t hashSize() const
Size of the hash result from finalize().
SHA256()
Constructs a SHA-256 hash object.
virtual ~SHA256()
Destroys this SHA-256 hash object after clearing sensitive information.
void reset()
Resets the hash ready for a new hashing process.
size_t blockSize() const
Size of the internal block used by the hash algorithm.
void clear()
Clears the hash state, removing all sensitive data, and then resets the hash ready for a new hashing ...
void processChunk()
Processes a single 512-bit chunk with the core SHA-256 algorithm.