SHA1.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. (function () {
  2. var C = typeof window === 'undefined' ? require('./Crypto').Crypto : window.Crypto;
  3. // Shortcuts
  4. var util = C.util;
  5. var charenc = C.charenc;
  6. var UTF8 = charenc.UTF8;
  7. var Binary = charenc.Binary; // Public API
  8. var SHA1 = (C.SHA1 = function (message, options) {
  9. var digestbytes = util.wordsToBytes(SHA1._sha1(message));
  10. return options && options.asBytes ? digestbytes : options && options.asString ? Binary.bytesToString(digestbytes) : util.bytesToHex(digestbytes);
  11. });
  12. // The core
  13. SHA1._sha1 = function (message) {
  14. // Convert to byte array
  15. if (message.constructor == String) {
  16. message = UTF8.stringToBytes(message);
  17. }
  18. /* else, assume byte array already */
  19. var m = util.bytesToWords(message);
  20. var l = message.length * 8;
  21. var w = [];
  22. var H0 = 1732584193;
  23. var H1 = -271733879;
  24. var H2 = -1732584194;
  25. var H3 = 271733878;
  26. var H4 = -1009589776; // Padding
  27. m[l >> 5] |= 128 << (24 - (l % 32));
  28. m[(((l + 64) >>> 9) << 4) + 15] = l;
  29. for (var i = 0; i < m.length; i += 16) {
  30. var a = H0;
  31. var b = H1;
  32. var c = H2;
  33. var d = H3;
  34. var e = H4;
  35. for (var j = 0; j < 80; j++) {
  36. if (j < 16) {
  37. w[j] = m[i + j];
  38. } else {
  39. var n = w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16];
  40. w[j] = (n << 1) | (n >>> 31);
  41. }
  42. var t =
  43. ((H0 << 5) | (H0 >>> 27)) +
  44. H4 +
  45. (w[j] >>> 0) +
  46. (j < 20
  47. ? ((H1 & H2) | (~H1 & H3)) + 1518500249
  48. : j < 40
  49. ? (H1 ^ H2 ^ H3) + 1859775393
  50. : j < 60
  51. ? ((H1 & H2) | (H1 & H3) | (H2 & H3)) - 1894007588
  52. : (H1 ^ H2 ^ H3) - 899497514);
  53. H4 = H3;
  54. H3 = H2;
  55. H2 = (H1 << 30) | (H1 >>> 2);
  56. H1 = H0;
  57. H0 = t;
  58. }
  59. H0 += a;
  60. H1 += b;
  61. H2 += c;
  62. H3 += d;
  63. H4 += e;
  64. }
  65. return [H0, H1, H2, H3, H4];
  66. };
  67. // Package private blocksize
  68. SHA1._blocksize = 16;
  69. SHA1._digestsize = 20;
  70. })();