]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/md5.js
Merge.
[irc/quakenet/qwebirc.git] / js / md5.js
CommitLineData
e516cc76
CP
1/*\r
2 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\r
3 * Digest Algorithm, as defined in RFC 1321.\r
4 * Copyright (C) Paul Johnston 1999 - 2000.\r
5 * See http://pajhome.org.uk/site/legal.html for details.\r
6 */\r
7\r
8/*\r
9 * Converted freestanding JavaScript code to fully encapsulated object.\r
10 * Andrew Collins, andrewrcollins@yahoo.com, 2000-11-28\r
11 */\r
12\r
13/*\r
14 * MD5\r
15 *\r
16 * Usage:\r
17 *\r
18 * var object = new MD5()\r
19 *\r
20 * Returns a MD5 object.\r
21 *\r
22 * object.digest(input)\r
23 *\r
24 * Returns MD5 message digest of input.\r
25 *\r
26 * Example:\r
27 *\r
28 * var object = new MD5();\r
29 *\r
30 * // Examples drawn from RFC1321 test suite\r
31 * object.digest("");\r
32 * // d41d8cd98f00b204e9800998ecf8427e\r
33 *\r
34 * object.digest("a");\r
35 * // 0cc175b9c0f1b6a831c399e269772661\r
36 *\r
37 * object.digest("abc");\r
38 * // 900150983cd24fb0d6963f7d28e17f72\r
39 *\r
40 * object.digest("message digest");\r
41 * // f96b697d7cb7938d525a2f31aaf161d0\r
42 *\r
43 * object.digest("abcdefghijklmnopqrstuvwxyz");\r
44 * // c3fcd3d76192e4007dfb496cca67e13b\r
45 *\r
46 * object.digest("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");\r
47 * // d174ab98d277d9f5a5611c2c9f419d9f\r
48 *\r
49 * object.digest("12345678901234567890123456789012345678901234567890123456789012345678901234567890");\r
50 * // 57edf4a22be3c955ac49da2e2107b67a\r
51 */\r
52\r
53qwebirc.util.crypto.MD5 = function() {\r
54 this.digest = calcMD5;\r
55\r
56/*\r
57 * Convert a 32-bit number to a hex string with ls-byte first\r
58 */\r
59 var hex_chr = "0123456789abcdef";\r
60 function rhex(num)\r
61 {\r
62 var str = "";\r
63 for(var j = 0; j <= 3; j++)\r
64 str += hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) + hex_chr.charAt((num >> (j * 8)) & 0x0F);\r
65 return str;\r
66 }\r
67\r
68/*\r
69 * Convert a string to a sequence of 16-word blocks, stored as an array.\r
70 * Append padding bits and the length, as described in the MD5 standard.\r
71 */\r
72 function str2blks_MD5(str)\r
73 {\r
74 var nblk = ((str.length + 8) >> 6) + 1;\r
75 var blks = new Array(nblk * 16);\r
76 for(var i = 0; i < nblk * 16; i++) blks[i] = 0;\r
77 for(var i = 0; i < str.length; i++)\r
78 blks[i >> 2] |= str.charCodeAt(i) << ((i % 4) * 8);\r
79 blks[i >> 2] |= 0x80 << ((i % 4) * 8);\r
80 blks[nblk * 16 - 2] = str.length * 8;\r
81 return blks;\r
82 }\r
83\r
84/*\r
85 * Add integers, wrapping at 2^32\r
86 */\r
87 function add(x, y)\r
88 {\r
89 return ((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^ (y&0x80000000);\r
90 }\r
91\r
92/*\r
93 * Bitwise rotate a 32-bit number to the left\r
94 */\r
95function rol(num, cnt)\r
96 {\r
97 return (num << cnt) | (num >>> (32 - cnt));\r
98 }\r
99\r
100/*\r
101 * These functions implement the basic operation for each round of the\r
102 * algorithm.\r
103 */\r
104 function cmn(q, a, b, x, s, t)\r
105 {\r
106 return add(rol(add(add(a, q), add(x, t)), s), b);\r
107 }\r
108 function ff(a, b, c, d, x, s, t)\r
109 {\r
110 return cmn((b & c) | ((~b) & d), a, b, x, s, t);\r
111 }\r
112 function gg(a, b, c, d, x, s, t)\r
113 {\r
114 return cmn((b & d) | (c & (~d)), a, b, x, s, t);\r
115 }\r
116 function hh(a, b, c, d, x, s, t)\r
117 {\r
118 return cmn(b ^ c ^ d, a, b, x, s, t);\r
119 }\r
120 function ii(a, b, c, d, x, s, t)\r
121 {\r
122 return cmn(c ^ (b | (~d)), a, b, x, s, t);\r
123 }\r
124\r
125/*\r
126 * Take a string and return the hex representation of its MD5.\r
127 */\r
128 function calcMD5(str)\r
129 {\r
130 var x = str2blks_MD5(str);\r
131 var a = 0x67452301;\r
132 var b = 0xEFCDAB89;\r
133 var c = 0x98BADCFE;\r
134 var d = 0x10325476;\r
135\r
136 for(var i = 0; i < x.length; i += 16)\r
137 {\r
138 var olda = a;\r
139 var oldb = b;\r
140 var oldc = c;\r
141 var oldd = d;\r
142\r
143 a = ff(a, b, c, d, x[i+ 0], 7 , 0xD76AA478);\r
144 d = ff(d, a, b, c, x[i+ 1], 12, 0xE8C7B756);\r
145 c = ff(c, d, a, b, x[i+ 2], 17, 0x242070DB);\r
146 b = ff(b, c, d, a, x[i+ 3], 22, 0xC1BDCEEE);\r
147 a = ff(a, b, c, d, x[i+ 4], 7 , 0xF57C0FAF);\r
148 d = ff(d, a, b, c, x[i+ 5], 12, 0x4787C62A);\r
149 c = ff(c, d, a, b, x[i+ 6], 17, 0xA8304613);\r
150 b = ff(b, c, d, a, x[i+ 7], 22, 0xFD469501);\r
151 a = ff(a, b, c, d, x[i+ 8], 7 , 0x698098D8);\r
152 d = ff(d, a, b, c, x[i+ 9], 12, 0x8B44F7AF);\r
153 c = ff(c, d, a, b, x[i+10], 17, 0xFFFF5BB1);\r
154 b = ff(b, c, d, a, x[i+11], 22, 0x895CD7BE);\r
155 a = ff(a, b, c, d, x[i+12], 7 , 0x6B901122);\r
156 d = ff(d, a, b, c, x[i+13], 12, 0xFD987193);\r
157 c = ff(c, d, a, b, x[i+14], 17, 0xA679438E);\r
158 b = ff(b, c, d, a, x[i+15], 22, 0x49B40821);\r
159\r
160 a = gg(a, b, c, d, x[i+ 1], 5 , 0xF61E2562);\r
161 d = gg(d, a, b, c, x[i+ 6], 9 , 0xC040B340);\r
162 c = gg(c, d, a, b, x[i+11], 14, 0x265E5A51);\r
163 b = gg(b, c, d, a, x[i+ 0], 20, 0xE9B6C7AA);\r
164 a = gg(a, b, c, d, x[i+ 5], 5 , 0xD62F105D);\r
165 d = gg(d, a, b, c, x[i+10], 9 , 0x02441453);\r
166 c = gg(c, d, a, b, x[i+15], 14, 0xD8A1E681);\r
167 b = gg(b, c, d, a, x[i+ 4], 20, 0xE7D3FBC8);\r
168 a = gg(a, b, c, d, x[i+ 9], 5 , 0x21E1CDE6);\r
169 d = gg(d, a, b, c, x[i+14], 9 , 0xC33707D6);\r
170 c = gg(c, d, a, b, x[i+ 3], 14, 0xF4D50D87);\r
171 b = gg(b, c, d, a, x[i+ 8], 20, 0x455A14ED);\r
172 a = gg(a, b, c, d, x[i+13], 5 , 0xA9E3E905);\r
173 d = gg(d, a, b, c, x[i+ 2], 9 , 0xFCEFA3F8);\r
174 c = gg(c, d, a, b, x[i+ 7], 14, 0x676F02D9);\r
175 b = gg(b, c, d, a, x[i+12], 20, 0x8D2A4C8A);\r
176\r
177 a = hh(a, b, c, d, x[i+ 5], 4 , 0xFFFA3942);\r
178 d = hh(d, a, b, c, x[i+ 8], 11, 0x8771F681);\r
179 c = hh(c, d, a, b, x[i+11], 16, 0x6D9D6122);\r
180 b = hh(b, c, d, a, x[i+14], 23, 0xFDE5380C);\r
181 a = hh(a, b, c, d, x[i+ 1], 4 , 0xA4BEEA44);\r
182 d = hh(d, a, b, c, x[i+ 4], 11, 0x4BDECFA9);\r
183 c = hh(c, d, a, b, x[i+ 7], 16, 0xF6BB4B60);\r
184 b = hh(b, c, d, a, x[i+10], 23, 0xBEBFBC70);\r
185 a = hh(a, b, c, d, x[i+13], 4 , 0x289B7EC6);\r
186 d = hh(d, a, b, c, x[i+ 0], 11, 0xEAA127FA);\r
187 c = hh(c, d, a, b, x[i+ 3], 16, 0xD4EF3085);\r
188 b = hh(b, c, d, a, x[i+ 6], 23, 0x04881D05);\r
189 a = hh(a, b, c, d, x[i+ 9], 4 , 0xD9D4D039);\r
190 d = hh(d, a, b, c, x[i+12], 11, 0xE6DB99E5);\r
191 c = hh(c, d, a, b, x[i+15], 16, 0x1FA27CF8);\r
192 b = hh(b, c, d, a, x[i+ 2], 23, 0xC4AC5665);\r
193\r
194 a = ii(a, b, c, d, x[i+ 0], 6 , 0xF4292244);\r
195 d = ii(d, a, b, c, x[i+ 7], 10, 0x432AFF97);\r
196 c = ii(c, d, a, b, x[i+14], 15, 0xAB9423A7);\r
197 b = ii(b, c, d, a, x[i+ 5], 21, 0xFC93A039);\r
198 a = ii(a, b, c, d, x[i+12], 6 , 0x655B59C3);\r
199 d = ii(d, a, b, c, x[i+ 3], 10, 0x8F0CCC92);\r
200 c = ii(c, d, a, b, x[i+10], 15, 0xFFEFF47D);\r
201 b = ii(b, c, d, a, x[i+ 1], 21, 0x85845DD1);\r
202 a = ii(a, b, c, d, x[i+ 8], 6 , 0x6FA87E4F);\r
203 d = ii(d, a, b, c, x[i+15], 10, 0xFE2CE6E0);\r
204 c = ii(c, d, a, b, x[i+ 6], 15, 0xA3014314);\r
205 b = ii(b, c, d, a, x[i+13], 21, 0x4E0811A1);\r
206 a = ii(a, b, c, d, x[i+ 4], 6 , 0xF7537E82);\r
207 d = ii(d, a, b, c, x[i+11], 10, 0xBD3AF235);\r
208 c = ii(c, d, a, b, x[i+ 2], 15, 0x2AD7D2BB);\r
209 b = ii(b, c, d, a, x[i+ 9], 21, 0xEB86D391);\r
210\r
211 a = add(a, olda);\r
212 b = add(b, oldb);\r
213 c = add(c, oldc);\r
214 d = add(d, oldd);\r
215 }\r
216 return rhex(a) + rhex(b) + rhex(c) + rhex(d);\r
217 }\r
218}\r