MD5.js 5.4 KB

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