1 /** This file is part of KCFinder project
3 * @desc Helper MD5 checksum function
6 * @author Pavel Tzonkov <sunhater@sunhater.com>
7 * @copyright 2010-2014 KCFinder Project
8 * @license http://opensource.org/licenses/GPL-3.0 GPLv3
9 * @license http://opensource.org/licenses/LGPL-3.0 LGPLv3
10 * @link http://kcfinder.sunhater.com
15 $.$.utf8encode = function(string
) {
16 string
= string
.replace(/\r\n/g,"\n");
19 for (var n
= 0; n
< string
.length
; n
++) {
21 var c
= string
.charCodeAt(n
);
24 utftext
+= String
.fromCharCode(c
);
25 } else if((c
> 127) && (c
< 2048)) {
26 utftext
+= String
.fromCharCode((c
>> 6) | 192);
27 utftext
+= String
.fromCharCode((c
& 63) | 128);
29 utftext
+= String
.fromCharCode((c
>> 12) | 224);
30 utftext
+= String
.fromCharCode(((c
>> 6) & 63) | 128);
31 utftext
+= String
.fromCharCode((c
& 63) | 128);
39 $.$.md5 = function(string
) {
41 string
= $.$.utf8encode(string
);
43 var RotateLeft = function(lValue
, iShiftBits
) {
44 return (lValue
<<iShiftBits
) | (lValue
>>>(32-iShiftBits
));
47 AddUnsigned = function(lX
, lY
) {
48 var lX8
= (lX
& 0x80000000),
49 lY8
= (lY
& 0x80000000),
50 lX4
= (lX
& 0x40000000),
51 lY4
= (lY
& 0x40000000),
52 lResult
= (lX
& 0x3FFFFFFF) + (lY
& 0x3FFFFFFF);
54 return (lResult
^ 0x80000000 ^ lX8
^ lY8
);
56 return (lResult
& 0x40000000)
57 ? (lResult
^ 0xC0000000 ^ lX8
^ lY8
)
58 : (lResult
^ 0x40000000 ^ lX8
^ lY8
);
60 return (lResult
^ lX8
^ lY8
);
63 F = function(x
, y
, z
) { return (x
& y
) | ((~x
) & z
); },
64 G = function(x
, y
, z
) { return (x
& z
) | (y
& (~z
)); },
65 H = function(x
, y
, z
) { return (x
^ y
^ z
); },
66 I = function(x
, y
, z
) { return (y
^ (x
| (~z
))); },
68 FF = function(a
, b
, c
, d
, x
, s
, ac
) {
69 a
= AddUnsigned(a
, AddUnsigned(AddUnsigned(F(b
, c
, d
), x
), ac
));
70 return AddUnsigned(RotateLeft(a
, s
), b
);
73 GG = function(a
, b
, c
, d
, x
, s
, ac
) {
74 a
= AddUnsigned(a
, AddUnsigned(AddUnsigned(G(b
, c
, d
), x
), ac
));
75 return AddUnsigned(RotateLeft(a
, s
), b
);
78 HH = function(a
, b
, c
, d
, x
, s
, ac
) {
79 a
= AddUnsigned(a
, AddUnsigned(AddUnsigned(H(b
, c
, d
), x
), ac
));
80 return AddUnsigned(RotateLeft(a
, s
), b
);
83 II = function(a
, b
, c
, d
, x
, s
, ac
) {
84 a
= AddUnsigned(a
, AddUnsigned(AddUnsigned(I(b
, c
, d
), x
), ac
));
85 return AddUnsigned(RotateLeft(a
, s
), b
);
88 ConvertToWordArray = function(string
) {
90 lMessageLength
= string
.length
,
91 lNumberOfWords_temp1
= lMessageLength
+ 8,
92 lNumberOfWords_temp2
= (lNumberOfWords_temp1
- (lNumberOfWords_temp1
% 64)) / 64,
93 lNumberOfWords
= (lNumberOfWords_temp2
+ 1) * 16,
94 lWordArray
= [lNumberOfWords
- 1],
98 while (lByteCount
< lMessageLength
) {
99 lWordCount
= (lByteCount
- (lByteCount
% 4)) / 4;
100 lBytePosition
= (lByteCount
% 4) * 8;
101 lWordArray
[lWordCount
] = (lWordArray
[lWordCount
] | (string
.charCodeAt(lByteCount
) << lBytePosition
));
105 lWordCount
= (lByteCount
- (lByteCount
% 4)) / 4;
106 lBytePosition
= (lByteCount
% 4) * 8;
107 lWordArray
[lWordCount
] = lWordArray
[lWordCount
] | (0x80 << lBytePosition
);
108 lWordArray
[lNumberOfWords
- 2] = lMessageLength
<< 3;
109 lWordArray
[lNumberOfWords
- 1] = lMessageLength
>>> 29;
114 WordToHex = function(lValue
) {
115 var lByte
, lCount
= 0,
117 WordToHexValue_temp
= "";
119 for (; lCount
<= 3; lCount
++) {
120 lByte
= (lValue
>>> (lCount
* 8)) & 255;
121 WordToHexValue_temp
= "0" + lByte
.toString(16);
122 WordToHexValue
= WordToHexValue
+ WordToHexValue_temp
.substr(WordToHexValue_temp
.length
- 2,2);
125 return WordToHexValue
;
128 AA
, BB
, CC
, DD
, k
= 0,
129 x
= ConvertToWordArray(string
),
130 a
= 0x67452301, b
= 0xEFCDAB89,
131 c
= 0x98BADCFE, d
= 0x10325476,
132 S11
= 7, S12
= 12, S13
= 17, S14
= 22,
133 S21
= 5, S22
= 9, S23
= 14, S24
= 20,
134 S31
= 4, S32
= 11, S33
= 16, S34
= 23,
135 S41
= 6, S42
= 10, S43
= 15, S44
= 21;
137 for (; k
< x
.length
; k
+= 16) {
138 AA
= a
; BB
= b
; CC
= c
; DD
= d
;
139 a
= FF(a
, b
, c
, d
, x
[k
+ 0], S11
, 0xD76AA478);
140 d
= FF(d
, a
, b
, c
, x
[k
+ 1], S12
, 0xE8C7B756);
141 c
= FF(c
, d
, a
, b
, x
[k
+ 2], S13
, 0x242070DB);
142 b
= FF(b
, c
, d
, a
, x
[k
+ 3], S14
, 0xC1BDCEEE);
143 a
= FF(a
, b
, c
, d
, x
[k
+ 4], S11
, 0xF57C0FAF);
144 d
= FF(d
, a
, b
, c
, x
[k
+ 5], S12
, 0x4787C62A);
145 c
= FF(c
, d
, a
, b
, x
[k
+ 6], S13
, 0xA8304613);
146 b
= FF(b
, c
, d
, a
, x
[k
+ 7], S14
, 0xFD469501);
147 a
= FF(a
, b
, c
, d
, x
[k
+ 8], S11
, 0x698098D8);
148 d
= FF(d
, a
, b
, c
, x
[k
+ 9], S12
, 0x8B44F7AF);
149 c
= FF(c
, d
, a
, b
, x
[k
+ 10], S13
, 0xFFFF5BB1);
150 b
= FF(b
, c
, d
, a
, x
[k
+ 11], S14
, 0x895CD7BE);
151 a
= FF(a
, b
, c
, d
, x
[k
+ 12], S11
, 0x6B901122);
152 d
= FF(d
, a
, b
, c
, x
[k
+ 13], S12
, 0xFD987193);
153 c
= FF(c
, d
, a
, b
, x
[k
+ 14], S13
, 0xA679438E);
154 b
= FF(b
, c
, d
, a
, x
[k
+ 15], S14
, 0x49B40821);
155 a
= GG(a
, b
, c
, d
, x
[k
+ 1], S21
, 0xF61E2562);
156 d
= GG(d
, a
, b
, c
, x
[k
+ 6], S22
, 0xC040B340);
157 c
= GG(c
, d
, a
, b
, x
[k
+ 11], S23
, 0x265E5A51);
158 b
= GG(b
, c
, d
, a
, x
[k
+ 0], S24
, 0xE9B6C7AA);
159 a
= GG(a
, b
, c
, d
, x
[k
+ 5], S21
, 0xD62F105D);
160 d
= GG(d
, a
, b
, c
, x
[k
+ 10], S22
, 0x2441453);
161 c
= GG(c
, d
, a
, b
, x
[k
+ 15], S23
, 0xD8A1E681);
162 b
= GG(b
, c
, d
, a
, x
[k
+ 4], S24
, 0xE7D3FBC8);
163 a
= GG(a
, b
, c
, d
, x
[k
+ 9], S21
, 0x21E1CDE6);
164 d
= GG(d
, a
, b
, c
, x
[k
+ 14], S22
, 0xC33707D6);
165 c
= GG(c
, d
, a
, b
, x
[k
+ 3], S23
, 0xF4D50D87);
166 b
= GG(b
, c
, d
, a
, x
[k
+ 8], S24
, 0x455A14ED);
167 a
= GG(a
, b
, c
, d
, x
[k
+ 13], S21
, 0xA9E3E905);
168 d
= GG(d
, a
, b
, c
, x
[k
+ 2], S22
, 0xFCEFA3F8);
169 c
= GG(c
, d
, a
, b
, x
[k
+ 7], S23
, 0x676F02D9);
170 b
= GG(b
, c
, d
, a
, x
[k
+ 12], S24
, 0x8D2A4C8A);
171 a
= HH(a
, b
, c
, d
, x
[k
+ 5], S31
, 0xFFFA3942);
172 d
= HH(d
, a
, b
, c
, x
[k
+ 8], S32
, 0x8771F681);
173 c
= HH(c
, d
, a
, b
, x
[k
+ 11], S33
, 0x6D9D6122);
174 b
= HH(b
, c
, d
, a
, x
[k
+ 14], S34
, 0xFDE5380C);
175 a
= HH(a
, b
, c
, d
, x
[k
+ 1], S31
, 0xA4BEEA44);
176 d
= HH(d
, a
, b
, c
, x
[k
+ 4], S32
, 0x4BDECFA9);
177 c
= HH(c
, d
, a
, b
, x
[k
+ 7], S33
, 0xF6BB4B60);
178 b
= HH(b
, c
, d
, a
, x
[k
+ 10], S34
, 0xBEBFBC70);
179 a
= HH(a
, b
, c
, d
, x
[k
+ 13], S31
, 0x289B7EC6);
180 d
= HH(d
, a
, b
, c
, x
[k
+ 0], S32
, 0xEAA127FA);
181 c
= HH(c
, d
, a
, b
, x
[k
+ 3], S33
, 0xD4EF3085);
182 b
= HH(b
, c
, d
, a
, x
[k
+ 6], S34
, 0x4881D05);
183 a
= HH(a
, b
, c
, d
, x
[k
+ 9], S31
, 0xD9D4D039);
184 d
= HH(d
, a
, b
, c
, x
[k
+ 12], S32
, 0xE6DB99E5);
185 c
= HH(c
, d
, a
, b
, x
[k
+ 15], S33
, 0x1FA27CF8);
186 b
= HH(b
, c
, d
, a
, x
[k
+ 2], S34
, 0xC4AC5665);
187 a
= II(a
, b
, c
, d
, x
[k
+ 0], S41
, 0xF4292244);
188 d
= II(d
, a
, b
, c
, x
[k
+ 7], S42
, 0x432AFF97);
189 c
= II(c
, d
, a
, b
, x
[k
+ 14], S43
, 0xAB9423A7);
190 b
= II(b
, c
, d
, a
, x
[k
+ 5], S44
, 0xFC93A039);
191 a
= II(a
, b
, c
, d
, x
[k
+ 12], S41
, 0x655B59C3);
192 d
= II(d
, a
, b
, c
, x
[k
+ 3], S42
, 0x8F0CCC92);
193 c
= II(c
, d
, a
, b
, x
[k
+ 10], S43
, 0xFFEFF47D);
194 b
= II(b
, c
, d
, a
, x
[k
+ 1], S44
, 0x85845DD1);
195 a
= II(a
, b
, c
, d
, x
[k
+ 8], S41
, 0x6FA87E4F);
196 d
= II(d
, a
, b
, c
, x
[k
+ 15], S42
, 0xFE2CE6E0);
197 c
= II(c
, d
, a
, b
, x
[k
+ 6], S43
, 0xA3014314);
198 b
= II(b
, c
, d
, a
, x
[k
+ 13], S44
, 0x4E0811A1);
199 a
= II(a
, b
, c
, d
, x
[k
+ 4], S41
, 0xF7537E82);
200 d
= II(d
, a
, b
, c
, x
[k
+ 11], S42
, 0xBD3AF235);
201 c
= II(c
, d
, a
, b
, x
[k
+ 2], S43
, 0x2AD7D2BB);
202 b
= II(b
, c
, d
, a
, x
[k
+ 9], S44
, 0xEB86D391);
203 a
= AddUnsigned(a
, AA
);
204 b
= AddUnsigned(b
, BB
);
205 c
= AddUnsigned(c
, CC
);
206 d
= AddUnsigned(d
, DD
);
209 return (WordToHex(a
) + WordToHex(b
) + WordToHex(c
) + WordToHex(d
)).toLowerCase();