function sha1(m){ let add = function(a, b){ return ((a >>> 0) + (b >>> 0)) | 0; } let lrot = function(v, r){ return (v << r) | (v >>> (32 - r)); } let h = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; let ml = m.length * 8; m += "\x80"; while(m.length % 64 != 60){ m += "\x00"; } for(let i = 24; i >= 0; i -= 8){ m += String.fromCharCode((ml >>> i) & 0xff); } for(let cn = 0; cn < m.length; cn += 64){ let w = new Array(80); for(let i = 0; i < 16; i++){ w[i] = 0; for(let j = 0; j < 4; j++){ w[i] <<= 8; w[i] |= m.charCodeAt(cn + i * 4 + j); } } for(let i = 16; i < 80; i++){ w[i] = lrot(w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16], 1); } let a = h.concat([]); for(let i = 0; i < 80; i++){ let f, k; if(i < 20){ f = (a[1] & a[2]) | (~a[1] & a[3]); k = 0x5a827999; }else if(i < 40){ f = a[1] ^ a[2] ^ a[3]; k = 0x6ed9eba1; }else if(i < 60){ f = (a[1] & a[2]) | (a[1] & a[3]) | (a[2] & a[3]); k = 0x8f1bbcdc; }else{ f = a[1] ^ a[2] ^ a[3]; k = 0xca62c1d6; } let tmp = add(add(add(add(lrot(a[0], 5), f), a[4]), k), w[i]); a[4] = a[3]; a[3] = a[2]; a[2] = lrot(a[1], 30); a[1] = a[0]; a[0] = tmp; } for(let i = 0; i < 5; i++){ h[i] = add(h[i], a[i]); } } let hh = ""; for(let hp of h){ for(let i = 24; i >= 0; i -= 8){ hh += String.fromCharCode((hp >>> i) & 0xff); } } return hh; }