gnablib
Version:
A lean, zero dependency library to provide a useful base for your project.
2 lines • 5.06 kB
JavaScript
/*! Copyright 2023-2024 the gnablib contributors MPL-1.1 */
var t,s,i=this&&this.__classPrivateFieldSet||function(t,s,i,h,u){if("m"===h)throw new TypeError("Private method is not writable");if("a"===h&&!u)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof s?t!==s||!u:!s.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===h?u.call(t,i):u?u.value=i:s.set(t,i),i},h=this&&this.__classPrivateFieldGet||function(t,s,i,h){if("a"===i&&!h)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof s?t!==s||!h:!s.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?h:"a"===i?h.call(t):h?h.value:s.get(t)};import{asLE as u}from"../../endian/platform.js";import{ContentError as e}from"../../error/ContentError.js";import{U32 as o}from"../../primitive/number/U32Static.js";import{U64 as r,U64Mut as n}from"../../primitive/number/U64.js";import{sLen as l}from"../../safe/safe.js";const a=64,c=[1634760805,857760878,2036477234,1797285236],f=[1634760805,824206446,2036477238,1797285236];class w{constructor(t){this.rounds=t,this.u8=new Uint8Array(a),this.u32=new Uint32Array(this.u8.buffer)}block(){for(let t=this.rounds;t>0;t-=2)this.u32[4]^=o.lRot(this.u32[0]+this.u32[12],7),this.u32[8]^=o.lRot(this.u32[4]+this.u32[0],9),this.u32[12]^=o.lRot(this.u32[8]+this.u32[4],13),this.u32[0]^=o.lRot(this.u32[12]+this.u32[8],18),this.u32[9]^=o.lRot(this.u32[5]+this.u32[1],7),this.u32[13]^=o.lRot(this.u32[9]+this.u32[5],9),this.u32[1]^=o.lRot(this.u32[13]+this.u32[9],13),this.u32[5]^=o.lRot(this.u32[1]+this.u32[13],18),this.u32[14]^=o.lRot(this.u32[10]+this.u32[6],7),this.u32[2]^=o.lRot(this.u32[14]+this.u32[10],9),this.u32[6]^=o.lRot(this.u32[2]+this.u32[14],13),this.u32[10]^=o.lRot(this.u32[6]+this.u32[2],18),this.u32[3]^=o.lRot(this.u32[15]+this.u32[11],7),this.u32[7]^=o.lRot(this.u32[3]+this.u32[15],9),this.u32[11]^=o.lRot(this.u32[7]+this.u32[3],13),this.u32[15]^=o.lRot(this.u32[11]+this.u32[7],18),this.u32[1]^=o.lRot(this.u32[0]+this.u32[3],7),this.u32[2]^=o.lRot(this.u32[1]+this.u32[0],9),this.u32[3]^=o.lRot(this.u32[2]+this.u32[1],13),this.u32[0]^=o.lRot(this.u32[3]+this.u32[2],18),this.u32[6]^=o.lRot(this.u32[5]+this.u32[4],7),this.u32[7]^=o.lRot(this.u32[6]+this.u32[5],9),this.u32[4]^=o.lRot(this.u32[7]+this.u32[6],13),this.u32[5]^=o.lRot(this.u32[4]+this.u32[7],18),this.u32[11]^=o.lRot(this.u32[10]+this.u32[9],7),this.u32[8]^=o.lRot(this.u32[11]+this.u32[10],9),this.u32[9]^=o.lRot(this.u32[8]+this.u32[11],13),this.u32[10]^=o.lRot(this.u32[9]+this.u32[8],18),this.u32[12]^=o.lRot(this.u32[15]+this.u32[14],7),this.u32[13]^=o.lRot(this.u32[12]+this.u32[15],9),this.u32[14]^=o.lRot(this.u32[13]+this.u32[12],13),this.u32[15]^=o.lRot(this.u32[14]+this.u32[13],18)}}class R{constructor(o,r,R,p){let y,b,d;if(this.blockSize=a,t.set(this,new Uint32Array(16)),s.set(this,void 0),i(this,s,new w(p),"f"),16===o.length)y=o.slice(0),u.i32(y,0,4),b=y.slice(),d=f;else{if(32!==o.length)throw new e("should be 16 or 32","key.length",o.length);y=o.slice(0,16),u.i32(y,0,4),b=o.slice(16,32),u.i32(b,0,4),d=c}l("nonce",r).exactly(8).throwNot(),h(this,t,"f")[0]=d[0],h(this,t,"f")[5]=d[1],h(this,t,"f")[10]=d[2],h(this,t,"f")[15]=d[3];const m=new Uint32Array(y.buffer);h(this,t,"f").set(m,1);const k=new Uint32Array(b.buffer);h(this,t,"f").set(k,11),this._count=n.mount(h(this,t,"f"),8),this._count.set(R);const v=r.slice();u.i32(v,0,2);const U=new Uint32Array(v.buffer);h(this,t,"f")[6]=U[0],h(this,t,"f")[7]=U[1]}block(){h(this,s,"f").u32.set(h(this,t,"f")),h(this,s,"f").block();for(let i=0;i<16;i++)h(this,s,"f").u32[i]+=h(this,t,"f")[i];this._count.addEq(r.fromInt(1))}decryptInto(t,i){let u=i.length,e=0;for(i!==t&&t.set(i);u>=a;){this.block();for(let i=0;i<a;i++)t[e++]^=h(this,s,"f").u8[i];u-=a}if(u>0){this.block();for(let i=0;i<u;i++)t[e++]^=h(this,s,"f").u8[i]}}encryptInto(t,i){let u=i.length,e=0;for(t!==i&&t.set(i);u>=a;){this.block();for(let i=0;i<a;i++)t[e++]^=h(this,s,"f").u8[i];u-=a}if(u>0){this.block();for(let i=0;i<u;i++)t[e++]^=h(this,s,"f").u8[i]}}encryptSize(t){return t}}function p(t,s,i,h){l("output",t).atLeast(32).throwNot(),l("key",s).exactly(32).throwNot();const e=new w(h);e.u32[0]=c[0],e.u32[5]=c[1],e.u32[10]=c[2],e.u32[15]=c[3],e.u8.set(s.slice(0,16),4),e.u8.set(s.slice(16,32),44),e.u8.set(i.subarray(0,16),24),u.i32(e.u8,0,16),e.block();const o=new Uint32Array(t.buffer,t.byteOffset,t.byteLength>>>2);o[0]=e.u32[0],o[1]=e.u32[5],o[2]=e.u32[10],o[3]=e.u32[15],o[4]=e.u32[6],o[5]=e.u32[7],o[6]=e.u32[8],o[7]=e.u32[9],u.i32(t,0,8)}t=new WeakMap,s=new WeakMap;class y extends R{constructor(t,s,i,h){l("nonce",s).exactly(24).throwNot();const u=new Uint8Array(32);p(u,t,s,h),super(u,s.subarray(16),i,h)}}export class Salsa20 extends R{constructor(t,s,i=r.zero){super(t,s,i,20)}}export function hSalsa20(t,s,i){l("input",i).atLeast(16).throwNot(),p(t,s,i,20)}export class XSalsa20 extends y{constructor(t,s,i=r.zero){super(t,s,i,20)}}