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