19constexpr uint32_t
K[64] = {
20 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
21 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
22 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
23 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
24 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
25 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
26 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
27 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
28 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
29 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
30 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
33#define ROTLEFT(a, b) (((a) << (b)) | ((a) >> (32 - (b))))
34#define ROTRIGHT(a, b) (((a) >> (b)) | ((a) << (32 - (b))))
36#define CH(x, y, z) (((x) & (y)) ^ (~(x) & (z)))
37#define MAJ(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
38#define EP0(x) (ROTRIGHT(x, 2) ^ ROTRIGHT(x, 13) ^ ROTRIGHT(x, 22))
39#define EP1(x) (ROTRIGHT(x, 6) ^ ROTRIGHT(x, 11) ^ ROTRIGHT(x, 25))
40#define SIG0(x) (ROTRIGHT(x, 7) ^ ROTRIGHT(x, 18) ^ ((x) >> 3))
41#define SIG1(x) (ROTRIGHT(x, 17) ^ ROTRIGHT(x, 19) ^ ((x) >> 10))
50 for (; i < 16; ++i, j += 4)
51 m[i] = (data[j] << 24) | (data[j + 1] << 16) | (data[j + 2] << 8) |
55 m[i] =
SIG1(m[i - 2]) + m[i - 7] +
SIG0(m[i - 15]) + m[i - 16];
57 uint32_t a = state[0];
58 uint32_t b = state[1];
59 uint32_t c = state[2];
60 uint32_t d = state[3];
61 uint32_t e = state[4];
62 uint32_t f = state[5];
63 uint32_t g = state[6];
64 uint32_t h = state[7];
68 const uint32_t t1 = h +
EP1(e) +
CH(e, f, g) +
K[i] + m[i];
69 const uint32_t t2 =
EP0(a) +
MAJ(a, b, c);
100 const uint8_t* dataPtr =
static_cast<const uint8_t*
>(data);
104 std::size_t blockSize =
110 dataPtr += blockSize;
124 Update(zString, std::strlen(zString));
130 std::size_t padLength;
166 for (
int i = 0; i < 8; ++i)
168 result[i * 4 + 0] = (
mState[i] >> 24) & 0xff;
169 result[i * 4 + 1] = (
mState[i] >> 16) & 0xff;
170 result[i * 4 + 2] = (
mState[i] >> 8) & 0xff;
171 result[i * 4 + 3] = (
mState[i] >> 0) & 0xff;
177 constexpr char hexChars[] =
"0123456789ABCDEF";
178 std::string resultStr;
183 resultStr[i * 2 + 0] = hexChars[(result[i] >> 4) & 0xf];
184 resultStr[i * 2 + 1] = hexChars[result[i] & 0xf];
void Update(const void *data, std::size_t size)
uint8_t mBuffer[BLOCK_SIZE]
static constexpr std::size_t HASH_SIZE
static constexpr std::size_t BLOCK_SIZE
void sha256_transform(uint32_t state[8], const uint8_t data[64])