]>
Commit | Line | Data |
---|---|---|
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 | |
53 | qwebirc.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 | |
95 | function 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 |