| 20 | | /* md5.js - MD5 Message-Digest |
| 21 | | * Copyright (C) 1999,2002 Masanao Izumo <iz@onicos.co.jp> |
| 22 | | * Version: 2.0.0 |
| 23 | | * LastModified: May 13 2002 |
| 24 | | * |
| 25 | | * This program is free software. You can redistribute it and/or modify |
| 26 | | * it without any warranty. This library calculates the MD5 based on RFC1321. |
| 27 | | * See RFC1321 for more information and algorism. |
| 28 | | */ |
| 29 | | |
| 30 | | /* Interface: |
| 31 | | * md5_128bits = MD5_hash(data); |
| 32 | | * md5_hexstr = MD5_hexhash(data); |
| 33 | | */ |
| 34 | | |
| 35 | | /* ChangeLog |
| 36 | | * 2002/05/13: Version 2.0.0 released |
| 37 | | * NOTICE: API is changed. |
| 38 | | * 2002/04/15: Bug fix about MD5 length. |
| 39 | | */ |
| 40 | | |
| 41 | | // md5_T[i] = parseInt(Math.abs(Math.sin(i)) * 4294967296.0); |
| 42 | | var MD5 = {}; |
| 43 | | (function(){ |
| 44 | | var _T = [0x00000000, 0xd76aa478, 0xe8c7b756, 0x242070db, |
| 45 | | 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, |
| 46 | | 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, |
| 47 | | 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, |
| 48 | | 0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, |
| 49 | | 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, |
| 50 | | 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, |
| 51 | | 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, |
| 52 | | 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, |
| 53 | | 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, |
| 54 | | 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, |
| 55 | | 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, |
| 56 | | 0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7, |
| 57 | | 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, |
| 58 | | 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, |
| 59 | | 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391]; |
| 60 | | |
| 61 | | var _round1 = [[ 0, 7, 1], [ 1,12, 2], [ 2,17, 3], [ 3,22, 4], |
| 62 | | [ 4, 7, 5], [ 5,12, 6], [ 6,17, 7], [ 7,22, 8], |
| 63 | | [ 8, 7, 9], [ 9,12,10], [10,17,11], [11,22,12], |
| 64 | | [12, 7,13], [13,12,14], [14,17,15], [15,22,16]]; |
| 65 | | |
| 66 | | var _round2 = [[ 1, 5,17], [ 6, 9,18], [11,14,19], [ 0,20,20], |
| 67 | | [ 5, 5,21], [10, 9,22], [15,14,23], [ 4,20,24], |
| 68 | | [ 9, 5,25], [14, 9,26], [ 3,14,27], [ 8,20,28], |
| 69 | | [13, 5,29], [ 2, 9,30], [ 7,14,31], [12,20,32]]; |
| 70 | | |
| 71 | | var _round3 = [[ 5, 4,33], [ 8,11,34], [11,16,35], [14,23,36], |
| 72 | | [ 1, 4,37], [ 4,11,38], [ 7,16,39], [10,23,40], |
| 73 | | [13, 4,41], [ 0,11,42], [ 3,16,43], [ 6,23,44], |
| 74 | | [ 9, 4,45], [12,11,46], [15,16,47], [ 2,23,48]]; |
| 75 | | |
| 76 | | var _round4 = [[ 0, 6,49], [ 7,10,50], [14,15,51], [ 5,21,52], |
| 77 | | [12, 6,53], [ 3,10,54], [10,15,55], [ 1,21,56], |
| 78 | | [ 8, 6,57], [15,10,58], [ 6,15,59], [13,21,60], |
| 79 | | [ 4, 6,61], [11,10,62], [ 2,15,63], [ 9,21,64]]; |
| 80 | | |
| 81 | | function _F(x, y, z) { return (x & y) | (~x & z); } |
| 82 | | function _G(x, y, z) { return (x & z) | (y & ~z); } |
| 83 | | function _H(x, y, z) { return x ^ y ^ z; } |
| 84 | | function _I(x, y, z) { return y ^ (x | ~z); } |
| 85 | | |
| 86 | | var _round = [[_F, _round1], |
| 87 | | [_G, _round2], |
| 88 | | [_H, _round3], |
| 89 | | [_I, _round4]]; |
| 90 | | |
| 91 | | function _pack(n32) { |
| 92 | | return String.fromCharCode(n32 & 0xff) + |
| 93 | | String.fromCharCode((n32 >>> 8) & 0xff) + |
| 94 | | String.fromCharCode((n32 >>> 16) & 0xff) + |
| 95 | | String.fromCharCode((n32 >>> 24) & 0xff); |
| 96 | | } |
| 97 | | |
| 98 | | function _unpack(s4) { |
| 99 | | return s4.charCodeAt(0) | |
| 100 | | (s4.charCodeAt(1) << 8) | |
| 101 | | (s4.charCodeAt(2) << 16) | |
| 102 | | (s4.charCodeAt(3) << 24); |
| 103 | | } |
| 104 | | |
| 105 | | function _number(n) { |
| 106 | | while (n < 0) |
| 107 | | n += 4294967296; |
| 108 | | while (n > 4294967295) |
| 109 | | n -= 4294967296; |
| 110 | | return n; |
| 111 | | } |
| 112 | | |
| 113 | | function _apply_round(x, s, f, abcd, r) { |
| 114 | | var a, b, c, d; |
| 115 | | var kk, ss, ii; |
| 116 | | var t, u; |
| 117 | | |
| 118 | | a = abcd[0]; |
| 119 | | b = abcd[1]; |
| 120 | | c = abcd[2]; |
| 121 | | d = abcd[3]; |
| 122 | | kk = r[0]; |
| 123 | | ss = r[1]; |
| 124 | | ii = r[2]; |
| 125 | | |
| 126 | | u = f(s[b], s[c], s[d]); |
| 127 | | t = s[a] + u + x[kk] + _T[ii]; |
| 128 | | t = _number(t); |
| 129 | | t = ((t<<ss) | (t>>>(32-ss))); |
| 130 | | t += s[b]; |
| 131 | | s[a] = _number(t); |
| 132 | | } |
| 133 | | |
| 134 | | MD5.digest = function(data) { |
| 135 | | var abcd, x, state, s; |
| 136 | | var len, index, padLen, f, r; |
| 137 | | var i, j, k; |
| 138 | | var tmp; |
| 139 | | |
| 140 | | state = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476]; |
| 141 | | len = data.length; |
| 142 | | index = len & 0x3f; |
| 143 | | padLen = (index < 56) ? (56 - index) : (120 - index); |
| 144 | | if(padLen > 0) { |
| 145 | | data += "\x80"; |
| 146 | | for(i = 0; i < padLen - 1; i++) |
| 147 | | data += "\x00"; |
| 148 | | } |
| 149 | | data += _pack(len * 8); |
| 150 | | data += _pack(0); |
| 151 | | len += padLen + 8; |
| 152 | | abcd = [0, 1, 2, 3]; |
| 153 | | x = [16]; |
| 154 | | s = [4]; |
| 155 | | |
| 156 | | for(k = 0; k < len; k += 64) { |
| 157 | | for(i = 0, j = k; i < 16; i++, j += 4) { |
| 158 | | x[i] = data.charCodeAt(j) | |
| 159 | | (data.charCodeAt(j + 1) << 8) | |
| 160 | | (data.charCodeAt(j + 2) << 16) | |
| 161 | | (data.charCodeAt(j + 3) << 24); |
| 162 | | } |
| 163 | | for(i = 0; i < 4; i++) |
| 164 | | s[i] = state[i]; |
| 165 | | for(i = 0; i < 4; i++) { |
| 166 | | f = _round[i][0]; |
| 167 | | r = _round[i][1]; |
| 168 | | for(j = 0; j < 16; j++) { |
| 169 | | _apply_round(x, s, f, abcd, r[j]); |
| 170 | | tmp = abcd[0]; |
| 171 | | abcd[0] = abcd[3]; |
| 172 | | abcd[3] = abcd[2]; |
| 173 | | abcd[2] = abcd[1]; |
| 174 | | abcd[1] = tmp; |
| 175 | | } |
| 176 | | } |
| 177 | | |
| 178 | | for(i = 0; i < 4; i++) { |
| 179 | | state[i] += s[i]; |
| 180 | | state[i] = _number(state[i]); |
| 181 | | } |
| 182 | | } |
| 183 | | |
| 184 | | return _pack(state[0]) + _pack(state[1]) + _pack(state[2]) + _pack(state[3]); |
| 185 | | } |
| 186 | | |
| 187 | | MD5.hexdigest = function(data) { |
| 188 | | var i, out, c; |
| 189 | | var bit128; |
| 190 | | |
| 191 | | bit128 = MD5.digest(data); |
| 192 | | out = ""; |
| 193 | | for(i = 0; i < 16; i++) { |
| 194 | | c = bit128.charCodeAt(i); |
| 195 | | out += "0123456789abcdef".charAt((c>>4) & 0xf); |
| 196 | | out += "0123456789abcdef".charAt(c & 0xf); |
| 197 | | } |
| 198 | | return out; |
| 199 | | } |
| 200 | | })(); |
| | 20 | /* md5.js - MD5 Message-Digest |
| | 21 | * Copyright (C) 1999,2002 Masanao Izumo <iz@onicos.co.jp> |
| | 22 | * Version: 2.0.0 |
| | 23 | * LastModified: May 13 2002 |
| | 24 | * |
| | 25 | * This program is free software. You can redistribute it and/or modify |
| | 26 | * it without any warranty. This library calculates the MD5 based on RFC1321. |
| | 27 | * See RFC1321 for more information and algorism. |
| | 28 | */ |
| | 29 | var MD5={};(function(){var F=[0,3614090360,3905402710,606105819,3250441966,4118548399,1200080426,2821735955,4249261313,1770035416,2336552879,4294925233,2304563134,1804603682,4254626195,2792965006,1236535329,4129170786,3225465664,643717713,3921069994,3593408605,38016083,3634488961,3889429448,568446438,3275163606,4107603335,1163531501,2850285829,4243563512,1735328473,2368359562,4294588738,2272392833,1839030562,4259657740,2763975236,1272893353,4139469664,3200236656,681279174,3936430074,3572445317,76029189,3654602809,3873151461,530742520,3299628645,4096336452,1126891415,2878612391,4237533241,1700485571,2399980690,4293915773,2240044497,1873313359,4264355552,2734768916,1309151649,4149444226,3174756917,718787259,3951481745];var E=[[0,7,1],[1,12,2],[2,17,3],[3,22,4],[4,7,5],[5,12,6],[6,17,7],[7,22,8],[8,7,9],[9,12,10],[10,17,11],[11,22,12],[12,7,13],[13,12,14],[14,17,15],[15,22,16]];var D=[[1,5,17],[6,9,18],[11,14,19],[0,20,20],[5,5,21],[10,9,22],[15,14,23],[4,20,24],[9,5,25],[14,9,26],[3,14,27],[8,20,28],[13,5,29],[2,9,30],[7,14,31],[12,20,32]];var C=[[5,4,33],[8,11,34],[11,16,35],[14,23,36],[1,4,37],[4,11,38],[7,16,39],[10,23,40],[13,4,41],[0,11,42],[3,16,43],[6,23,44],[9,4,45],[12,11,46],[15,16,47],[2,23,48]];var B=[[0,6,49],[7,10,50],[14,15,51],[5,21,52],[12,6,53],[3,10,54],[10,15,55],[1,21,56],[8,6,57],[15,10,58],[6,15,59],[13,21,60],[4,6,61],[11,10,62],[2,15,63],[9,21,64]];function N(O,Q,P){return(O&Q)|(~O&P)}function M(O,Q,P){return(O&P)|(Q&~P)}function L(O,Q,P){return O^Q^P}function J(O,Q,P){return Q^(O|~P)}var A=[[N,E],[M,D],[L,C],[J,B]];function G(O){return String.fromCharCode(O&255)+String.fromCharCode((O>>>8)&255)+String.fromCharCode((O>>>16)&255)+String.fromCharCode((O>>>24)&255)}function H(O){return O.charCodeAt(0)|(O.charCodeAt(1)<<8)|(O.charCodeAt(2)<<16)|(O.charCodeAt(3)<<24)}function K(O){while(O<0){O+=4294967296}while(O>4294967295){O-=4294967296}return O}function I(W,g,R,Q,O){var V,U,T,S;var P,e,Y;var Z,X;V=Q[0];U=Q[1];T=Q[2];S=Q[3];P=O[0];e=O[1];Y=O[2];X=R(g[U],g[T],g[S]);Z=g[V]+X+W[P]+F[Y];Z=K(Z);Z=((Z<<e)|(Z>>>(32-e)));Z+=g[U];g[V]=K(Z)}MD5.digest=function(V){var Q,a,P,b;var Z,Y,W,X,O;var U,S,R;var T;P=[1732584193,4023233417,2562383102,271733878];Z=V.length;Y=Z&63;W=(Y<56)?(56-Y):(120-Y);if(W>0){V+="\x80";for(U=0;U<W-1;U++){V+="\x00"}}V+=G(Z*8);V+=G(0);Z+=W+8;Q=[0,1,2,3];a=[16];b=[4];for(R=0;R<Z;R+=64){for(U=0,S=R;U<16;U++,S+=4){a[U]=V.charCodeAt(S)|(V.charCodeAt(S+1)<<8)|(V.charCodeAt(S+2)<<16)|(V.charCodeAt(S+3)<<24)}for(U=0;U<4;U++){b[U]=P[U]}for(U=0;U<4;U++){X=A[U][0];O=A[U][1];for(S=0;S<16;S++){I(a,b,X,Q,O[S]);T=Q[0];Q[0]=Q[3];Q[3]=Q[2];Q[2]=Q[1];Q[1]=T}}for(U=0;U<4;U++){P[U]+=b[U];P[U]=K(P[U])}}return G(P[0])+G(P[1])+G(P[2])+G(P[3])};MD5.hexdigest=function(R){var Q,P,S;var O;O=MD5.digest(R);P="";for(Q=0;Q<16;Q++){S=O.charCodeAt(Q);P+="0123456789abcdef".charAt((S>>4)&15);P+="0123456789abcdef".charAt(S&15)}return P}})(); |