61 inline MD5::uint4 MD5::F(uint4 x, uint4 y, uint4 z) {
65 inline MD5::uint4 MD5::G(uint4 x, uint4 y, uint4 z) {
69 inline MD5::uint4 MD5::H(uint4 x, uint4 y, uint4 z) {
73 inline MD5::uint4 MD5::I(uint4 x, uint4 y, uint4 z) {
78 inline MD5::uint4 MD5::rotate_left(uint4 x,
int n) {
79 return (x << n) | (x >> (32-n));
84 inline void MD5::FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
85 a = rotate_left(a+ F(b,c,d) + x + ac, s) + b;
88 inline void MD5::GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
89 a = rotate_left(a + G(b,c,d) + x + ac, s) + b;
92 inline void MD5::HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
93 a = rotate_left(a + H(b,c,d) + x + ac, s) + b;
96 inline void MD5::II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
97 a = rotate_left(a + I(b,c,d) + x + ac, s) + b;
114 update(text.c_str(), text.length());
128 state[0] = 0x67452301;
129 state[1] = 0xefcdab89;
130 state[2] = 0x98badcfe;
131 state[3] = 0x10325476;
137 void MD5::decode(uint4 output[],
const uint1 input[], size_type len)
139 for (
unsigned int i = 0, j = 0; j < len; i++, j += 4)
140 output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) |
141 (((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24);
148 void MD5::encode(uint1 output[],
const uint4 input[], size_type len)
150 for (
size_type i = 0, j = 0; j < len; i++, j += 4) {
151 output[j] = input[i] & 0xff;
152 output[j+1] = (input[i] >> 8) & 0xff;
153 output[j+2] = (input[i] >> 16) & 0xff;
154 output[j+3] = (input[i] >> 24) & 0xff;
161 void MD5::transform(
const uint1 block[blocksize])
163 uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
164 decode (x, block, blocksize);
167 FF (a, b, c, d, x[ 0],
S11, 0xd76aa478);
168 FF (d, a, b, c, x[ 1],
S12, 0xe8c7b756);
169 FF (c, d, a, b, x[ 2],
S13, 0x242070db);
170 FF (b, c, d, a, x[ 3],
S14, 0xc1bdceee);
171 FF (a, b, c, d, x[ 4],
S11, 0xf57c0faf);
172 FF (d, a, b, c, x[ 5],
S12, 0x4787c62a);
173 FF (c, d, a, b, x[ 6],
S13, 0xa8304613);
174 FF (b, c, d, a, x[ 7],
S14, 0xfd469501);
175 FF (a, b, c, d, x[ 8],
S11, 0x698098d8);
176 FF (d, a, b, c, x[ 9],
S12, 0x8b44f7af);
177 FF (c, d, a, b, x[10],
S13, 0xffff5bb1);
178 FF (b, c, d, a, x[11],
S14, 0x895cd7be);
179 FF (a, b, c, d, x[12],
S11, 0x6b901122);
180 FF (d, a, b, c, x[13],
S12, 0xfd987193);
181 FF (c, d, a, b, x[14],
S13, 0xa679438e);
182 FF (b, c, d, a, x[15],
S14, 0x49b40821);
185 GG (a, b, c, d, x[ 1],
S21, 0xf61e2562);
186 GG (d, a, b, c, x[ 6],
S22, 0xc040b340);
187 GG (c, d, a, b, x[11],
S23, 0x265e5a51);
188 GG (b, c, d, a, x[ 0],
S24, 0xe9b6c7aa);
189 GG (a, b, c, d, x[ 5],
S21, 0xd62f105d);
190 GG (d, a, b, c, x[10],
S22, 0x2441453);
191 GG (c, d, a, b, x[15],
S23, 0xd8a1e681);
192 GG (b, c, d, a, x[ 4],
S24, 0xe7d3fbc8);
193 GG (a, b, c, d, x[ 9],
S21, 0x21e1cde6);
194 GG (d, a, b, c, x[14],
S22, 0xc33707d6);
195 GG (c, d, a, b, x[ 3],
S23, 0xf4d50d87);
196 GG (b, c, d, a, x[ 8],
S24, 0x455a14ed);
197 GG (a, b, c, d, x[13],
S21, 0xa9e3e905);
198 GG (d, a, b, c, x[ 2],
S22, 0xfcefa3f8);
199 GG (c, d, a, b, x[ 7],
S23, 0x676f02d9);
200 GG (b, c, d, a, x[12],
S24, 0x8d2a4c8a);
203 HH (a, b, c, d, x[ 5],
S31, 0xfffa3942);
204 HH (d, a, b, c, x[ 8],
S32, 0x8771f681);
205 HH (c, d, a, b, x[11],
S33, 0x6d9d6122);
206 HH (b, c, d, a, x[14],
S34, 0xfde5380c);
207 HH (a, b, c, d, x[ 1],
S31, 0xa4beea44);
208 HH (d, a, b, c, x[ 4],
S32, 0x4bdecfa9);
209 HH (c, d, a, b, x[ 7],
S33, 0xf6bb4b60);
210 HH (b, c, d, a, x[10],
S34, 0xbebfbc70);
211 HH (a, b, c, d, x[13],
S31, 0x289b7ec6);
212 HH (d, a, b, c, x[ 0],
S32, 0xeaa127fa);
213 HH (c, d, a, b, x[ 3],
S33, 0xd4ef3085);
214 HH (b, c, d, a, x[ 6],
S34, 0x4881d05);
215 HH (a, b, c, d, x[ 9],
S31, 0xd9d4d039);
216 HH (d, a, b, c, x[12],
S32, 0xe6db99e5);
217 HH (c, d, a, b, x[15],
S33, 0x1fa27cf8);
218 HH (b, c, d, a, x[ 2],
S34, 0xc4ac5665);
221 II (a, b, c, d, x[ 0],
S41, 0xf4292244);
222 II (d, a, b, c, x[ 7],
S42, 0x432aff97);
223 II (c, d, a, b, x[14],
S43, 0xab9423a7);
224 II (b, c, d, a, x[ 5],
S44, 0xfc93a039);
225 II (a, b, c, d, x[12],
S41, 0x655b59c3);
226 II (d, a, b, c, x[ 3],
S42, 0x8f0ccc92);
227 II (c, d, a, b, x[10],
S43, 0xffeff47d);
228 II (b, c, d, a, x[ 1],
S44, 0x85845dd1);
229 II (a, b, c, d, x[ 8],
S41, 0x6fa87e4f);
230 II (d, a, b, c, x[15],
S42, 0xfe2ce6e0);
231 II (c, d, a, b, x[ 6],
S43, 0xa3014314);
232 II (b, c, d, a, x[13],
S44, 0x4e0811a1);
233 II (a, b, c, d, x[ 4],
S41, 0xf7537e82);
234 II (d, a, b, c, x[11],
S42, 0xbd3af235);
235 II (c, d, a, b, x[ 2],
S43, 0x2ad7d2bb);
236 II (b, c, d, a, x[ 9],
S44, 0xeb86d391);
244 memset(x, 0,
sizeof x);
251 void MD5::update(
const unsigned char input[], size_type length)
254 size_type index = count[0] / 8 % blocksize;
257 if ((count[0] += (length << 3)) < (length << 3))
259 count[1] += (length >> 29);
267 if (length >= firstpart)
270 memcpy(&buffer[index], input, firstpart);
274 for (i = firstpart; i + blocksize <= length; i += blocksize)
275 transform(&input[i]);
283 memcpy(&buffer[index], &input[i], length-i);
289 void MD5::update(
const char input[], size_type length)
291 update((
const unsigned char*)input, length);
300 static unsigned char padding[64] = {
301 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
302 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
303 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
308 unsigned char bits[8];
309 encode(bits, count, 8);
313 size_type padLen = (index < 56) ? (56 - index) : (120 - index);
320 encode(digest, state, 16);
323 memset(buffer, 0,
sizeof buffer);
324 memset(count, 0,
sizeof count);
341 for (
int i=0; i<16; i++)
342 sprintf(buf+i*2,
"%02x", digest[i]);
345 return std::string(buf);
357 std::string
md5(
const std::string str)
void update(const unsigned char *buf, size_type length)
std::ostream & operator<<(std::ostream &out, MD5 md5)
std::string md5(const std::string str)
std::string hexdigest() const