UNPKG

gnablib

Version:

A lean, zero dependency library to provide a useful base for your project.

2 lines 11.1 kB
/*! Copyright 2025 the gnablib contributors MPL-1.1 */ var t,a=this&&this.__classPrivateFieldSet||function(t,a,s,e,i){if("m"===e)throw new TypeError("Private method is not writable");if("a"===e&&!i)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof a?t!==a||!i:!a.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===e?i.call(t,s):i?i.value=s:a.set(t,s),s},s=this&&this.__classPrivateFieldGet||function(t,a,s,e){if("a"===s&&!e)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof a?t!==a||!e:!a.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?e:"a"===s?e.call(t):e?e.value:a.get(t)};import{U64 as e,U64Mut as i,U64MutArray as h}from"../../primitive/number/U64.js";import{sLen as r}from"../../safe/safe.js";const o=e.fromI32s(2851871266,466688986),n=i.fromInt(0);export class Tweak{constructor(t){this.t8=new Uint8Array(24),this._lock=!1,t&&t.length>0&&(r("tweak",t).exactly(16).throwNot(),this.t8.set(t));const a=new Uint32Array(this.t8.buffer);this.t64=h.mount(a)}set isFirst(t){t?this.t8[15]|=64:this.t8[15]&=-65,this._lock=!1}set isLast(t){t?this.t8[15]|=128:this.t8[15]&=-129,this._lock=!1}set lock(t){t&&!this._lock?(this._lock=!0,this.t64.at(2).set(this.t64.at(0)).xorEq(this.t64.at(1))):this._lock=t}incr(t){this.t64.at(0).addEq(e.fromInt(t)),this._lock=!1}makeCfg(t){this.t8.fill(0),this.t8[15]=196,this.t64.at(0).set(e.fromInt(t)),this._lock=!1}makeKdf(){this.t8.fill(0),this.t8[15]=80,this._lock=!1}makeMsg(){this.t8.fill(0),this.t8[15]=112,this._lock=!1}makeOut(){this.t8.fill(0),this.t8[0]=8,this.t8[15]=255,this._lock=!1}static NewKey(){const t=new Tweak;return t.t8[15]=64,t}}export class Key{constructor(t){this.k8=t,this._lock=!1;const a=new Uint32Array(t.buffer);this.k64=h.mount(a)}get length(){return this.k8.length-8}set lock(t){if(t&&!this._lock){const t=this.k64.length-1,a=this.k64.at(t).set(o);for(let s=0;s<t;s++)a.xorEq(this.k64.at(s));this._lock=!0}else this._lock=t}static fromSize(t){const a=new Uint8Array(t+8);return new Key(a)}static fromKey(t){const a=new Uint8Array(t.length+8);return a.set(t),new Key(a)}}class l{constructor(s,e,i){this.qr=s,this.t=i,t.set(this,void 0),this.blockSize=e.length,a(this,t,e,"f")}addRk(a,i){a.at(a.length-3).addEq(this.t.t64.at(i%3)),a.at(a.length-2).addEq(this.t.t64.at((i+1)%3)),a.at(a.length-1).addEq(e.fromInt(i)),a.at(0).addEq(s(this,t,"f").k64.at(i%s(this,t,"f").k64.length)),a.at(1).addEq(s(this,t,"f").k64.at((i+1)%s(this,t,"f").k64.length)),a.at(2).addEq(s(this,t,"f").k64.at((i+2)%s(this,t,"f").k64.length)),a.at(3).addEq(s(this,t,"f").k64.at((i+3)%s(this,t,"f").k64.length)),4!=a.length&&(a.at(4).addEq(s(this,t,"f").k64.at((i+4)%s(this,t,"f").k64.length)),a.at(5).addEq(s(this,t,"f").k64.at((i+5)%s(this,t,"f").k64.length)),a.at(6).addEq(s(this,t,"f").k64.at((i+6)%s(this,t,"f").k64.length)),a.at(7).addEq(s(this,t,"f").k64.at((i+7)%s(this,t,"f").k64.length)),8!=a.length&&(a.at(8).addEq(s(this,t,"f").k64.at((i+8)%s(this,t,"f").k64.length)),a.at(9).addEq(s(this,t,"f").k64.at((i+9)%s(this,t,"f").k64.length)),a.at(10).addEq(s(this,t,"f").k64.at((i+10)%s(this,t,"f").k64.length)),a.at(11).addEq(s(this,t,"f").k64.at((i+11)%s(this,t,"f").k64.length)),a.at(12).addEq(s(this,t,"f").k64.at((i+12)%s(this,t,"f").k64.length)),a.at(13).addEq(s(this,t,"f").k64.at((i+13)%s(this,t,"f").k64.length)),a.at(14).addEq(s(this,t,"f").k64.at((i+14)%s(this,t,"f").k64.length)),a.at(15).addEq(s(this,t,"f").k64.at((i+15)%s(this,t,"f").k64.length))))}subRk(a,i){a.at(a.length-3).subEq(this.t.t64.at(i%3)),a.at(a.length-2).subEq(this.t.t64.at((i+1)%3)),a.at(a.length-1).subEq(e.fromInt(i)),a.at(0).subEq(s(this,t,"f").k64.at(i%s(this,t,"f").k64.length)),a.at(1).subEq(s(this,t,"f").k64.at((i+1)%s(this,t,"f").k64.length)),a.at(2).subEq(s(this,t,"f").k64.at((i+2)%s(this,t,"f").k64.length)),a.at(3).subEq(s(this,t,"f").k64.at((i+3)%s(this,t,"f").k64.length)),4!=a.length&&(a.at(4).subEq(s(this,t,"f").k64.at((i+4)%s(this,t,"f").k64.length)),a.at(5).subEq(s(this,t,"f").k64.at((i+5)%s(this,t,"f").k64.length)),a.at(6).subEq(s(this,t,"f").k64.at((i+6)%s(this,t,"f").k64.length)),a.at(7).subEq(s(this,t,"f").k64.at((i+7)%s(this,t,"f").k64.length)),8!=a.length&&(a.at(8).subEq(s(this,t,"f").k64.at((i+8)%s(this,t,"f").k64.length)),a.at(9).subEq(s(this,t,"f").k64.at((i+9)%s(this,t,"f").k64.length)),a.at(10).subEq(s(this,t,"f").k64.at((i+10)%s(this,t,"f").k64.length)),a.at(11).subEq(s(this,t,"f").k64.at((i+11)%s(this,t,"f").k64.length)),a.at(12).subEq(s(this,t,"f").k64.at((i+12)%s(this,t,"f").k64.length)),a.at(13).subEq(s(this,t,"f").k64.at((i+13)%s(this,t,"f").k64.length)),a.at(14).subEq(s(this,t,"f").k64.at((i+14)%s(this,t,"f").k64.length)),a.at(15).subEq(s(this,t,"f").k64.at((i+15)%s(this,t,"f").k64.length))))}encryptBlock(a,e=0){const i=e*this.blockSize;r("block",a).atLeast(i+this.blockSize).throwNot(),s(this,t,"f").lock=!0,this.t.lock=!0,this._encBlock(a.subarray(i,i+this.blockSize))}decryptBlock(a,e=0){const i=e*this.blockSize;r("block",a).atLeast(i+this.blockSize).throwNot(),s(this,t,"f").lock=!0,this.t.lock=!0,this._decBlock(a.subarray(i,i+this.blockSize))}}t=new WeakMap;export class Threefish256 extends l{constructor(t,a){r("key",t).exactly(32).throwNot(),t instanceof Uint8Array&&(t=Key.fromKey(t)),a instanceof Uint8Array&&(a=new Tweak(a)),super(18,t,a)}swap(t){n.set(t.at(1)),t.at(1).set(t.at(3)),t.at(3).set(n)}mixPerm(t,a,s){t.at(0).addEq(t.at(1)),t.at(1).lRotEq(a).xorEq(t.at(0)),t.at(2).addEq(t.at(3)),t.at(3).lRotEq(s).xorEq(t.at(2)),this.swap(t)}permUnmix(t,a,s){this.swap(t),t.at(3).xorEq(t.at(2)).rRotEq(a),t.at(2).subEq(t.at(3)),t.at(1).xorEq(t.at(0)).rRotEq(s),t.at(0).subEq(t.at(1))}_encBlock(t){const a=h.mount(new Uint32Array(t.buffer,t.byteOffset,t.length/4));let s=0;do{this.addRk(a,s++),this.mixPerm(a,14,16),this.mixPerm(a,52,57),this.mixPerm(a,23,40),this.mixPerm(a,5,37),this.addRk(a,s++),this.mixPerm(a,25,33),this.mixPerm(a,46,12),this.mixPerm(a,58,22),this.mixPerm(a,32,32)}while(s<this.qr);this.addRk(a,s)}_decBlock(t){const a=h.mount(new Uint32Array(t.buffer,t.byteOffset,t.length/4));let s=this.qr;this.subRk(a,s--);do{this.permUnmix(a,32,32),this.permUnmix(a,22,58),this.permUnmix(a,12,46),this.permUnmix(a,33,25),this.subRk(a,s--),this.permUnmix(a,37,5),this.permUnmix(a,40,23),this.permUnmix(a,57,52),this.permUnmix(a,16,14),this.subRk(a,s--)}while(s>=0)}}export class Threefish512 extends l{constructor(t,a){r("key",t).exactly(64).throwNot(),t instanceof Uint8Array&&(t=Key.fromKey(t)),a instanceof Uint8Array&&(a=new Tweak(a)),super(18,t,a)}swap(t){n.set(t.at(0)),t.at(0).set(t.at(2)),t.at(2).set(t.at(4)),t.at(4).set(t.at(6)),t.at(6).set(n),n.set(t.at(3)),t.at(3).set(t.at(7)),t.at(7).set(n)}unswap(t){n.set(t.at(0)),t.at(0).set(t.at(6)),t.at(6).set(t.at(4)),t.at(4).set(t.at(2)),t.at(2).set(n),n.set(t.at(3)),t.at(3).set(t.at(7)),t.at(7).set(n)}mixPerm(t,a,s,e,i){t.at(0).addEq(t.at(1)),t.at(1).lRotEq(a).xorEq(t.at(0)),t.at(2).addEq(t.at(3)),t.at(3).lRotEq(s).xorEq(t.at(2)),t.at(4).addEq(t.at(5)),t.at(5).lRotEq(e).xorEq(t.at(4)),t.at(6).addEq(t.at(7)),t.at(7).lRotEq(i).xorEq(t.at(6)),this.swap(t)}permUnmix(t,a,s,e,i){this.unswap(t),t.at(7).xorEq(t.at(6)).rRotEq(a),t.at(6).subEq(t.at(7)),t.at(5).xorEq(t.at(4)).rRotEq(s),t.at(4).subEq(t.at(5)),t.at(3).xorEq(t.at(2)).rRotEq(e),t.at(2).subEq(t.at(3)),t.at(1).xorEq(t.at(0)).rRotEq(i),t.at(0).subEq(t.at(1))}_encBlock(t){const a=h.mount(new Uint32Array(t.buffer,t.byteOffset,t.length/4));let s=0;do{this.addRk(a,s++),this.mixPerm(a,46,36,19,37),this.mixPerm(a,33,27,14,42),this.mixPerm(a,17,49,36,39),this.mixPerm(a,44,9,54,56),this.addRk(a,s++),this.mixPerm(a,39,30,34,24),this.mixPerm(a,13,50,10,17),this.mixPerm(a,25,29,39,43),this.mixPerm(a,8,35,56,22)}while(s<this.qr);this.addRk(a,s)}_decBlock(t){const a=h.mount(new Uint32Array(t.buffer,t.byteOffset,t.length/4));let s=this.qr;this.subRk(a,s--);do{this.permUnmix(a,22,56,35,8),this.permUnmix(a,43,39,29,25),this.permUnmix(a,17,10,50,13),this.permUnmix(a,24,34,30,39),this.subRk(a,s--),this.permUnmix(a,56,54,9,44),this.permUnmix(a,39,36,49,17),this.permUnmix(a,42,14,27,33),this.permUnmix(a,37,19,36,46),this.subRk(a,s--)}while(s>=0)}}export class Threefish1024 extends l{constructor(t,a){r("key",t).exactly(128).throwNot(),t instanceof Uint8Array&&(t=Key.fromKey(t)),a instanceof Uint8Array&&(a=new Tweak(a)),super(20,t,a)}swap(t){n.set(t.at(1)),t.at(1).set(t.at(9)),t.at(9).set(t.at(7)),t.at(7).set(t.at(15)),t.at(15).set(n),n.set(t.at(3)),t.at(3).set(t.at(13)),t.at(13).set(t.at(5)),t.at(5).set(t.at(11)),t.at(11).set(n),n.set(t.at(4)),t.at(4).set(t.at(6)),t.at(6).set(n),n.set(t.at(8)),t.at(8).set(t.at(10)),t.at(10).set(t.at(12)),t.at(12).set(t.at(14)),t.at(14).set(n)}unswap(t){n.set(t.at(1)),t.at(1).set(t.at(15)),t.at(15).set(t.at(7)),t.at(7).set(t.at(9)),t.at(9).set(n),n.set(t.at(3)),t.at(3).set(t.at(11)),t.at(11).set(t.at(5)),t.at(5).set(t.at(13)),t.at(13).set(n),n.set(t.at(4)),t.at(4).set(t.at(6)),t.at(6).set(n),n.set(t.at(10)),t.at(10).set(t.at(8)),t.at(8).set(t.at(14)),t.at(14).set(t.at(12)),t.at(12).set(n)}mixPerm(t,a,s,e,i,h,r,o,n){t.at(0).addEq(t.at(1)),t.at(1).lRotEq(a).xorEq(t.at(0)),t.at(2).addEq(t.at(3)),t.at(3).lRotEq(s).xorEq(t.at(2)),t.at(4).addEq(t.at(5)),t.at(5).lRotEq(e).xorEq(t.at(4)),t.at(6).addEq(t.at(7)),t.at(7).lRotEq(i).xorEq(t.at(6)),t.at(8).addEq(t.at(9)),t.at(9).lRotEq(h).xorEq(t.at(8)),t.at(10).addEq(t.at(11)),t.at(11).lRotEq(r).xorEq(t.at(10)),t.at(12).addEq(t.at(13)),t.at(13).lRotEq(o).xorEq(t.at(12)),t.at(14).addEq(t.at(15)),t.at(15).lRotEq(n).xorEq(t.at(14)),this.swap(t)}permUnmix(t,a,s,e,i,h,r,o,n){this.unswap(t),t.at(15).xorEq(t.at(14)).rRotEq(a),t.at(14).subEq(t.at(15)),t.at(13).xorEq(t.at(12)).rRotEq(s),t.at(12).subEq(t.at(13)),t.at(11).xorEq(t.at(10)).rRotEq(e),t.at(10).subEq(t.at(11)),t.at(9).xorEq(t.at(8)).rRotEq(i),t.at(8).subEq(t.at(9)),t.at(7).xorEq(t.at(6)).rRotEq(h),t.at(6).subEq(t.at(7)),t.at(5).xorEq(t.at(4)).rRotEq(r),t.at(4).subEq(t.at(5)),t.at(3).xorEq(t.at(2)).rRotEq(o),t.at(2).subEq(t.at(3)),t.at(1).xorEq(t.at(0)).rRotEq(n),t.at(0).subEq(t.at(1))}_encBlock(t){const a=h.mount(new Uint32Array(t.buffer,t.byteOffset,t.length/4));let s=0;do{this.addRk(a,s++),this.mixPerm(a,24,13,8,47,8,17,22,37),this.mixPerm(a,38,19,10,55,49,18,23,52),this.mixPerm(a,33,4,51,13,34,41,59,17),this.mixPerm(a,5,20,48,41,47,28,16,25),this.addRk(a,s++),this.mixPerm(a,41,9,37,31,12,47,44,30),this.mixPerm(a,16,34,56,51,4,53,42,41),this.mixPerm(a,31,44,47,46,19,42,44,25),this.mixPerm(a,9,48,35,52,23,31,37,20)}while(s<this.qr);this.addRk(a,s)}_decBlock(t){const a=h.mount(new Uint32Array(t.buffer,t.byteOffset,t.length/4));let s=this.qr;this.subRk(a,s--);do{this.permUnmix(a,20,37,31,23,52,35,48,9),this.permUnmix(a,25,44,42,19,46,47,44,31),this.permUnmix(a,41,42,53,4,51,56,34,16),this.permUnmix(a,30,44,47,12,31,37,9,41),this.subRk(a,s--),this.permUnmix(a,25,16,28,47,41,48,20,5),this.permUnmix(a,17,59,41,34,13,51,4,33),this.permUnmix(a,52,23,18,49,55,10,19,38),this.permUnmix(a,37,22,17,8,47,8,13,24),this.subRk(a,s--)}while(s>=0)}}