gnablib
Version:
A lean, zero dependency library to provide a useful base for your project.
2 lines • 3.75 kB
JavaScript
/*! Copyright 2023-2024 the gnablib contributors MPL-1.1 */
var t,i,s,h,f=this&&this.__classPrivateFieldGet||function(t,i,s,h){if("a"===s&&!h)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof i?t!==i||!h:!i.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?h:"a"===s?h.call(t):h?h.value:i.get(t)};import{asBE as e,asLE as o}from"../../endian/platform.js";import{U32 as r}from"../../primitive/number/U32Static.js";import{sLen as n}from"../../safe/safe.js";const l=[1295307597,3545052371,886263092,1295307597,3545052371,886263092,1295307597,3545052371],a=16;export class Rabbit{constructor(r,l){this.blockSize=a,t.set(this,new Uint32Array(8)),i.set(this,new Uint32Array(8)),s.set(this,new Uint8Array(a)),h.set(this,new Uint32Array(f(this,s,"f").buffer)),this._counterCarryBit=0,n("key",r).exactly(16).throwNot(),null!=l&&n("iv",l).exactly(8).throwNot();const c=r.slice();e.i128(c),o.i32(c,0,4);const b=new Uint32Array(c.buffer),w=4294901760,k=65535;if(f(this,t,"f")[0]=b[0],f(this,t,"f")[1]=b[3]<<16|b[2]>>>16,f(this,t,"f")[2]=b[1],f(this,t,"f")[3]=b[0]<<16|b[3]>>>16,f(this,t,"f")[4]=b[2],f(this,t,"f")[5]=b[1]<<16|b[0]>>>16,f(this,t,"f")[6]=b[3],f(this,t,"f")[7]=b[2]<<16|b[1]>>>16,f(this,i,"f")[0]=b[2]<<16|b[2]>>>16,f(this,i,"f")[1]=b[0]&w|b[1]&k,f(this,i,"f")[2]=b[3]<<16|b[3]>>>16,f(this,i,"f")[3]=b[1]&w|b[2]&k,f(this,i,"f")[4]=b[0]<<16|b[0]>>>16,f(this,i,"f")[5]=b[2]&w|b[3]&k,f(this,i,"f")[6]=b[1]<<16|b[1]>>>16,f(this,i,"f")[7]=b[3]&w|b[0]&k,this.block(),this.block(),this.block(),this.block(),f(this,i,"f")[0]^=f(this,t,"f")[4],f(this,i,"f")[1]^=f(this,t,"f")[5],f(this,i,"f")[2]^=f(this,t,"f")[6],f(this,i,"f")[3]^=f(this,t,"f")[7],f(this,i,"f")[4]^=f(this,t,"f")[0],f(this,i,"f")[5]^=f(this,t,"f")[1],f(this,i,"f")[6]^=f(this,t,"f")[2],f(this,i,"f")[7]^=f(this,t,"f")[3],null!=l){const t=l.slice();e.i64(t),o.i32(t,0,2);const s=new Uint32Array(t.buffer);f(this,i,"f")[0]^=s[0],f(this,i,"f")[1]^=s[1]&w|(s[0]&w)>>>16,f(this,i,"f")[2]^=s[1],f(this,i,"f")[3]^=(s[1]&k)<<16|s[0]&k,f(this,i,"f")[4]^=s[0],f(this,i,"f")[5]^=s[1]&w|(s[0]&w)>>>16,f(this,i,"f")[6]^=s[1],f(this,i,"f")[7]^=(s[1]&k)<<16|s[0]&k,this.block(),this.block(),this.block(),this.block()}}block(){const o=new Uint32Array(8);for(let s=0;s<8;s++){const h=f(this,i,"f")[s]+l[s]+this._counterCarryBit;this._counterCarryBit=h/4294967296,f(this,i,"f")[s]=h;const e=f(this,t,"f")[s]+f(this,i,"f")[s]&4294967295,r=65535&e,n=e>>>16,a=((r*r>>>17)+r*n>>>15)+n*n,c=((4294901760&e)*e|0)+r*e;o[s]=a^c}f(this,t,"f")[0]=o[0]+r.lRot(o[7],16)+r.lRot(o[6],16),f(this,t,"f")[1]=o[1]+r.lRot(o[0],8)+o[7],f(this,t,"f")[2]=o[2]+r.lRot(o[1],16)+r.lRot(o[0],16),f(this,t,"f")[3]=o[3]+r.lRot(o[2],8)+o[1],f(this,t,"f")[4]=o[4]+r.lRot(o[3],16)+r.lRot(o[2],16),f(this,t,"f")[5]=o[5]+r.lRot(o[4],8)+o[3],f(this,t,"f")[6]=o[6]+r.lRot(o[5],16)+r.lRot(o[4],16),f(this,t,"f")[7]=o[7]+r.lRot(o[6],8)+o[5],f(this,h,"f")[0]=f(this,t,"f")[0]^f(this,t,"f")[5]>>>16^f(this,t,"f")[3]<<16,f(this,h,"f")[1]=f(this,t,"f")[2]^f(this,t,"f")[7]>>>16^f(this,t,"f")[5]<<16,f(this,h,"f")[2]=f(this,t,"f")[4]^f(this,t,"f")[1]>>>16^f(this,t,"f")[7]<<16,f(this,h,"f")[3]=f(this,t,"f")[6]^f(this,t,"f")[3]>>>16^f(this,t,"f")[1]<<16,e.i128(f(this,s,"f"))}encryptInto(t,i){let h=i.length,e=0;for(t!==i&&t.set(i);h>=a;){this.block();for(let i=0;i<a;i++)t[e++]^=f(this,s,"f")[i];h-=a}if(h>0){this.block();for(let i=0;i<h;i++)t[e++]^=f(this,s,"f")[i]}}decryptInto(t,i){let h=t.length,e=0;for(i!==t&&t.set(i);h>=a;){this.block();for(let i=0;i<a;i++)t[e++]^=f(this,s,"f")[i];h-=a}if(h>0){this.block();for(let i=0;i<h;i++)t[e++]^=f(this,s,"f")[i]}}encryptSize(t){return t}}t=new WeakMap,i=new WeakMap,s=new WeakMap,h=new WeakMap;