sha1.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. CryptoJS v3.0.2
  3. code.google.com/p/crypto-js
  4. (c) 2009-2012 by Jeff Mott. All rights reserved.
  5. code.google.com/p/crypto-js/wiki/License
  6. */
  7. (function () {
  8. // Shortcuts
  9. var C = CryptoJS;
  10. var C_lib = C.lib;
  11. var WordArray = C_lib.WordArray;
  12. var Hasher = C_lib.Hasher;
  13. var C_algo = C.algo;
  14. // Reusable object
  15. var W = [];
  16. /**
  17. * SHA-1 hash algorithm.
  18. */
  19. var SHA1 = C_algo.SHA1 = Hasher.extend({
  20. _doReset: function () {
  21. this._hash = WordArray.create([0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]);
  22. },
  23. _doProcessBlock: function (M, offset) {
  24. // Shortcut
  25. var H = this._hash.words;
  26. // Working variables
  27. var a = H[0];
  28. var b = H[1];
  29. var c = H[2];
  30. var d = H[3];
  31. var e = H[4];
  32. // Computation
  33. for (var i = 0; i < 80; i++) {
  34. if (i < 16) {
  35. W[i] = M[offset + i] | 0;
  36. } else {
  37. var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
  38. W[i] = (n << 1) | (n >>> 31);
  39. }
  40. var t = ((a << 5) | (a >>> 27)) + e + W[i];
  41. if (i < 20) {
  42. t += ((b & c) | (~b & d)) + 0x5a827999;
  43. } else if (i < 40) {
  44. t += (b ^ c ^ d) + 0x6ed9eba1;
  45. } else if (i < 60) {
  46. t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
  47. } else /* if (i < 80) */ {
  48. t += (b ^ c ^ d) - 0x359d3e2a;
  49. }
  50. e = d;
  51. d = c;
  52. c = (b << 30) | (b >>> 2);
  53. b = a;
  54. a = t;
  55. }
  56. // Intermediate hash value
  57. H[0] = (H[0] + a) | 0;
  58. H[1] = (H[1] + b) | 0;
  59. H[2] = (H[2] + c) | 0;
  60. H[3] = (H[3] + d) | 0;
  61. H[4] = (H[4] + e) | 0;
  62. },
  63. _doFinalize: function () {
  64. // Shortcuts
  65. var data = this._data;
  66. var dataWords = data.words;
  67. var nBitsTotal = this._nDataBytes * 8;
  68. var nBitsLeft = data.sigBytes * 8;
  69. // Add padding
  70. dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
  71. dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
  72. data.sigBytes = dataWords.length * 4;
  73. // Hash final blocks
  74. this._process();
  75. }
  76. });
  77. /**
  78. * Shortcut function to the hasher's object interface.
  79. *
  80. * @param {WordArray|string} message The message to hash.
  81. *
  82. * @return {WordArray} The hash.
  83. *
  84. * @static
  85. *
  86. * @example
  87. *
  88. * var hash = CryptoJS.SHA1('message');
  89. * var hash = CryptoJS.SHA1(wordArray);
  90. */
  91. C.SHA1 = Hasher._createHelper(SHA1);
  92. /**
  93. * Shortcut function to the HMAC's object interface.
  94. *
  95. * @param {WordArray|string} message The message to hash.
  96. * @param {WordArray|string} key The secret key.
  97. *
  98. * @return {WordArray} The HMAC.
  99. *
  100. * @static
  101. *
  102. * @example
  103. *
  104. * var hmac = CryptoJS.HmacSHA1(message, key);
  105. */
  106. C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
  107. }());