UNPKG

simple-js-sha2-512

Version:

how to import: ``` const sha2_512 = require('simple-js-sha2-512') ``` hashing: ``` sha2_512('hello') // 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 ```

148 lines (131 loc) 5.54 kB
const max = 2n ** 64n//Math.pow(2n, 32n) const fast = typeof window === 'undefined' const k = [ 0x428a2f98d728ae22n, 0x7137449123ef65cdn, 0xb5c0fbcfec4d3b2fn, 0xe9b5dba58189dbbcn, 0x3956c25bf348b538n, 0x59f111f1b605d019n, 0x923f82a4af194f9bn, 0xab1c5ed5da6d8118n, 0xd807aa98a3030242n, 0x12835b0145706fben, 0x243185be4ee4b28cn, 0x550c7dc3d5ffb4e2n, 0x72be5d74f27b896fn, 0x80deb1fe3b1696b1n, 0x9bdc06a725c71235n, 0xc19bf174cf692694n, 0xe49b69c19ef14ad2n, 0xefbe4786384f25e3n, 0x0fc19dc68b8cd5b5n, 0x240ca1cc77ac9c65n, 0x2de92c6f592b0275n, 0x4a7484aa6ea6e483n, 0x5cb0a9dcbd41fbd4n, 0x76f988da831153b5n, 0x983e5152ee66dfabn, 0xa831c66d2db43210n, 0xb00327c898fb213fn, 0xbf597fc7beef0ee4n, 0xc6e00bf33da88fc2n, 0xd5a79147930aa725n, 0x06ca6351e003826fn, 0x142929670a0e6e70n, 0x27b70a8546d22ffcn, 0x2e1b21385c26c926n, 0x4d2c6dfc5ac42aedn, 0x53380d139d95b3dfn, 0x650a73548baf63den, 0x766a0abb3c77b2a8n, 0x81c2c92e47edaee6n, 0x92722c851482353bn, 0xa2bfe8a14cf10364n, 0xa81a664bbc423001n, 0xc24b8b70d0f89791n, 0xc76c51a30654be30n, 0xd192e819d6ef5218n, 0xd69906245565a910n, 0xf40e35855771202an, 0x106aa07032bbd1b8n, 0x19a4c116b8d2d0c8n, 0x1e376c085141ab53n, 0x2748774cdf8eeb99n, 0x34b0bcb5e19b48a8n, 0x391c0cb3c5c95a63n, 0x4ed8aa4ae3418acbn, 0x5b9cca4f7763e373n, 0x682e6ff3d6b2b8a3n, 0x748f82ee5defb2fcn, 0x78a5636f43172f60n, 0x84c87814a1f0ab72n, 0x8cc702081a6439ecn, 0x90befffa23631e28n, 0xa4506cebde82bde9n, 0xbef9a3f7b2c67915n, 0xc67178f2e372532bn, 0xca273eceea26619cn, 0xd186b8c721c0c207n, 0xeada7dd6cde0eb1en, 0xf57d4f7fee6ed178n, 0x06f067aa72176fban, 0x0a637dc5a2c898a6n, 0x113f9804bef90daen, 0x1b710b35131c471bn, 0x28db77f523047d84n, 0x32caab7b40c72493n, 0x3c9ebe0a15c9bebcn, 0x431d67c49c100d4cn, 0x4cc5d4becb3e42b6n, 0x597f299cfc657e2an, 0x5fcb6fab3ad6faecn, 0x6c44198c4a475817n ] function rotr(x, n) { const b = (x >> (n)) const c = (x - (x >> (n) << n) << (64n - n)) return b+c } const utf8 = function (str) { var i, l = str.length, output = new Array(Math.ceil(str.length/64)*16).fill(0n) let current = 0n for (i = 0; i < l; i += 1) { const r = BigInt(i) % 8n if (r === 0n) { current = 0n } if (l !== i) { current += BigInt(str.charCodeAt(i)) << (7n - r) * 8n } else { current += 128n << +(7n - r) * 8n } output[BigInt(i)/8n | 0n] = current } const ln = BigInt(output.length * 8) output[Math.floor(i/8)] = output[Math.floor(i/8)] || 0n const offset = BigInt((8 - (i + 1)%8)*8) const inject = (0x80n << offset) output[Math.floor(i/8)] = ((output[Math.floor(i/8)] || 0n) | inject); output[output.length - 1] = BigInt(str.length * 8); return output } module.exports = m => { const H = [0x6a09e667f3bcc908n, 0xbb67ae8584caa73bn, 0x3c6ef372fe94f82bn, 0xa54ff53a5f1d36f1n, 0x510e527fade682d1n, 0x9b05688c2b3e6c1fn, 0x1f83d9abfb41bd6bn, 0x5be0cd19137e2179n] const utfStartTime = Date.now() const M = utf8(m); global.utfTime += Date.now() - utfStartTime const w = new Array(80) var a, b, c, d, e, f, g, h; // console.log(M) for (var t = 0, len = M.length; t < len; t+=16) { if (M[t] === undefined) { M[t] = 0 } a = H[0] b = H[1] c = H[2] d = H[3] e = H[4] f = H[5] g = H[6] h = H[7] for (let i = 0; i < 80; i++) { if (i <= 15) { w[i] = M[t + i] === undefined ? 0 : M[t + i]; } else { const w15 = w[i-15] const w2 = w[i-2] const s0 = rotr(w15, 1n) ^ rotr(w15, 8n) ^ (w15 >> 7n) const s1 = rotr(w2, 19n) ^ rotr(w2, 61n) ^ (w2 >> 6n) w[i] = (w[i-16] + s0 + w[i-7] + s1) % max } const S1 = rotr(e, 14n) ^ rotr(e, 18n) ^ rotr(e, 41n) const ch = (e & f) ^ (~e & g) const temp1 = (h + S1 + ch + k[i] + w[i]) % max const S0 = rotr(a, 28n) ^ rotr(a, 34n) ^ rotr(a, 39n) const maj = (a & b) ^ (a & c) ^ (b & c) const temp2 = (S0 + maj) % max h = g g = f f = e e = (d + temp1) % max d = c c = b b = a a = (temp1 + temp2) % max } H[0] = (H[0] + a) % max H[1] = (H[1] + b) % max H[2] = (H[2] + c) % max H[3] = (H[3] + d) % max H[4] = (H[4] + e) % max H[5] = (H[5] + f) % max H[6] = (H[6] + g) % max H[7] = (H[7] + h) % max } H[0] = (H[0] + max) % max H[1] = (H[1] + max) % max H[2] = (H[2] + max) % max H[3] = (H[3] + max) % max H[4] = (H[4] + max) % max H[5] = (H[5] + max) % max H[6] = (H[6] + max) % max H[7] = (H[7] + max) % max return base16(H) } const base16 = (H) => { let arr = [] for (let i = 0; i < 8; i++) { const j = i * 8 const item = H[i] arr[j] = (item >> 56n) & 0xffn arr[j + 1] = (item >> 48n) & 0xffn arr[j + 2] = (item >> 40n) & 0xffn arr[j + 3] = (item >> 32n) & 0xffn arr[j + 4] = (item >> 24n) & 0xffn arr[j + 5] = (item >> 16n) & 0xffn arr[j + 6] = (item >> 8n) & 0xffn arr[j + 7] = item & 0xffn } return arr.map(i => i.toString(16).padStart(2, '0')).join('') }