gnablib
Version:
A lean, zero dependency library to provide a useful base for your project.
2 lines • 2.8 kB
JavaScript
/*! Copyright 2022-2025 the gnablib contributors MPL-1.1 */
var t,s,i,e=this&&this.__classPrivateFieldGet||function(t,s,i,e){if("a"===i&&!e)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof s?t!==s||!e:!s.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?e:"a"===i?e.call(t):e?e.value:s.get(t)};import{asBE as h}from"../../endian/platform.js";import{U32 as o}from"../../primitive/number/U32Static.js";const r=[1518500249,1859775393,2400959708,3395469782],f=[1732584193,4023233417,2562383102,271733878,3285377520];export class Sha1{constructor(){this.size=20,this.blockSize=64,t.set(this,new Uint32Array(5)),s.set(this,new Uint8Array(64)),i.set(this,new Uint32Array(e(this,s,"f").buffer)),this._ingestBytes=0,this._bPos=0,this.reset()}hash(){const f=new Uint32Array(80);let n,a=e(this,t,"f")[0],l=e(this,t,"f")[1],b=e(this,t,"f")[2],_=e(this,t,"f")[3],c=e(this,t,"f")[4],u=0;for(;u<16;u++)h.i32(e(this,s,"f"),4*u),f[u]=e(this,i,"f")[u],n=o.lRot(a,5)+(_^l&(b^_))+c+f[u]+r[0],c=_,_=b,b=o.lRot(l,30),l=a,a=n;for(;u<20;u++)f[u]=o.lRot(f[u-3]^f[u-8]^f[u-14]^f[u-16],1),n=o.lRot(a,5)+(_^l&(b^_))+c+f[u]+r[0],c=_,_=b,b=o.lRot(l,30),l=a,a=n;for(;u<40;u++)f[u]=o.lRot(f[u-3]^f[u-8]^f[u-14]^f[u-16],1),n=o.lRot(a,5)+(l^b^_)+c+f[u]+r[1],c=_,_=b,b=o.lRot(l,30),l=a,a=n;for(;u<60;u++)f[u]=o.lRot(f[u-3]^f[u-8]^f[u-14]^f[u-16],1),n=o.lRot(a,5)+((l|b)&_|l&b)+c+f[u]+r[2],c=_,_=b,b=o.lRot(l,30),l=a,a=n;for(;u<80;u++)f[u]=o.lRot(f[u-3]^f[u-8]^f[u-14]^f[u-16],1),n=o.lRot(a,5)+(l^b^_)+c+f[u]+r[3],c=_,_=b,b=o.lRot(l,30),l=a,a=n;e(this,t,"f")[0]+=a,e(this,t,"f")[1]+=l,e(this,t,"f")[2]+=b,e(this,t,"f")[3]+=_,e(this,t,"f")[4]+=c,this._bPos=0}write(t){this._ingestBytes+=t.length;let i=t.length,h=0,o=64-this._bPos;for(;i>0;){if(o>i)return e(this,s,"f").set(t.subarray(h),this._bPos),void(this._bPos+=i);e(this,s,"f").set(t.subarray(h,h+o),this._bPos),this._bPos+=o,this.hash(),h+=o,i-=o,o=64}}sum(){return this.clone().sumIn()}sumIn(){e(this,s,"f")[this._bPos]=128,this._bPos++;this._bPos>56&&(e(this,s,"f").fill(0,this._bPos),this.hash()),e(this,s,"f").fill(0,this._bPos);e(this,i,"f")[14]=this._ingestBytes/536870912,e(this,i,"f")[15]=this._ingestBytes<<3,h.i32(e(this,s,"f"),56),h.i32(e(this,s,"f"),60),this.hash();const o=new Uint8Array(e(this,t,"f").buffer,e(this,t,"f").byteOffset);for(let t=0;t<20;t++)h.i32(o,4*t);return o.slice(0,20)}reset(){e(this,t,"f")[0]=f[0],e(this,t,"f")[1]=f[1],e(this,t,"f")[2]=f[2],e(this,t,"f")[3]=f[3],e(this,t,"f")[4]=f[4],this._ingestBytes=0,this._bPos=0}newEmpty(){return new Sha1}clone(){const i=new Sha1;return e(i,t,"f").set(e(this,t,"f")),e(i,s,"f").set(e(this,s,"f")),i._ingestBytes=this._ingestBytes,i._bPos=this._bPos,i}}t=new WeakMap,s=new WeakMap,i=new WeakMap;