SHA256.js 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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; // Constants
  8. var K = [
  9. 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206,
  10. 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671,
  11. 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411,
  12. 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779,
  13. 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298
  14. ];
  15. // Public API
  16. var SHA256 = (C.SHA256 = function (message, options) {
  17. var digestbytes = util.wordsToBytes(SHA256._sha256(message));
  18. return options && options.asBytes ? digestbytes : options && options.asString ? Binary.bytesToString(digestbytes) : util.bytesToHex(digestbytes);
  19. });
  20. // The core
  21. SHA256._sha256 = function (message) {
  22. // Convert to byte array
  23. if (message.constructor == String) {
  24. message = UTF8.stringToBytes(message);
  25. }
  26. /* else, assume byte array already */
  27. var m = util.bytesToWords(message);
  28. var l = message.length * 8;
  29. var H = [1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225];
  30. var w = [];
  31. var a;
  32. var b;
  33. var c;
  34. var d;
  35. var e;
  36. var f;
  37. var g;
  38. var h;
  39. var i;
  40. var j;
  41. var t1;
  42. var t2; // Padding
  43. m[l >> 5] |= 128 << (24 - (l % 32));
  44. m[(((l + 64) >> 9) << 4) + 15] = l;
  45. for (var i = 0; i < m.length; i += 16) {
  46. a = H[0];
  47. b = H[1];
  48. c = H[2];
  49. d = H[3];
  50. e = H[4];
  51. f = H[5];
  52. g = H[6];
  53. h = H[7];
  54. for (var j = 0; j < 64; j++) {
  55. if (j < 16) {
  56. w[j] = m[j + i];
  57. } else {
  58. var gamma0x = w[j - 15];
  59. var gamma1x = w[j - 2];
  60. var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ ((gamma0x << 14) | (gamma0x >>> 18)) ^ (gamma0x >>> 3);
  61. var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ ((gamma1x << 13) | (gamma1x >>> 19)) ^ (gamma1x >>> 10);
  62. w[j] = gamma0 + (w[j - 7] >>> 0) + gamma1 + (w[j - 16] >>> 0);
  63. }
  64. var ch = (e & f) ^ (~e & g);
  65. var maj = (a & b) ^ (a & c) ^ (b & c);
  66. var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
  67. var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));
  68. t1 = (h >>> 0) + sigma1 + ch + K[j] + (w[j] >>> 0);
  69. t2 = sigma0 + maj;
  70. h = g;
  71. g = f;
  72. f = e;
  73. e = (d + t1) >>> 0;
  74. d = c;
  75. c = b;
  76. b = a;
  77. a = (t1 + t2) >>> 0;
  78. }
  79. H[0] += a;
  80. H[1] += b;
  81. H[2] += c;
  82. H[3] += d;
  83. H[4] += e;
  84. H[5] += f;
  85. H[6] += g;
  86. H[7] += h;
  87. }
  88. return H;
  89. };
  90. // Package private blocksize
  91. SHA256._blocksize = 16;
  92. SHA256._digestsize = 32;
  93. })();