42 inline static uint32_t
LeftRotate(uint32_t value,
size_t count) {
43 return (value << count) ^ (value >> (32-count));
63 memcpy(m_digest, s.m_digest, 5 *
sizeof(uint32_t));
64 memcpy(m_block, s.m_block, 64);
65 m_blockByteIndex = s.m_blockByteIndex;
66 m_byteCount = s.m_byteCount;
75 m_digest[0] = 0x67452301;
76 m_digest[1] = 0xEFCDAB89;
77 m_digest[2] = 0x98BADCFE;
78 m_digest[3] = 0x10325476;
79 m_digest[4] = 0xC3D2E1F0;
89 this->m_block[this->m_blockByteIndex++] = octet;
91 if(m_blockByteIndex == 64) {
92 this->m_blockByteIndex = 0;
102 const uint8_t* begin =
static_cast<const uint8_t*
>(start);
103 const uint8_t* finish =
static_cast<const uint8_t*
>(end);
104 while(begin != finish) {
115 const uint8_t* block =
static_cast<const uint8_t*
>(data);
124 size_t bitCount = this->m_byteCount * 8;
126 if (this->m_blockByteIndex > 56) {
127 while (m_blockByteIndex != 0) {
130 while (m_blockByteIndex < 56) {
134 while (m_blockByteIndex < 56) {
142 processByte(
static_cast<unsigned char>((bitCount>>24) & 0xFF));
143 processByte(
static_cast<unsigned char>((bitCount>>16) & 0xFF));
144 processByte(
static_cast<unsigned char>((bitCount>>8 ) & 0xFF));
145 processByte(
static_cast<unsigned char>((bitCount) & 0xFF));
147 memcpy(digest, m_digest, 5 *
sizeof(uint32_t));
158 digest[di++] = ((d32[0] >> 24) & 0xFF);
159 digest[di++] = ((d32[0] >> 16) & 0xFF);
160 digest[di++] = ((d32[0] >> 8) & 0xFF);
161 digest[di++] = ((d32[0]) & 0xFF);
163 digest[di++] = ((d32[1] >> 24) & 0xFF);
164 digest[di++] = ((d32[1] >> 16) & 0xFF);
165 digest[di++] = ((d32[1] >> 8) & 0xFF);
166 digest[di++] = ((d32[1]) & 0xFF);
168 digest[di++] = ((d32[2] >> 24) & 0xFF);
169 digest[di++] = ((d32[2] >> 16) & 0xFF);
170 digest[di++] = ((d32[2] >> 8) & 0xFF);
171 digest[di++] = ((d32[2]) & 0xFF);
173 digest[di++] = ((d32[3] >> 24) & 0xFF);
174 digest[di++] = ((d32[3] >> 16) & 0xFF);
175 digest[di++] = ((d32[3] >> 8) & 0xFF);
176 digest[di++] = ((d32[3]) & 0xFF);
178 digest[di++] = ((d32[4] >> 24) & 0xFF);
179 digest[di++] = ((d32[4] >> 16) & 0xFF);
180 digest[di++] = ((d32[4] >> 8) & 0xFF);
181 digest[di++] = ((d32[4]) & 0xFF);
192 for (
size_t i = 0; i < 16; i++) {
193 w[i] = (m_block[i*4 + 0] << 24);
194 w[i] |= (m_block[i*4 + 1] << 16);
195 w[i] |= (m_block[i*4 + 2] << 8);
196 w[i] |= (m_block[i*4 + 3]);
198 for (
size_t i = 16; i < 80; i++) {
199 w[i] =
LeftRotate((w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]), 1);
202 uint32_t a = m_digest[0];
203 uint32_t b = m_digest[1];
204 uint32_t c = m_digest[2];
205 uint32_t d = m_digest[3];
206 uint32_t e = m_digest[4];
208 for (std::size_t i=0; i<80; ++i) {
213 f = (b & c) | (~b & d);
219 f = (b & c) | (b & d) | (c & d);
225 uint32_t temp =
LeftRotate(a, 5) + f + e + k + w[i];
242 size_t m_blockByteIndex;