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.