source: Dev/branches/rest-dojo-ui/client/dojox/encoding/digests/MD5.js @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

File size: 5.3 KB
Line 
1define(["./_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});
Note: See TracBrowser for help on using the repository browser.