1 | define(["./_base"], function(dxd) { |
---|
2 | |
---|
3 | /*===== |
---|
4 | dxd = dojox.encoding.digests; |
---|
5 | =====*/ |
---|
6 | |
---|
7 | /* A port of Paul Johnstone's MD5 implementation |
---|
8 | * http://pajhome.org.uk/crypt/md5/index.html |
---|
9 | * |
---|
10 | * Copyright (C) Paul Johnston 1999 - 2002. |
---|
11 | * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet |
---|
12 | * Distributed under the BSD License |
---|
13 | * |
---|
14 | * Dojo port by Tom Trenka |
---|
15 | */ |
---|
16 | |
---|
17 | var chrsz=8; |
---|
18 | |
---|
19 | // MD5 rounds functions |
---|
20 | function R(n,c){ return (n<<c)|(n>>>(32-c)); } |
---|
21 | function C(q,a,b,x,s,t){ return dxd.addWords(R(dxd.addWords(dxd.addWords(a, q), dxd.addWords(x, t)), s), b); } |
---|
22 | function FF(a,b,c,d,x,s,t){ return C((b&c)|((~b)&d),a,b,x,s,t); } |
---|
23 | function GG(a,b,c,d,x,s,t){ return C((b&d)|(c&(~d)),a,b,x,s,t); } |
---|
24 | function HH(a,b,c,d,x,s,t){ return C(b^c^d,a,b,x,s,t); } |
---|
25 | function II(a,b,c,d,x,s,t){ return C(c^(b|(~d)),a,b,x,s,t); } |
---|
26 | |
---|
27 | // the core MD5 rounds method |
---|
28 | function core(x,len){ |
---|
29 | x[len>>5]|=0x80<<((len)%32); |
---|
30 | x[(((len+64)>>>9)<<4)+14]=len; |
---|
31 | var a= 1732584193; |
---|
32 | var b=-271733879; |
---|
33 | var c=-1732584194; |
---|
34 | var d= 271733878; |
---|
35 | for(var i=0; i<x.length; i+=16){ |
---|
36 | var olda=a; |
---|
37 | var oldb=b; |
---|
38 | var oldc=c; |
---|
39 | var oldd=d; |
---|
40 | |
---|
41 | a=FF(a,b,c,d,x[i+ 0],7 ,-680876936); |
---|
42 | d=FF(d,a,b,c,x[i+ 1],12,-389564586); |
---|
43 | c=FF(c,d,a,b,x[i+ 2],17, 606105819); |
---|
44 | b=FF(b,c,d,a,x[i+ 3],22,-1044525330); |
---|
45 | a=FF(a,b,c,d,x[i+ 4],7 ,-176418897); |
---|
46 | d=FF(d,a,b,c,x[i+ 5],12, 1200080426); |
---|
47 | c=FF(c,d,a,b,x[i+ 6],17,-1473231341); |
---|
48 | b=FF(b,c,d,a,x[i+ 7],22,-45705983); |
---|
49 | a=FF(a,b,c,d,x[i+ 8],7 , 1770035416); |
---|
50 | d=FF(d,a,b,c,x[i+ 9],12,-1958414417); |
---|
51 | c=FF(c,d,a,b,x[i+10],17,-42063); |
---|
52 | b=FF(b,c,d,a,x[i+11],22,-1990404162); |
---|
53 | a=FF(a,b,c,d,x[i+12],7 , 1804603682); |
---|
54 | d=FF(d,a,b,c,x[i+13],12,-40341101); |
---|
55 | c=FF(c,d,a,b,x[i+14],17,-1502002290); |
---|
56 | b=FF(b,c,d,a,x[i+15],22, 1236535329); |
---|
57 | |
---|
58 | a=GG(a,b,c,d,x[i+ 1],5 ,-165796510); |
---|
59 | d=GG(d,a,b,c,x[i+ 6],9 ,-1069501632); |
---|
60 | c=GG(c,d,a,b,x[i+11],14, 643717713); |
---|
61 | b=GG(b,c,d,a,x[i+ 0],20,-373897302); |
---|
62 | a=GG(a,b,c,d,x[i+ 5],5 ,-701558691); |
---|
63 | d=GG(d,a,b,c,x[i+10],9 , 38016083); |
---|
64 | c=GG(c,d,a,b,x[i+15],14,-660478335); |
---|
65 | b=GG(b,c,d,a,x[i+ 4],20,-405537848); |
---|
66 | a=GG(a,b,c,d,x[i+ 9],5 , 568446438); |
---|
67 | d=GG(d,a,b,c,x[i+14],9 ,-1019803690); |
---|
68 | c=GG(c,d,a,b,x[i+ 3],14,-187363961); |
---|
69 | b=GG(b,c,d,a,x[i+ 8],20, 1163531501); |
---|
70 | a=GG(a,b,c,d,x[i+13],5 ,-1444681467); |
---|
71 | d=GG(d,a,b,c,x[i+ 2],9 ,-51403784); |
---|
72 | c=GG(c,d,a,b,x[i+ 7],14, 1735328473); |
---|
73 | b=GG(b,c,d,a,x[i+12],20,-1926607734); |
---|
74 | |
---|
75 | a=HH(a,b,c,d,x[i+ 5],4 ,-378558); |
---|
76 | d=HH(d,a,b,c,x[i+ 8],11,-2022574463); |
---|
77 | c=HH(c,d,a,b,x[i+11],16, 1839030562); |
---|
78 | b=HH(b,c,d,a,x[i+14],23,-35309556); |
---|
79 | a=HH(a,b,c,d,x[i+ 1],4 ,-1530992060); |
---|
80 | d=HH(d,a,b,c,x[i+ 4],11, 1272893353); |
---|
81 | c=HH(c,d,a,b,x[i+ 7],16,-155497632); |
---|
82 | b=HH(b,c,d,a,x[i+10],23,-1094730640); |
---|
83 | a=HH(a,b,c,d,x[i+13],4 , 681279174); |
---|
84 | d=HH(d,a,b,c,x[i+ 0],11,-358537222); |
---|
85 | c=HH(c,d,a,b,x[i+ 3],16,-722521979); |
---|
86 | b=HH(b,c,d,a,x[i+ 6],23, 76029189); |
---|
87 | a=HH(a,b,c,d,x[i+ 9],4 ,-640364487); |
---|
88 | d=HH(d,a,b,c,x[i+12],11,-421815835); |
---|
89 | c=HH(c,d,a,b,x[i+15],16, 530742520); |
---|
90 | b=HH(b,c,d,a,x[i+ 2],23,-995338651); |
---|
91 | |
---|
92 | a=II(a,b,c,d,x[i+ 0],6 ,-198630844); |
---|
93 | d=II(d,a,b,c,x[i+ 7],10, 1126891415); |
---|
94 | c=II(c,d,a,b,x[i+14],15,-1416354905); |
---|
95 | b=II(b,c,d,a,x[i+ 5],21,-57434055); |
---|
96 | a=II(a,b,c,d,x[i+12],6 , 1700485571); |
---|
97 | d=II(d,a,b,c,x[i+ 3],10,-1894986606); |
---|
98 | c=II(c,d,a,b,x[i+10],15,-1051523); |
---|
99 | b=II(b,c,d,a,x[i+ 1],21,-2054922799); |
---|
100 | a=II(a,b,c,d,x[i+ 8],6 , 1873313359); |
---|
101 | d=II(d,a,b,c,x[i+15],10,-30611744); |
---|
102 | c=II(c,d,a,b,x[i+ 6],15,-1560198380); |
---|
103 | b=II(b,c,d,a,x[i+13],21, 1309151649); |
---|
104 | a=II(a,b,c,d,x[i+ 4],6 ,-145523070); |
---|
105 | d=II(d,a,b,c,x[i+11],10,-1120210379); |
---|
106 | c=II(c,d,a,b,x[i+ 2],15, 718787259); |
---|
107 | b=II(b,c,d,a,x[i+ 9],21,-343485551); |
---|
108 | |
---|
109 | a=dxd.addWords(a, olda); |
---|
110 | b=dxd.addWords(b, oldb); |
---|
111 | c=dxd.addWords(c, oldc); |
---|
112 | d=dxd.addWords(d, oldd); |
---|
113 | } |
---|
114 | return [a,b,c,d]; |
---|
115 | } |
---|
116 | |
---|
117 | function hmac(data, key){ |
---|
118 | var wa=dxd.stringToWord(key); |
---|
119 | if(wa.length>16){ |
---|
120 | wa=core(wa, key.length*chrsz); |
---|
121 | } |
---|
122 | var l=[], r=[]; |
---|
123 | for(var i=0; i<16; i++){ |
---|
124 | l[i]=wa[i]^0x36363636; |
---|
125 | r[i]=wa[i]^0x5c5c5c5c; |
---|
126 | } |
---|
127 | var h=core(l.concat(dxd.stringToWord(data)), 512+data.length*chrsz); |
---|
128 | return core(r.concat(h), 640); |
---|
129 | } |
---|
130 | |
---|
131 | // public function |
---|
132 | dxd.MD5=function(/* string */data, /* dojox.encoding.digests.outputTypes? */outputType){ |
---|
133 | // summary |
---|
134 | // computes the digest of data, and returns the result according to type outputType |
---|
135 | var out=outputType || dxd.outputTypes.Base64; |
---|
136 | var wa=core(dxd.stringToWord(data), data.length*chrsz); |
---|
137 | switch(out){ |
---|
138 | case dxd.outputTypes.Raw:{ |
---|
139 | return wa; // word[] |
---|
140 | } |
---|
141 | case dxd.outputTypes.Hex:{ |
---|
142 | return dxd.wordToHex(wa); // string |
---|
143 | } |
---|
144 | case dxd.outputTypes.String:{ |
---|
145 | return dxd.wordToString(wa); // string |
---|
146 | } |
---|
147 | default:{ |
---|
148 | return dxd.wordToBase64(wa); // string |
---|
149 | } |
---|
150 | } |
---|
151 | }; |
---|
152 | |
---|
153 | // make this private, for later use with a generic HMAC calculator. |
---|
154 | dxd.MD5._hmac=function(/* string */data, /* string */key, /* dojox.encoding.digests.outputTypes? */outputType){ |
---|
155 | // summary |
---|
156 | // computes the digest of data, and returns the result according to type outputType |
---|
157 | var out=outputType || dxd.outputTypes.Base64; |
---|
158 | var wa=hmac(data, key); |
---|
159 | switch(out){ |
---|
160 | case dxd.outputTypes.Raw:{ |
---|
161 | return wa; // word[] |
---|
162 | } |
---|
163 | case dxd.outputTypes.Hex:{ |
---|
164 | return dxd.wordToHex(wa); // string |
---|
165 | } |
---|
166 | case dxd.outputTypes.String:{ |
---|
167 | return dxd.wordToString(wa); // string |
---|
168 | } |
---|
169 | default:{ |
---|
170 | return dxd.wordToBase64(wa); // string |
---|
171 | } |
---|
172 | } |
---|
173 | }; |
---|
174 | |
---|
175 | return dxd.MD5; |
---|
176 | }); |
---|