63inline MD5::uint4 MD5::F(uint4 x, uint4 y, uint4 z) {
64 return (x&y) | (~x&z);
67inline MD5::uint4 MD5::G(uint4 x, uint4 y, uint4 z) {
68 return (x&z) | (y&~z);
71inline MD5::uint4 MD5::H(uint4 x, uint4 y, uint4 z) {
75inline MD5::uint4 MD5::I(uint4 x, uint4 y, uint4 z) {
76 return y ^ (x | ( ~z));
80inline MD5::uint4 MD5::rotate_left(uint4 x,
int n) {
81 return (x << n) | (x >> (32-n));
86inline void MD5::FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
87 a = rotate_left(a+ F(b,c,d) + x + ac, s) + b;
90inline void MD5::GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
91 a = rotate_left(a + G(b,c,d) + x + ac, s) + b;
94inline void MD5::HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
95 a = rotate_left(a + H(b,c,d) + x + ac, s) + b;
98inline void MD5::II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
99 a = rotate_left(a + I(b,c,d) + x + ac, s) + b;
116 update(text.c_str(), (
unsigned int)(text.length()));
131 state[0] = 0x67452301;
132 state[1] = 0xefcdab89;
133 state[2] = 0x98badcfe;
134 state[3] = 0x10325476;
140void MD5::decode(uint4 output[],
const uint1 input[], size_type len)
142 for (
unsigned int i = 0, j = 0; j < len; i++, j += 4)
143 output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) |
144 (((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24);
151void MD5::encode(uint1 output[],
const uint4 input[], size_type len)
153 for (
size_type i = 0, j = 0; j < len; i++, j += 4) {
154 output[j] = input[i] & 0xff;
155 output[j+1] = (input[i] >> 8) & 0xff;
156 output[j+2] = (input[i] >> 16) & 0xff;
157 output[j+3] = (input[i] >> 24) & 0xff;
164void MD5::transform(
const uint1 block[blocksize])
166 uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
167 decode (x, block, blocksize);
170 FF (a, b, c, d, x[ 0],
S11, 0xd76aa478);
171 FF (d, a, b, c, x[ 1],
S12, 0xe8c7b756);
172 FF (c, d, a, b, x[ 2],
S13, 0x242070db);
173 FF (b, c, d, a, x[ 3],
S14, 0xc1bdceee);
174 FF (a, b, c, d, x[ 4],
S11, 0xf57c0faf);
175 FF (d, a, b, c, x[ 5],
S12, 0x4787c62a);
176 FF (c, d, a, b, x[ 6],
S13, 0xa8304613);
177 FF (b, c, d, a, x[ 7],
S14, 0xfd469501);
178 FF (a, b, c, d, x[ 8],
S11, 0x698098d8);
179 FF (d, a, b, c, x[ 9],
S12, 0x8b44f7af);
180 FF (c, d, a, b, x[10],
S13, 0xffff5bb1);
181 FF (b, c, d, a, x[11],
S14, 0x895cd7be);
182 FF (a, b, c, d, x[12],
S11, 0x6b901122);
183 FF (d, a, b, c, x[13],
S12, 0xfd987193);
184 FF (c, d, a, b, x[14],
S13, 0xa679438e);
185 FF (b, c, d, a, x[15],
S14, 0x49b40821);
188 GG (a, b, c, d, x[ 1],
S21, 0xf61e2562);
189 GG (d, a, b, c, x[ 6],
S22, 0xc040b340);
190 GG (c, d, a, b, x[11],
S23, 0x265e5a51);
191 GG (b, c, d, a, x[ 0],
S24, 0xe9b6c7aa);
192 GG (a, b, c, d, x[ 5],
S21, 0xd62f105d);
193 GG (d, a, b, c, x[10],
S22, 0x2441453);
194 GG (c, d, a, b, x[15],
S23, 0xd8a1e681);
195 GG (b, c, d, a, x[ 4],
S24, 0xe7d3fbc8);
196 GG (a, b, c, d, x[ 9],
S21, 0x21e1cde6);
197 GG (d, a, b, c, x[14],
S22, 0xc33707d6);
198 GG (c, d, a, b, x[ 3],
S23, 0xf4d50d87);
199 GG (b, c, d, a, x[ 8],
S24, 0x455a14ed);
200 GG (a, b, c, d, x[13],
S21, 0xa9e3e905);
201 GG (d, a, b, c, x[ 2],
S22, 0xfcefa3f8);
202 GG (c, d, a, b, x[ 7],
S23, 0x676f02d9);
203 GG (b, c, d, a, x[12],
S24, 0x8d2a4c8a);
206 HH (a, b, c, d, x[ 5],
S31, 0xfffa3942);
207 HH (d, a, b, c, x[ 8],
S32, 0x8771f681);
208 HH (c, d, a, b, x[11],
S33, 0x6d9d6122);
209 HH (b, c, d, a, x[14],
S34, 0xfde5380c);
210 HH (a, b, c, d, x[ 1],
S31, 0xa4beea44);
211 HH (d, a, b, c, x[ 4],
S32, 0x4bdecfa9);
212 HH (c, d, a, b, x[ 7],
S33, 0xf6bb4b60);
213 HH (b, c, d, a, x[10],
S34, 0xbebfbc70);
214 HH (a, b, c, d, x[13],
S31, 0x289b7ec6);
215 HH (d, a, b, c, x[ 0],
S32, 0xeaa127fa);
216 HH (c, d, a, b, x[ 3],
S33, 0xd4ef3085);
217 HH (b, c, d, a, x[ 6],
S34, 0x4881d05);
218 HH (a, b, c, d, x[ 9],
S31, 0xd9d4d039);
219 HH (d, a, b, c, x[12],
S32, 0xe6db99e5);
220 HH (c, d, a, b, x[15],
S33, 0x1fa27cf8);
221 HH (b, c, d, a, x[ 2],
S34, 0xc4ac5665);
224 II (a, b, c, d, x[ 0],
S41, 0xf4292244);
225 II (d, a, b, c, x[ 7],
S42, 0x432aff97);
226 II (c, d, a, b, x[14],
S43, 0xab9423a7);
227 II (b, c, d, a, x[ 5],
S44, 0xfc93a039);
228 II (a, b, c, d, x[12],
S41, 0x655b59c3);
229 II (d, a, b, c, x[ 3],
S42, 0x8f0ccc92);
230 II (c, d, a, b, x[10],
S43, 0xffeff47d);
231 II (b, c, d, a, x[ 1],
S44, 0x85845dd1);
232 II (a, b, c, d, x[ 8],
S41, 0x6fa87e4f);
233 II (d, a, b, c, x[15],
S42, 0xfe2ce6e0);
234 II (c, d, a, b, x[ 6],
S43, 0xa3014314);
235 II (b, c, d, a, x[13],
S44, 0x4e0811a1);
236 II (a, b, c, d, x[ 4],
S41, 0xf7537e82);
237 II (d, a, b, c, x[11],
S42, 0xbd3af235);
238 II (c, d, a, b, x[ 2],
S43, 0x2ad7d2bb);
239 II (b, c, d, a, x[ 9],
S44, 0xeb86d391);
247 memset(x, 0,
sizeof x);
254void MD5::update(
const unsigned char input[], size_type length)
257 size_type index = count[0] / 8 % blocksize;
260 if ((count[0] += (length << 3)) < (length << 3))
262 count[1] += (length >> 29);
270 if (length >= firstpart)
273 memcpy(&buffer[index], input, firstpart);
277 for (i = firstpart; i + blocksize <= length; i += blocksize)
278 transform(&input[i]);
286 memcpy(&buffer[index], &input[i], length-i);
292void MD5::update(
const char input[], size_type length)
294 update((
const unsigned char*)input, length);
303 static unsigned char padding[64] = {
304 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
305 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
306 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
311 unsigned char bits[8];
312 encode(bits, count, 8);
316 size_type padLen = (index < 56) ? (56 - index) : (120 - index);
323 encode(digest, state, 16);
326 memset(buffer, 0,
sizeof buffer);
327 memset(count, 0,
sizeof count);
344 for (
int i=0; i<16; i++)
345 sprintf(buf+i*2,
"%02x", digest[i]);
348 return std::string(buf);
355 return out <<
md5.hexdigest();
360std::string
md5(
const std::string str)
364 return md5.hexdigest();
std::string hexdigest() const
void update(const unsigned char *buf, size_type length)
std::string md5(const std::string str)
std::ostream & operator<<(std::ostream &out, MD5 md5)