MD5.js 5.7 KB

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