diff --git a/dist/otpauth.esm.js b/dist/otpauth.esm.js
index 436d20e..5afc512 100644
--- a/dist/otpauth.esm.js
+++ b/dist/otpauth.esm.js
@@ -756,6 +756,7 @@ const globalScope = (() => {
});
try {
// @ts-ignore
+ // eslint-disable-next-line no-undef
if (typeof __GLOBALTHIS__ !== "undefined") return __GLOBALTHIS__;
} finally {
// @ts-ignore
@@ -1253,7 +1254,7 @@ class HOTP {
// Return early if the token length does not match the digit number.
if (token.length !== digits) return null;
let delta = null;
- for (let i = counter - window; i <= counter + window; ++i) {
+ const check = ( /** @type {number} */i) => {
const generatedToken = HOTP.generate({
secret,
algorithm,
@@ -1263,6 +1264,13 @@ class HOTP {
if (timingSafeEqual(token, generatedToken)) {
delta = i - counter;
}
+ };
+ check(counter);
+ for (let i = 1; i <= window && delta === null; ++i) {
+ check(counter - i);
+ if (delta !== null) break;
+ check(counter + i);
+ if (delta !== null) break;
}
return delta;
}
@@ -1538,7 +1546,8 @@ class URI {
let uriGroups;
try {
uriGroups = uri.match(OTPURI_REGEX);
- } catch (error) {
+ // eslint-disable-next-line no-unused-vars
+ } catch (_) {
/* Handled below */
}
if (!Array.isArray(uriGroups)) {
@@ -1649,6 +1658,6 @@ class URI {
* Library version.
* @type {string}
*/
-const version = "9.2.3";
+const version = "9.2.4";
export { HOTP, Secret, TOTP, URI, version };
diff --git a/dist/otpauth.esm.min.js b/dist/otpauth.esm.min.js
index 6f98408..9831e6c 100644
--- a/dist/otpauth.esm.min.js
+++ b/dist/otpauth.esm.min.js
@@ -1,3 +1,3 @@
///
-const Ie=r=>{const e=new ArrayBuffer(8),n=new Uint8Array(e);let t=r;for(let i=7;i>=0&&t!==0;i--)n[i]=t&255,t-=n[i],t/=256;return e},ht=void 0,at=void 0,ct=void 0;var q=Object.freeze({__proto__:null,createHmac:void 0,randomBytes:void 0,timingSafeEqual:void 0});const J="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Q="ARRAYBUFFER not supported by this environment",W="UINT8ARRAY not supported by this environment";function _(r,e,n,t){let i,s,u;const c=e||[0],a=(n=n||0)>>>3,l=t===-1?3:0;for(i=0;i>>2,c.length<=s&&c.push(0),c[s]|=r[i]<<8*(l+t*(u%4));return{value:c,binLen:8*r.length+n}}function B(r,e,n){switch(e){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(r){case"HEX":return function(t,i,s){return function(u,c,a,l){let d,h,f,g;if(u.length%2!=0)throw new Error("String of HEX type must be in byte increments");const p=c||[0],m=(a=a||0)>>>3,A=l===-1?3:0;for(d=0;d>>1)+m,f=g>>>2;p.length<=f;)p.push(0);p[f]|=h<<8*(A+l*(g%4))}return{value:p,binLen:4*u.length+a}}(t,i,s,n)};case"TEXT":return function(t,i,s){return function(u,c,a,l,d){let h,f,g,p,m,A,y,b,v=0;const H=a||[0],S=(l=l||0)>>>3;if(c==="UTF8")for(y=d===-1?3:0,g=0;gh?f.push(h):2048>h?(f.push(192|h>>>6),f.push(128|63&h)):55296>h||57344<=h?f.push(224|h>>>12,128|h>>>6&63,128|63&h):(g+=1,h=65536+((1023&h)<<10|1023&u.charCodeAt(g)),f.push(240|h>>>18,128|h>>>12&63,128|h>>>6&63,128|63&h)),p=0;p>>2;H.length<=m;)H.push(0);H[m]|=f[p]<<8*(y+d*(A%4)),v+=1}else for(y=d===-1?2:0,b=c==="UTF16LE"&&d!==1||c!=="UTF16LE"&&d===1,g=0;g>>8),A=v+S,m=A>>>2;H.length<=m;)H.push(0);H[m]|=h<<8*(y+d*(A%4)),v+=2}return{value:H,binLen:8*v+l}}(t,e,i,s,n)};case"B64":return function(t,i,s){return function(u,c,a,l){let d,h,f,g,p,m,A,y=0;const b=c||[0],v=(a=a||0)>>>3,H=l===-1?3:0,S=u.indexOf("=");if(u.search(/^[a-zA-Z0-9=+/]+$/)===-1)throw new Error("Invalid character in base-64 string");if(u=u.replace(/=/g,""),S!==-1&&S>>2;b.length<=m;)b.push(0);b[m]|=(g>>>16-8*f&255)<<8*(H+l*(A%4)),y+=1}}return{value:b,binLen:8*y+a}}(t,i,s,n)};case"BYTES":return function(t,i,s){return function(u,c,a,l){let d,h,f,g;const p=c||[0],m=(a=a||0)>>>3,A=l===-1?3:0;for(h=0;h>>2,p.length<=f&&p.push(0),p[f]|=d<<8*(A+l*(g%4));return{value:p,binLen:8*u.length+a}}(t,i,s,n)};case"ARRAYBUFFER":try{new ArrayBuffer(0)}catch(t){throw new Error(Q)}return function(t,i,s){return function(u,c,a,l){return _(new Uint8Array(u),c,a,l)}(t,i,s,n)};case"UINT8ARRAY":try{new Uint8Array(0)}catch(t){throw new Error(W)}return function(t,i,s){return _(t,i,s,n)};default:throw new Error("format must be HEX, TEXT, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY")}}function ee(r,e,n,t){switch(r){case"HEX":return function(i){return function(s,u,c,a){const l="0123456789abcdef";let d,h,f="";const g=u/8,p=c===-1?3:0;for(d=0;d>>2]>>>8*(p+c*(d%4)),f+=l.charAt(h>>>4&15)+l.charAt(15&h);return a.outputUpper?f.toUpperCase():f}(i,e,n,t)};case"B64":return function(i){return function(s,u,c,a){let l,d,h,f,g,p="";const m=u/8,A=c===-1?3:0;for(l=0;l>>2]:0,g=l+2>>2]:0,h=(s[l>>>2]>>>8*(A+c*(l%4))&255)<<16|(f>>>8*(A+c*((l+1)%4))&255)<<8|g>>>8*(A+c*((l+2)%4))&255,d=0;d<4;d+=1)p+=8*l+6*d<=u?J.charAt(h>>>6*(3-d)&63):a.b64Pad;return p}(i,e,n,t)};case"BYTES":return function(i){return function(s,u,c){let a,l,d="";const h=u/8,f=c===-1?3:0;for(a=0;a>>2]>>>8*(f+c*(a%4))&255,d+=String.fromCharCode(l);return d}(i,e,n)};case"ARRAYBUFFER":try{new ArrayBuffer(0)}catch(i){throw new Error(Q)}return function(i){return function(s,u,c){let a;const l=u/8,d=new ArrayBuffer(l),h=new Uint8Array(d),f=c===-1?3:0;for(a=0;a>>2]>>>8*(f+c*(a%4))&255;return d}(i,e,n)};case"UINT8ARRAY":try{new Uint8Array(0)}catch(i){throw new Error(W)}return function(i){return function(s,u,c){let a;const l=u/8,d=c===-1?3:0,h=new Uint8Array(l);for(a=0;a>>2]>>>8*(d+c*(a%4))&255;return h}(i,e,n)};default:throw new Error("format must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY")}}const k=4294967296,w=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],C=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],$=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],P="Chosen SHA variant is not supported",te="Cannot set numRounds with MAC";function z(r,e){let n,t;const i=r.binLen>>>3,s=e.binLen>>>3,u=i<<3,c=4-i<<3;if(i%4!=0){for(n=0;n>>2,r.value[t]|=e.value[n>>>2]<>>2]>>>c;return(r.value.length<<2)-4>=s+i&&r.value.pop(),{value:r.value,binLen:r.binLen+e.binLen}}return{value:r.value.concat(e.value),binLen:r.binLen+e.binLen}}function ne(r){const e={outputUpper:!1,b64Pad:"=",outputLen:-1},n=r||{},t="Output length must be a multiple of 8";if(e.outputUpper=n.outputUpper||!1,n.b64Pad&&(e.b64Pad=n.b64Pad),n.outputLen){if(n.outputLen%8!=0)throw new Error(t);e.outputLen=n.outputLen}else if(n.shakeLen){if(n.shakeLen%8!=0)throw new Error(t);e.outputLen=n.shakeLen}if(typeof e.outputUpper!="boolean")throw new Error("Invalid outputUpper formatting option");if(typeof e.b64Pad!="string")throw new Error("Invalid b64Pad formatting option");return e}function K(r,e,n,t){const i=r+" must include a value and format";if(!e){if(!t)throw new Error(i);return t}if(e.value===void 0||!e.format)throw new Error(i);return B(e.format,e.encoding||"UTF8",n)(e.value)}class j{constructor(e,n,t){const i=t||{};if(this.t=n,this.i=i.encoding||"UTF8",this.numRounds=i.numRounds||1,isNaN(this.numRounds)||this.numRounds!==parseInt(this.numRounds,10)||1>this.numRounds)throw new Error("numRounds must a integer >= 1");this.o=e,this.h=[],this.u=0,this.l=!1,this.A=0,this.H=!1,this.S=[],this.p=[]}update(e){let n,t=0;const i=this.m>>>5,s=this.C(e,this.h,this.u),u=s.binLen,c=s.value,a=u>>>5;for(n=0;n>>5),this.u=u%this.m,this.l=!0,this}getHash(e,n){let t,i,s=this.R;const u=ne(n);if(this.K){if(u.outputLen===-1)throw new Error("Output length must be specified in options");s=u.outputLen}const c=ee(e,s,this.T,u);if(this.H&&this.g)return c(this.g(u));for(i=this.F(this.h.slice(),this.u,this.A,this.L(this.U),s),t=1;t>>24-s%32),i=this.F(i,s,0,this.B(this.o),s);return c(i)}setHMACKey(e,n,t){if(!this.M)throw new Error("Variant does not support HMAC");if(this.l)throw new Error("Cannot set MAC key after calling update");const i=B(n,(t||{}).encoding||"UTF8",this.T);this.k(i(e))}k(e){const n=this.m>>>3,t=n/4-1;let i;if(this.numRounds!==1)throw new Error(te);if(this.H)throw new Error("MAC key already set");for(n>>32-e}function L(r,e){return r>>>e|r<<32-e}function re(r,e){return r>>>e}function ie(r,e,n){return r^e^n}function se(r,e,n){return r&e^~r&n}function oe(r,e,n){return r&e^r&n^e&n}function ye(r){return L(r,2)^L(r,13)^L(r,22)}function I(r,e){const n=(65535&r)+(65535&e);return(65535&(r>>>16)+(e>>>16)+(n>>>16))<<16|65535&n}function He(r,e,n,t){const i=(65535&r)+(65535&e)+(65535&n)+(65535&t);return(65535&(r>>>16)+(e>>>16)+(n>>>16)+(t>>>16)+(i>>>16))<<16|65535&i}function O(r,e,n,t,i){const s=(65535&r)+(65535&e)+(65535&n)+(65535&t)+(65535&i);return(65535&(r>>>16)+(e>>>16)+(n>>>16)+(t>>>16)+(i>>>16)+(s>>>16))<<16|65535&s}function Ee(r){return L(r,7)^L(r,18)^re(r,3)}function Ne(r){return L(r,6)^L(r,11)^L(r,25)}function ve(r){return[1732584193,4023233417,2562383102,271733878,3285377520]}function ue(r,e){let n,t,i,s,u,c,a;const l=[];for(n=e[0],t=e[1],i=e[2],s=e[3],u=e[4],a=0;a<80;a+=1)l[a]=a<16?r[a]:F(l[a-3]^l[a-8]^l[a-14]^l[a-16],1),c=a<20?O(F(n,5),se(t,i,s),u,1518500249,l[a]):a<40?O(F(n,5),ie(t,i,s),u,1859775393,l[a]):a<60?O(F(n,5),oe(t,i,s),u,2400959708,l[a]):O(F(n,5),ie(t,i,s),u,3395469782,l[a]),u=s,s=i,i=F(t,30),t=n,n=c;return e[0]=I(n,e[0]),e[1]=I(t,e[1]),e[2]=I(i,e[2]),e[3]=I(s,e[3]),e[4]=I(u,e[4]),e}function Se(r,e,n,t){let i;const s=15+(e+65>>>9<<4),u=e+n;for(;r.length<=s;)r.push(0);for(r[e>>>5]|=128<<24-e%32,r[s]=4294967295&u,r[s-1]=u/k|0,i=0;i>>9<<4),A=l+d;for(;a.length<=m;)a.push(0);for(a[l>>>5]|=128<<24-l%32,a[m]=4294967295&A,a[m-1]=A/k|0,g=0;g32?(n=64-e,new o(r.I<>>n,r.N<>>n)):e!==0?(n=32-e,new o(r.N<>>n,r.I<>>n)):r}function R(r,e){let n;return e<32?(n=32-e,new o(r.N>>>e|r.I<>>e|r.N<>>e|r.N<>>e|r.I<>>e,r.I>>>e|r.N<<32-e)}function Re(r,e,n){return new o(r.N&e.N^r.N&n.N^e.N&n.N,r.I&e.I^r.I&n.I^e.I&n.I)}function Te(r){const e=R(r,28),n=R(r,34),t=R(r,39);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}function U(r,e){let n,t;n=(65535&r.I)+(65535&e.I),t=(r.I>>>16)+(e.I>>>16)+(n>>>16);const i=(65535&t)<<16|65535&n;return n=(65535&r.N)+(65535&e.N)+(t>>>16),t=(r.N>>>16)+(e.N>>>16)+(n>>>16),new o((65535&t)<<16|65535&n,i)}function Ce(r,e,n,t){let i,s;i=(65535&r.I)+(65535&e.I)+(65535&n.I)+(65535&t.I),s=(r.I>>>16)+(e.I>>>16)+(n.I>>>16)+(t.I>>>16)+(i>>>16);const u=(65535&s)<<16|65535&i;return i=(65535&r.N)+(65535&e.N)+(65535&n.N)+(65535&t.N)+(s>>>16),s=(r.N>>>16)+(e.N>>>16)+(n.N>>>16)+(t.N>>>16)+(i>>>16),new o((65535&s)<<16|65535&i,u)}function $e(r,e,n,t,i){let s,u;s=(65535&r.I)+(65535&e.I)+(65535&n.I)+(65535&t.I)+(65535&i.I),u=(r.I>>>16)+(e.I>>>16)+(n.I>>>16)+(t.I>>>16)+(i.I>>>16)+(s>>>16);const c=(65535&u)<<16|65535&s;return s=(65535&r.N)+(65535&e.N)+(65535&n.N)+(65535&t.N)+(65535&i.N)+(u>>>16),u=(r.N>>>16)+(e.N>>>16)+(n.N>>>16)+(t.N>>>16)+(i.N>>>16)+(s>>>16),new o((65535&u)<<16|65535&s,c)}function Y(r,e){return new o(r.N^e.N,r.I^e.I)}function Ke(r){const e=R(r,19),n=R(r,61),t=le(r,6);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}function Be(r){const e=R(r,1),n=R(r,8),t=le(r,7);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}function Fe(r){const e=R(r,14),n=R(r,18),t=R(r,41);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}const Me=[new o(w[0],3609767458),new o(w[1],602891725),new o(w[2],3964484399),new o(w[3],2173295548),new o(w[4],4081628472),new o(w[5],3053834265),new o(w[6],2937671579),new o(w[7],3664609560),new o(w[8],2734883394),new o(w[9],1164996542),new o(w[10],1323610764),new o(w[11],3590304994),new o(w[12],4068182383),new o(w[13],991336113),new o(w[14],633803317),new o(w[15],3479774868),new o(w[16],2666613458),new o(w[17],944711139),new o(w[18],2341262773),new o(w[19],2007800933),new o(w[20],1495990901),new o(w[21],1856431235),new o(w[22],3175218132),new o(w[23],2198950837),new o(w[24],3999719339),new o(w[25],766784016),new o(w[26],2566594879),new o(w[27],3203337956),new o(w[28],1034457026),new o(w[29],2466948901),new o(w[30],3758326383),new o(w[31],168717936),new o(w[32],1188179964),new o(w[33],1546045734),new o(w[34],1522805485),new o(w[35],2643833823),new o(w[36],2343527390),new o(w[37],1014477480),new o(w[38],1206759142),new o(w[39],344077627),new o(w[40],1290863460),new o(w[41],3158454273),new o(w[42],3505952657),new o(w[43],106217008),new o(w[44],3606008344),new o(w[45],1432725776),new o(w[46],1467031594),new o(w[47],851169720),new o(w[48],3100823752),new o(w[49],1363258195),new o(w[50],3750685593),new o(w[51],3785050280),new o(w[52],3318307427),new o(w[53],3812723403),new o(w[54],2003034995),new o(w[55],3602036899),new o(w[56],1575990012),new o(w[57],1125592928),new o(w[58],2716904306),new o(w[59],442776044),new o(w[60],593698344),new o(w[61],3733110249),new o(w[62],2999351573),new o(w[63],3815920427),new o(3391569614,3928383900),new o(3515267271,566280711),new o(3940187606,3454069534),new o(4118630271,4000239992),new o(116418474,1914138554),new o(174292421,2731055270),new o(289380356,3203993006),new o(460393269,320620315),new o(685471733,587496836),new o(852142971,1086792851),new o(1017036298,365543100),new o(1126000580,2618297676),new o(1288033470,3409855158),new o(1501505948,4234509866),new o(1607167915,987167468),new o(1816402316,1246189591)];function fe(r){return r==="SHA-384"?[new o(3418070365,C[0]),new o(1654270250,C[1]),new o(2438529370,C[2]),new o(355462360,C[3]),new o(1731405415,C[4]),new o(41048885895,C[5]),new o(3675008525,C[6]),new o(1203062813,C[7])]:[new o($[0],4089235720),new o($[1],2227873595),new o($[2],4271175723),new o($[3],1595750129),new o($[4],2917565137),new o($[5],725511199),new o($[6],4215389547),new o($[7],327033209)]}function we(r,e){let n,t,i,s,u,c,a,l,d,h,f,g;const p=[];for(n=e[0],t=e[1],i=e[2],s=e[3],u=e[4],c=e[5],a=e[6],l=e[7],f=0;f<80;f+=1)f<16?(g=2*f,p[f]=new o(r[g],r[g+1])):p[f]=Ce(Ke(p[f-2]),p[f-7],Be(p[f-15]),p[f-16]),d=$e(l,Fe(u),(A=c,y=a,new o((m=u).N&A.N^~m.N&y.N,m.I&A.I^~m.I&y.I)),Me[f],p[f]),h=U(Te(n),Re(n,t,i)),l=a,a=c,c=u,u=U(s,d),s=i,i=t,t=n,n=U(d,h);var m,A,y;return e[0]=U(n,e[0]),e[1]=U(t,e[1]),e[2]=U(i,e[2]),e[3]=U(s,e[3]),e[4]=U(u,e[4]),e[5]=U(c,e[5]),e[6]=U(a,e[6]),e[7]=U(l,e[7]),e}let ke=class extends j{constructor(r,e,n){if(r!=="SHA-384"&&r!=="SHA-512")throw new Error(P);super(r,e,n);const t=n||{};this.g=this.Y,this.M=!0,this.T=-1,this.C=B(this.t,this.i,this.T),this.v=we,this.L=function(i){return i.slice()},this.B=fe,this.F=function(i,s,u,c){return function(a,l,d,h,f){let g,p;const m=31+(l+129>>>10<<5),A=l+d;for(;a.length<=m;)a.push(0);for(a[l>>>5]|=128<<24-l%32,a[m]=4294967295&A,a[m-1]=A/k|0,g=0;g>>1)%5][(t>>>1)/5|0]=Y(e[(t>>>1)%5][(t>>>1)/5|0],new o(r[t+1],r[t]));for(n=0;n<24;n+=1){for(s=G(),t=0;t<5;t+=1)u[t]=(a=e[t][0],l=e[t][1],d=e[t][2],h=e[t][3],f=e[t][4],new o(a.N^l.N^d.N^h.N^f.N,a.I^l.I^d.I^h.I^f.I));for(t=0;t<5;t+=1)c[t]=Y(u[(t+4)%5],ce(u[(t+1)%5],1));for(t=0;t<5;t+=1)for(i=0;i<5;i+=1)e[t][i]=Y(e[t][i],c[t]);for(t=0;t<5;t+=1)for(i=0;i<5;i+=1)s[i][(2*t+3*i)%5]=ce(e[t][i],Oe[t][i]);for(t=0;t<5;t+=1)for(i=0;i<5;i+=1)e[t][i]=Y(s[t][i],new o(~s[(t+1)%5][i].N&s[(t+2)%5][i].N,~s[(t+1)%5][i].I&s[(t+2)%5][i].I));e[0][0]=Y(e[0][0],Pe[n])}var a,l,d,h,f;return e}function de(r){let e,n,t=0;const i=[0,0],s=[4294967295&r,r/k&2097151];for(e=6;e>=0;e--)n=s[e>>2]>>>8*e&255,n===0&&t===0||(i[t+1>>2]|=n<<8*(t+1),t+=1);return t=t!==0?t:1,i[0]|=t,{value:t+1>4?i:[i[0]],binLen:8+8*t}}function Z(r){return z(de(r.binLen),r)}function ge(r,e){let n,t=de(e);t=z(t,r);const i=e>>>2,s=(i-t.value.length%i)%i;for(n=0;n>>5,be=f>>>5;for(b=0;b=m;b+=X)p=D(h.slice(b,b+X),p),f-=m;for(h=h.slice(b),f%=m;h.length>>3,h[b>>2]^=A<=y));)S.push(v.N),H+=1,64*H%m==0&&(D(null,p),H=0);return S}(u,c,0,l,i,t,d)},s.hmacKey&&this.k(K("hmacKey",s.hmacKey,this.T))}O(r,e){const n=function(i){const s=i||{};return{funcName:K("funcName",s.funcName,1,{value:[],binLen:0}),customization:K("Customization",s.customization,1,{value:[],binLen:0})}}(r||{});e&&(n.funcName=e);const t=z(Z(n.funcName),Z(n.customization));if(n.customization.binLen!==0||n.funcName.binLen!==0){const i=ge(t,this.m>>>3);for(let s=0;s>>5)this.U=this.v(i.slice(s,s+(this.m>>>5)),this.U),this.A+=this.m;return 4}return 31}X(r){const e=function(t){const i=t||{};return{kmacKey:K("kmacKey",i.kmacKey,1),funcName:{value:[1128353099],binLen:32},customization:K("Customization",i.customization,1,{value:[],binLen:0})}}(r||{});this.O(r,e.funcName);const n=ge(Z(e.kmacKey),this.m>>>3);for(let t=0;t>>5)this.U=this.v(n.slice(t,t+(this.m>>>5)),this.U),this.A+=this.m;this.H=!0}_(r){const e=z({value:this.h.slice(),binLen:this.u},function(n){let t,i,s=0;const u=[0,0],c=[4294967295&n,n/k&2097151];for(t=6;t>=0;t--)i=c[t>>2]>>>8*t&255,i===0&&s===0||(u[s>>2]|=i<<8*s,s+=1);return s=s!==0?s:1,u[s>>2]|=s<<8*s,{value:s+1>4?u:[u[0]],binLen:8+8*s}}(r.outputLen));return this.F(e.value,e.binLen,this.A,this.L(this.U),r.outputLen)}};class Xe{constructor(e,n,t){if(e=="SHA-1")this.P=new Ue(e,n,t);else if(e=="SHA-224"||e=="SHA-256")this.P=new Le(e,n,t);else if(e=="SHA-384"||e=="SHA-512")this.P=new ke(e,n,t);else{if(e!="SHA3-224"&&e!="SHA3-256"&&e!="SHA3-384"&&e!="SHA3-512"&&e!="SHAKE128"&&e!="SHAKE256"&&e!="CSHAKE128"&&e!="CSHAKE256"&&e!="KMAC128"&&e!="KMAC256")throw new Error(P);this.P=new xe(e,n,t)}}update(e){return this.P.update(e),this}getHash(e,n){return this.P.getHash(e,n)}setHMACKey(e,n,t){this.P.setHMACKey(e,n,t)}getHMAC(e,n){return this.P.getHMAC(e,n)}}const M=(()=>{if(typeof globalThis=="object")return globalThis;Object.defineProperty(Object.prototype,"__GLOBALTHIS__",{get(){return this},configurable:!0});try{if(typeof __GLOBALTHIS__!="undefined")return __GLOBALTHIS__}finally{delete Object.prototype.__GLOBALTHIS__}if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof global!="undefined")return global})(),ze={SHA1:"SHA-1",SHA224:"SHA-224",SHA256:"SHA-256",SHA384:"SHA-384",SHA512:"SHA-512","SHA3-224":"SHA3-224","SHA3-256":"SHA3-256","SHA3-384":"SHA3-384","SHA3-512":"SHA3-512"},je=(r,e,n)=>{q!=null;{const t=ze[r.toUpperCase()];if(typeof t=="undefined")throw new TypeError("Unknown hash function");const i=new Xe(t,"ARRAYBUFFER");return i.setHMACKey(e,"ARRAYBUFFER"),i.update(n),i.getHMAC("ARRAYBUFFER")}},V="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",De=r=>{let e=r.length;for(;r[e-1]==="=";)--e;const n=(e=8&&(s-=8,i[c++]=u>>>s)}return t},qe=r=>{const e=new Uint8Array(r);let n=0,t=0,i="";for(let s=0;s=5;)i+=V[t>>>n-5&31],n-=5;return n>0&&(i+=V[t<<5-n&31]),i},Ge=r=>{const e=new ArrayBuffer(r.length/2),n=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(r);let n="";for(let t=0;t{const e=new ArrayBuffer(r.length),n=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(r);let n="";for(let t=0;t{if(!pe)throw new Error("Encoding API not available");return pe.encode(r).buffer},We=r=>{if(!me)throw new Error("Encoding API not available");return me.decode(r)},_e=r=>{var e;if(q!=null,!((e=M.crypto)!=null&&e.getRandomValues))throw new Error("Cryptography API not available");return M.crypto.getRandomValues(new Uint8Array(r)).buffer};class T{constructor({buffer:e,size:n=20}={}){this.buffer=typeof e=="undefined"?_e(n):e}static fromLatin1(e){return new T({buffer:Ve(e)})}static fromUTF8(e){return new T({buffer:Qe(e)})}static fromBase32(e){return new T({buffer:De(e)})}static fromHex(e){return new T({buffer:Ge(e)})}get latin1(){return Object.defineProperty(this,"latin1",{enumerable:!0,value:Je(this.buffer)}),this.latin1}get utf8(){return Object.defineProperty(this,"utf8",{enumerable:!0,value:We(this.buffer)}),this.utf8}get base32(){return Object.defineProperty(this,"base32",{enumerable:!0,value:qe(this.buffer)}),this.base32}get hex(){return Object.defineProperty(this,"hex",{enumerable:!0,value:Ze(this.buffer)}),this.hex}}const et=(r,e)=>{q!=null;{if(r.length!==e.length)throw new TypeError("Input strings must have the same length");let n=-1,t=0;for(;++n0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&counter=${e(this.counter)}`}};class N{static get defaults(){return{issuer:"",label:"OTPAuth",issuerInLabel:!0,algorithm:"SHA1",digits:6,period:30,window:1}}constructor({issuer:e=N.defaults.issuer,label:n=N.defaults.label,issuerInLabel:t=N.defaults.issuerInLabel,secret:i=new T,algorithm:s=N.defaults.algorithm,digits:u=N.defaults.digits,period:c=N.defaults.period}={}){this.issuer=e,this.label=n,this.issuerInLabel=t,this.secret=typeof i=="string"?T.fromBase32(i):i,this.algorithm=s.toUpperCase(),this.digits=u,this.period=c}static generate({secret:e,algorithm:n,digits:t,period:i=N.defaults.period,timestamp:s=Date.now()}){return x.generate({secret:e,algorithm:n,digits:t,counter:Math.floor(s/1e3/i)})}generate({timestamp:e=Date.now()}={}){return N.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:e})}static validate({token:e,secret:n,algorithm:t,digits:i,period:s=N.defaults.period,timestamp:u=Date.now(),window:c}){return x.validate({token:e,secret:n,algorithm:t,digits:i,counter:Math.floor(u/1e3/s),window:c})}validate({token:e,timestamp:n,window:t}){return N.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:n,window:t})}toString(){const e=encodeURIComponent;return`otpauth://totp/${this.issuer.length>0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&period=${e(this.period)}`}}const nt=/^otpauth:\/\/([ht]otp)\/(.+)\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i,rt=/^[2-7A-Z]+=*$/i,it=/^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i,st=/^[+-]?\d+$/,Ae=/^\+?[1-9]\d*$/;class ot{static parse(e){let n;try{n=e.match(nt)}catch(a){}if(!Array.isArray(n))throw new URIError("Invalid URI format");const t=n[1].toLowerCase(),i=n[2].split(/(?::|%3A) *(.+)/i,2).map(decodeURIComponent),s=n[3].split("&").reduce((a,l)=>{const d=l.split(/=(.*)/,2).map(decodeURIComponent),h=d[0].toLowerCase(),f=d[1],g=a;return g[h]=f,g},{});let u;const c={};if(t==="hotp")if(u=x,typeof s.counter!="undefined"&&st.test(s.counter))c.counter=parseInt(s.counter,10);else throw new TypeError("Missing or invalid 'counter' parameter");else if(t==="totp"){if(u=N,typeof s.period!="undefined")if(Ae.test(s.period))c.period=parseInt(s.period,10);else throw new TypeError("Invalid 'period' parameter")}else throw new TypeError("Unknown OTP type");if(typeof s.issuer!="undefined"&&(c.issuer=s.issuer),i.length===2?(c.label=i[1],typeof c.issuer=="undefined"||c.issuer===""?c.issuer=i[0]:i[0]===""&&(c.issuerInLabel=!1)):(c.label=i[0],typeof c.issuer!="undefined"&&c.issuer!==""&&(c.issuerInLabel=!1)),typeof s.secret!="undefined"&&rt.test(s.secret))c.secret=s.secret;else throw new TypeError("Missing or invalid 'secret' parameter");if(typeof s.algorithm!="undefined")if(it.test(s.algorithm))c.algorithm=s.algorithm;else throw new TypeError("Invalid 'algorithm' parameter");if(typeof s.digits!="undefined")if(Ae.test(s.digits))c.digits=parseInt(s.digits,10);else throw new TypeError("Invalid 'digits' parameter");return new u(c)}static stringify(e){if(e instanceof x||e instanceof N)return e.toString();throw new TypeError("Invalid 'HOTP/TOTP' object")}}const ut="9.2.3";export{x as HOTP,T as Secret,N as TOTP,ot as URI,ut as version};
+const Ie=r=>{const e=new ArrayBuffer(8),n=new Uint8Array(e);let t=r;for(let i=7;i>=0&&t!==0;i--)n[i]=t&255,t-=n[i],t/=256;return e},ht=void 0,at=void 0,ct=void 0;var q=Object.freeze({__proto__:null,createHmac:void 0,randomBytes:void 0,timingSafeEqual:void 0});const J="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Q="ARRAYBUFFER not supported by this environment",W="UINT8ARRAY not supported by this environment";function _(r,e,n,t){let i,s,u;const c=e||[0],a=(n=n||0)>>>3,l=t===-1?3:0;for(i=0;i>>2,c.length<=s&&c.push(0),c[s]|=r[i]<<8*(l+t*(u%4));return{value:c,binLen:8*r.length+n}}function B(r,e,n){switch(e){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(r){case"HEX":return function(t,i,s){return function(u,c,a,l){let d,h,f,g;if(u.length%2!=0)throw new Error("String of HEX type must be in byte increments");const p=c||[0],m=(a=a||0)>>>3,A=l===-1?3:0;for(d=0;d>>1)+m,f=g>>>2;p.length<=f;)p.push(0);p[f]|=h<<8*(A+l*(g%4))}return{value:p,binLen:4*u.length+a}}(t,i,s,n)};case"TEXT":return function(t,i,s){return function(u,c,a,l,d){let h,f,g,p,m,A,y,b,v=0;const H=a||[0],S=(l=l||0)>>>3;if(c==="UTF8")for(y=d===-1?3:0,g=0;gh?f.push(h):2048>h?(f.push(192|h>>>6),f.push(128|63&h)):55296>h||57344<=h?f.push(224|h>>>12,128|h>>>6&63,128|63&h):(g+=1,h=65536+((1023&h)<<10|1023&u.charCodeAt(g)),f.push(240|h>>>18,128|h>>>12&63,128|h>>>6&63,128|63&h)),p=0;p>>2;H.length<=m;)H.push(0);H[m]|=f[p]<<8*(y+d*(A%4)),v+=1}else for(y=d===-1?2:0,b=c==="UTF16LE"&&d!==1||c!=="UTF16LE"&&d===1,g=0;g>>8),A=v+S,m=A>>>2;H.length<=m;)H.push(0);H[m]|=h<<8*(y+d*(A%4)),v+=2}return{value:H,binLen:8*v+l}}(t,e,i,s,n)};case"B64":return function(t,i,s){return function(u,c,a,l){let d,h,f,g,p,m,A,y=0;const b=c||[0],v=(a=a||0)>>>3,H=l===-1?3:0,S=u.indexOf("=");if(u.search(/^[a-zA-Z0-9=+/]+$/)===-1)throw new Error("Invalid character in base-64 string");if(u=u.replace(/=/g,""),S!==-1&&S>>2;b.length<=m;)b.push(0);b[m]|=(g>>>16-8*f&255)<<8*(H+l*(A%4)),y+=1}}return{value:b,binLen:8*y+a}}(t,i,s,n)};case"BYTES":return function(t,i,s){return function(u,c,a,l){let d,h,f,g;const p=c||[0],m=(a=a||0)>>>3,A=l===-1?3:0;for(h=0;h>>2,p.length<=f&&p.push(0),p[f]|=d<<8*(A+l*(g%4));return{value:p,binLen:8*u.length+a}}(t,i,s,n)};case"ARRAYBUFFER":try{new ArrayBuffer(0)}catch(t){throw new Error(Q)}return function(t,i,s){return function(u,c,a,l){return _(new Uint8Array(u),c,a,l)}(t,i,s,n)};case"UINT8ARRAY":try{new Uint8Array(0)}catch(t){throw new Error(W)}return function(t,i,s){return _(t,i,s,n)};default:throw new Error("format must be HEX, TEXT, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY")}}function ee(r,e,n,t){switch(r){case"HEX":return function(i){return function(s,u,c,a){const l="0123456789abcdef";let d,h,f="";const g=u/8,p=c===-1?3:0;for(d=0;d>>2]>>>8*(p+c*(d%4)),f+=l.charAt(h>>>4&15)+l.charAt(15&h);return a.outputUpper?f.toUpperCase():f}(i,e,n,t)};case"B64":return function(i){return function(s,u,c,a){let l,d,h,f,g,p="";const m=u/8,A=c===-1?3:0;for(l=0;l>>2]:0,g=l+2>>2]:0,h=(s[l>>>2]>>>8*(A+c*(l%4))&255)<<16|(f>>>8*(A+c*((l+1)%4))&255)<<8|g>>>8*(A+c*((l+2)%4))&255,d=0;d<4;d+=1)p+=8*l+6*d<=u?J.charAt(h>>>6*(3-d)&63):a.b64Pad;return p}(i,e,n,t)};case"BYTES":return function(i){return function(s,u,c){let a,l,d="";const h=u/8,f=c===-1?3:0;for(a=0;a>>2]>>>8*(f+c*(a%4))&255,d+=String.fromCharCode(l);return d}(i,e,n)};case"ARRAYBUFFER":try{new ArrayBuffer(0)}catch(i){throw new Error(Q)}return function(i){return function(s,u,c){let a;const l=u/8,d=new ArrayBuffer(l),h=new Uint8Array(d),f=c===-1?3:0;for(a=0;a>>2]>>>8*(f+c*(a%4))&255;return d}(i,e,n)};case"UINT8ARRAY":try{new Uint8Array(0)}catch(i){throw new Error(W)}return function(i){return function(s,u,c){let a;const l=u/8,d=c===-1?3:0,h=new Uint8Array(l);for(a=0;a>>2]>>>8*(d+c*(a%4))&255;return h}(i,e,n)};default:throw new Error("format must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY")}}const k=4294967296,w=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],C=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],$=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],P="Chosen SHA variant is not supported",te="Cannot set numRounds with MAC";function z(r,e){let n,t;const i=r.binLen>>>3,s=e.binLen>>>3,u=i<<3,c=4-i<<3;if(i%4!=0){for(n=0;n>>2,r.value[t]|=e.value[n>>>2]<>>2]>>>c;return(r.value.length<<2)-4>=s+i&&r.value.pop(),{value:r.value,binLen:r.binLen+e.binLen}}return{value:r.value.concat(e.value),binLen:r.binLen+e.binLen}}function ne(r){const e={outputUpper:!1,b64Pad:"=",outputLen:-1},n=r||{},t="Output length must be a multiple of 8";if(e.outputUpper=n.outputUpper||!1,n.b64Pad&&(e.b64Pad=n.b64Pad),n.outputLen){if(n.outputLen%8!=0)throw new Error(t);e.outputLen=n.outputLen}else if(n.shakeLen){if(n.shakeLen%8!=0)throw new Error(t);e.outputLen=n.shakeLen}if(typeof e.outputUpper!="boolean")throw new Error("Invalid outputUpper formatting option");if(typeof e.b64Pad!="string")throw new Error("Invalid b64Pad formatting option");return e}function K(r,e,n,t){const i=r+" must include a value and format";if(!e){if(!t)throw new Error(i);return t}if(e.value===void 0||!e.format)throw new Error(i);return B(e.format,e.encoding||"UTF8",n)(e.value)}class j{constructor(e,n,t){const i=t||{};if(this.t=n,this.i=i.encoding||"UTF8",this.numRounds=i.numRounds||1,isNaN(this.numRounds)||this.numRounds!==parseInt(this.numRounds,10)||1>this.numRounds)throw new Error("numRounds must a integer >= 1");this.o=e,this.h=[],this.u=0,this.l=!1,this.A=0,this.H=!1,this.S=[],this.p=[]}update(e){let n,t=0;const i=this.m>>>5,s=this.C(e,this.h,this.u),u=s.binLen,c=s.value,a=u>>>5;for(n=0;n>>5),this.u=u%this.m,this.l=!0,this}getHash(e,n){let t,i,s=this.R;const u=ne(n);if(this.K){if(u.outputLen===-1)throw new Error("Output length must be specified in options");s=u.outputLen}const c=ee(e,s,this.T,u);if(this.H&&this.g)return c(this.g(u));for(i=this.F(this.h.slice(),this.u,this.A,this.L(this.U),s),t=1;t>>24-s%32),i=this.F(i,s,0,this.B(this.o),s);return c(i)}setHMACKey(e,n,t){if(!this.M)throw new Error("Variant does not support HMAC");if(this.l)throw new Error("Cannot set MAC key after calling update");const i=B(n,(t||{}).encoding||"UTF8",this.T);this.k(i(e))}k(e){const n=this.m>>>3,t=n/4-1;let i;if(this.numRounds!==1)throw new Error(te);if(this.H)throw new Error("MAC key already set");for(n>>32-e}function L(r,e){return r>>>e|r<<32-e}function re(r,e){return r>>>e}function ie(r,e,n){return r^e^n}function se(r,e,n){return r&e^~r&n}function oe(r,e,n){return r&e^r&n^e&n}function ye(r){return L(r,2)^L(r,13)^L(r,22)}function I(r,e){const n=(65535&r)+(65535&e);return(65535&(r>>>16)+(e>>>16)+(n>>>16))<<16|65535&n}function He(r,e,n,t){const i=(65535&r)+(65535&e)+(65535&n)+(65535&t);return(65535&(r>>>16)+(e>>>16)+(n>>>16)+(t>>>16)+(i>>>16))<<16|65535&i}function O(r,e,n,t,i){const s=(65535&r)+(65535&e)+(65535&n)+(65535&t)+(65535&i);return(65535&(r>>>16)+(e>>>16)+(n>>>16)+(t>>>16)+(i>>>16)+(s>>>16))<<16|65535&s}function Ee(r){return L(r,7)^L(r,18)^re(r,3)}function Ne(r){return L(r,6)^L(r,11)^L(r,25)}function ve(r){return[1732584193,4023233417,2562383102,271733878,3285377520]}function ue(r,e){let n,t,i,s,u,c,a;const l=[];for(n=e[0],t=e[1],i=e[2],s=e[3],u=e[4],a=0;a<80;a+=1)l[a]=a<16?r[a]:F(l[a-3]^l[a-8]^l[a-14]^l[a-16],1),c=a<20?O(F(n,5),se(t,i,s),u,1518500249,l[a]):a<40?O(F(n,5),ie(t,i,s),u,1859775393,l[a]):a<60?O(F(n,5),oe(t,i,s),u,2400959708,l[a]):O(F(n,5),ie(t,i,s),u,3395469782,l[a]),u=s,s=i,i=F(t,30),t=n,n=c;return e[0]=I(n,e[0]),e[1]=I(t,e[1]),e[2]=I(i,e[2]),e[3]=I(s,e[3]),e[4]=I(u,e[4]),e}function Se(r,e,n,t){let i;const s=15+(e+65>>>9<<4),u=e+n;for(;r.length<=s;)r.push(0);for(r[e>>>5]|=128<<24-e%32,r[s]=4294967295&u,r[s-1]=u/k|0,i=0;i>>9<<4),A=l+d;for(;a.length<=m;)a.push(0);for(a[l>>>5]|=128<<24-l%32,a[m]=4294967295&A,a[m-1]=A/k|0,g=0;g32?(n=64-e,new o(r.I<>>n,r.N<>>n)):e!==0?(n=32-e,new o(r.N<>>n,r.I<>>n)):r}function R(r,e){let n;return e<32?(n=32-e,new o(r.N>>>e|r.I<>>e|r.N<>>e|r.N<>>e|r.I<>>e,r.I>>>e|r.N<<32-e)}function Re(r,e,n){return new o(r.N&e.N^r.N&n.N^e.N&n.N,r.I&e.I^r.I&n.I^e.I&n.I)}function Te(r){const e=R(r,28),n=R(r,34),t=R(r,39);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}function U(r,e){let n,t;n=(65535&r.I)+(65535&e.I),t=(r.I>>>16)+(e.I>>>16)+(n>>>16);const i=(65535&t)<<16|65535&n;return n=(65535&r.N)+(65535&e.N)+(t>>>16),t=(r.N>>>16)+(e.N>>>16)+(n>>>16),new o((65535&t)<<16|65535&n,i)}function Ce(r,e,n,t){let i,s;i=(65535&r.I)+(65535&e.I)+(65535&n.I)+(65535&t.I),s=(r.I>>>16)+(e.I>>>16)+(n.I>>>16)+(t.I>>>16)+(i>>>16);const u=(65535&s)<<16|65535&i;return i=(65535&r.N)+(65535&e.N)+(65535&n.N)+(65535&t.N)+(s>>>16),s=(r.N>>>16)+(e.N>>>16)+(n.N>>>16)+(t.N>>>16)+(i>>>16),new o((65535&s)<<16|65535&i,u)}function $e(r,e,n,t,i){let s,u;s=(65535&r.I)+(65535&e.I)+(65535&n.I)+(65535&t.I)+(65535&i.I),u=(r.I>>>16)+(e.I>>>16)+(n.I>>>16)+(t.I>>>16)+(i.I>>>16)+(s>>>16);const c=(65535&u)<<16|65535&s;return s=(65535&r.N)+(65535&e.N)+(65535&n.N)+(65535&t.N)+(65535&i.N)+(u>>>16),u=(r.N>>>16)+(e.N>>>16)+(n.N>>>16)+(t.N>>>16)+(i.N>>>16)+(s>>>16),new o((65535&u)<<16|65535&s,c)}function Y(r,e){return new o(r.N^e.N,r.I^e.I)}function Ke(r){const e=R(r,19),n=R(r,61),t=le(r,6);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}function Be(r){const e=R(r,1),n=R(r,8),t=le(r,7);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}function Fe(r){const e=R(r,14),n=R(r,18),t=R(r,41);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}const Me=[new o(w[0],3609767458),new o(w[1],602891725),new o(w[2],3964484399),new o(w[3],2173295548),new o(w[4],4081628472),new o(w[5],3053834265),new o(w[6],2937671579),new o(w[7],3664609560),new o(w[8],2734883394),new o(w[9],1164996542),new o(w[10],1323610764),new o(w[11],3590304994),new o(w[12],4068182383),new o(w[13],991336113),new o(w[14],633803317),new o(w[15],3479774868),new o(w[16],2666613458),new o(w[17],944711139),new o(w[18],2341262773),new o(w[19],2007800933),new o(w[20],1495990901),new o(w[21],1856431235),new o(w[22],3175218132),new o(w[23],2198950837),new o(w[24],3999719339),new o(w[25],766784016),new o(w[26],2566594879),new o(w[27],3203337956),new o(w[28],1034457026),new o(w[29],2466948901),new o(w[30],3758326383),new o(w[31],168717936),new o(w[32],1188179964),new o(w[33],1546045734),new o(w[34],1522805485),new o(w[35],2643833823),new o(w[36],2343527390),new o(w[37],1014477480),new o(w[38],1206759142),new o(w[39],344077627),new o(w[40],1290863460),new o(w[41],3158454273),new o(w[42],3505952657),new o(w[43],106217008),new o(w[44],3606008344),new o(w[45],1432725776),new o(w[46],1467031594),new o(w[47],851169720),new o(w[48],3100823752),new o(w[49],1363258195),new o(w[50],3750685593),new o(w[51],3785050280),new o(w[52],3318307427),new o(w[53],3812723403),new o(w[54],2003034995),new o(w[55],3602036899),new o(w[56],1575990012),new o(w[57],1125592928),new o(w[58],2716904306),new o(w[59],442776044),new o(w[60],593698344),new o(w[61],3733110249),new o(w[62],2999351573),new o(w[63],3815920427),new o(3391569614,3928383900),new o(3515267271,566280711),new o(3940187606,3454069534),new o(4118630271,4000239992),new o(116418474,1914138554),new o(174292421,2731055270),new o(289380356,3203993006),new o(460393269,320620315),new o(685471733,587496836),new o(852142971,1086792851),new o(1017036298,365543100),new o(1126000580,2618297676),new o(1288033470,3409855158),new o(1501505948,4234509866),new o(1607167915,987167468),new o(1816402316,1246189591)];function fe(r){return r==="SHA-384"?[new o(3418070365,C[0]),new o(1654270250,C[1]),new o(2438529370,C[2]),new o(355462360,C[3]),new o(1731405415,C[4]),new o(41048885895,C[5]),new o(3675008525,C[6]),new o(1203062813,C[7])]:[new o($[0],4089235720),new o($[1],2227873595),new o($[2],4271175723),new o($[3],1595750129),new o($[4],2917565137),new o($[5],725511199),new o($[6],4215389547),new o($[7],327033209)]}function we(r,e){let n,t,i,s,u,c,a,l,d,h,f,g;const p=[];for(n=e[0],t=e[1],i=e[2],s=e[3],u=e[4],c=e[5],a=e[6],l=e[7],f=0;f<80;f+=1)f<16?(g=2*f,p[f]=new o(r[g],r[g+1])):p[f]=Ce(Ke(p[f-2]),p[f-7],Be(p[f-15]),p[f-16]),d=$e(l,Fe(u),(A=c,y=a,new o((m=u).N&A.N^~m.N&y.N,m.I&A.I^~m.I&y.I)),Me[f],p[f]),h=U(Te(n),Re(n,t,i)),l=a,a=c,c=u,u=U(s,d),s=i,i=t,t=n,n=U(d,h);var m,A,y;return e[0]=U(n,e[0]),e[1]=U(t,e[1]),e[2]=U(i,e[2]),e[3]=U(s,e[3]),e[4]=U(u,e[4]),e[5]=U(c,e[5]),e[6]=U(a,e[6]),e[7]=U(l,e[7]),e}let ke=class extends j{constructor(r,e,n){if(r!=="SHA-384"&&r!=="SHA-512")throw new Error(P);super(r,e,n);const t=n||{};this.g=this.Y,this.M=!0,this.T=-1,this.C=B(this.t,this.i,this.T),this.v=we,this.L=function(i){return i.slice()},this.B=fe,this.F=function(i,s,u,c){return function(a,l,d,h,f){let g,p;const m=31+(l+129>>>10<<5),A=l+d;for(;a.length<=m;)a.push(0);for(a[l>>>5]|=128<<24-l%32,a[m]=4294967295&A,a[m-1]=A/k|0,g=0;g>>1)%5][(t>>>1)/5|0]=Y(e[(t>>>1)%5][(t>>>1)/5|0],new o(r[t+1],r[t]));for(n=0;n<24;n+=1){for(s=G(),t=0;t<5;t+=1)u[t]=(a=e[t][0],l=e[t][1],d=e[t][2],h=e[t][3],f=e[t][4],new o(a.N^l.N^d.N^h.N^f.N,a.I^l.I^d.I^h.I^f.I));for(t=0;t<5;t+=1)c[t]=Y(u[(t+4)%5],ce(u[(t+1)%5],1));for(t=0;t<5;t+=1)for(i=0;i<5;i+=1)e[t][i]=Y(e[t][i],c[t]);for(t=0;t<5;t+=1)for(i=0;i<5;i+=1)s[i][(2*t+3*i)%5]=ce(e[t][i],Oe[t][i]);for(t=0;t<5;t+=1)for(i=0;i<5;i+=1)e[t][i]=Y(s[t][i],new o(~s[(t+1)%5][i].N&s[(t+2)%5][i].N,~s[(t+1)%5][i].I&s[(t+2)%5][i].I));e[0][0]=Y(e[0][0],Pe[n])}var a,l,d,h,f;return e}function de(r){let e,n,t=0;const i=[0,0],s=[4294967295&r,r/k&2097151];for(e=6;e>=0;e--)n=s[e>>2]>>>8*e&255,n===0&&t===0||(i[t+1>>2]|=n<<8*(t+1),t+=1);return t=t!==0?t:1,i[0]|=t,{value:t+1>4?i:[i[0]],binLen:8+8*t}}function Z(r){return z(de(r.binLen),r)}function ge(r,e){let n,t=de(e);t=z(t,r);const i=e>>>2,s=(i-t.value.length%i)%i;for(n=0;n>>5,be=f>>>5;for(b=0;b=m;b+=X)p=D(h.slice(b,b+X),p),f-=m;for(h=h.slice(b),f%=m;h.length>>3,h[b>>2]^=A<=y));)S.push(v.N),H+=1,64*H%m==0&&(D(null,p),H=0);return S}(u,c,0,l,i,t,d)},s.hmacKey&&this.k(K("hmacKey",s.hmacKey,this.T))}O(r,e){const n=function(i){const s=i||{};return{funcName:K("funcName",s.funcName,1,{value:[],binLen:0}),customization:K("Customization",s.customization,1,{value:[],binLen:0})}}(r||{});e&&(n.funcName=e);const t=z(Z(n.funcName),Z(n.customization));if(n.customization.binLen!==0||n.funcName.binLen!==0){const i=ge(t,this.m>>>3);for(let s=0;s>>5)this.U=this.v(i.slice(s,s+(this.m>>>5)),this.U),this.A+=this.m;return 4}return 31}X(r){const e=function(t){const i=t||{};return{kmacKey:K("kmacKey",i.kmacKey,1),funcName:{value:[1128353099],binLen:32},customization:K("Customization",i.customization,1,{value:[],binLen:0})}}(r||{});this.O(r,e.funcName);const n=ge(Z(e.kmacKey),this.m>>>3);for(let t=0;t>>5)this.U=this.v(n.slice(t,t+(this.m>>>5)),this.U),this.A+=this.m;this.H=!0}_(r){const e=z({value:this.h.slice(),binLen:this.u},function(n){let t,i,s=0;const u=[0,0],c=[4294967295&n,n/k&2097151];for(t=6;t>=0;t--)i=c[t>>2]>>>8*t&255,i===0&&s===0||(u[s>>2]|=i<<8*s,s+=1);return s=s!==0?s:1,u[s>>2]|=s<<8*s,{value:s+1>4?u:[u[0]],binLen:8+8*s}}(r.outputLen));return this.F(e.value,e.binLen,this.A,this.L(this.U),r.outputLen)}};class Xe{constructor(e,n,t){if(e=="SHA-1")this.P=new Ue(e,n,t);else if(e=="SHA-224"||e=="SHA-256")this.P=new Le(e,n,t);else if(e=="SHA-384"||e=="SHA-512")this.P=new ke(e,n,t);else{if(e!="SHA3-224"&&e!="SHA3-256"&&e!="SHA3-384"&&e!="SHA3-512"&&e!="SHAKE128"&&e!="SHAKE256"&&e!="CSHAKE128"&&e!="CSHAKE256"&&e!="KMAC128"&&e!="KMAC256")throw new Error(P);this.P=new xe(e,n,t)}}update(e){return this.P.update(e),this}getHash(e,n){return this.P.getHash(e,n)}setHMACKey(e,n,t){this.P.setHMACKey(e,n,t)}getHMAC(e,n){return this.P.getHMAC(e,n)}}const M=(()=>{if(typeof globalThis=="object")return globalThis;Object.defineProperty(Object.prototype,"__GLOBALTHIS__",{get(){return this},configurable:!0});try{if(typeof __GLOBALTHIS__!="undefined")return __GLOBALTHIS__}finally{delete Object.prototype.__GLOBALTHIS__}if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof global!="undefined")return global})(),ze={SHA1:"SHA-1",SHA224:"SHA-224",SHA256:"SHA-256",SHA384:"SHA-384",SHA512:"SHA-512","SHA3-224":"SHA3-224","SHA3-256":"SHA3-256","SHA3-384":"SHA3-384","SHA3-512":"SHA3-512"},je=(r,e,n)=>{q!=null;{const t=ze[r.toUpperCase()];if(typeof t=="undefined")throw new TypeError("Unknown hash function");const i=new Xe(t,"ARRAYBUFFER");return i.setHMACKey(e,"ARRAYBUFFER"),i.update(n),i.getHMAC("ARRAYBUFFER")}},V="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",De=r=>{let e=r.length;for(;r[e-1]==="=";)--e;const n=(e=8&&(s-=8,i[c++]=u>>>s)}return t},qe=r=>{const e=new Uint8Array(r);let n=0,t=0,i="";for(let s=0;s=5;)i+=V[t>>>n-5&31],n-=5;return n>0&&(i+=V[t<<5-n&31]),i},Ge=r=>{const e=new ArrayBuffer(r.length/2),n=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(r);let n="";for(let t=0;t{const e=new ArrayBuffer(r.length),n=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(r);let n="";for(let t=0;t{if(!pe)throw new Error("Encoding API not available");return pe.encode(r).buffer},We=r=>{if(!me)throw new Error("Encoding API not available");return me.decode(r)},_e=r=>{var e;if(q!=null,!((e=M.crypto)!=null&&e.getRandomValues))throw new Error("Cryptography API not available");return M.crypto.getRandomValues(new Uint8Array(r)).buffer};class T{constructor({buffer:e,size:n=20}={}){this.buffer=typeof e=="undefined"?_e(n):e}static fromLatin1(e){return new T({buffer:Ve(e)})}static fromUTF8(e){return new T({buffer:Qe(e)})}static fromBase32(e){return new T({buffer:De(e)})}static fromHex(e){return new T({buffer:Ge(e)})}get latin1(){return Object.defineProperty(this,"latin1",{enumerable:!0,value:Je(this.buffer)}),this.latin1}get utf8(){return Object.defineProperty(this,"utf8",{enumerable:!0,value:We(this.buffer)}),this.utf8}get base32(){return Object.defineProperty(this,"base32",{enumerable:!0,value:qe(this.buffer)}),this.base32}get hex(){return Object.defineProperty(this,"hex",{enumerable:!0,value:Ze(this.buffer)}),this.hex}}const et=(r,e)=>{q!=null;{if(r.length!==e.length)throw new TypeError("Input strings must have the same length");let n=-1,t=0;for(;++n{const d=E.generate({secret:n,algorithm:t,digits:i,counter:l});et(e,d)&&(c=l-s)};a(s);for(let l=1;l<=u&&c===null&&(a(s-l),!(c!==null||(a(s+l),c!==null)));++l);return c}validate({token:e,counter:n=this.counter,window:t}){return E.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,counter:n,window:t})}toString(){const e=encodeURIComponent;return`otpauth://hotp/${this.issuer.length>0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&counter=${e(this.counter)}`}};class N{static get defaults(){return{issuer:"",label:"OTPAuth",issuerInLabel:!0,algorithm:"SHA1",digits:6,period:30,window:1}}constructor({issuer:e=N.defaults.issuer,label:n=N.defaults.label,issuerInLabel:t=N.defaults.issuerInLabel,secret:i=new T,algorithm:s=N.defaults.algorithm,digits:u=N.defaults.digits,period:c=N.defaults.period}={}){this.issuer=e,this.label=n,this.issuerInLabel=t,this.secret=typeof i=="string"?T.fromBase32(i):i,this.algorithm=s.toUpperCase(),this.digits=u,this.period=c}static generate({secret:e,algorithm:n,digits:t,period:i=N.defaults.period,timestamp:s=Date.now()}){return x.generate({secret:e,algorithm:n,digits:t,counter:Math.floor(s/1e3/i)})}generate({timestamp:e=Date.now()}={}){return N.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:e})}static validate({token:e,secret:n,algorithm:t,digits:i,period:s=N.defaults.period,timestamp:u=Date.now(),window:c}){return x.validate({token:e,secret:n,algorithm:t,digits:i,counter:Math.floor(u/1e3/s),window:c})}validate({token:e,timestamp:n,window:t}){return N.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:n,window:t})}toString(){const e=encodeURIComponent;return`otpauth://totp/${this.issuer.length>0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&period=${e(this.period)}`}}const nt=/^otpauth:\/\/([ht]otp)\/(.+)\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i,rt=/^[2-7A-Z]+=*$/i,it=/^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i,st=/^[+-]?\d+$/,Ae=/^\+?[1-9]\d*$/;class ot{static parse(e){let n;try{n=e.match(nt)}catch(a){}if(!Array.isArray(n))throw new URIError("Invalid URI format");const t=n[1].toLowerCase(),i=n[2].split(/(?::|%3A) *(.+)/i,2).map(decodeURIComponent),s=n[3].split("&").reduce((a,l)=>{const d=l.split(/=(.*)/,2).map(decodeURIComponent),h=d[0].toLowerCase(),f=d[1],g=a;return g[h]=f,g},{});let u;const c={};if(t==="hotp")if(u=x,typeof s.counter!="undefined"&&st.test(s.counter))c.counter=parseInt(s.counter,10);else throw new TypeError("Missing or invalid 'counter' parameter");else if(t==="totp"){if(u=N,typeof s.period!="undefined")if(Ae.test(s.period))c.period=parseInt(s.period,10);else throw new TypeError("Invalid 'period' parameter")}else throw new TypeError("Unknown OTP type");if(typeof s.issuer!="undefined"&&(c.issuer=s.issuer),i.length===2?(c.label=i[1],typeof c.issuer=="undefined"||c.issuer===""?c.issuer=i[0]:i[0]===""&&(c.issuerInLabel=!1)):(c.label=i[0],typeof c.issuer!="undefined"&&c.issuer!==""&&(c.issuerInLabel=!1)),typeof s.secret!="undefined"&&rt.test(s.secret))c.secret=s.secret;else throw new TypeError("Missing or invalid 'secret' parameter");if(typeof s.algorithm!="undefined")if(it.test(s.algorithm))c.algorithm=s.algorithm;else throw new TypeError("Invalid 'algorithm' parameter");if(typeof s.digits!="undefined")if(Ae.test(s.digits))c.digits=parseInt(s.digits,10);else throw new TypeError("Invalid 'digits' parameter");return new u(c)}static stringify(e){if(e instanceof x||e instanceof N)return e.toString();throw new TypeError("Invalid 'HOTP/TOTP' object")}}const ut="9.2.4";export{x as HOTP,T as Secret,N as TOTP,ot as URI,ut as version};
//# sourceMappingURL=otpauth.esm.min.js.map
diff --git a/dist/otpauth.esm.min.js.map b/dist/otpauth.esm.min.js.map
index 9a5ae1d..dc4a783 100644
--- a/dist/otpauth.esm.min.js.map
+++ b/dist/otpauth.esm.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"otpauth.esm.min.js","sources":["../src/utils/encoding/uint.js","../node_modules/jssha/dist/sha.mjs","../src/utils/global-scope.js","../src/utils/crypto/hmac-digest.js","../src/utils/encoding/base32.js","../src/utils/encoding/hex.js","../src/utils/encoding/latin1.js","../src/utils/encoding/utf8.js","../src/utils/crypto/random-bytes.js","../src/secret.js","../src/utils/crypto/timing-safe-equal.js","../src/hotp.js","../src/totp.js","../src/uri.js","../src/version.js"],"sourcesContent":["/**\n * Converts an integer to an ArrayBuffer.\n * @param {number} num Integer.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst uintToBuf = (num) => {\n const buf = new ArrayBuffer(8);\n const arr = new Uint8Array(buf);\n let acc = num;\n\n for (let i = 7; i >= 0; i--) {\n if (acc === 0) break;\n arr[i] = acc & 255;\n acc -= arr[i];\n acc /= 256;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let num = 0;\n\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] !== 0) {\n num *= 256;\n num += arr[i];\n }\n }\n\n return num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * A JavaScript implementation of the SHA family of hashes - defined in FIPS PUB 180-4, FIPS PUB 202,\n * and SP 800-185 - as well as the corresponding HMAC implementation as defined in FIPS PUB 198-1.\n *\n * Copyright 2008-2023 Brian Turek, 1998-2009 Paul Johnston & Contributors\n * Distributed under the BSD License\n * See http://caligatio.github.com/jsSHA/ for more information\n */\nconst t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",n=\"ARRAYBUFFER not supported by this environment\",e=\"UINT8ARRAY not supported by this environment\";function r(t,n,e,r){let i,s,o;const h=n||[0],u=(e=e||0)>>>3,w=-1===r?3:0;for(i=0;i>>2,h.length<=s&&h.push(0),h[s]|=t[i]<<8*(w+r*(o%4));return{value:h,binLen:8*t.length+e}}function i(i,s,o){switch(s){case\"UTF8\":case\"UTF16BE\":case\"UTF16LE\":break;default:throw new Error(\"encoding must be UTF8, UTF16BE, or UTF16LE\")}switch(i){case\"HEX\":return function(t,n,e){return function(t,n,e,r){let i,s,o,h;if(0!=t.length%2)throw new Error(\"String of HEX type must be in byte increments\");const u=n||[0],w=(e=e||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+w,o=h>>>2;u.length<=o;)u.push(0);u[o]|=s<<8*(c+r*(h%4))}return{value:u,binLen:4*t.length+e}}(t,n,e,o)};case\"TEXT\":return function(t,n,e){return function(t,n,e,r,i){let s,o,h,u,w,c,f,a,l=0;const A=e||[0],E=(r=r||0)>>>3;if(\"UTF8\"===n)for(f=-1===i?3:0,h=0;hs?o.push(s):2048>s?(o.push(192|s>>>6),o.push(128|63&s)):55296>s||57344<=s?o.push(224|s>>>12,128|s>>>6&63,128|63&s):(h+=1,s=65536+((1023&s)<<10|1023&t.charCodeAt(h)),o.push(240|s>>>18,128|s>>>12&63,128|s>>>6&63,128|63&s)),u=0;u>>2;A.length<=w;)A.push(0);A[w]|=o[u]<<8*(f+i*(c%4)),l+=1}else for(f=-1===i?2:0,a=\"UTF16LE\"===n&&1!==i||\"UTF16LE\"!==n&&1===i,h=0;h>>8),c=l+E,w=c>>>2;A.length<=w;)A.push(0);A[w]|=s<<8*(f+i*(c%4)),l+=2}return{value:A,binLen:8*l+r}}(t,s,n,e,o)};case\"B64\":return function(n,e,r){return function(n,e,r,i){let s,o,h,u,w,c,f,a=0;const l=e||[0],A=(r=r||0)>>>3,E=-1===i?3:0,H=n.indexOf(\"=\");if(-1===n.search(/^[a-zA-Z0-9=+/]+$/))throw new Error(\"Invalid character in base-64 string\");if(n=n.replace(/=/g,\"\"),-1!==H&&H>>2;l.length<=c;)l.push(0);l[c]|=(u>>>16-8*h&255)<<8*(E+i*(f%4)),a+=1}}return{value:l,binLen:8*a+r}}(n,e,r,o)};case\"BYTES\":return function(t,n,e){return function(t,n,e,r){let i,s,o,h;const u=n||[0],w=(e=e||0)>>>3,c=-1===r?3:0;for(s=0;s>>2,u.length<=o&&u.push(0),u[o]|=i<<8*(c+r*(h%4));return{value:u,binLen:8*t.length+e}}(t,n,e,o)};case\"ARRAYBUFFER\":try{new ArrayBuffer(0)}catch(t){throw new Error(n)}return function(t,n,e){return function(t,n,e,i){return r(new Uint8Array(t),n,e,i)}(t,n,e,o)};case\"UINT8ARRAY\":try{new Uint8Array(0)}catch(t){throw new Error(e)}return function(t,n,e){return r(t,n,e,o)};default:throw new Error(\"format must be HEX, TEXT, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY\")}}function s(r,i,s,o){switch(r){case\"HEX\":return function(t){return function(t,n,e,r){const i=\"0123456789abcdef\";let s,o,h=\"\";const u=n/8,w=-1===e?3:0;for(s=0;s>>2]>>>8*(w+e*(s%4)),h+=i.charAt(o>>>4&15)+i.charAt(15&o);return r.outputUpper?h.toUpperCase():h}(t,i,s,o)};case\"B64\":return function(n){return function(n,e,r,i){let s,o,h,u,w,c=\"\";const f=e/8,a=-1===r?3:0;for(s=0;s>>2]:0,w=s+2>>2]:0,h=(n[s>>>2]>>>8*(a+r*(s%4))&255)<<16|(u>>>8*(a+r*((s+1)%4))&255)<<8|w>>>8*(a+r*((s+2)%4))&255,o=0;o<4;o+=1)c+=8*s+6*o<=e?t.charAt(h>>>6*(3-o)&63):i.b64Pad;return c}(n,i,s,o)};case\"BYTES\":return function(t){return function(t,n,e){let r,i,s=\"\";const o=n/8,h=-1===e?3:0;for(r=0;r>>2]>>>8*(h+e*(r%4))&255,s+=String.fromCharCode(i);return s}(t,i,s)};case\"ARRAYBUFFER\":try{new ArrayBuffer(0)}catch(t){throw new Error(n)}return function(t){return function(t,n,e){let r;const i=n/8,s=new ArrayBuffer(i),o=new Uint8Array(s),h=-1===e?3:0;for(r=0;r>>2]>>>8*(h+e*(r%4))&255;return s}(t,i,s)};case\"UINT8ARRAY\":try{new Uint8Array(0)}catch(t){throw new Error(e)}return function(t){return function(t,n,e){let r;const i=n/8,s=-1===e?3:0,o=new Uint8Array(i);for(r=0;r>>2]>>>8*(s+e*(r%4))&255;return o}(t,i,s)};default:throw new Error(\"format must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY\")}}const o=4294967296,h=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],u=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],w=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],c=\"Chosen SHA variant is not supported\",f=\"Cannot set numRounds with MAC\";function a(t,n){let e,r;const i=t.binLen>>>3,s=n.binLen>>>3,o=i<<3,h=4-i<<3;if(i%4!=0){for(e=0;e>>2,t.value[r]|=n.value[e>>>2]<>>2]>>>h;return(t.value.length<<2)-4>=s+i&&t.value.pop(),{value:t.value,binLen:t.binLen+n.binLen}}return{value:t.value.concat(n.value),binLen:t.binLen+n.binLen}}function l(t){const n={outputUpper:!1,b64Pad:\"=\",outputLen:-1},e=t||{},r=\"Output length must be a multiple of 8\";if(n.outputUpper=e.outputUpper||!1,e.b64Pad&&(n.b64Pad=e.b64Pad),e.outputLen){if(e.outputLen%8!=0)throw new Error(r);n.outputLen=e.outputLen}else if(e.shakeLen){if(e.shakeLen%8!=0)throw new Error(r);n.outputLen=e.shakeLen}if(\"boolean\"!=typeof n.outputUpper)throw new Error(\"Invalid outputUpper formatting option\");if(\"string\"!=typeof n.b64Pad)throw new Error(\"Invalid b64Pad formatting option\");return n}function A(t,n,e,r){const s=t+\" must include a value and format\";if(!n){if(!r)throw new Error(s);return r}if(void 0===n.value||!n.format)throw new Error(s);return i(n.format,n.encoding||\"UTF8\",e)(n.value)}class E{constructor(t,n,e){const r=e||{};if(this.t=n,this.i=r.encoding||\"UTF8\",this.numRounds=r.numRounds||1,isNaN(this.numRounds)||this.numRounds!==parseInt(this.numRounds,10)||1>this.numRounds)throw new Error(\"numRounds must a integer >= 1\");this.o=t,this.h=[],this.u=0,this.l=!1,this.A=0,this.H=!1,this.S=[],this.p=[]}update(t){let n,e=0;const r=this.m>>>5,i=this.C(t,this.h,this.u),s=i.binLen,o=i.value,h=s>>>5;for(n=0;n>>5),this.u=s%this.m,this.l=!0,this}getHash(t,n){let e,r,i=this.R;const o=l(n);if(this.K){if(-1===o.outputLen)throw new Error(\"Output length must be specified in options\");i=o.outputLen}const h=s(t,i,this.T,o);if(this.H&&this.g)return h(this.g(o));for(r=this.F(this.h.slice(),this.u,this.A,this.L(this.U),i),e=1;e>>24-i%32),r=this.F(r,i,0,this.B(this.o),i);return h(r)}setHMACKey(t,n,e){if(!this.M)throw new Error(\"Variant does not support HMAC\");if(this.l)throw new Error(\"Cannot set MAC key after calling update\");const r=i(n,(e||{}).encoding||\"UTF8\",this.T);this.k(r(t))}k(t){const n=this.m>>>3,e=n/4-1;let r;if(1!==this.numRounds)throw new Error(f);if(this.H)throw new Error(\"MAC key already set\");for(n>>32-n}function S(t,n){return t>>>n|t<<32-n}function b(t,n){return t>>>n}function p(t,n,e){return t^n^e}function d(t,n,e){return t&n^~t&e}function m(t,n,e){return t&n^t&e^n&e}function C(t){return S(t,2)^S(t,13)^S(t,22)}function y(t,n){const e=(65535&t)+(65535&n);return(65535&(t>>>16)+(n>>>16)+(e>>>16))<<16|65535&e}function U(t,n,e,r){const i=(65535&t)+(65535&n)+(65535&e)+(65535&r);return(65535&(t>>>16)+(n>>>16)+(e>>>16)+(r>>>16)+(i>>>16))<<16|65535&i}function v(t,n,e,r,i){const s=(65535&t)+(65535&n)+(65535&e)+(65535&r)+(65535&i);return(65535&(t>>>16)+(n>>>16)+(e>>>16)+(r>>>16)+(i>>>16)+(s>>>16))<<16|65535&s}function R(t){return S(t,7)^S(t,18)^b(t,3)}function K(t){return S(t,6)^S(t,11)^S(t,25)}function T(t){return[1732584193,4023233417,2562383102,271733878,3285377520]}function g(t,n){let e,r,i,s,o,h,u;const w=[];for(e=n[0],r=n[1],i=n[2],s=n[3],o=n[4],u=0;u<80;u+=1)w[u]=u<16?t[u]:H(w[u-3]^w[u-8]^w[u-14]^w[u-16],1),h=u<20?v(H(e,5),d(r,i,s),o,1518500249,w[u]):u<40?v(H(e,5),p(r,i,s),o,1859775393,w[u]):u<60?v(H(e,5),m(r,i,s),o,2400959708,w[u]):v(H(e,5),p(r,i,s),o,3395469782,w[u]),o=s,s=i,i=H(r,30),r=e,e=h;return n[0]=y(e,n[0]),n[1]=y(r,n[1]),n[2]=y(i,n[2]),n[3]=y(s,n[3]),n[4]=y(o,n[4]),n}function F(t,n,e,r){let i;const s=15+(n+65>>>9<<4),h=n+e;for(;t.length<=s;)t.push(0);for(t[n>>>5]|=128<<24-n%32,t[s]=4294967295&h,t[s-1]=h/o|0,i=0;i>>9<<4),w=n+e;for(;t.length<=u;)t.push(0);for(t[n>>>5]|=128<<24-n%32,t[u]=4294967295&w,t[u-1]=w/o|0,s=0;s32?(e=64-n,new Y(t.I<>>e,t.N<>>e)):0!==n?(e=32-n,new Y(t.N<>>e,t.I<>>e)):t}function I(t,n){let e;return n<32?(e=32-n,new Y(t.N>>>n|t.I<>>n|t.N<>>n|t.N<>>n|t.I<>>n,t.I>>>n|t.N<<32-n)}function z(t,n,e){return new Y(t.N&n.N^t.N&e.N^n.N&e.N,t.I&n.I^t.I&e.I^n.I&e.I)}function x(t){const n=I(t,28),e=I(t,34),r=I(t,39);return new Y(n.N^e.N^r.N,n.I^e.I^r.I)}function _(t,n){let e,r;e=(65535&t.I)+(65535&n.I),r=(t.I>>>16)+(n.I>>>16)+(e>>>16);const i=(65535&r)<<16|65535&e;e=(65535&t.N)+(65535&n.N)+(r>>>16),r=(t.N>>>16)+(n.N>>>16)+(e>>>16);return new Y((65535&r)<<16|65535&e,i)}function O(t,n,e,r){let i,s;i=(65535&t.I)+(65535&n.I)+(65535&e.I)+(65535&r.I),s=(t.I>>>16)+(n.I>>>16)+(e.I>>>16)+(r.I>>>16)+(i>>>16);const o=(65535&s)<<16|65535&i;i=(65535&t.N)+(65535&n.N)+(65535&e.N)+(65535&r.N)+(s>>>16),s=(t.N>>>16)+(n.N>>>16)+(e.N>>>16)+(r.N>>>16)+(i>>>16);return new Y((65535&s)<<16|65535&i,o)}function P(t,n,e,r,i){let s,o;s=(65535&t.I)+(65535&n.I)+(65535&e.I)+(65535&r.I)+(65535&i.I),o=(t.I>>>16)+(n.I>>>16)+(e.I>>>16)+(r.I>>>16)+(i.I>>>16)+(s>>>16);const h=(65535&o)<<16|65535&s;s=(65535&t.N)+(65535&n.N)+(65535&e.N)+(65535&r.N)+(65535&i.N)+(o>>>16),o=(t.N>>>16)+(n.N>>>16)+(e.N>>>16)+(r.N>>>16)+(i.N>>>16)+(s>>>16);return new Y((65535&o)<<16|65535&s,h)}function V(t,n){return new Y(t.N^n.N,t.I^n.I)}function Z(t){const n=I(t,19),e=I(t,61),r=X(t,6);return new Y(n.N^e.N^r.N,n.I^e.I^r.I)}function j(t){const n=I(t,1),e=I(t,8),r=X(t,7);return new Y(n.N^e.N^r.N,n.I^e.I^r.I)}function q(t){const n=I(t,14),e=I(t,18),r=I(t,41);return new Y(n.N^e.N^r.N,n.I^e.I^r.I)}const D=[new Y(h[0],3609767458),new Y(h[1],602891725),new Y(h[2],3964484399),new Y(h[3],2173295548),new Y(h[4],4081628472),new Y(h[5],3053834265),new Y(h[6],2937671579),new Y(h[7],3664609560),new Y(h[8],2734883394),new Y(h[9],1164996542),new Y(h[10],1323610764),new Y(h[11],3590304994),new Y(h[12],4068182383),new Y(h[13],991336113),new Y(h[14],633803317),new Y(h[15],3479774868),new Y(h[16],2666613458),new Y(h[17],944711139),new Y(h[18],2341262773),new Y(h[19],2007800933),new Y(h[20],1495990901),new Y(h[21],1856431235),new Y(h[22],3175218132),new Y(h[23],2198950837),new Y(h[24],3999719339),new Y(h[25],766784016),new Y(h[26],2566594879),new Y(h[27],3203337956),new Y(h[28],1034457026),new Y(h[29],2466948901),new Y(h[30],3758326383),new Y(h[31],168717936),new Y(h[32],1188179964),new Y(h[33],1546045734),new Y(h[34],1522805485),new Y(h[35],2643833823),new Y(h[36],2343527390),new Y(h[37],1014477480),new Y(h[38],1206759142),new Y(h[39],344077627),new Y(h[40],1290863460),new Y(h[41],3158454273),new Y(h[42],3505952657),new Y(h[43],106217008),new Y(h[44],3606008344),new Y(h[45],1432725776),new Y(h[46],1467031594),new Y(h[47],851169720),new Y(h[48],3100823752),new Y(h[49],1363258195),new Y(h[50],3750685593),new Y(h[51],3785050280),new Y(h[52],3318307427),new Y(h[53],3812723403),new Y(h[54],2003034995),new Y(h[55],3602036899),new Y(h[56],1575990012),new Y(h[57],1125592928),new Y(h[58],2716904306),new Y(h[59],442776044),new Y(h[60],593698344),new Y(h[61],3733110249),new Y(h[62],2999351573),new Y(h[63],3815920427),new Y(3391569614,3928383900),new Y(3515267271,566280711),new Y(3940187606,3454069534),new Y(4118630271,4000239992),new Y(116418474,1914138554),new Y(174292421,2731055270),new Y(289380356,3203993006),new Y(460393269,320620315),new Y(685471733,587496836),new Y(852142971,1086792851),new Y(1017036298,365543100),new Y(1126000580,2618297676),new Y(1288033470,3409855158),new Y(1501505948,4234509866),new Y(1607167915,987167468),new Y(1816402316,1246189591)];function G(t){return\"SHA-384\"===t?[new Y(3418070365,u[0]),new Y(1654270250,u[1]),new Y(2438529370,u[2]),new Y(355462360,u[3]),new Y(1731405415,u[4]),new Y(41048885895,u[5]),new Y(3675008525,u[6]),new Y(1203062813,u[7])]:[new Y(w[0],4089235720),new Y(w[1],2227873595),new Y(w[2],4271175723),new Y(w[3],1595750129),new Y(w[4],2917565137),new Y(w[5],725511199),new Y(w[6],4215389547),new Y(w[7],327033209)]}function J(t,n){let e,r,i,s,o,h,u,w,c,f,a,l;const A=[];for(e=n[0],r=n[1],i=n[2],s=n[3],o=n[4],h=n[5],u=n[6],w=n[7],a=0;a<80;a+=1)a<16?(l=2*a,A[a]=new Y(t[l],t[l+1])):A[a]=O(Z(A[a-2]),A[a-7],j(A[a-15]),A[a-16]),c=P(w,q(o),(H=h,S=u,new Y((E=o).N&H.N^~E.N&S.N,E.I&H.I^~E.I&S.I)),D[a],A[a]),f=_(x(e),z(e,r,i)),w=u,u=h,h=o,o=_(s,c),s=i,i=r,r=e,e=_(c,f);var E,H,S;return n[0]=_(e,n[0]),n[1]=_(r,n[1]),n[2]=_(i,n[2]),n[3]=_(s,n[3]),n[4]=_(o,n[4]),n[5]=_(h,n[5]),n[6]=_(u,n[6]),n[7]=_(w,n[7]),n}let Q=class extends E{constructor(t,n,e){if(\"SHA-384\"!==t&&\"SHA-512\"!==t)throw new Error(c);super(t,n,e);const r=e||{};this.g=this.Y,this.M=!0,this.T=-1,this.C=i(this.t,this.i,this.T),this.v=J,this.L=function(t){return t.slice()},this.B=G,this.F=function(n,e,r,i){return function(t,n,e,r,i){let s,h;const u=31+(n+129>>>10<<5),w=n+e;for(;t.length<=u;)t.push(0);for(t[n>>>5]|=128<<24-n%32,t[u]=4294967295&w,t[u-1]=w/o|0,s=0;s>>1)%5][(r>>>1)/5|0]=V(n[(r>>>1)%5][(r>>>1)/5|0],new Y(t[r+1],t[r]));for(e=0;e<24;e+=1){for(s=tt(),r=0;r<5;r+=1)o[r]=(u=n[r][0],w=n[r][1],c=n[r][2],f=n[r][3],a=n[r][4],new Y(u.N^w.N^c.N^f.N^a.N,u.I^w.I^c.I^f.I^a.I));for(r=0;r<5;r+=1)h[r]=V(o[(r+4)%5],N(o[(r+1)%5],1));for(r=0;r<5;r+=1)for(i=0;i<5;i+=1)n[r][i]=V(n[r][i],h[r]);for(r=0;r<5;r+=1)for(i=0;i<5;i+=1)s[i][(2*r+3*i)%5]=N(n[r][i],$[r][i]);for(r=0;r<5;r+=1)for(i=0;i<5;i+=1)n[r][i]=V(s[r][i],new Y(~s[(r+1)%5][i].N&s[(r+2)%5][i].N,~s[(r+1)%5][i].I&s[(r+2)%5][i].I));n[0][0]=V(n[0][0],W[e])}var u,w,c,f,a;return n}function rt(t){let n,e,r=0;const i=[0,0],s=[4294967295&t,t/o&2097151];for(n=6;n>=0;n--)e=s[n>>2]>>>8*n&255,0===e&&0===r||(i[r+1>>2]|=e<<8*(r+1),r+=1);return r=0!==r?r:1,i[0]|=r,{value:r+1>4?i:[i[0]],binLen:8+8*r}}function it(t){return a(rt(t.binLen),t)}function st(t,n){let e,r=rt(n);r=a(r,t);const i=n>>>2,s=(i-r.value.length%i)%i;for(e=0;e>>5,a=n>>>5;for(h=0;h=i;h+=f)r=et(t.slice(h,h+f),r),n-=i;for(t=t.slice(h),n%=i;t.length>>3,t[h>>2]^=s<=o));)c.push(u.N),w+=1,0==64*w%i&&(et(null,r),w=0);return c}(t,n,0,i,s,r,o)},o.hmacKey&&this.k(A(\"hmacKey\",o.hmacKey,this.T))}O(t,n){const e=function(t){const n=t||{};return{funcName:A(\"funcName\",n.funcName,1,{value:[],binLen:0}),customization:A(\"Customization\",n.customization,1,{value:[],binLen:0})}}(t||{});n&&(e.funcName=n);const r=a(it(e.funcName),it(e.customization));if(0!==e.customization.binLen||0!==e.funcName.binLen){const t=st(r,this.m>>>3);for(let n=0;n>>5)this.U=this.v(t.slice(n,n+(this.m>>>5)),this.U),this.A+=this.m;return 4}return 31}X(t){const n=function(t){const n=t||{};return{kmacKey:A(\"kmacKey\",n.kmacKey,1),funcName:{value:[1128353099],binLen:32},customization:A(\"Customization\",n.customization,1,{value:[],binLen:0})}}(t||{});this.O(t,n.funcName);const e=st(it(n.kmacKey),this.m>>>3);for(let t=0;t>>5)this.U=this.v(e.slice(t,t+(this.m>>>5)),this.U),this.A+=this.m;this.H=!0}_(t){const n=a({value:this.h.slice(),binLen:this.u},function(t){let n,e,r=0;const i=[0,0],s=[4294967295&t,t/o&2097151];for(n=6;n>=0;n--)e=s[n>>2]>>>8*n&255,0===e&&0===r||(i[r>>2]|=e<<8*r,r+=1);return r=0!==r?r:1,i[r>>2]|=r<<8*r,{value:r+1>4?i:[i[0]],binLen:8+8*r}}(t.outputLen));return this.F(n.value,n.binLen,this.A,this.L(this.U),t.outputLen)}};class ht{constructor(t,n,e){if(\"SHA-1\"==t)this.P=new L(t,n,e);else if(\"SHA-224\"==t||\"SHA-256\"==t)this.P=new k(t,n,e);else if(\"SHA-384\"==t||\"SHA-512\"==t)this.P=new Q(t,n,e);else{if(\"SHA3-224\"!=t&&\"SHA3-256\"!=t&&\"SHA3-384\"!=t&&\"SHA3-512\"!=t&&\"SHAKE128\"!=t&&\"SHAKE256\"!=t&&\"CSHAKE128\"!=t&&\"CSHAKE256\"!=t&&\"KMAC128\"!=t&&\"KMAC256\"!=t)throw new Error(c);this.P=new ot(t,n,e)}}update(t){return this.P.update(t),this}getHash(t,n){return this.P.getHash(t,n)}setHMACKey(t,n,e){this.P.setHMACKey(t,n,e)}getHMAC(t,n){return this.P.getHMAC(t,n)}}export{ht as default};\n//# sourceMappingURL=sha.mjs.map\n","/**\n * \"globalThis\" ponyfill.\n * @see [A horrifying globalThis polyfill in universal JavaScript](https://mathiasbynens.be/notes/globalthis)\n * @type {Object.}\n */\nconst globalScope = (() => {\n if (typeof globalThis === \"object\") return globalThis;\n else {\n Object.defineProperty(Object.prototype, \"__GLOBALTHIS__\", {\n get() {\n return this;\n },\n configurable: true,\n });\n try {\n // @ts-ignore\n if (typeof __GLOBALTHIS__ !== \"undefined\") return __GLOBALTHIS__;\n } finally {\n // @ts-ignore\n delete Object.prototype.__GLOBALTHIS__;\n }\n }\n\n // Still unable to determine \"globalThis\", fall back to a naive method.\n if (typeof self !== \"undefined\") return self;\n else if (typeof window !== \"undefined\") return window;\n else if (typeof global !== \"undefined\") return global;\n\n return undefined;\n})();\n\nexport { globalScope };\n","import * as crypto from \"node:crypto\";\nimport jsSHA from \"jssha\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * OpenSSL to jsSHA algorithms map.\n * @type {Object.}\n */\nconst OPENSSL_JSSHA_ALGO_MAP = {\n SHA1: \"SHA-1\",\n SHA224: \"SHA-224\",\n SHA256: \"SHA-256\",\n SHA384: \"SHA-384\",\n SHA512: \"SHA-512\",\n \"SHA3-224\": \"SHA3-224\",\n \"SHA3-256\": \"SHA3-256\",\n \"SHA3-384\": \"SHA3-384\",\n \"SHA3-512\": \"SHA3-512\",\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n if (crypto?.createHmac) {\n const hmac = crypto.createHmac(algorithm, globalScope.Buffer.from(key));\n hmac.update(globalScope.Buffer.from(message));\n return hmac.digest().buffer;\n } else {\n const variant = OPENSSL_JSSHA_ALGO_MAP[algorithm.toUpperCase()];\n if (typeof variant === \"undefined\") {\n throw new TypeError(\"Unknown hash function\");\n }\n const hmac = new jsSHA(variant, \"ARRAYBUFFER\");\n hmac.setHMACKey(key, \"ARRAYBUFFER\");\n hmac.update(message);\n return hmac.getHMAC(\"ARRAYBUFFER\");\n }\n};\n\nexport { hmacDigest };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * @see [LinusU/base32-decode](https://github.com/LinusU/base32-decode)\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n // Canonicalize to all upper case and remove padding if it exists.\n let end = str.length;\n while (str[end - 1] === \"=\") --end;\n const cstr = (end < str.length ? str.substring(0, end) : str).toUpperCase();\n\n const buf = new ArrayBuffer(((cstr.length * 5) / 8) | 0);\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let index = 0;\n\n for (let i = 0; i < cstr.length; i++) {\n const idx = ALPHABET.indexOf(cstr[i]);\n if (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n value = (value << 5) | idx;\n bits += 5;\n\n if (bits >= 8) {\n bits -= 8;\n arr[index++] = value >>> bits;\n }\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * @see [LinusU/base32-encode](https://github.com/LinusU/base32-encode)\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n value = (value << 8) | arr[i];\n bits += 8;\n\n while (bits >= 5) {\n str += ALPHABET[(value >>> (bits - 5)) & 31];\n bits -= 5;\n }\n }\n\n if (bits > 0) {\n str += ALPHABET[(value << (5 - bits)) & 31];\n }\n\n return str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n const buf = new ArrayBuffer(str.length / 2);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i += 2) {\n arr[i / 2] = parseInt(str.substring(i, i + 2), 16);\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n const hex = arr[i].toString(16);\n if (hex.length === 1) str += \"0\";\n str += hex;\n }\n\n return str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n const buf = new ArrayBuffer(str.length);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i) & 0xff;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n str += String.fromCharCode(arr[i]);\n }\n\n return str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalScope } from \"../global-scope.js\";\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalScope.TextEncoder\n ? new globalScope.TextEncoder(\"utf-8\")\n : null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalScope.TextDecoder\n ? new globalScope.TextDecoder(\"utf-8\")\n : null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n if (!ENCODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n if (!DECODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n if (crypto?.randomBytes) {\n return crypto.randomBytes(size).buffer;\n } else {\n if (!globalScope.crypto?.getRandomValues) {\n throw new Error(\"Cryptography API not available\");\n }\n return globalScope.crypto.getRandomValues(new Uint8Array(size)).buffer;\n }\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from \"./utils/encoding/base32.js\";\nimport { hexToBuf, hexFromBuf } from \"./utils/encoding/hex.js\";\nimport { latin1ToBuf, latin1FromBuf } from \"./utils/encoding/latin1.js\";\nimport { utf8ToBuf, utf8FromBuf } from \"./utils/encoding/utf8.js\";\nimport { randomBytes } from \"./utils/crypto/random-bytes.js\";\n\n/**\n * OTP secret key.\n */\nclass Secret {\n /**\n * Creates a secret key object.\n * @param {Object} [config] Configuration options.\n * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n */\n constructor({ buffer, size = 20 } = {}) {\n /**\n * Secret key.\n * @type {ArrayBuffer}\n */\n this.buffer = typeof buffer === \"undefined\" ? randomBytes(size) : buffer;\n }\n\n /**\n * Converts a Latin-1 string to a Secret object.\n * @param {string} str Latin-1 string.\n * @returns {Secret} Secret object.\n */\n static fromLatin1(str) {\n return new Secret({ buffer: latin1ToBuf(str) });\n }\n\n /**\n * Converts an UTF-8 string to a Secret object.\n * @param {string} str UTF-8 string.\n * @returns {Secret} Secret object.\n */\n static fromUTF8(str) {\n return new Secret({ buffer: utf8ToBuf(str) });\n }\n\n /**\n * Converts a base32 string to a Secret object.\n * @param {string} str Base32 string.\n * @returns {Secret} Secret object.\n */\n static fromBase32(str) {\n return new Secret({ buffer: base32ToBuf(str) });\n }\n\n /**\n * Converts a hexadecimal string to a Secret object.\n * @param {string} str Hexadecimal string.\n * @returns {Secret} Secret object.\n */\n static fromHex(str) {\n return new Secret({ buffer: hexToBuf(str) });\n }\n\n /**\n * Latin-1 string representation of secret key.\n * @type {string}\n */\n get latin1() {\n Object.defineProperty(this, \"latin1\", {\n enumerable: true,\n value: latin1FromBuf(this.buffer),\n });\n\n return this.latin1;\n }\n\n /**\n * UTF-8 string representation of secret key.\n * @type {string}\n */\n get utf8() {\n Object.defineProperty(this, \"utf8\", {\n enumerable: true,\n value: utf8FromBuf(this.buffer),\n });\n\n return this.utf8;\n }\n\n /**\n * Base32 string representation of secret key.\n * @type {string}\n */\n get base32() {\n Object.defineProperty(this, \"base32\", {\n enumerable: true,\n value: base32FromBuf(this.buffer),\n });\n\n return this.base32;\n }\n\n /**\n * Hexadecimal string representation of secret key.\n * @type {string}\n */\n get hex() {\n Object.defineProperty(this, \"hex\", {\n enumerable: true,\n value: hexFromBuf(this.buffer),\n });\n\n return this.hex;\n }\n}\n\nexport { Secret };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n if (crypto?.timingSafeEqual) {\n return crypto.timingSafeEqual(\n globalScope.Buffer.from(a),\n globalScope.Buffer.from(b),\n );\n } else {\n if (a.length !== b.length) {\n throw new TypeError(\"Input strings must have the same length\");\n }\n let i = -1;\n let out = 0;\n while (++i < a.length) {\n out |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return out === 0;\n }\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from \"./utils/encoding/uint.js\";\nimport { hmacDigest } from \"./utils/crypto/hmac-digest.js\";\nimport { Secret } from \"./secret.js\";\nimport { timingSafeEqual } from \"./utils/crypto/timing-safe-equal.js\";\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * @see [RFC 4226](https://tools.ietf.org/html/rfc4226)\n */\nclass HOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * counter: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n counter: 0,\n window: 1,\n };\n }\n\n /**\n * Creates an HOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Initial counter value.\n */\n constructor({\n issuer = HOTP.defaults.issuer,\n label = HOTP.defaults.label,\n issuerInLabel = HOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Initial counter value.\n * @type {number}\n */\n this.counter = counter;\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Counter value.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n }) {\n const digest = new Uint8Array(\n hmacDigest(algorithm, secret.buffer, uintToBuf(counter)),\n );\n const offset = digest[digest.byteLength - 1] & 15;\n const otp =\n (((digest[offset] & 127) << 24) |\n ((digest[offset + 1] & 255) << 16) |\n ((digest[offset + 2] & 255) << 8) |\n (digest[offset + 3] & 255)) %\n 10 ** digits;\n\n return otp.toString().padStart(digits, \"0\");\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.counter=this.counter++] Counter value.\n * @returns {string} Token.\n */\n generate({ counter = this.counter++ } = {}) {\n return HOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n });\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.counter=0] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n counter = HOTP.defaults.counter,\n window = HOTP.defaults.window,\n }) {\n // Return early if the token length does not match the digit number.\n if (token.length !== digits) return null;\n\n let delta = null;\n\n for (let i = counter - window; i <= counter + window; ++i) {\n const generatedToken = HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: i,\n });\n\n if (timingSafeEqual(token, generatedToken)) {\n delta = i - counter;\n }\n }\n\n return delta;\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.counter=this.counter] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, counter = this.counter, window }) {\n return HOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://hotp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `counter=${e(this.counter)}`\n );\n }\n}\n\nexport { HOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { Secret } from \"./secret.js\";\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * @see [RFC 6238](https://tools.ietf.org/html/rfc6238)\n */\nclass TOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * period: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n period: 30,\n window: 1,\n };\n }\n\n /**\n * Creates a TOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n */\n constructor({\n issuer = TOTP.defaults.issuer,\n label = TOTP.defaults.label,\n issuerInLabel = TOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = TOTP.defaults.algorithm,\n digits = TOTP.defaults.digits,\n period = TOTP.defaults.period,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Token time-step duration.\n * @type {number}\n */\n this.period = period;\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n }) {\n return HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n });\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n generate({ timestamp = Date.now() } = {}) {\n return TOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n window,\n }) {\n return HOTP.validate({\n token,\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n window,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, timestamp, window }) {\n return TOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://totp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `period=${e(this.period)}`\n );\n }\n}\n\nexport { TOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { TOTP } from \"./totp.js\";\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX =\n /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * @see [Key URI Format](https://github.com/google/google-authenticator/wiki/Key-Uri-Format)\n */\nclass URI {\n /**\n * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n * @param {string} uri Google Authenticator Key URI.\n * @returns {HOTP|TOTP} HOTP/TOTP object.\n */\n static parse(uri) {\n let uriGroups;\n\n try {\n uriGroups = uri.match(OTPURI_REGEX);\n } catch (error) {\n /* Handled below */\n }\n\n if (!Array.isArray(uriGroups)) {\n throw new URIError(\"Invalid URI format\");\n }\n\n // Extract URI groups.\n const uriType = uriGroups[1].toLowerCase();\n const uriLabel = uriGroups[2]\n .split(/(?::|%3A) *(.+)/i, 2)\n .map(decodeURIComponent);\n /** @type {Object.} */\n const uriParams = uriGroups[3].split(\"&\").reduce((acc, cur) => {\n const pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n const pairKey = pairArr[0].toLowerCase();\n const pairVal = pairArr[1];\n /** @type {Object.} */\n const pairAcc = acc;\n\n pairAcc[pairKey] = pairVal;\n return pairAcc;\n }, {});\n\n // 'OTP' will be instantiated with 'config' argument.\n let OTP;\n const config = {};\n\n if (uriType === \"hotp\") {\n OTP = HOTP;\n\n // Counter: required\n if (\n typeof uriParams.counter !== \"undefined\" &&\n INTEGER_REGEX.test(uriParams.counter)\n ) {\n config.counter = parseInt(uriParams.counter, 10);\n } else {\n throw new TypeError(\"Missing or invalid 'counter' parameter\");\n }\n } else if (uriType === \"totp\") {\n OTP = TOTP;\n\n // Period: optional\n if (typeof uriParams.period !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n config.period = parseInt(uriParams.period, 10);\n } else {\n throw new TypeError(\"Invalid 'period' parameter\");\n }\n }\n } else {\n throw new TypeError(\"Unknown OTP type\");\n }\n\n // Label: required\n // Issuer: optional\n if (typeof uriParams.issuer !== \"undefined\") {\n config.issuer = uriParams.issuer;\n }\n if (uriLabel.length === 2) {\n config.label = uriLabel[1];\n if (typeof config.issuer === \"undefined\" || config.issuer === \"\") {\n config.issuer = uriLabel[0];\n } else if (uriLabel[0] === \"\") {\n config.issuerInLabel = false;\n }\n } else {\n config.label = uriLabel[0];\n if (typeof config.issuer !== \"undefined\" && config.issuer !== \"\") {\n config.issuerInLabel = false;\n }\n }\n\n // Secret: required\n if (\n typeof uriParams.secret !== \"undefined\" &&\n SECRET_REGEX.test(uriParams.secret)\n ) {\n config.secret = uriParams.secret;\n } else {\n throw new TypeError(\"Missing or invalid 'secret' parameter\");\n }\n\n // Algorithm: optional\n if (typeof uriParams.algorithm !== \"undefined\") {\n if (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n config.algorithm = uriParams.algorithm;\n } else {\n throw new TypeError(\"Invalid 'algorithm' parameter\");\n }\n }\n\n // Digits: optional\n if (typeof uriParams.digits !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n config.digits = parseInt(uriParams.digits, 10);\n } else {\n throw new TypeError(\"Invalid 'digits' parameter\");\n }\n }\n\n return new OTP(config);\n }\n\n /**\n * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n * @param {HOTP|TOTP} otp HOTP/TOTP object.\n * @returns {string} Google Authenticator Key URI.\n */\n static stringify(otp) {\n if (otp instanceof HOTP || otp instanceof TOTP) {\n return otp.toString();\n }\n\n throw new TypeError(\"Invalid 'HOTP/TOTP' object\");\n }\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = \"__OTPAUTH_VERSION__\";\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","t","n","e","r","s","o","h","u","w","length","push","value","binLen","Error","c","parseInt","substr","isNaN","f","a","l","A","E","charCodeAt","H","indexOf","search","replace","charAt","outputUpper","toUpperCase","b64Pad","String","fromCharCode","globalScope","globalThis","Object","defineProperty","prototype","get","configurable","__GLOBALTHIS__","self","window","global","OPENSSL_JSSHA_ALGO_MAP","SHA1","SHA224","SHA256","SHA384","SHA512","hmacDigest","algorithm","key","message","crypto","variant","TypeError","hmac","jsSHA","setHMACKey","update","getHMAC","ALPHABET","base32ToBuf","str","end","cstr","substring","bits","index","idx","base32FromBuf","hexToBuf","hexFromBuf","hex","toString","latin1ToBuf","latin1FromBuf","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","encode","buffer","utf8FromBuf","decode","randomBytes","size","_a","getRandomValues","Secret","constructor","fromLatin1","fromUTF8","fromBase32","fromHex","latin1","enumerable","utf8","base32","timingSafeEqual","b","out","HOTP","defaults","issuer","label","issuerInLabel","digits","counter","secret","generate","digest","offset","byteLength","__pow","padStart","validate","token","delta","generatedToken","encodeURIComponent","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","parse","uri","uriGroups","match","error","Array","isArray","URIError","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","OTP","config","test","stringify","otp","version"],"mappings":"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","x_google_ignoreList":[1]}
\ No newline at end of file
+{"version":3,"file":"otpauth.esm.min.js","sources":["../src/utils/encoding/uint.js","../node_modules/jssha/dist/sha.mjs","../src/utils/global-scope.js","../src/utils/crypto/hmac-digest.js","../src/utils/encoding/base32.js","../src/utils/encoding/hex.js","../src/utils/encoding/latin1.js","../src/utils/encoding/utf8.js","../src/utils/crypto/random-bytes.js","../src/secret.js","../src/utils/crypto/timing-safe-equal.js","../src/hotp.js","../src/totp.js","../src/uri.js","../src/version.js"],"sourcesContent":["/**\n * Converts an integer to an ArrayBuffer.\n * @param {number} num Integer.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst uintToBuf = (num) => {\n const buf = new ArrayBuffer(8);\n const arr = new Uint8Array(buf);\n let acc = num;\n\n for (let i = 7; i >= 0; i--) {\n if (acc === 0) break;\n arr[i] = acc & 255;\n acc -= arr[i];\n acc /= 256;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let num = 0;\n\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] !== 0) {\n num *= 256;\n num += arr[i];\n }\n }\n\n return num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * A JavaScript implementation of the SHA family of hashes - defined in FIPS PUB 180-4, FIPS PUB 202,\n * and SP 800-185 - as well as the corresponding HMAC implementation as defined in FIPS PUB 198-1.\n *\n * Copyright 2008-2023 Brian Turek, 1998-2009 Paul Johnston & Contributors\n * Distributed under the BSD License\n * See http://caligatio.github.com/jsSHA/ for more information\n */\nconst t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",n=\"ARRAYBUFFER not supported by this environment\",e=\"UINT8ARRAY not supported by this environment\";function r(t,n,e,r){let i,s,o;const h=n||[0],u=(e=e||0)>>>3,w=-1===r?3:0;for(i=0;i>>2,h.length<=s&&h.push(0),h[s]|=t[i]<<8*(w+r*(o%4));return{value:h,binLen:8*t.length+e}}function i(i,s,o){switch(s){case\"UTF8\":case\"UTF16BE\":case\"UTF16LE\":break;default:throw new Error(\"encoding must be UTF8, UTF16BE, or UTF16LE\")}switch(i){case\"HEX\":return function(t,n,e){return function(t,n,e,r){let i,s,o,h;if(0!=t.length%2)throw new Error(\"String of HEX type must be in byte increments\");const u=n||[0],w=(e=e||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+w,o=h>>>2;u.length<=o;)u.push(0);u[o]|=s<<8*(c+r*(h%4))}return{value:u,binLen:4*t.length+e}}(t,n,e,o)};case\"TEXT\":return function(t,n,e){return function(t,n,e,r,i){let s,o,h,u,w,c,f,a,l=0;const A=e||[0],E=(r=r||0)>>>3;if(\"UTF8\"===n)for(f=-1===i?3:0,h=0;hs?o.push(s):2048>s?(o.push(192|s>>>6),o.push(128|63&s)):55296>s||57344<=s?o.push(224|s>>>12,128|s>>>6&63,128|63&s):(h+=1,s=65536+((1023&s)<<10|1023&t.charCodeAt(h)),o.push(240|s>>>18,128|s>>>12&63,128|s>>>6&63,128|63&s)),u=0;u>>2;A.length<=w;)A.push(0);A[w]|=o[u]<<8*(f+i*(c%4)),l+=1}else for(f=-1===i?2:0,a=\"UTF16LE\"===n&&1!==i||\"UTF16LE\"!==n&&1===i,h=0;h>>8),c=l+E,w=c>>>2;A.length<=w;)A.push(0);A[w]|=s<<8*(f+i*(c%4)),l+=2}return{value:A,binLen:8*l+r}}(t,s,n,e,o)};case\"B64\":return function(n,e,r){return function(n,e,r,i){let s,o,h,u,w,c,f,a=0;const l=e||[0],A=(r=r||0)>>>3,E=-1===i?3:0,H=n.indexOf(\"=\");if(-1===n.search(/^[a-zA-Z0-9=+/]+$/))throw new Error(\"Invalid character in base-64 string\");if(n=n.replace(/=/g,\"\"),-1!==H&&H>>2;l.length<=c;)l.push(0);l[c]|=(u>>>16-8*h&255)<<8*(E+i*(f%4)),a+=1}}return{value:l,binLen:8*a+r}}(n,e,r,o)};case\"BYTES\":return function(t,n,e){return function(t,n,e,r){let i,s,o,h;const u=n||[0],w=(e=e||0)>>>3,c=-1===r?3:0;for(s=0;s>>2,u.length<=o&&u.push(0),u[o]|=i<<8*(c+r*(h%4));return{value:u,binLen:8*t.length+e}}(t,n,e,o)};case\"ARRAYBUFFER\":try{new ArrayBuffer(0)}catch(t){throw new Error(n)}return function(t,n,e){return function(t,n,e,i){return r(new Uint8Array(t),n,e,i)}(t,n,e,o)};case\"UINT8ARRAY\":try{new Uint8Array(0)}catch(t){throw new Error(e)}return function(t,n,e){return r(t,n,e,o)};default:throw new Error(\"format must be HEX, TEXT, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY\")}}function s(r,i,s,o){switch(r){case\"HEX\":return function(t){return function(t,n,e,r){const i=\"0123456789abcdef\";let s,o,h=\"\";const u=n/8,w=-1===e?3:0;for(s=0;s>>2]>>>8*(w+e*(s%4)),h+=i.charAt(o>>>4&15)+i.charAt(15&o);return r.outputUpper?h.toUpperCase():h}(t,i,s,o)};case\"B64\":return function(n){return function(n,e,r,i){let s,o,h,u,w,c=\"\";const f=e/8,a=-1===r?3:0;for(s=0;s>>2]:0,w=s+2>>2]:0,h=(n[s>>>2]>>>8*(a+r*(s%4))&255)<<16|(u>>>8*(a+r*((s+1)%4))&255)<<8|w>>>8*(a+r*((s+2)%4))&255,o=0;o<4;o+=1)c+=8*s+6*o<=e?t.charAt(h>>>6*(3-o)&63):i.b64Pad;return c}(n,i,s,o)};case\"BYTES\":return function(t){return function(t,n,e){let r,i,s=\"\";const o=n/8,h=-1===e?3:0;for(r=0;r>>2]>>>8*(h+e*(r%4))&255,s+=String.fromCharCode(i);return s}(t,i,s)};case\"ARRAYBUFFER\":try{new ArrayBuffer(0)}catch(t){throw new Error(n)}return function(t){return function(t,n,e){let r;const i=n/8,s=new ArrayBuffer(i),o=new Uint8Array(s),h=-1===e?3:0;for(r=0;r>>2]>>>8*(h+e*(r%4))&255;return s}(t,i,s)};case\"UINT8ARRAY\":try{new Uint8Array(0)}catch(t){throw new Error(e)}return function(t){return function(t,n,e){let r;const i=n/8,s=-1===e?3:0,o=new Uint8Array(i);for(r=0;r>>2]>>>8*(s+e*(r%4))&255;return o}(t,i,s)};default:throw new Error(\"format must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY\")}}const o=4294967296,h=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],u=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],w=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],c=\"Chosen SHA variant is not supported\",f=\"Cannot set numRounds with MAC\";function a(t,n){let e,r;const i=t.binLen>>>3,s=n.binLen>>>3,o=i<<3,h=4-i<<3;if(i%4!=0){for(e=0;e>>2,t.value[r]|=n.value[e>>>2]<>>2]>>>h;return(t.value.length<<2)-4>=s+i&&t.value.pop(),{value:t.value,binLen:t.binLen+n.binLen}}return{value:t.value.concat(n.value),binLen:t.binLen+n.binLen}}function l(t){const n={outputUpper:!1,b64Pad:\"=\",outputLen:-1},e=t||{},r=\"Output length must be a multiple of 8\";if(n.outputUpper=e.outputUpper||!1,e.b64Pad&&(n.b64Pad=e.b64Pad),e.outputLen){if(e.outputLen%8!=0)throw new Error(r);n.outputLen=e.outputLen}else if(e.shakeLen){if(e.shakeLen%8!=0)throw new Error(r);n.outputLen=e.shakeLen}if(\"boolean\"!=typeof n.outputUpper)throw new Error(\"Invalid outputUpper formatting option\");if(\"string\"!=typeof n.b64Pad)throw new Error(\"Invalid b64Pad formatting option\");return n}function A(t,n,e,r){const s=t+\" must include a value and format\";if(!n){if(!r)throw new Error(s);return r}if(void 0===n.value||!n.format)throw new Error(s);return i(n.format,n.encoding||\"UTF8\",e)(n.value)}class E{constructor(t,n,e){const r=e||{};if(this.t=n,this.i=r.encoding||\"UTF8\",this.numRounds=r.numRounds||1,isNaN(this.numRounds)||this.numRounds!==parseInt(this.numRounds,10)||1>this.numRounds)throw new Error(\"numRounds must a integer >= 1\");this.o=t,this.h=[],this.u=0,this.l=!1,this.A=0,this.H=!1,this.S=[],this.p=[]}update(t){let n,e=0;const r=this.m>>>5,i=this.C(t,this.h,this.u),s=i.binLen,o=i.value,h=s>>>5;for(n=0;n>>5),this.u=s%this.m,this.l=!0,this}getHash(t,n){let e,r,i=this.R;const o=l(n);if(this.K){if(-1===o.outputLen)throw new Error(\"Output length must be specified in options\");i=o.outputLen}const h=s(t,i,this.T,o);if(this.H&&this.g)return h(this.g(o));for(r=this.F(this.h.slice(),this.u,this.A,this.L(this.U),i),e=1;e>>24-i%32),r=this.F(r,i,0,this.B(this.o),i);return h(r)}setHMACKey(t,n,e){if(!this.M)throw new Error(\"Variant does not support HMAC\");if(this.l)throw new Error(\"Cannot set MAC key after calling update\");const r=i(n,(e||{}).encoding||\"UTF8\",this.T);this.k(r(t))}k(t){const n=this.m>>>3,e=n/4-1;let r;if(1!==this.numRounds)throw new Error(f);if(this.H)throw new Error(\"MAC key already set\");for(n>>32-n}function S(t,n){return t>>>n|t<<32-n}function b(t,n){return t>>>n}function p(t,n,e){return t^n^e}function d(t,n,e){return t&n^~t&e}function m(t,n,e){return t&n^t&e^n&e}function C(t){return S(t,2)^S(t,13)^S(t,22)}function y(t,n){const e=(65535&t)+(65535&n);return(65535&(t>>>16)+(n>>>16)+(e>>>16))<<16|65535&e}function U(t,n,e,r){const i=(65535&t)+(65535&n)+(65535&e)+(65535&r);return(65535&(t>>>16)+(n>>>16)+(e>>>16)+(r>>>16)+(i>>>16))<<16|65535&i}function v(t,n,e,r,i){const s=(65535&t)+(65535&n)+(65535&e)+(65535&r)+(65535&i);return(65535&(t>>>16)+(n>>>16)+(e>>>16)+(r>>>16)+(i>>>16)+(s>>>16))<<16|65535&s}function R(t){return S(t,7)^S(t,18)^b(t,3)}function K(t){return S(t,6)^S(t,11)^S(t,25)}function T(t){return[1732584193,4023233417,2562383102,271733878,3285377520]}function g(t,n){let e,r,i,s,o,h,u;const w=[];for(e=n[0],r=n[1],i=n[2],s=n[3],o=n[4],u=0;u<80;u+=1)w[u]=u<16?t[u]:H(w[u-3]^w[u-8]^w[u-14]^w[u-16],1),h=u<20?v(H(e,5),d(r,i,s),o,1518500249,w[u]):u<40?v(H(e,5),p(r,i,s),o,1859775393,w[u]):u<60?v(H(e,5),m(r,i,s),o,2400959708,w[u]):v(H(e,5),p(r,i,s),o,3395469782,w[u]),o=s,s=i,i=H(r,30),r=e,e=h;return n[0]=y(e,n[0]),n[1]=y(r,n[1]),n[2]=y(i,n[2]),n[3]=y(s,n[3]),n[4]=y(o,n[4]),n}function F(t,n,e,r){let i;const s=15+(n+65>>>9<<4),h=n+e;for(;t.length<=s;)t.push(0);for(t[n>>>5]|=128<<24-n%32,t[s]=4294967295&h,t[s-1]=h/o|0,i=0;i>>9<<4),w=n+e;for(;t.length<=u;)t.push(0);for(t[n>>>5]|=128<<24-n%32,t[u]=4294967295&w,t[u-1]=w/o|0,s=0;s32?(e=64-n,new Y(t.I<>>e,t.N<>>e)):0!==n?(e=32-n,new Y(t.N<>>e,t.I<>>e)):t}function I(t,n){let e;return n<32?(e=32-n,new Y(t.N>>>n|t.I<>>n|t.N<>>n|t.N<>>n|t.I<>>n,t.I>>>n|t.N<<32-n)}function z(t,n,e){return new Y(t.N&n.N^t.N&e.N^n.N&e.N,t.I&n.I^t.I&e.I^n.I&e.I)}function x(t){const n=I(t,28),e=I(t,34),r=I(t,39);return new Y(n.N^e.N^r.N,n.I^e.I^r.I)}function _(t,n){let e,r;e=(65535&t.I)+(65535&n.I),r=(t.I>>>16)+(n.I>>>16)+(e>>>16);const i=(65535&r)<<16|65535&e;e=(65535&t.N)+(65535&n.N)+(r>>>16),r=(t.N>>>16)+(n.N>>>16)+(e>>>16);return new Y((65535&r)<<16|65535&e,i)}function O(t,n,e,r){let i,s;i=(65535&t.I)+(65535&n.I)+(65535&e.I)+(65535&r.I),s=(t.I>>>16)+(n.I>>>16)+(e.I>>>16)+(r.I>>>16)+(i>>>16);const o=(65535&s)<<16|65535&i;i=(65535&t.N)+(65535&n.N)+(65535&e.N)+(65535&r.N)+(s>>>16),s=(t.N>>>16)+(n.N>>>16)+(e.N>>>16)+(r.N>>>16)+(i>>>16);return new Y((65535&s)<<16|65535&i,o)}function P(t,n,e,r,i){let s,o;s=(65535&t.I)+(65535&n.I)+(65535&e.I)+(65535&r.I)+(65535&i.I),o=(t.I>>>16)+(n.I>>>16)+(e.I>>>16)+(r.I>>>16)+(i.I>>>16)+(s>>>16);const h=(65535&o)<<16|65535&s;s=(65535&t.N)+(65535&n.N)+(65535&e.N)+(65535&r.N)+(65535&i.N)+(o>>>16),o=(t.N>>>16)+(n.N>>>16)+(e.N>>>16)+(r.N>>>16)+(i.N>>>16)+(s>>>16);return new Y((65535&o)<<16|65535&s,h)}function V(t,n){return new Y(t.N^n.N,t.I^n.I)}function Z(t){const n=I(t,19),e=I(t,61),r=X(t,6);return new Y(n.N^e.N^r.N,n.I^e.I^r.I)}function j(t){const n=I(t,1),e=I(t,8),r=X(t,7);return new Y(n.N^e.N^r.N,n.I^e.I^r.I)}function q(t){const n=I(t,14),e=I(t,18),r=I(t,41);return new Y(n.N^e.N^r.N,n.I^e.I^r.I)}const D=[new Y(h[0],3609767458),new Y(h[1],602891725),new Y(h[2],3964484399),new Y(h[3],2173295548),new Y(h[4],4081628472),new Y(h[5],3053834265),new Y(h[6],2937671579),new Y(h[7],3664609560),new Y(h[8],2734883394),new Y(h[9],1164996542),new Y(h[10],1323610764),new Y(h[11],3590304994),new Y(h[12],4068182383),new Y(h[13],991336113),new Y(h[14],633803317),new Y(h[15],3479774868),new Y(h[16],2666613458),new Y(h[17],944711139),new Y(h[18],2341262773),new Y(h[19],2007800933),new Y(h[20],1495990901),new Y(h[21],1856431235),new Y(h[22],3175218132),new Y(h[23],2198950837),new Y(h[24],3999719339),new Y(h[25],766784016),new Y(h[26],2566594879),new Y(h[27],3203337956),new Y(h[28],1034457026),new Y(h[29],2466948901),new Y(h[30],3758326383),new Y(h[31],168717936),new Y(h[32],1188179964),new Y(h[33],1546045734),new Y(h[34],1522805485),new Y(h[35],2643833823),new Y(h[36],2343527390),new Y(h[37],1014477480),new Y(h[38],1206759142),new Y(h[39],344077627),new Y(h[40],1290863460),new Y(h[41],3158454273),new Y(h[42],3505952657),new Y(h[43],106217008),new Y(h[44],3606008344),new Y(h[45],1432725776),new Y(h[46],1467031594),new Y(h[47],851169720),new Y(h[48],3100823752),new Y(h[49],1363258195),new Y(h[50],3750685593),new Y(h[51],3785050280),new Y(h[52],3318307427),new Y(h[53],3812723403),new Y(h[54],2003034995),new Y(h[55],3602036899),new Y(h[56],1575990012),new Y(h[57],1125592928),new Y(h[58],2716904306),new Y(h[59],442776044),new Y(h[60],593698344),new Y(h[61],3733110249),new Y(h[62],2999351573),new Y(h[63],3815920427),new Y(3391569614,3928383900),new Y(3515267271,566280711),new Y(3940187606,3454069534),new Y(4118630271,4000239992),new Y(116418474,1914138554),new Y(174292421,2731055270),new Y(289380356,3203993006),new Y(460393269,320620315),new Y(685471733,587496836),new Y(852142971,1086792851),new Y(1017036298,365543100),new Y(1126000580,2618297676),new Y(1288033470,3409855158),new Y(1501505948,4234509866),new Y(1607167915,987167468),new Y(1816402316,1246189591)];function G(t){return\"SHA-384\"===t?[new Y(3418070365,u[0]),new Y(1654270250,u[1]),new Y(2438529370,u[2]),new Y(355462360,u[3]),new Y(1731405415,u[4]),new Y(41048885895,u[5]),new Y(3675008525,u[6]),new Y(1203062813,u[7])]:[new Y(w[0],4089235720),new Y(w[1],2227873595),new Y(w[2],4271175723),new Y(w[3],1595750129),new Y(w[4],2917565137),new Y(w[5],725511199),new Y(w[6],4215389547),new Y(w[7],327033209)]}function J(t,n){let e,r,i,s,o,h,u,w,c,f,a,l;const A=[];for(e=n[0],r=n[1],i=n[2],s=n[3],o=n[4],h=n[5],u=n[6],w=n[7],a=0;a<80;a+=1)a<16?(l=2*a,A[a]=new Y(t[l],t[l+1])):A[a]=O(Z(A[a-2]),A[a-7],j(A[a-15]),A[a-16]),c=P(w,q(o),(H=h,S=u,new Y((E=o).N&H.N^~E.N&S.N,E.I&H.I^~E.I&S.I)),D[a],A[a]),f=_(x(e),z(e,r,i)),w=u,u=h,h=o,o=_(s,c),s=i,i=r,r=e,e=_(c,f);var E,H,S;return n[0]=_(e,n[0]),n[1]=_(r,n[1]),n[2]=_(i,n[2]),n[3]=_(s,n[3]),n[4]=_(o,n[4]),n[5]=_(h,n[5]),n[6]=_(u,n[6]),n[7]=_(w,n[7]),n}let Q=class extends E{constructor(t,n,e){if(\"SHA-384\"!==t&&\"SHA-512\"!==t)throw new Error(c);super(t,n,e);const r=e||{};this.g=this.Y,this.M=!0,this.T=-1,this.C=i(this.t,this.i,this.T),this.v=J,this.L=function(t){return t.slice()},this.B=G,this.F=function(n,e,r,i){return function(t,n,e,r,i){let s,h;const u=31+(n+129>>>10<<5),w=n+e;for(;t.length<=u;)t.push(0);for(t[n>>>5]|=128<<24-n%32,t[u]=4294967295&w,t[u-1]=w/o|0,s=0;s>>1)%5][(r>>>1)/5|0]=V(n[(r>>>1)%5][(r>>>1)/5|0],new Y(t[r+1],t[r]));for(e=0;e<24;e+=1){for(s=tt(),r=0;r<5;r+=1)o[r]=(u=n[r][0],w=n[r][1],c=n[r][2],f=n[r][3],a=n[r][4],new Y(u.N^w.N^c.N^f.N^a.N,u.I^w.I^c.I^f.I^a.I));for(r=0;r<5;r+=1)h[r]=V(o[(r+4)%5],N(o[(r+1)%5],1));for(r=0;r<5;r+=1)for(i=0;i<5;i+=1)n[r][i]=V(n[r][i],h[r]);for(r=0;r<5;r+=1)for(i=0;i<5;i+=1)s[i][(2*r+3*i)%5]=N(n[r][i],$[r][i]);for(r=0;r<5;r+=1)for(i=0;i<5;i+=1)n[r][i]=V(s[r][i],new Y(~s[(r+1)%5][i].N&s[(r+2)%5][i].N,~s[(r+1)%5][i].I&s[(r+2)%5][i].I));n[0][0]=V(n[0][0],W[e])}var u,w,c,f,a;return n}function rt(t){let n,e,r=0;const i=[0,0],s=[4294967295&t,t/o&2097151];for(n=6;n>=0;n--)e=s[n>>2]>>>8*n&255,0===e&&0===r||(i[r+1>>2]|=e<<8*(r+1),r+=1);return r=0!==r?r:1,i[0]|=r,{value:r+1>4?i:[i[0]],binLen:8+8*r}}function it(t){return a(rt(t.binLen),t)}function st(t,n){let e,r=rt(n);r=a(r,t);const i=n>>>2,s=(i-r.value.length%i)%i;for(e=0;e>>5,a=n>>>5;for(h=0;h=i;h+=f)r=et(t.slice(h,h+f),r),n-=i;for(t=t.slice(h),n%=i;t.length>>3,t[h>>2]^=s<=o));)c.push(u.N),w+=1,0==64*w%i&&(et(null,r),w=0);return c}(t,n,0,i,s,r,o)},o.hmacKey&&this.k(A(\"hmacKey\",o.hmacKey,this.T))}O(t,n){const e=function(t){const n=t||{};return{funcName:A(\"funcName\",n.funcName,1,{value:[],binLen:0}),customization:A(\"Customization\",n.customization,1,{value:[],binLen:0})}}(t||{});n&&(e.funcName=n);const r=a(it(e.funcName),it(e.customization));if(0!==e.customization.binLen||0!==e.funcName.binLen){const t=st(r,this.m>>>3);for(let n=0;n>>5)this.U=this.v(t.slice(n,n+(this.m>>>5)),this.U),this.A+=this.m;return 4}return 31}X(t){const n=function(t){const n=t||{};return{kmacKey:A(\"kmacKey\",n.kmacKey,1),funcName:{value:[1128353099],binLen:32},customization:A(\"Customization\",n.customization,1,{value:[],binLen:0})}}(t||{});this.O(t,n.funcName);const e=st(it(n.kmacKey),this.m>>>3);for(let t=0;t>>5)this.U=this.v(e.slice(t,t+(this.m>>>5)),this.U),this.A+=this.m;this.H=!0}_(t){const n=a({value:this.h.slice(),binLen:this.u},function(t){let n,e,r=0;const i=[0,0],s=[4294967295&t,t/o&2097151];for(n=6;n>=0;n--)e=s[n>>2]>>>8*n&255,0===e&&0===r||(i[r>>2]|=e<<8*r,r+=1);return r=0!==r?r:1,i[r>>2]|=r<<8*r,{value:r+1>4?i:[i[0]],binLen:8+8*r}}(t.outputLen));return this.F(n.value,n.binLen,this.A,this.L(this.U),t.outputLen)}};class ht{constructor(t,n,e){if(\"SHA-1\"==t)this.P=new L(t,n,e);else if(\"SHA-224\"==t||\"SHA-256\"==t)this.P=new k(t,n,e);else if(\"SHA-384\"==t||\"SHA-512\"==t)this.P=new Q(t,n,e);else{if(\"SHA3-224\"!=t&&\"SHA3-256\"!=t&&\"SHA3-384\"!=t&&\"SHA3-512\"!=t&&\"SHAKE128\"!=t&&\"SHAKE256\"!=t&&\"CSHAKE128\"!=t&&\"CSHAKE256\"!=t&&\"KMAC128\"!=t&&\"KMAC256\"!=t)throw new Error(c);this.P=new ot(t,n,e)}}update(t){return this.P.update(t),this}getHash(t,n){return this.P.getHash(t,n)}setHMACKey(t,n,e){this.P.setHMACKey(t,n,e)}getHMAC(t,n){return this.P.getHMAC(t,n)}}export{ht as default};\n//# sourceMappingURL=sha.mjs.map\n","/**\n * \"globalThis\" ponyfill.\n * @see [A horrifying globalThis polyfill in universal JavaScript](https://mathiasbynens.be/notes/globalthis)\n * @type {Object.}\n */\nconst globalScope = (() => {\n if (typeof globalThis === \"object\") return globalThis;\n else {\n Object.defineProperty(Object.prototype, \"__GLOBALTHIS__\", {\n get() {\n return this;\n },\n configurable: true,\n });\n try {\n // @ts-ignore\n // eslint-disable-next-line no-undef\n if (typeof __GLOBALTHIS__ !== \"undefined\") return __GLOBALTHIS__;\n } finally {\n // @ts-ignore\n delete Object.prototype.__GLOBALTHIS__;\n }\n }\n\n // Still unable to determine \"globalThis\", fall back to a naive method.\n if (typeof self !== \"undefined\") return self;\n else if (typeof window !== \"undefined\") return window;\n else if (typeof global !== \"undefined\") return global;\n\n return undefined;\n})();\n\nexport { globalScope };\n","import * as crypto from \"node:crypto\";\nimport jsSHA from \"jssha\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * OpenSSL to jsSHA algorithms map.\n * @type {Object.}\n */\nconst OPENSSL_JSSHA_ALGO_MAP = {\n SHA1: \"SHA-1\",\n SHA224: \"SHA-224\",\n SHA256: \"SHA-256\",\n SHA384: \"SHA-384\",\n SHA512: \"SHA-512\",\n \"SHA3-224\": \"SHA3-224\",\n \"SHA3-256\": \"SHA3-256\",\n \"SHA3-384\": \"SHA3-384\",\n \"SHA3-512\": \"SHA3-512\",\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n if (crypto?.createHmac) {\n const hmac = crypto.createHmac(algorithm, globalScope.Buffer.from(key));\n hmac.update(globalScope.Buffer.from(message));\n return hmac.digest().buffer;\n } else {\n const variant = OPENSSL_JSSHA_ALGO_MAP[algorithm.toUpperCase()];\n if (typeof variant === \"undefined\") {\n throw new TypeError(\"Unknown hash function\");\n }\n const hmac = new jsSHA(variant, \"ARRAYBUFFER\");\n hmac.setHMACKey(key, \"ARRAYBUFFER\");\n hmac.update(message);\n return hmac.getHMAC(\"ARRAYBUFFER\");\n }\n};\n\nexport { hmacDigest };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * @see [LinusU/base32-decode](https://github.com/LinusU/base32-decode)\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n // Canonicalize to all upper case and remove padding if it exists.\n let end = str.length;\n while (str[end - 1] === \"=\") --end;\n const cstr = (end < str.length ? str.substring(0, end) : str).toUpperCase();\n\n const buf = new ArrayBuffer(((cstr.length * 5) / 8) | 0);\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let index = 0;\n\n for (let i = 0; i < cstr.length; i++) {\n const idx = ALPHABET.indexOf(cstr[i]);\n if (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n value = (value << 5) | idx;\n bits += 5;\n\n if (bits >= 8) {\n bits -= 8;\n arr[index++] = value >>> bits;\n }\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * @see [LinusU/base32-encode](https://github.com/LinusU/base32-encode)\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n value = (value << 8) | arr[i];\n bits += 8;\n\n while (bits >= 5) {\n str += ALPHABET[(value >>> (bits - 5)) & 31];\n bits -= 5;\n }\n }\n\n if (bits > 0) {\n str += ALPHABET[(value << (5 - bits)) & 31];\n }\n\n return str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n const buf = new ArrayBuffer(str.length / 2);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i += 2) {\n arr[i / 2] = parseInt(str.substring(i, i + 2), 16);\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n const hex = arr[i].toString(16);\n if (hex.length === 1) str += \"0\";\n str += hex;\n }\n\n return str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n const buf = new ArrayBuffer(str.length);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i) & 0xff;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n str += String.fromCharCode(arr[i]);\n }\n\n return str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalScope } from \"../global-scope.js\";\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalScope.TextEncoder\n ? new globalScope.TextEncoder(\"utf-8\")\n : null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalScope.TextDecoder\n ? new globalScope.TextDecoder(\"utf-8\")\n : null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n if (!ENCODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n if (!DECODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n if (crypto?.randomBytes) {\n return crypto.randomBytes(size).buffer;\n } else {\n if (!globalScope.crypto?.getRandomValues) {\n throw new Error(\"Cryptography API not available\");\n }\n return globalScope.crypto.getRandomValues(new Uint8Array(size)).buffer;\n }\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from \"./utils/encoding/base32.js\";\nimport { hexToBuf, hexFromBuf } from \"./utils/encoding/hex.js\";\nimport { latin1ToBuf, latin1FromBuf } from \"./utils/encoding/latin1.js\";\nimport { utf8ToBuf, utf8FromBuf } from \"./utils/encoding/utf8.js\";\nimport { randomBytes } from \"./utils/crypto/random-bytes.js\";\n\n/**\n * OTP secret key.\n */\nclass Secret {\n /**\n * Creates a secret key object.\n * @param {Object} [config] Configuration options.\n * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n */\n constructor({ buffer, size = 20 } = {}) {\n /**\n * Secret key.\n * @type {ArrayBuffer}\n */\n this.buffer = typeof buffer === \"undefined\" ? randomBytes(size) : buffer;\n }\n\n /**\n * Converts a Latin-1 string to a Secret object.\n * @param {string} str Latin-1 string.\n * @returns {Secret} Secret object.\n */\n static fromLatin1(str) {\n return new Secret({ buffer: latin1ToBuf(str) });\n }\n\n /**\n * Converts an UTF-8 string to a Secret object.\n * @param {string} str UTF-8 string.\n * @returns {Secret} Secret object.\n */\n static fromUTF8(str) {\n return new Secret({ buffer: utf8ToBuf(str) });\n }\n\n /**\n * Converts a base32 string to a Secret object.\n * @param {string} str Base32 string.\n * @returns {Secret} Secret object.\n */\n static fromBase32(str) {\n return new Secret({ buffer: base32ToBuf(str) });\n }\n\n /**\n * Converts a hexadecimal string to a Secret object.\n * @param {string} str Hexadecimal string.\n * @returns {Secret} Secret object.\n */\n static fromHex(str) {\n return new Secret({ buffer: hexToBuf(str) });\n }\n\n /**\n * Latin-1 string representation of secret key.\n * @type {string}\n */\n get latin1() {\n Object.defineProperty(this, \"latin1\", {\n enumerable: true,\n value: latin1FromBuf(this.buffer),\n });\n\n return this.latin1;\n }\n\n /**\n * UTF-8 string representation of secret key.\n * @type {string}\n */\n get utf8() {\n Object.defineProperty(this, \"utf8\", {\n enumerable: true,\n value: utf8FromBuf(this.buffer),\n });\n\n return this.utf8;\n }\n\n /**\n * Base32 string representation of secret key.\n * @type {string}\n */\n get base32() {\n Object.defineProperty(this, \"base32\", {\n enumerable: true,\n value: base32FromBuf(this.buffer),\n });\n\n return this.base32;\n }\n\n /**\n * Hexadecimal string representation of secret key.\n * @type {string}\n */\n get hex() {\n Object.defineProperty(this, \"hex\", {\n enumerable: true,\n value: hexFromBuf(this.buffer),\n });\n\n return this.hex;\n }\n}\n\nexport { Secret };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n if (crypto?.timingSafeEqual) {\n return crypto.timingSafeEqual(\n globalScope.Buffer.from(a),\n globalScope.Buffer.from(b),\n );\n } else {\n if (a.length !== b.length) {\n throw new TypeError(\"Input strings must have the same length\");\n }\n let i = -1;\n let out = 0;\n while (++i < a.length) {\n out |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return out === 0;\n }\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from \"./utils/encoding/uint.js\";\nimport { hmacDigest } from \"./utils/crypto/hmac-digest.js\";\nimport { Secret } from \"./secret.js\";\nimport { timingSafeEqual } from \"./utils/crypto/timing-safe-equal.js\";\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * @see [RFC 4226](https://tools.ietf.org/html/rfc4226)\n */\nclass HOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * counter: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n counter: 0,\n window: 1,\n };\n }\n\n /**\n * Creates an HOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Initial counter value.\n */\n constructor({\n issuer = HOTP.defaults.issuer,\n label = HOTP.defaults.label,\n issuerInLabel = HOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Initial counter value.\n * @type {number}\n */\n this.counter = counter;\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Counter value.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n }) {\n const digest = new Uint8Array(\n hmacDigest(algorithm, secret.buffer, uintToBuf(counter)),\n );\n const offset = digest[digest.byteLength - 1] & 15;\n const otp =\n (((digest[offset] & 127) << 24) |\n ((digest[offset + 1] & 255) << 16) |\n ((digest[offset + 2] & 255) << 8) |\n (digest[offset + 3] & 255)) %\n 10 ** digits;\n\n return otp.toString().padStart(digits, \"0\");\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.counter=this.counter++] Counter value.\n * @returns {string} Token.\n */\n generate({ counter = this.counter++ } = {}) {\n return HOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n });\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.counter=0] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n counter = HOTP.defaults.counter,\n window = HOTP.defaults.window,\n }) {\n // Return early if the token length does not match the digit number.\n if (token.length !== digits) return null;\n\n let delta = null;\n\n const check = (/** @type {number} */ i) => {\n const generatedToken = HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: i,\n });\n if (timingSafeEqual(token, generatedToken)) {\n delta = i - counter;\n }\n };\n\n check(counter);\n for (let i = 1; i <= window && delta === null; ++i) {\n check(counter - i);\n if (delta !== null) break;\n check(counter + i);\n if (delta !== null) break;\n }\n\n return delta;\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.counter=this.counter] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, counter = this.counter, window }) {\n return HOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://hotp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `counter=${e(this.counter)}`\n );\n }\n}\n\nexport { HOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { Secret } from \"./secret.js\";\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * @see [RFC 6238](https://tools.ietf.org/html/rfc6238)\n */\nclass TOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * period: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n period: 30,\n window: 1,\n };\n }\n\n /**\n * Creates a TOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n */\n constructor({\n issuer = TOTP.defaults.issuer,\n label = TOTP.defaults.label,\n issuerInLabel = TOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = TOTP.defaults.algorithm,\n digits = TOTP.defaults.digits,\n period = TOTP.defaults.period,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Token time-step duration.\n * @type {number}\n */\n this.period = period;\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n }) {\n return HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n });\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n generate({ timestamp = Date.now() } = {}) {\n return TOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n window,\n }) {\n return HOTP.validate({\n token,\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n window,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, timestamp, window }) {\n return TOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://totp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `period=${e(this.period)}`\n );\n }\n}\n\nexport { TOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { TOTP } from \"./totp.js\";\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX =\n /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * @see [Key URI Format](https://github.com/google/google-authenticator/wiki/Key-Uri-Format)\n */\nclass URI {\n /**\n * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n * @param {string} uri Google Authenticator Key URI.\n * @returns {HOTP|TOTP} HOTP/TOTP object.\n */\n static parse(uri) {\n let uriGroups;\n\n try {\n uriGroups = uri.match(OTPURI_REGEX);\n // eslint-disable-next-line no-unused-vars\n } catch (_) {\n /* Handled below */\n }\n\n if (!Array.isArray(uriGroups)) {\n throw new URIError(\"Invalid URI format\");\n }\n\n // Extract URI groups.\n const uriType = uriGroups[1].toLowerCase();\n const uriLabel = uriGroups[2]\n .split(/(?::|%3A) *(.+)/i, 2)\n .map(decodeURIComponent);\n /** @type {Object.} */\n const uriParams = uriGroups[3].split(\"&\").reduce((acc, cur) => {\n const pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n const pairKey = pairArr[0].toLowerCase();\n const pairVal = pairArr[1];\n /** @type {Object.} */\n const pairAcc = acc;\n\n pairAcc[pairKey] = pairVal;\n return pairAcc;\n }, {});\n\n // 'OTP' will be instantiated with 'config' argument.\n let OTP;\n const config = {};\n\n if (uriType === \"hotp\") {\n OTP = HOTP;\n\n // Counter: required\n if (\n typeof uriParams.counter !== \"undefined\" &&\n INTEGER_REGEX.test(uriParams.counter)\n ) {\n config.counter = parseInt(uriParams.counter, 10);\n } else {\n throw new TypeError(\"Missing or invalid 'counter' parameter\");\n }\n } else if (uriType === \"totp\") {\n OTP = TOTP;\n\n // Period: optional\n if (typeof uriParams.period !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n config.period = parseInt(uriParams.period, 10);\n } else {\n throw new TypeError(\"Invalid 'period' parameter\");\n }\n }\n } else {\n throw new TypeError(\"Unknown OTP type\");\n }\n\n // Label: required\n // Issuer: optional\n if (typeof uriParams.issuer !== \"undefined\") {\n config.issuer = uriParams.issuer;\n }\n if (uriLabel.length === 2) {\n config.label = uriLabel[1];\n if (typeof config.issuer === \"undefined\" || config.issuer === \"\") {\n config.issuer = uriLabel[0];\n } else if (uriLabel[0] === \"\") {\n config.issuerInLabel = false;\n }\n } else {\n config.label = uriLabel[0];\n if (typeof config.issuer !== \"undefined\" && config.issuer !== \"\") {\n config.issuerInLabel = false;\n }\n }\n\n // Secret: required\n if (\n typeof uriParams.secret !== \"undefined\" &&\n SECRET_REGEX.test(uriParams.secret)\n ) {\n config.secret = uriParams.secret;\n } else {\n throw new TypeError(\"Missing or invalid 'secret' parameter\");\n }\n\n // Algorithm: optional\n if (typeof uriParams.algorithm !== \"undefined\") {\n if (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n config.algorithm = uriParams.algorithm;\n } else {\n throw new TypeError(\"Invalid 'algorithm' parameter\");\n }\n }\n\n // Digits: optional\n if (typeof uriParams.digits !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n config.digits = parseInt(uriParams.digits, 10);\n } else {\n throw new TypeError(\"Invalid 'digits' parameter\");\n }\n }\n\n return new OTP(config);\n }\n\n /**\n * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n * @param {HOTP|TOTP} otp HOTP/TOTP object.\n * @returns {string} Google Authenticator Key URI.\n */\n static stringify(otp) {\n if (otp instanceof HOTP || otp instanceof TOTP) {\n return otp.toString();\n }\n\n throw new TypeError(\"Invalid 'HOTP/TOTP' object\");\n }\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = \"__OTPAUTH_VERSION__\";\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","t","n","e","r","s","o","h","u","w","length","push","value","binLen","Error","c","parseInt","substr","isNaN","f","a","l","A","E","charCodeAt","H","indexOf","search","replace","charAt","outputUpper","toUpperCase","b64Pad","String","fromCharCode","globalScope","globalThis","Object","defineProperty","prototype","get","configurable","__GLOBALTHIS__","self","window","global","OPENSSL_JSSHA_ALGO_MAP","SHA1","SHA224","SHA256","SHA384","SHA512","hmacDigest","algorithm","key","message","crypto","variant","TypeError","hmac","jsSHA","setHMACKey","update","getHMAC","ALPHABET","base32ToBuf","str","end","cstr","substring","bits","index","idx","base32FromBuf","hexToBuf","hexFromBuf","hex","toString","latin1ToBuf","latin1FromBuf","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","encode","buffer","utf8FromBuf","decode","randomBytes","size","_a","getRandomValues","Secret","constructor","fromLatin1","fromUTF8","fromBase32","fromHex","latin1","enumerable","utf8","base32","timingSafeEqual","b","out","HOTP","defaults","issuer","label","issuerInLabel","digits","counter","secret","generate","digest","offset","byteLength","__pow","padStart","validate","token","delta","check","generatedToken","encodeURIComponent","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","parse","uri","uriGroups","match","_","Array","isArray","URIError","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","OTP","config","test","stringify","otp","version"],"mappings":"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","x_google_ignoreList":[1]}
\ No newline at end of file
diff --git a/dist/otpauth.node.cjs b/dist/otpauth.node.cjs
index 956cc3b..5c59a8d 100644
--- a/dist/otpauth.node.cjs
+++ b/dist/otpauth.node.cjs
@@ -57,6 +57,7 @@ const globalScope = (() => {
});
try {
// @ts-ignore
+ // eslint-disable-next-line no-undef
if (typeof __GLOBALTHIS__ !== "undefined") return __GLOBALTHIS__;
} finally {
// @ts-ignore
@@ -562,7 +563,7 @@ class HOTP {
// Return early if the token length does not match the digit number.
if (token.length !== digits) return null;
let delta = null;
- for (let i = counter - window; i <= counter + window; ++i) {
+ const check = ( /** @type {number} */i) => {
const generatedToken = HOTP.generate({
secret,
algorithm,
@@ -572,6 +573,13 @@ class HOTP {
if (timingSafeEqual(token, generatedToken)) {
delta = i - counter;
}
+ };
+ check(counter);
+ for (let i = 1; i <= window && delta === null; ++i) {
+ check(counter - i);
+ if (delta !== null) break;
+ check(counter + i);
+ if (delta !== null) break;
}
return delta;
}
@@ -847,7 +855,8 @@ class URI {
let uriGroups;
try {
uriGroups = uri.match(OTPURI_REGEX);
- } catch (error) {
+ // eslint-disable-next-line no-unused-vars
+ } catch (_) {
/* Handled below */
}
if (!Array.isArray(uriGroups)) {
@@ -958,7 +967,7 @@ class URI {
* Library version.
* @type {string}
*/
-const version = "9.2.3";
+const version = "9.2.4";
exports.HOTP = HOTP;
exports.Secret = Secret;
diff --git a/dist/otpauth.node.min.cjs b/dist/otpauth.node.min.cjs
index 3a939f0..cc04616 100644
--- a/dist/otpauth.node.min.cjs
+++ b/dist/otpauth.node.min.cjs
@@ -1,3 +1,3 @@
///
-"use strict";var H=require("node:crypto");function T(s){var e=Object.create(null);return s&&Object.keys(s).forEach(function(r){if(r!=="default"){var t=Object.getOwnPropertyDescriptor(s,r);Object.defineProperty(e,r,t.get?t:{enumerable:!0,get:function(){return s[r]}})}}),e.default=s,Object.freeze(e)}var c=T(H);const v=s=>{const e=new ArrayBuffer(8),r=new Uint8Array(e);let t=s;for(let n=7;n>=0&&t!==0;n--)r[n]=t&255,t-=r[n],t/=256;return e};var U=void 0;const d=(()=>{if(typeof globalThis=="object")return globalThis;Object.defineProperty(Object.prototype,"__GLOBALTHIS__",{get(){return this},configurable:!0});try{if(typeof __GLOBALTHIS__!="undefined")return __GLOBALTHIS__}finally{delete Object.prototype.__GLOBALTHIS__}if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof global!="undefined")return global})(),E={SHA1:"SHA-1",SHA224:"SHA-224",SHA256:"SHA-256",SHA384:"SHA-384",SHA512:"SHA-512","SHA3-224":"SHA3-224","SHA3-256":"SHA3-256","SHA3-384":"SHA3-384","SHA3-512":"SHA3-512"},O=(s,e,r)=>{if(c!=null&&c.createHmac){const t=c.createHmac(s,d.Buffer.from(e));return t.update(d.Buffer.from(r)),t.digest().buffer}else{const t=E[s.toUpperCase()];if(typeof t=="undefined")throw new TypeError("Unknown hash function");const n=new U(t,"ARRAYBUFFER");return n.setHMACKey(e,"ARRAYBUFFER"),n.update(r),n.getHMAC("ARRAYBUFFER")}},m="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",L=s=>{let e=s.length;for(;s[e-1]==="=";)--e;const r=(e=8&&(i-=8,n[o++]=a>>>i)}return t},B=s=>{const e=new Uint8Array(s);let r=0,t=0,n="";for(let i=0;i=5;)n+=m[t>>>r-5&31],r-=5;return r>0&&(n+=m[t<<5-r&31]),n},C=s=>{const e=new ArrayBuffer(s.length/2),r=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(s);let r="";for(let t=0;t{const e=new ArrayBuffer(s.length),r=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(s);let r="";for(let t=0;t{if(!y)throw new Error("Encoding API not available");return y.encode(s).buffer},D=s=>{if(!A)throw new Error("Encoding API not available");return A.decode(s)},F=s=>{var e;if(c!=null&&c.randomBytes)return c.randomBytes(s).buffer;if(!((e=d.crypto)!=null&&e.getRandomValues))throw new Error("Cryptography API not available");return d.crypto.getRandomValues(new Uint8Array(s)).buffer};class h{constructor({buffer:e,size:r=20}={}){this.buffer=typeof e=="undefined"?F(r):e}static fromLatin1(e){return new h({buffer:P(e)})}static fromUTF8(e){return new h({buffer:x(e)})}static fromBase32(e){return new h({buffer:L(e)})}static fromHex(e){return new h({buffer:C(e)})}get latin1(){return Object.defineProperty(this,"latin1",{enumerable:!0,value:j(this.buffer)}),this.latin1}get utf8(){return Object.defineProperty(this,"utf8",{enumerable:!0,value:D(this.buffer)}),this.utf8}get base32(){return Object.defineProperty(this,"base32",{enumerable:!0,value:B(this.buffer)}),this.base32}get hex(){return Object.defineProperty(this,"hex",{enumerable:!0,value:R(this.buffer)}),this.hex}}const M=(s,e)=>{if(c!=null&&c.timingSafeEqual)return c.timingSafeEqual(d.Buffer.from(s),d.Buffer.from(e));{if(s.length!==e.length)throw new TypeError("Input strings must have the same length");let r=-1,t=0;for(;++r0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&counter=${e(this.counter)}`}};class u{static get defaults(){return{issuer:"",label:"OTPAuth",issuerInLabel:!0,algorithm:"SHA1",digits:6,period:30,window:1}}constructor({issuer:e=u.defaults.issuer,label:r=u.defaults.label,issuerInLabel:t=u.defaults.issuerInLabel,secret:n=new h,algorithm:i=u.defaults.algorithm,digits:a=u.defaults.digits,period:o=u.defaults.period}={}){this.issuer=e,this.label=r,this.issuerInLabel=t,this.secret=typeof n=="string"?h.fromBase32(n):n,this.algorithm=i.toUpperCase(),this.digits=a,this.period=o}static generate({secret:e,algorithm:r,digits:t,period:n=u.defaults.period,timestamp:i=Date.now()}){return p.generate({secret:e,algorithm:r,digits:t,counter:Math.floor(i/1e3/n)})}generate({timestamp:e=Date.now()}={}){return u.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:e})}static validate({token:e,secret:r,algorithm:t,digits:n,period:i=u.defaults.period,timestamp:a=Date.now(),window:o}){return p.validate({token:e,secret:r,algorithm:t,digits:n,counter:Math.floor(a/1e3/i),window:o})}validate({token:e,timestamp:r,window:t}){return u.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:r,window:t})}toString(){const e=encodeURIComponent;return`otpauth://totp/${this.issuer.length>0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&period=${e(this.period)}`}}const G=/^otpauth:\/\/([ht]otp)\/(.+)\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i,Y=/^[2-7A-Z]+=*$/i,Z=/^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i,q=/^[+-]?\d+$/,$=/^\+?[1-9]\d*$/;class V{static parse(e){let r;try{r=e.match(G)}catch(f){}if(!Array.isArray(r))throw new URIError("Invalid URI format");const t=r[1].toLowerCase(),n=r[2].split(/(?::|%3A) *(.+)/i,2).map(decodeURIComponent),i=r[3].split("&").reduce((f,g)=>{const w=g.split(/=(.*)/,2).map(decodeURIComponent),I=w[0].toLowerCase(),S=w[1],b=f;return b[I]=S,b},{});let a;const o={};if(t==="hotp")if(a=p,typeof i.counter!="undefined"&&q.test(i.counter))o.counter=parseInt(i.counter,10);else throw new TypeError("Missing or invalid 'counter' parameter");else if(t==="totp"){if(a=u,typeof i.period!="undefined")if($.test(i.period))o.period=parseInt(i.period,10);else throw new TypeError("Invalid 'period' parameter")}else throw new TypeError("Unknown OTP type");if(typeof i.issuer!="undefined"&&(o.issuer=i.issuer),n.length===2?(o.label=n[1],typeof o.issuer=="undefined"||o.issuer===""?o.issuer=n[0]:n[0]===""&&(o.issuerInLabel=!1)):(o.label=n[0],typeof o.issuer!="undefined"&&o.issuer!==""&&(o.issuerInLabel=!1)),typeof i.secret!="undefined"&&Y.test(i.secret))o.secret=i.secret;else throw new TypeError("Missing or invalid 'secret' parameter");if(typeof i.algorithm!="undefined")if(Z.test(i.algorithm))o.algorithm=i.algorithm;else throw new TypeError("Invalid 'algorithm' parameter");if(typeof i.digits!="undefined")if($.test(i.digits))o.digits=parseInt(i.digits,10);else throw new TypeError("Invalid 'digits' parameter");return new a(o)}static stringify(e){if(e instanceof p||e instanceof u)return e.toString();throw new TypeError("Invalid 'HOTP/TOTP' object")}}const z="9.2.3";exports.HOTP=p,exports.Secret=h,exports.TOTP=u,exports.URI=V,exports.version=z;
+"use strict";var H=require("node:crypto");function T(s){var e=Object.create(null);return s&&Object.keys(s).forEach(function(r){if(r!=="default"){var t=Object.getOwnPropertyDescriptor(s,r);Object.defineProperty(e,r,t.get?t:{enumerable:!0,get:function(){return s[r]}})}}),e.default=s,Object.freeze(e)}var g=T(H);const v=s=>{const e=new ArrayBuffer(8),r=new Uint8Array(e);let t=s;for(let n=7;n>=0&&t!==0;n--)r[n]=t&255,t-=r[n],t/=256;return e};var U=void 0;const h=(()=>{if(typeof globalThis=="object")return globalThis;Object.defineProperty(Object.prototype,"__GLOBALTHIS__",{get(){return this},configurable:!0});try{if(typeof __GLOBALTHIS__!="undefined")return __GLOBALTHIS__}finally{delete Object.prototype.__GLOBALTHIS__}if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof global!="undefined")return global})(),E={SHA1:"SHA-1",SHA224:"SHA-224",SHA256:"SHA-256",SHA384:"SHA-384",SHA512:"SHA-512","SHA3-224":"SHA3-224","SHA3-256":"SHA3-256","SHA3-384":"SHA3-384","SHA3-512":"SHA3-512"},O=(s,e,r)=>{if(g!=null&&g.createHmac){const t=g.createHmac(s,h.Buffer.from(e));return t.update(h.Buffer.from(r)),t.digest().buffer}else{const t=E[s.toUpperCase()];if(typeof t=="undefined")throw new TypeError("Unknown hash function");const n=new U(t,"ARRAYBUFFER");return n.setHMACKey(e,"ARRAYBUFFER"),n.update(r),n.getHMAC("ARRAYBUFFER")}},w="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",L=s=>{let e=s.length;for(;s[e-1]==="=";)--e;const r=(e=8&&(i-=8,n[o++]=a>>>i)}return t},B=s=>{const e=new Uint8Array(s);let r=0,t=0,n="";for(let i=0;i=5;)n+=w[t>>>r-5&31],r-=5;return r>0&&(n+=w[t<<5-r&31]),n},C=s=>{const e=new ArrayBuffer(s.length/2),r=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(s);let r="";for(let t=0;t{const e=new ArrayBuffer(s.length),r=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(s);let r="";for(let t=0;t{if(!y)throw new Error("Encoding API not available");return y.encode(s).buffer},D=s=>{if(!A)throw new Error("Encoding API not available");return A.decode(s)},F=s=>{var e;if(g!=null&&g.randomBytes)return g.randomBytes(s).buffer;if(!((e=h.crypto)!=null&&e.getRandomValues))throw new Error("Cryptography API not available");return h.crypto.getRandomValues(new Uint8Array(s)).buffer};class c{constructor({buffer:e,size:r=20}={}){this.buffer=typeof e=="undefined"?F(r):e}static fromLatin1(e){return new c({buffer:P(e)})}static fromUTF8(e){return new c({buffer:x(e)})}static fromBase32(e){return new c({buffer:L(e)})}static fromHex(e){return new c({buffer:C(e)})}get latin1(){return Object.defineProperty(this,"latin1",{enumerable:!0,value:j(this.buffer)}),this.latin1}get utf8(){return Object.defineProperty(this,"utf8",{enumerable:!0,value:D(this.buffer)}),this.utf8}get base32(){return Object.defineProperty(this,"base32",{enumerable:!0,value:B(this.buffer)}),this.base32}get hex(){return Object.defineProperty(this,"hex",{enumerable:!0,value:R(this.buffer)}),this.hex}}const M=(s,e)=>{if(g!=null&&g.timingSafeEqual)return g.timingSafeEqual(h.Buffer.from(s),h.Buffer.from(e));{if(s.length!==e.length)throw new TypeError("Input strings must have the same length");let r=-1,t=0;for(;++r{const m=l.generate({secret:r,algorithm:t,digits:n,counter:f});M(e,m)&&(o=f-i)};d(i);for(let f=1;f<=a&&o===null&&(d(i-f),!(o!==null||(d(i+f),o!==null)));++f);return o}validate({token:e,counter:r=this.counter,window:t}){return l.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,counter:r,window:t})}toString(){const e=encodeURIComponent;return`otpauth://hotp/${this.issuer.length>0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&counter=${e(this.counter)}`}};class u{static get defaults(){return{issuer:"",label:"OTPAuth",issuerInLabel:!0,algorithm:"SHA1",digits:6,period:30,window:1}}constructor({issuer:e=u.defaults.issuer,label:r=u.defaults.label,issuerInLabel:t=u.defaults.issuerInLabel,secret:n=new c,algorithm:i=u.defaults.algorithm,digits:a=u.defaults.digits,period:o=u.defaults.period}={}){this.issuer=e,this.label=r,this.issuerInLabel=t,this.secret=typeof n=="string"?c.fromBase32(n):n,this.algorithm=i.toUpperCase(),this.digits=a,this.period=o}static generate({secret:e,algorithm:r,digits:t,period:n=u.defaults.period,timestamp:i=Date.now()}){return p.generate({secret:e,algorithm:r,digits:t,counter:Math.floor(i/1e3/n)})}generate({timestamp:e=Date.now()}={}){return u.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:e})}static validate({token:e,secret:r,algorithm:t,digits:n,period:i=u.defaults.period,timestamp:a=Date.now(),window:o}){return p.validate({token:e,secret:r,algorithm:t,digits:n,counter:Math.floor(a/1e3/i),window:o})}validate({token:e,timestamp:r,window:t}){return u.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:r,window:t})}toString(){const e=encodeURIComponent;return`otpauth://totp/${this.issuer.length>0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&period=${e(this.period)}`}}const G=/^otpauth:\/\/([ht]otp)\/(.+)\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i,Y=/^[2-7A-Z]+=*$/i,Z=/^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i,q=/^[+-]?\d+$/,$=/^\+?[1-9]\d*$/;class V{static parse(e){let r;try{r=e.match(G)}catch(d){}if(!Array.isArray(r))throw new URIError("Invalid URI format");const t=r[1].toLowerCase(),n=r[2].split(/(?::|%3A) *(.+)/i,2).map(decodeURIComponent),i=r[3].split("&").reduce((d,f)=>{const m=f.split(/=(.*)/,2).map(decodeURIComponent),I=m[0].toLowerCase(),S=m[1],b=d;return b[I]=S,b},{});let a;const o={};if(t==="hotp")if(a=p,typeof i.counter!="undefined"&&q.test(i.counter))o.counter=parseInt(i.counter,10);else throw new TypeError("Missing or invalid 'counter' parameter");else if(t==="totp"){if(a=u,typeof i.period!="undefined")if($.test(i.period))o.period=parseInt(i.period,10);else throw new TypeError("Invalid 'period' parameter")}else throw new TypeError("Unknown OTP type");if(typeof i.issuer!="undefined"&&(o.issuer=i.issuer),n.length===2?(o.label=n[1],typeof o.issuer=="undefined"||o.issuer===""?o.issuer=n[0]:n[0]===""&&(o.issuerInLabel=!1)):(o.label=n[0],typeof o.issuer!="undefined"&&o.issuer!==""&&(o.issuerInLabel=!1)),typeof i.secret!="undefined"&&Y.test(i.secret))o.secret=i.secret;else throw new TypeError("Missing or invalid 'secret' parameter");if(typeof i.algorithm!="undefined")if(Z.test(i.algorithm))o.algorithm=i.algorithm;else throw new TypeError("Invalid 'algorithm' parameter");if(typeof i.digits!="undefined")if($.test(i.digits))o.digits=parseInt(i.digits,10);else throw new TypeError("Invalid 'digits' parameter");return new a(o)}static stringify(e){if(e instanceof p||e instanceof u)return e.toString();throw new TypeError("Invalid 'HOTP/TOTP' object")}}const z="9.2.4";exports.HOTP=p,exports.Secret=c,exports.TOTP=u,exports.URI=V,exports.version=z;
//# sourceMappingURL=otpauth.node.min.cjs.map
diff --git a/dist/otpauth.node.min.cjs.map b/dist/otpauth.node.min.cjs.map
index 8b381d0..f3dd829 100644
--- a/dist/otpauth.node.min.cjs.map
+++ b/dist/otpauth.node.min.cjs.map
@@ -1 +1 @@
-{"version":3,"file":"otpauth.node.min.cjs","sources":["../src/utils/encoding/uint.js","../src/utils/global-scope.js","../src/utils/crypto/hmac-digest.js","../src/utils/encoding/base32.js","../src/utils/encoding/hex.js","../src/utils/encoding/latin1.js","../src/utils/encoding/utf8.js","../src/utils/crypto/random-bytes.js","../src/secret.js","../src/utils/crypto/timing-safe-equal.js","../src/hotp.js","../src/totp.js","../src/uri.js","../src/version.js"],"sourcesContent":["/**\n * Converts an integer to an ArrayBuffer.\n * @param {number} num Integer.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst uintToBuf = (num) => {\n const buf = new ArrayBuffer(8);\n const arr = new Uint8Array(buf);\n let acc = num;\n\n for (let i = 7; i >= 0; i--) {\n if (acc === 0) break;\n arr[i] = acc & 255;\n acc -= arr[i];\n acc /= 256;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let num = 0;\n\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] !== 0) {\n num *= 256;\n num += arr[i];\n }\n }\n\n return num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * \"globalThis\" ponyfill.\n * @see [A horrifying globalThis polyfill in universal JavaScript](https://mathiasbynens.be/notes/globalthis)\n * @type {Object.}\n */\nconst globalScope = (() => {\n if (typeof globalThis === \"object\") return globalThis;\n else {\n Object.defineProperty(Object.prototype, \"__GLOBALTHIS__\", {\n get() {\n return this;\n },\n configurable: true,\n });\n try {\n // @ts-ignore\n if (typeof __GLOBALTHIS__ !== \"undefined\") return __GLOBALTHIS__;\n } finally {\n // @ts-ignore\n delete Object.prototype.__GLOBALTHIS__;\n }\n }\n\n // Still unable to determine \"globalThis\", fall back to a naive method.\n if (typeof self !== \"undefined\") return self;\n else if (typeof window !== \"undefined\") return window;\n else if (typeof global !== \"undefined\") return global;\n\n return undefined;\n})();\n\nexport { globalScope };\n","import * as crypto from \"node:crypto\";\nimport jsSHA from \"jssha\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * OpenSSL to jsSHA algorithms map.\n * @type {Object.}\n */\nconst OPENSSL_JSSHA_ALGO_MAP = {\n SHA1: \"SHA-1\",\n SHA224: \"SHA-224\",\n SHA256: \"SHA-256\",\n SHA384: \"SHA-384\",\n SHA512: \"SHA-512\",\n \"SHA3-224\": \"SHA3-224\",\n \"SHA3-256\": \"SHA3-256\",\n \"SHA3-384\": \"SHA3-384\",\n \"SHA3-512\": \"SHA3-512\",\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n if (crypto?.createHmac) {\n const hmac = crypto.createHmac(algorithm, globalScope.Buffer.from(key));\n hmac.update(globalScope.Buffer.from(message));\n return hmac.digest().buffer;\n } else {\n const variant = OPENSSL_JSSHA_ALGO_MAP[algorithm.toUpperCase()];\n if (typeof variant === \"undefined\") {\n throw new TypeError(\"Unknown hash function\");\n }\n const hmac = new jsSHA(variant, \"ARRAYBUFFER\");\n hmac.setHMACKey(key, \"ARRAYBUFFER\");\n hmac.update(message);\n return hmac.getHMAC(\"ARRAYBUFFER\");\n }\n};\n\nexport { hmacDigest };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * @see [LinusU/base32-decode](https://github.com/LinusU/base32-decode)\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n // Canonicalize to all upper case and remove padding if it exists.\n let end = str.length;\n while (str[end - 1] === \"=\") --end;\n const cstr = (end < str.length ? str.substring(0, end) : str).toUpperCase();\n\n const buf = new ArrayBuffer(((cstr.length * 5) / 8) | 0);\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let index = 0;\n\n for (let i = 0; i < cstr.length; i++) {\n const idx = ALPHABET.indexOf(cstr[i]);\n if (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n value = (value << 5) | idx;\n bits += 5;\n\n if (bits >= 8) {\n bits -= 8;\n arr[index++] = value >>> bits;\n }\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * @see [LinusU/base32-encode](https://github.com/LinusU/base32-encode)\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n value = (value << 8) | arr[i];\n bits += 8;\n\n while (bits >= 5) {\n str += ALPHABET[(value >>> (bits - 5)) & 31];\n bits -= 5;\n }\n }\n\n if (bits > 0) {\n str += ALPHABET[(value << (5 - bits)) & 31];\n }\n\n return str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n const buf = new ArrayBuffer(str.length / 2);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i += 2) {\n arr[i / 2] = parseInt(str.substring(i, i + 2), 16);\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n const hex = arr[i].toString(16);\n if (hex.length === 1) str += \"0\";\n str += hex;\n }\n\n return str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n const buf = new ArrayBuffer(str.length);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i) & 0xff;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n str += String.fromCharCode(arr[i]);\n }\n\n return str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalScope } from \"../global-scope.js\";\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalScope.TextEncoder\n ? new globalScope.TextEncoder(\"utf-8\")\n : null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalScope.TextDecoder\n ? new globalScope.TextDecoder(\"utf-8\")\n : null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n if (!ENCODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n if (!DECODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n if (crypto?.randomBytes) {\n return crypto.randomBytes(size).buffer;\n } else {\n if (!globalScope.crypto?.getRandomValues) {\n throw new Error(\"Cryptography API not available\");\n }\n return globalScope.crypto.getRandomValues(new Uint8Array(size)).buffer;\n }\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from \"./utils/encoding/base32.js\";\nimport { hexToBuf, hexFromBuf } from \"./utils/encoding/hex.js\";\nimport { latin1ToBuf, latin1FromBuf } from \"./utils/encoding/latin1.js\";\nimport { utf8ToBuf, utf8FromBuf } from \"./utils/encoding/utf8.js\";\nimport { randomBytes } from \"./utils/crypto/random-bytes.js\";\n\n/**\n * OTP secret key.\n */\nclass Secret {\n /**\n * Creates a secret key object.\n * @param {Object} [config] Configuration options.\n * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n */\n constructor({ buffer, size = 20 } = {}) {\n /**\n * Secret key.\n * @type {ArrayBuffer}\n */\n this.buffer = typeof buffer === \"undefined\" ? randomBytes(size) : buffer;\n }\n\n /**\n * Converts a Latin-1 string to a Secret object.\n * @param {string} str Latin-1 string.\n * @returns {Secret} Secret object.\n */\n static fromLatin1(str) {\n return new Secret({ buffer: latin1ToBuf(str) });\n }\n\n /**\n * Converts an UTF-8 string to a Secret object.\n * @param {string} str UTF-8 string.\n * @returns {Secret} Secret object.\n */\n static fromUTF8(str) {\n return new Secret({ buffer: utf8ToBuf(str) });\n }\n\n /**\n * Converts a base32 string to a Secret object.\n * @param {string} str Base32 string.\n * @returns {Secret} Secret object.\n */\n static fromBase32(str) {\n return new Secret({ buffer: base32ToBuf(str) });\n }\n\n /**\n * Converts a hexadecimal string to a Secret object.\n * @param {string} str Hexadecimal string.\n * @returns {Secret} Secret object.\n */\n static fromHex(str) {\n return new Secret({ buffer: hexToBuf(str) });\n }\n\n /**\n * Latin-1 string representation of secret key.\n * @type {string}\n */\n get latin1() {\n Object.defineProperty(this, \"latin1\", {\n enumerable: true,\n value: latin1FromBuf(this.buffer),\n });\n\n return this.latin1;\n }\n\n /**\n * UTF-8 string representation of secret key.\n * @type {string}\n */\n get utf8() {\n Object.defineProperty(this, \"utf8\", {\n enumerable: true,\n value: utf8FromBuf(this.buffer),\n });\n\n return this.utf8;\n }\n\n /**\n * Base32 string representation of secret key.\n * @type {string}\n */\n get base32() {\n Object.defineProperty(this, \"base32\", {\n enumerable: true,\n value: base32FromBuf(this.buffer),\n });\n\n return this.base32;\n }\n\n /**\n * Hexadecimal string representation of secret key.\n * @type {string}\n */\n get hex() {\n Object.defineProperty(this, \"hex\", {\n enumerable: true,\n value: hexFromBuf(this.buffer),\n });\n\n return this.hex;\n }\n}\n\nexport { Secret };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n if (crypto?.timingSafeEqual) {\n return crypto.timingSafeEqual(\n globalScope.Buffer.from(a),\n globalScope.Buffer.from(b),\n );\n } else {\n if (a.length !== b.length) {\n throw new TypeError(\"Input strings must have the same length\");\n }\n let i = -1;\n let out = 0;\n while (++i < a.length) {\n out |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return out === 0;\n }\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from \"./utils/encoding/uint.js\";\nimport { hmacDigest } from \"./utils/crypto/hmac-digest.js\";\nimport { Secret } from \"./secret.js\";\nimport { timingSafeEqual } from \"./utils/crypto/timing-safe-equal.js\";\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * @see [RFC 4226](https://tools.ietf.org/html/rfc4226)\n */\nclass HOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * counter: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n counter: 0,\n window: 1,\n };\n }\n\n /**\n * Creates an HOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Initial counter value.\n */\n constructor({\n issuer = HOTP.defaults.issuer,\n label = HOTP.defaults.label,\n issuerInLabel = HOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Initial counter value.\n * @type {number}\n */\n this.counter = counter;\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Counter value.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n }) {\n const digest = new Uint8Array(\n hmacDigest(algorithm, secret.buffer, uintToBuf(counter)),\n );\n const offset = digest[digest.byteLength - 1] & 15;\n const otp =\n (((digest[offset] & 127) << 24) |\n ((digest[offset + 1] & 255) << 16) |\n ((digest[offset + 2] & 255) << 8) |\n (digest[offset + 3] & 255)) %\n 10 ** digits;\n\n return otp.toString().padStart(digits, \"0\");\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.counter=this.counter++] Counter value.\n * @returns {string} Token.\n */\n generate({ counter = this.counter++ } = {}) {\n return HOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n });\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.counter=0] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n counter = HOTP.defaults.counter,\n window = HOTP.defaults.window,\n }) {\n // Return early if the token length does not match the digit number.\n if (token.length !== digits) return null;\n\n let delta = null;\n\n for (let i = counter - window; i <= counter + window; ++i) {\n const generatedToken = HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: i,\n });\n\n if (timingSafeEqual(token, generatedToken)) {\n delta = i - counter;\n }\n }\n\n return delta;\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.counter=this.counter] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, counter = this.counter, window }) {\n return HOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://hotp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `counter=${e(this.counter)}`\n );\n }\n}\n\nexport { HOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { Secret } from \"./secret.js\";\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * @see [RFC 6238](https://tools.ietf.org/html/rfc6238)\n */\nclass TOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * period: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n period: 30,\n window: 1,\n };\n }\n\n /**\n * Creates a TOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n */\n constructor({\n issuer = TOTP.defaults.issuer,\n label = TOTP.defaults.label,\n issuerInLabel = TOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = TOTP.defaults.algorithm,\n digits = TOTP.defaults.digits,\n period = TOTP.defaults.period,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Token time-step duration.\n * @type {number}\n */\n this.period = period;\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n }) {\n return HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n });\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n generate({ timestamp = Date.now() } = {}) {\n return TOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n window,\n }) {\n return HOTP.validate({\n token,\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n window,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, timestamp, window }) {\n return TOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://totp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `period=${e(this.period)}`\n );\n }\n}\n\nexport { TOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { TOTP } from \"./totp.js\";\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX =\n /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * @see [Key URI Format](https://github.com/google/google-authenticator/wiki/Key-Uri-Format)\n */\nclass URI {\n /**\n * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n * @param {string} uri Google Authenticator Key URI.\n * @returns {HOTP|TOTP} HOTP/TOTP object.\n */\n static parse(uri) {\n let uriGroups;\n\n try {\n uriGroups = uri.match(OTPURI_REGEX);\n } catch (error) {\n /* Handled below */\n }\n\n if (!Array.isArray(uriGroups)) {\n throw new URIError(\"Invalid URI format\");\n }\n\n // Extract URI groups.\n const uriType = uriGroups[1].toLowerCase();\n const uriLabel = uriGroups[2]\n .split(/(?::|%3A) *(.+)/i, 2)\n .map(decodeURIComponent);\n /** @type {Object.} */\n const uriParams = uriGroups[3].split(\"&\").reduce((acc, cur) => {\n const pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n const pairKey = pairArr[0].toLowerCase();\n const pairVal = pairArr[1];\n /** @type {Object.} */\n const pairAcc = acc;\n\n pairAcc[pairKey] = pairVal;\n return pairAcc;\n }, {});\n\n // 'OTP' will be instantiated with 'config' argument.\n let OTP;\n const config = {};\n\n if (uriType === \"hotp\") {\n OTP = HOTP;\n\n // Counter: required\n if (\n typeof uriParams.counter !== \"undefined\" &&\n INTEGER_REGEX.test(uriParams.counter)\n ) {\n config.counter = parseInt(uriParams.counter, 10);\n } else {\n throw new TypeError(\"Missing or invalid 'counter' parameter\");\n }\n } else if (uriType === \"totp\") {\n OTP = TOTP;\n\n // Period: optional\n if (typeof uriParams.period !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n config.period = parseInt(uriParams.period, 10);\n } else {\n throw new TypeError(\"Invalid 'period' parameter\");\n }\n }\n } else {\n throw new TypeError(\"Unknown OTP type\");\n }\n\n // Label: required\n // Issuer: optional\n if (typeof uriParams.issuer !== \"undefined\") {\n config.issuer = uriParams.issuer;\n }\n if (uriLabel.length === 2) {\n config.label = uriLabel[1];\n if (typeof config.issuer === \"undefined\" || config.issuer === \"\") {\n config.issuer = uriLabel[0];\n } else if (uriLabel[0] === \"\") {\n config.issuerInLabel = false;\n }\n } else {\n config.label = uriLabel[0];\n if (typeof config.issuer !== \"undefined\" && config.issuer !== \"\") {\n config.issuerInLabel = false;\n }\n }\n\n // Secret: required\n if (\n typeof uriParams.secret !== \"undefined\" &&\n SECRET_REGEX.test(uriParams.secret)\n ) {\n config.secret = uriParams.secret;\n } else {\n throw new TypeError(\"Missing or invalid 'secret' parameter\");\n }\n\n // Algorithm: optional\n if (typeof uriParams.algorithm !== \"undefined\") {\n if (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n config.algorithm = uriParams.algorithm;\n } else {\n throw new TypeError(\"Invalid 'algorithm' parameter\");\n }\n }\n\n // Digits: optional\n if (typeof uriParams.digits !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n config.digits = parseInt(uriParams.digits, 10);\n } else {\n throw new TypeError(\"Invalid 'digits' parameter\");\n }\n }\n\n return new OTP(config);\n }\n\n /**\n * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n * @param {HOTP|TOTP} otp HOTP/TOTP object.\n * @returns {string} Google Authenticator Key URI.\n */\n static stringify(otp) {\n if (otp instanceof HOTP || otp instanceof TOTP) {\n return otp.toString();\n }\n\n throw new TypeError(\"Invalid 'HOTP/TOTP' object\");\n }\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = \"__OTPAUTH_VERSION__\";\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","globalScope","globalThis","Object","defineProperty","prototype","get","configurable","__GLOBALTHIS__","self","window","global","OPENSSL_JSSHA_ALGO_MAP","SHA1","SHA224","SHA256","SHA384","SHA512","hmacDigest","algorithm","key","message","crypto","createHmac","hmac","Buffer","from","update","digest","buffer","variant","toUpperCase","TypeError","jsSHA","setHMACKey","getHMAC","ALPHABET","base32ToBuf","str","end","length","cstr","substring","bits","value","index","idx","indexOf","base32FromBuf","hexToBuf","parseInt","hexFromBuf","hex","toString","latin1ToBuf","charCodeAt","latin1FromBuf","String","fromCharCode","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","Error","encode","utf8FromBuf","decode","randomBytes","size","_a","getRandomValues","Secret","constructor","fromLatin1","fromUTF8","fromBase32","fromHex","latin1","enumerable","utf8","base32","timingSafeEqual","a","b","out","HOTP","defaults","issuer","label","issuerInLabel","digits","counter","secret","generate","offset","byteLength","__pow","padStart","validate","token","delta","generatedToken","e","encodeURIComponent","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","parse","uri","uriGroups","match","error","Array","isArray","URIError","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","OTP","config","test","stringify","otp","version"],"mappings":";sTAKA,MAAMA,EAAaC,GAAQ,CACzB,MAAMC,EAAM,IAAIC,YAAY,CAAC,EACvBC,EAAM,IAAIC,WAAWH,CAAG,EAC9B,IAAII,EAAML,EAEV,QAASM,EAAI,EAAGA,GAAK,GACfD,IAAQ,EADUC,IAEtBH,EAAIG,CAAC,EAAID,EAAM,IACfA,GAAOF,EAAIG,CAAC,EACZD,GAAO,IAGT,OAAOJ,CACT,eCbA,MAAMM,GAAe,IAAM,CACzB,GAAI,OAAOC,YAAe,SAAU,OAAOA,WAEzCC,OAAOC,eAAeD,OAAOE,UAAW,iBAAkB,CACxDC,KAAM,CACJ,OAAO,IACT,EACAC,aAAc,EAChB,CAAC,EACD,GAAI,CAEF,GAAI,OAAOC,gBAAmB,YAAa,OAAOA,cACpD,QAAU,CAER,OAAOL,OAAOE,UAAUG,cAC1B,CAIF,GAAI,OAAOC,MAAS,YAAa,OAAOA,KACnC,GAAI,OAAOC,QAAW,YAAa,OAAOA,OAC1C,GAAI,OAAOC,QAAW,YAAa,OAAOA,MAGjD,GAEA,ECtBMC,EAAyB,CAC7BC,KAAM,QACNC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACR,WAAY,WACZ,WAAY,WACZ,WAAY,WACZ,WAAY,UACd,EAUMC,EAAaA,CAACC,EAAWC,EAAKC,IAAY,CAC9C,GAAIC,GAAAA,MAAAA,EAAQC,WAAY,CACtB,MAAMC,EAAOF,EAAOC,WAAWJ,EAAWlB,EAAYwB,OAAOC,KAAKN,CAAG,CAAC,EACtEI,OAAAA,EAAKG,OAAO1B,EAAYwB,OAAOC,KAAKL,CAAO,CAAC,EACrCG,EAAKI,OAAO,EAAEC,MACvB,KAAO,CACL,MAAMC,EAAUlB,EAAuBO,EAAUY,YAAa,CAAA,EAC9D,GAAI,OAAOD,GAAY,YACrB,MAAM,IAAIE,UAAU,uBAAuB,EAE7C,MAAMR,EAAO,IAAIS,EAAMH,EAAS,aAAa,EAC7CN,OAAAA,EAAKU,WAAWd,EAAK,aAAa,EAClCI,EAAKG,OAAON,CAAO,EACZG,EAAKW,QAAQ,aAAa,CACnC,CACF,ECxCMC,EAAW,mCAQXC,EAAeC,GAAQ,CAE3B,IAAIC,EAAMD,EAAIE,OACd,KAAOF,EAAIC,EAAM,CAAC,IAAM,KAAK,EAAEA,EAC/B,MAAME,GAAQF,EAAMD,EAAIE,OAASF,EAAII,UAAU,EAAGH,CAAG,EAAID,GAAKP,YAAY,EAEpEpC,EAAM,IAAIC,YAAc6C,EAAKD,OAAS,EAAK,EAAK,CAAC,EACjD3C,EAAM,IAAIC,WAAWH,CAAG,EAC9B,IAAIgD,EAAO,EACPC,EAAQ,EACRC,EAAQ,EAEZ,QAAS7C,EAAI,EAAGA,EAAIyC,EAAKD,OAAQxC,IAAK,CACpC,MAAM8C,EAAMV,EAASW,QAAQN,EAAKzC,CAAC,CAAC,EACpC,GAAI8C,IAAQ,GAAI,MAAM,IAAId,UAAW,4BAA2BS,EAAKzC,CAAC,CAAE,EAAC,EAEzE4C,EAASA,GAAS,EAAKE,EACvBH,GAAQ,EAEJA,GAAQ,IACVA,GAAQ,EACR9C,EAAIgD,GAAO,EAAID,IAAUD,EAE7B,CAEA,OAAOhD,CACT,EAQMqD,EAAiBrD,GAAQ,CAC7B,MAAME,EAAM,IAAIC,WAAWH,CAAG,EAC9B,IAAIgD,EAAO,EACPC,EAAQ,EACRN,EAAM,GAEV,QAAStC,EAAI,EAAGA,EAAIH,EAAI2C,OAAQxC,IAI9B,IAHA4C,EAASA,GAAS,EAAK/C,EAAIG,CAAC,EAC5B2C,GAAQ,EAEDA,GAAQ,GACbL,GAAOF,EAAUQ,IAAWD,EAAO,EAAM,EAAE,EAC3CA,GAAQ,EAIZ,OAAIA,EAAO,IACTL,GAAOF,EAAUQ,GAAU,EAAID,EAAS,EAAE,GAGrCL,CACT,EC9DMW,EAAYX,GAAQ,CACxB,MAAM3C,EAAM,IAAIC,YAAY0C,EAAIE,OAAS,CAAC,EACpC3C,EAAM,IAAIC,WAAWH,CAAG,EAE9B,QAASK,EAAI,EAAGA,EAAIsC,EAAIE,OAAQxC,GAAK,EACnCH,EAAIG,EAAI,CAAC,EAAIkD,SAASZ,EAAII,UAAU1C,EAAGA,EAAI,CAAC,EAAG,EAAE,EAGnD,OAAOL,CACT,EAOMwD,EAAcxD,GAAQ,CAC1B,MAAME,EAAM,IAAIC,WAAWH,CAAG,EAC9B,IAAI2C,EAAM,GAEV,QAAStC,EAAI,EAAGA,EAAIH,EAAI2C,OAAQxC,IAAK,CACnC,MAAMoD,EAAMvD,EAAIG,CAAC,EAAEqD,SAAS,EAAE,EAC1BD,EAAIZ,SAAW,IAAGF,GAAO,KAC7BA,GAAOc,CACT,CAEA,OAAOd,EAAIP,aACb,EC3BMuB,EAAehB,GAAQ,CAC3B,MAAM3C,EAAM,IAAIC,YAAY0C,EAAIE,MAAM,EAChC3C,EAAM,IAAIC,WAAWH,CAAG,EAE9B,QAASK,EAAI,EAAGA,EAAIsC,EAAIE,OAAQxC,IAC9BH,EAAIG,CAAC,EAAIsC,EAAIiB,WAAWvD,CAAC,EAAI,IAG/B,OAAOL,CACT,EAOM6D,EAAiB7D,GAAQ,CAC7B,MAAME,EAAM,IAAIC,WAAWH,CAAG,EAC9B,IAAI2C,EAAM,GAEV,QAAStC,EAAI,EAAGA,EAAIH,EAAI2C,OAAQxC,IAC9BsC,GAAOmB,OAAOC,aAAa7D,EAAIG,CAAC,CAAC,EAGnC,OAAOsC,CACT,ECxBMqB,EAAU1D,EAAY2D,YACxB,IAAI3D,EAAY2D,YAAY,OAAO,EACnC,KAMEC,EAAU5D,EAAY6D,YACxB,IAAI7D,EAAY6D,YAAY,OAAO,EACnC,KAOEC,EAAazB,GAAQ,CACzB,GAAI,CAACqB,EACH,MAAM,IAAIK,MAAM,4BAA4B,EAG9C,OAAOL,EAAQM,OAAO3B,CAAG,EAAET,MAC7B,EAOMqC,EAAevE,GAAQ,CAC3B,GAAI,CAACkE,EACH,MAAM,IAAIG,MAAM,4BAA4B,EAG9C,OAAOH,EAAQM,OAAOxE,CAAG,CAC3B,ECjCMyE,EAAeC,GAAS,CAT9B,IAAAC,EAUE,GAAIhD,GAAAA,MAAAA,EAAQ8C,YACV,OAAO9C,EAAO8C,YAAYC,CAAI,EAAExC,OAEhC,GAAI,GAAC5B,EAAAA,EAAYqB,SAAZrB,MAAAA,EAAoBsE,iBACvB,MAAM,IAAIP,MAAM,gCAAgC,EAElD,OAAO/D,EAAYqB,OAAOiD,gBAAgB,IAAIzE,WAAWuE,CAAI,CAAC,EAAExC,MAEpE,ECTA,MAAM2C,CAAO,CAOXC,YAAY,CAAE5C,OAAAA,EAAQwC,KAAAA,EAAO,EAAG,EAAI,CAAA,EAAI,CAKtC,KAAKxC,OAAS,OAAOA,GAAW,YAAcuC,EAAYC,CAAI,EAAIxC,CACpE,CAOA,OAAO6C,WAAWpC,EAAK,CACrB,OAAO,IAAIkC,EAAO,CAAE3C,OAAQyB,EAAYhB,CAAG,CAAE,CAAC,CAChD,CAOA,OAAOqC,SAASrC,EAAK,CACnB,OAAO,IAAIkC,EAAO,CAAE3C,OAAQkC,EAAUzB,CAAG,CAAE,CAAC,CAC9C,CAOA,OAAOsC,WAAWtC,EAAK,CACrB,OAAO,IAAIkC,EAAO,CAAE3C,OAAQQ,EAAYC,CAAG,CAAE,CAAC,CAChD,CAOA,OAAOuC,QAAQvC,EAAK,CAClB,OAAO,IAAIkC,EAAO,CAAE3C,OAAQoB,EAASX,CAAG,CAAE,CAAC,CAC7C,CAMA,IAAIwC,QAAS,CACX3E,cAAOC,eAAe,KAAM,SAAU,CACpC2E,WAAY,GACZnC,MAAOY,EAAc,KAAK3B,MAAM,CAClC,CAAC,EAEM,KAAKiD,MACd,CAMA,IAAIE,MAAO,CACT7E,OAAAA,OAAOC,eAAe,KAAM,OAAQ,CAClC2E,WAAY,GACZnC,MAAOsB,EAAY,KAAKrC,MAAM,CAChC,CAAC,EAEM,KAAKmD,IACd,CAMA,IAAIC,QAAS,CACX9E,cAAOC,eAAe,KAAM,SAAU,CACpC2E,WAAY,GACZnC,MAAOI,EAAc,KAAKnB,MAAM,CAClC,CAAC,EAEM,KAAKoD,MACd,CAMA,IAAI7B,KAAM,CACRjD,OAAOC,OAAAA,eAAe,KAAM,MAAO,CACjC2E,WAAY,GACZnC,MAAOO,EAAW,KAAKtB,MAAM,CAC/B,CAAC,EAEM,KAAKuB,GACd,CACF,CCrGA,MAAM8B,EAAkBA,CAACC,EAAGC,IAAM,CAChC,GAAI9D,GAAAA,MAAAA,EAAQ4D,gBACV,OAAO5D,EAAO4D,gBACZjF,EAAYwB,OAAOC,KAAKyD,CAAC,EACzBlF,EAAYwB,OAAOC,KAAK0D,CAAC,CAC3B,EACK,CACL,GAAID,EAAE3C,SAAW4C,EAAE5C,OACjB,MAAM,IAAIR,UAAU,yCAAyC,EAE/D,IAAIhC,EAAI,GACJqF,EAAM,EACV,KAAO,EAAErF,EAAImF,EAAE3C,QACb6C,GAAOF,EAAE5B,WAAWvD,CAAC,EAAIoF,EAAE7B,WAAWvD,CAAC,EAEzC,OAAOqF,IAAQ,CACjB,CACF,uBClBA,MAAMC,CAAK,CAaT,WAAWC,UAAW,CACpB,MAAO,CACLC,OAAQ,GACRC,MAAO,UACPC,cAAe,GACfvE,UAAW,OACXwE,OAAQ,EACRC,QAAS,EACTlF,OAAQ,CACV,CACF,CAaA+D,YAAY,CACVe,OAAAA,EAASF,EAAKC,SAASC,OACvBC,MAAAA,EAAQH,EAAKC,SAASE,MACtBC,cAAAA,EAAgBJ,EAAKC,SAASG,cAC9BG,OAAAA,EAAS,IAAIrB,EACbrD,UAAAA,EAAYmE,EAAKC,SAASpE,UAC1BwE,OAAAA,EAASL,EAAKC,SAASI,OACvBC,QAAAA,EAAUN,EAAKC,SAASK,OAC1B,EAAI,GAAI,CAKN,KAAKJ,OAASA,EAKd,KAAKC,MAAQA,EAKb,KAAKC,cAAgBA,EAKrB,KAAKG,OACH,OAAOA,GAAW,SAAWrB,EAAOI,WAAWiB,CAAM,EAAIA,EAK3D,KAAK1E,UAAYA,EAAUY,YAK3B,EAAA,KAAK4D,OAASA,EAKd,KAAKC,QAAUA,CACjB,CAWA,OAAOE,SAAS,CACdD,OAAAA,EACA1E,UAAAA,EAAYmE,EAAKC,SAASpE,UAC1BwE,OAAAA,EAASL,EAAKC,SAASI,OACvBC,QAAAA,EAAUN,EAAKC,SAASK,OAC1B,EAAG,CACD,MAAMhE,EAAS,IAAI9B,WACjBoB,EAAWC,EAAW0E,EAAOhE,OAAQpC,EAAUmG,CAAO,CAAC,CACzD,EACMG,EAASnE,EAAOA,EAAOoE,WAAa,CAAC,EAAI,GAQ/C,SANKpE,EAAOmE,CAAM,EAAI,MAAQ,IACxBnE,EAAOmE,EAAS,CAAC,EAAI,MAAQ,IAC7BnE,EAAOmE,EAAS,CAAC,EAAI,MAAQ,EAC9BnE,EAAOmE,EAAS,CAAC,EAAI,KACxBE,EAAA,GAAMN,IAEGtC,WAAW6C,SAASP,EAAQ,GAAG,CAC5C,CAQAG,SAAS,CAAEF,QAAAA,EAAU,KAAKA,SAAU,EAAI,GAAI,CAC1C,OAAON,EAAKQ,SAAS,CACnBD,OAAQ,KAAKA,OACb1E,UAAW,KAAKA,UAChBwE,OAAQ,KAAKA,OACbC,QAAAA,CACF,CAAC,CACH,CAaA,OAAOO,SAAS,CACdC,MAAAA,EACAP,OAAAA,EACA1E,UAAAA,EACAwE,OAAAA,EACAC,QAAAA,EAAUN,EAAKC,SAASK,QACxBlF,OAAAA,EAAS4E,EAAKC,SAAS7E,MACzB,EAAG,CAED,GAAI0F,EAAM5D,SAAWmD,EAAQ,OAAO,KAEpC,IAAIU,EAAQ,KAEZ,QAASrG,EAAI4F,EAAUlF,EAAQV,GAAK4F,EAAUlF,EAAQ,EAAEV,EAAG,CACzD,MAAMsG,EAAiBhB,EAAKQ,SAAS,CACnCD,OAAAA,EACA1E,UAAAA,EACAwE,OAAAA,EACAC,QAAS5F,CACX,CAAC,EAEGkF,EAAgBkB,EAAOE,CAAc,IACvCD,EAAQrG,EAAI4F,EAEhB,CAEA,OAAOS,CACT,CAUAF,SAAS,CAAEC,MAAAA,EAAOR,QAAAA,EAAU,KAAKA,QAASlF,OAAAA,CAAO,EAAG,CAClD,OAAO4E,EAAKa,SAAS,CACnBC,MAAAA,EACAP,OAAQ,KAAKA,OACb1E,UAAW,KAAKA,UAChBwE,OAAQ,KAAKA,OACbC,QAAAA,EACAlF,OAAAA,CACF,CAAC,CACH,CAMA2C,UAAW,CACT,MAAMkD,EAAIC,mBACV,MACE,kBAEE,KAAKhB,OAAOhD,OAAS,EACjB,KAAKkD,cACF,GAAEa,EAAE,KAAKf,MAAM,CAAE,IAAGe,EAAE,KAAKd,KAAK,CAAE,WAAUc,EAAE,KAAKf,MAAM,CAAE,IAC3D,GAAEe,EAAE,KAAKd,KAAK,CAAE,WAAUc,EAAE,KAAKf,MAAM,CAAE,IAC3C,GAAEe,EAAE,KAAKd,KAAK,CAAE,GACtB,UACSc,EAAE,KAAKV,OAAOZ,MAAM,CAAE,cACnBsB,EAAE,KAAKpF,SAAS,CAAE,WACrBoF,EAAE,KAAKZ,MAAM,CAAE,YACdY,EAAE,KAAKX,OAAO,CAAE,EAE/B,CACF,ECjNA,MAAMa,CAAK,CAaT,WAAWlB,UAAW,CACpB,MAAO,CACLC,OAAQ,GACRC,MAAO,UACPC,cAAe,GACfvE,UAAW,OACXwE,OAAQ,EACRe,OAAQ,GACRhG,OAAQ,CACV,CACF,CAaA+D,YAAY,CACVe,OAAAA,EAASiB,EAAKlB,SAASC,OACvBC,MAAAA,EAAQgB,EAAKlB,SAASE,MACtBC,cAAAA,EAAgBe,EAAKlB,SAASG,cAC9BG,OAAAA,EAAS,IAAIrB,EACbrD,UAAAA,EAAYsF,EAAKlB,SAASpE,UAC1BwE,OAAAA,EAASc,EAAKlB,SAASI,OACvBe,OAAAA,EAASD,EAAKlB,SAASmB,MACzB,EAAI,CAAA,EAAI,CAKN,KAAKlB,OAASA,EAKd,KAAKC,MAAQA,EAKb,KAAKC,cAAgBA,EAKrB,KAAKG,OACH,OAAOA,GAAW,SAAWrB,EAAOI,WAAWiB,CAAM,EAAIA,EAK3D,KAAK1E,UAAYA,EAAUY,YAK3B,EAAA,KAAK4D,OAASA,EAKd,KAAKe,OAASA,CAChB,CAYA,OAAOZ,SAAS,CACdD,OAAAA,EACA1E,UAAAA,EACAwE,OAAAA,EACAe,OAAAA,EAASD,EAAKlB,SAASmB,OACvBC,UAAAA,EAAYC,KAAKC,IACnB,CAAA,EAAG,CACD,OAAOvB,EAAKQ,SAAS,CACnBD,OAAAA,EACA1E,UAAAA,EACAwE,OAAAA,EACAC,QAASkB,KAAKC,MAAMJ,EAAY,IAAOD,CAAM,CAC/C,CAAC,CACH,CAQAZ,SAAS,CAAEa,UAAAA,EAAYC,KAAKC,IAAAA,CAAM,EAAI,GAAI,CACxC,OAAOJ,EAAKX,SAAS,CACnBD,OAAQ,KAAKA,OACb1E,UAAW,KAAKA,UAChBwE,OAAQ,KAAKA,OACbe,OAAQ,KAAKA,OACbC,UAAAA,CACF,CAAC,CACH,CAcA,OAAOR,SAAS,CACdC,MAAAA,EACAP,OAAAA,EACA1E,UAAAA,EACAwE,OAAAA,EACAe,OAAAA,EAASD,EAAKlB,SAASmB,OACvBC,UAAAA,EAAYC,KAAKC,IACjBnG,EAAAA,OAAAA,CACF,EAAG,CACD,OAAO4E,EAAKa,SAAS,CACnBC,MAAAA,EACAP,OAAAA,EACA1E,UAAAA,EACAwE,OAAAA,EACAC,QAASkB,KAAKC,MAAMJ,EAAY,IAAOD,CAAM,EAC7ChG,OAAAA,CACF,CAAC,CACH,CAUAyF,SAAS,CAAEC,MAAAA,EAAOO,UAAAA,EAAWjG,OAAAA,CAAO,EAAG,CACrC,OAAO+F,EAAKN,SAAS,CACnBC,MAAAA,EACAP,OAAQ,KAAKA,OACb1E,UAAW,KAAKA,UAChBwE,OAAQ,KAAKA,OACbe,OAAQ,KAAKA,OACbC,UAAAA,EACAjG,OAAAA,CACF,CAAC,CACH,CAMA2C,UAAW,CACT,MAAMkD,EAAIC,mBACV,MACE,kBAEE,KAAKhB,OAAOhD,OAAS,EACjB,KAAKkD,cACF,GAAEa,EAAE,KAAKf,MAAM,CAAE,IAAGe,EAAE,KAAKd,KAAK,CAAE,WAAUc,EAAE,KAAKf,MAAM,CAAE,IAC3D,GAAEe,EAAE,KAAKd,KAAK,CAAE,WAAUc,EAAE,KAAKf,MAAM,CAAE,IAC3C,GAAEe,EAAE,KAAKd,KAAK,CAAE,GACtB,UACSc,EAAE,KAAKV,OAAOZ,MAAM,CAAE,cACnBsB,EAAE,KAAKpF,SAAS,CAAE,WACrBoF,EAAE,KAAKZ,MAAM,CAAE,WACfY,EAAE,KAAKG,MAAM,CAAE,EAE7B,CACF,CCpMA,MAAMM,EACJ,mFAMIC,EAAe,iBAMfC,EAAkB,sDAMlBC,EAAgB,aAMhBC,EAAyB,gBAM/B,MAAMC,CAAI,CAMR,OAAOC,MAAMC,EAAK,CAChB,IAAIC,EAEJ,GAAI,CACFA,EAAYD,EAAIE,MAAMT,CAAY,CACpC,OAASU,EAAO,CAIhB,CAAA,GAAI,CAACC,MAAMC,QAAQJ,CAAS,EAC1B,MAAM,IAAIK,SAAS,oBAAoB,EAIzC,MAAMC,EAAUN,EAAU,CAAC,EAAEO,cACvBC,EAAWR,EAAU,CAAC,EACzBS,MAAM,mBAAoB,CAAC,EAC3BC,IAAIC,kBAAkB,EAEnBC,EAAYZ,EAAU,CAAC,EAAES,MAAM,GAAG,EAAEI,OAAO,CAACtI,EAAKuI,IAAQ,CAC7D,MAAMC,EAAUD,EAAIL,MAAM,QAAS,CAAC,EAAEC,IAAIC,kBAAkB,EACtDK,EAAUD,EAAQ,CAAC,EAAER,cACrBU,EAAUF,EAAQ,CAAC,EAEnBG,EAAU3I,EAEhB2I,OAAAA,EAAQF,CAAO,EAAIC,EACZC,CACT,EAAG,CAAE,CAAA,EAGL,IAAIC,EACJ,MAAMC,EAAS,CAAA,EAEf,GAAId,IAAY,OAId,GAHAa,EAAMrD,EAIJ,OAAO8C,EAAUxC,SAAY,aAC7BuB,EAAc0B,KAAKT,EAAUxC,OAAO,EAEpCgD,EAAOhD,QAAU1C,SAASkF,EAAUxC,QAAS,EAAE,aAEzC,IAAI5D,UAAU,wCAAwC,UAErD8F,IAAY,QAIrB,GAHAa,EAAMlC,EAGF,OAAO2B,EAAU1B,QAAW,YAC9B,GAAIU,EAAuByB,KAAKT,EAAU1B,MAAM,EAC9CkC,EAAOlC,OAASxD,SAASkF,EAAU1B,OAAQ,EAAE,MAE7C,OAAM,IAAI1E,UAAU,4BAA4B,MAIpD,OAAM,IAAIA,UAAU,kBAAkB,EAuBxC,GAlBI,OAAOoG,EAAU5C,QAAW,cAC9BoD,EAAOpD,OAAS4C,EAAU5C,QAExBwC,EAASxF,SAAW,GACtBoG,EAAOnD,MAAQuC,EAAS,CAAC,EACrB,OAAOY,EAAOpD,QAAW,aAAeoD,EAAOpD,SAAW,GAC5DoD,EAAOpD,OAASwC,EAAS,CAAC,EACjBA,EAAS,CAAC,IAAM,KACzBY,EAAOlD,cAAgB,MAGzBkD,EAAOnD,MAAQuC,EAAS,CAAC,EACrB,OAAOY,EAAOpD,QAAW,aAAeoD,EAAOpD,SAAW,KAC5DoD,EAAOlD,cAAgB,KAMzB,OAAO0C,EAAUvC,QAAW,aAC5BoB,EAAa4B,KAAKT,EAAUvC,MAAM,EAElC+C,EAAO/C,OAASuC,EAAUvC,WAEpB,OAAA,IAAI7D,UAAU,uCAAuC,EAI7D,GAAI,OAAOoG,EAAUjH,WAAc,YACjC,GAAI+F,EAAgB2B,KAAKT,EAAUjH,SAAS,EAC1CyH,EAAOzH,UAAYiH,EAAUjH,cAEvB,OAAA,IAAIa,UAAU,+BAA+B,EAKvD,GAAI,OAAOoG,EAAUzC,QAAW,YAC9B,GAAIyB,EAAuByB,KAAKT,EAAUzC,MAAM,EAC9CiD,EAAOjD,OAASzC,SAASkF,EAAUzC,OAAQ,EAAE,MAE7C,OAAM,IAAI3D,UAAU,4BAA4B,EAIpD,OAAO,IAAI2G,EAAIC,CAAM,CACvB,CAOA,OAAOE,UAAUC,EAAK,CACpB,GAAIA,aAAezD,GAAQyD,aAAetC,EACxC,OAAOsC,EAAI1F,SAAS,EAGtB,MAAM,IAAIrB,UAAU,4BAA4B,CAClD,CACF,CCnKMgH,MAAAA,EAAU"}
\ No newline at end of file
+{"version":3,"file":"otpauth.node.min.cjs","sources":["../src/utils/encoding/uint.js","../src/utils/global-scope.js","../src/utils/crypto/hmac-digest.js","../src/utils/encoding/base32.js","../src/utils/encoding/hex.js","../src/utils/encoding/latin1.js","../src/utils/encoding/utf8.js","../src/utils/crypto/random-bytes.js","../src/secret.js","../src/utils/crypto/timing-safe-equal.js","../src/hotp.js","../src/totp.js","../src/uri.js","../src/version.js"],"sourcesContent":["/**\n * Converts an integer to an ArrayBuffer.\n * @param {number} num Integer.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst uintToBuf = (num) => {\n const buf = new ArrayBuffer(8);\n const arr = new Uint8Array(buf);\n let acc = num;\n\n for (let i = 7; i >= 0; i--) {\n if (acc === 0) break;\n arr[i] = acc & 255;\n acc -= arr[i];\n acc /= 256;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let num = 0;\n\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] !== 0) {\n num *= 256;\n num += arr[i];\n }\n }\n\n return num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * \"globalThis\" ponyfill.\n * @see [A horrifying globalThis polyfill in universal JavaScript](https://mathiasbynens.be/notes/globalthis)\n * @type {Object.}\n */\nconst globalScope = (() => {\n if (typeof globalThis === \"object\") return globalThis;\n else {\n Object.defineProperty(Object.prototype, \"__GLOBALTHIS__\", {\n get() {\n return this;\n },\n configurable: true,\n });\n try {\n // @ts-ignore\n // eslint-disable-next-line no-undef\n if (typeof __GLOBALTHIS__ !== \"undefined\") return __GLOBALTHIS__;\n } finally {\n // @ts-ignore\n delete Object.prototype.__GLOBALTHIS__;\n }\n }\n\n // Still unable to determine \"globalThis\", fall back to a naive method.\n if (typeof self !== \"undefined\") return self;\n else if (typeof window !== \"undefined\") return window;\n else if (typeof global !== \"undefined\") return global;\n\n return undefined;\n})();\n\nexport { globalScope };\n","import * as crypto from \"node:crypto\";\nimport jsSHA from \"jssha\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * OpenSSL to jsSHA algorithms map.\n * @type {Object.}\n */\nconst OPENSSL_JSSHA_ALGO_MAP = {\n SHA1: \"SHA-1\",\n SHA224: \"SHA-224\",\n SHA256: \"SHA-256\",\n SHA384: \"SHA-384\",\n SHA512: \"SHA-512\",\n \"SHA3-224\": \"SHA3-224\",\n \"SHA3-256\": \"SHA3-256\",\n \"SHA3-384\": \"SHA3-384\",\n \"SHA3-512\": \"SHA3-512\",\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n if (crypto?.createHmac) {\n const hmac = crypto.createHmac(algorithm, globalScope.Buffer.from(key));\n hmac.update(globalScope.Buffer.from(message));\n return hmac.digest().buffer;\n } else {\n const variant = OPENSSL_JSSHA_ALGO_MAP[algorithm.toUpperCase()];\n if (typeof variant === \"undefined\") {\n throw new TypeError(\"Unknown hash function\");\n }\n const hmac = new jsSHA(variant, \"ARRAYBUFFER\");\n hmac.setHMACKey(key, \"ARRAYBUFFER\");\n hmac.update(message);\n return hmac.getHMAC(\"ARRAYBUFFER\");\n }\n};\n\nexport { hmacDigest };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * @see [LinusU/base32-decode](https://github.com/LinusU/base32-decode)\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n // Canonicalize to all upper case and remove padding if it exists.\n let end = str.length;\n while (str[end - 1] === \"=\") --end;\n const cstr = (end < str.length ? str.substring(0, end) : str).toUpperCase();\n\n const buf = new ArrayBuffer(((cstr.length * 5) / 8) | 0);\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let index = 0;\n\n for (let i = 0; i < cstr.length; i++) {\n const idx = ALPHABET.indexOf(cstr[i]);\n if (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n value = (value << 5) | idx;\n bits += 5;\n\n if (bits >= 8) {\n bits -= 8;\n arr[index++] = value >>> bits;\n }\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * @see [LinusU/base32-encode](https://github.com/LinusU/base32-encode)\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n value = (value << 8) | arr[i];\n bits += 8;\n\n while (bits >= 5) {\n str += ALPHABET[(value >>> (bits - 5)) & 31];\n bits -= 5;\n }\n }\n\n if (bits > 0) {\n str += ALPHABET[(value << (5 - bits)) & 31];\n }\n\n return str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n const buf = new ArrayBuffer(str.length / 2);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i += 2) {\n arr[i / 2] = parseInt(str.substring(i, i + 2), 16);\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n const hex = arr[i].toString(16);\n if (hex.length === 1) str += \"0\";\n str += hex;\n }\n\n return str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n const buf = new ArrayBuffer(str.length);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i) & 0xff;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n str += String.fromCharCode(arr[i]);\n }\n\n return str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalScope } from \"../global-scope.js\";\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalScope.TextEncoder\n ? new globalScope.TextEncoder(\"utf-8\")\n : null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalScope.TextDecoder\n ? new globalScope.TextDecoder(\"utf-8\")\n : null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n if (!ENCODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n if (!DECODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n if (crypto?.randomBytes) {\n return crypto.randomBytes(size).buffer;\n } else {\n if (!globalScope.crypto?.getRandomValues) {\n throw new Error(\"Cryptography API not available\");\n }\n return globalScope.crypto.getRandomValues(new Uint8Array(size)).buffer;\n }\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from \"./utils/encoding/base32.js\";\nimport { hexToBuf, hexFromBuf } from \"./utils/encoding/hex.js\";\nimport { latin1ToBuf, latin1FromBuf } from \"./utils/encoding/latin1.js\";\nimport { utf8ToBuf, utf8FromBuf } from \"./utils/encoding/utf8.js\";\nimport { randomBytes } from \"./utils/crypto/random-bytes.js\";\n\n/**\n * OTP secret key.\n */\nclass Secret {\n /**\n * Creates a secret key object.\n * @param {Object} [config] Configuration options.\n * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n */\n constructor({ buffer, size = 20 } = {}) {\n /**\n * Secret key.\n * @type {ArrayBuffer}\n */\n this.buffer = typeof buffer === \"undefined\" ? randomBytes(size) : buffer;\n }\n\n /**\n * Converts a Latin-1 string to a Secret object.\n * @param {string} str Latin-1 string.\n * @returns {Secret} Secret object.\n */\n static fromLatin1(str) {\n return new Secret({ buffer: latin1ToBuf(str) });\n }\n\n /**\n * Converts an UTF-8 string to a Secret object.\n * @param {string} str UTF-8 string.\n * @returns {Secret} Secret object.\n */\n static fromUTF8(str) {\n return new Secret({ buffer: utf8ToBuf(str) });\n }\n\n /**\n * Converts a base32 string to a Secret object.\n * @param {string} str Base32 string.\n * @returns {Secret} Secret object.\n */\n static fromBase32(str) {\n return new Secret({ buffer: base32ToBuf(str) });\n }\n\n /**\n * Converts a hexadecimal string to a Secret object.\n * @param {string} str Hexadecimal string.\n * @returns {Secret} Secret object.\n */\n static fromHex(str) {\n return new Secret({ buffer: hexToBuf(str) });\n }\n\n /**\n * Latin-1 string representation of secret key.\n * @type {string}\n */\n get latin1() {\n Object.defineProperty(this, \"latin1\", {\n enumerable: true,\n value: latin1FromBuf(this.buffer),\n });\n\n return this.latin1;\n }\n\n /**\n * UTF-8 string representation of secret key.\n * @type {string}\n */\n get utf8() {\n Object.defineProperty(this, \"utf8\", {\n enumerable: true,\n value: utf8FromBuf(this.buffer),\n });\n\n return this.utf8;\n }\n\n /**\n * Base32 string representation of secret key.\n * @type {string}\n */\n get base32() {\n Object.defineProperty(this, \"base32\", {\n enumerable: true,\n value: base32FromBuf(this.buffer),\n });\n\n return this.base32;\n }\n\n /**\n * Hexadecimal string representation of secret key.\n * @type {string}\n */\n get hex() {\n Object.defineProperty(this, \"hex\", {\n enumerable: true,\n value: hexFromBuf(this.buffer),\n });\n\n return this.hex;\n }\n}\n\nexport { Secret };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n if (crypto?.timingSafeEqual) {\n return crypto.timingSafeEqual(\n globalScope.Buffer.from(a),\n globalScope.Buffer.from(b),\n );\n } else {\n if (a.length !== b.length) {\n throw new TypeError(\"Input strings must have the same length\");\n }\n let i = -1;\n let out = 0;\n while (++i < a.length) {\n out |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return out === 0;\n }\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from \"./utils/encoding/uint.js\";\nimport { hmacDigest } from \"./utils/crypto/hmac-digest.js\";\nimport { Secret } from \"./secret.js\";\nimport { timingSafeEqual } from \"./utils/crypto/timing-safe-equal.js\";\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * @see [RFC 4226](https://tools.ietf.org/html/rfc4226)\n */\nclass HOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * counter: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n counter: 0,\n window: 1,\n };\n }\n\n /**\n * Creates an HOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Initial counter value.\n */\n constructor({\n issuer = HOTP.defaults.issuer,\n label = HOTP.defaults.label,\n issuerInLabel = HOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Initial counter value.\n * @type {number}\n */\n this.counter = counter;\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Counter value.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n }) {\n const digest = new Uint8Array(\n hmacDigest(algorithm, secret.buffer, uintToBuf(counter)),\n );\n const offset = digest[digest.byteLength - 1] & 15;\n const otp =\n (((digest[offset] & 127) << 24) |\n ((digest[offset + 1] & 255) << 16) |\n ((digest[offset + 2] & 255) << 8) |\n (digest[offset + 3] & 255)) %\n 10 ** digits;\n\n return otp.toString().padStart(digits, \"0\");\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.counter=this.counter++] Counter value.\n * @returns {string} Token.\n */\n generate({ counter = this.counter++ } = {}) {\n return HOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n });\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.counter=0] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n counter = HOTP.defaults.counter,\n window = HOTP.defaults.window,\n }) {\n // Return early if the token length does not match the digit number.\n if (token.length !== digits) return null;\n\n let delta = null;\n\n const check = (/** @type {number} */ i) => {\n const generatedToken = HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: i,\n });\n if (timingSafeEqual(token, generatedToken)) {\n delta = i - counter;\n }\n };\n\n check(counter);\n for (let i = 1; i <= window && delta === null; ++i) {\n check(counter - i);\n if (delta !== null) break;\n check(counter + i);\n if (delta !== null) break;\n }\n\n return delta;\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.counter=this.counter] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, counter = this.counter, window }) {\n return HOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://hotp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `counter=${e(this.counter)}`\n );\n }\n}\n\nexport { HOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { Secret } from \"./secret.js\";\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * @see [RFC 6238](https://tools.ietf.org/html/rfc6238)\n */\nclass TOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * period: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n period: 30,\n window: 1,\n };\n }\n\n /**\n * Creates a TOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n */\n constructor({\n issuer = TOTP.defaults.issuer,\n label = TOTP.defaults.label,\n issuerInLabel = TOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = TOTP.defaults.algorithm,\n digits = TOTP.defaults.digits,\n period = TOTP.defaults.period,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Token time-step duration.\n * @type {number}\n */\n this.period = period;\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n }) {\n return HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n });\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n generate({ timestamp = Date.now() } = {}) {\n return TOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n window,\n }) {\n return HOTP.validate({\n token,\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n window,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, timestamp, window }) {\n return TOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://totp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `period=${e(this.period)}`\n );\n }\n}\n\nexport { TOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { TOTP } from \"./totp.js\";\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX =\n /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * @see [Key URI Format](https://github.com/google/google-authenticator/wiki/Key-Uri-Format)\n */\nclass URI {\n /**\n * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n * @param {string} uri Google Authenticator Key URI.\n * @returns {HOTP|TOTP} HOTP/TOTP object.\n */\n static parse(uri) {\n let uriGroups;\n\n try {\n uriGroups = uri.match(OTPURI_REGEX);\n // eslint-disable-next-line no-unused-vars\n } catch (_) {\n /* Handled below */\n }\n\n if (!Array.isArray(uriGroups)) {\n throw new URIError(\"Invalid URI format\");\n }\n\n // Extract URI groups.\n const uriType = uriGroups[1].toLowerCase();\n const uriLabel = uriGroups[2]\n .split(/(?::|%3A) *(.+)/i, 2)\n .map(decodeURIComponent);\n /** @type {Object.} */\n const uriParams = uriGroups[3].split(\"&\").reduce((acc, cur) => {\n const pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n const pairKey = pairArr[0].toLowerCase();\n const pairVal = pairArr[1];\n /** @type {Object.} */\n const pairAcc = acc;\n\n pairAcc[pairKey] = pairVal;\n return pairAcc;\n }, {});\n\n // 'OTP' will be instantiated with 'config' argument.\n let OTP;\n const config = {};\n\n if (uriType === \"hotp\") {\n OTP = HOTP;\n\n // Counter: required\n if (\n typeof uriParams.counter !== \"undefined\" &&\n INTEGER_REGEX.test(uriParams.counter)\n ) {\n config.counter = parseInt(uriParams.counter, 10);\n } else {\n throw new TypeError(\"Missing or invalid 'counter' parameter\");\n }\n } else if (uriType === \"totp\") {\n OTP = TOTP;\n\n // Period: optional\n if (typeof uriParams.period !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n config.period = parseInt(uriParams.period, 10);\n } else {\n throw new TypeError(\"Invalid 'period' parameter\");\n }\n }\n } else {\n throw new TypeError(\"Unknown OTP type\");\n }\n\n // Label: required\n // Issuer: optional\n if (typeof uriParams.issuer !== \"undefined\") {\n config.issuer = uriParams.issuer;\n }\n if (uriLabel.length === 2) {\n config.label = uriLabel[1];\n if (typeof config.issuer === \"undefined\" || config.issuer === \"\") {\n config.issuer = uriLabel[0];\n } else if (uriLabel[0] === \"\") {\n config.issuerInLabel = false;\n }\n } else {\n config.label = uriLabel[0];\n if (typeof config.issuer !== \"undefined\" && config.issuer !== \"\") {\n config.issuerInLabel = false;\n }\n }\n\n // Secret: required\n if (\n typeof uriParams.secret !== \"undefined\" &&\n SECRET_REGEX.test(uriParams.secret)\n ) {\n config.secret = uriParams.secret;\n } else {\n throw new TypeError(\"Missing or invalid 'secret' parameter\");\n }\n\n // Algorithm: optional\n if (typeof uriParams.algorithm !== \"undefined\") {\n if (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n config.algorithm = uriParams.algorithm;\n } else {\n throw new TypeError(\"Invalid 'algorithm' parameter\");\n }\n }\n\n // Digits: optional\n if (typeof uriParams.digits !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n config.digits = parseInt(uriParams.digits, 10);\n } else {\n throw new TypeError(\"Invalid 'digits' parameter\");\n }\n }\n\n return new OTP(config);\n }\n\n /**\n * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n * @param {HOTP|TOTP} otp HOTP/TOTP object.\n * @returns {string} Google Authenticator Key URI.\n */\n static stringify(otp) {\n if (otp instanceof HOTP || otp instanceof TOTP) {\n return otp.toString();\n }\n\n throw new TypeError(\"Invalid 'HOTP/TOTP' object\");\n }\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = \"__OTPAUTH_VERSION__\";\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","globalScope","globalThis","Object","defineProperty","prototype","get","configurable","__GLOBALTHIS__","self","window","global","OPENSSL_JSSHA_ALGO_MAP","SHA1","SHA224","SHA256","SHA384","SHA512","hmacDigest","algorithm","key","message","crypto","createHmac","hmac","Buffer","from","update","digest","buffer","variant","toUpperCase","TypeError","jsSHA","setHMACKey","getHMAC","ALPHABET","base32ToBuf","str","end","length","cstr","substring","bits","value","index","idx","indexOf","base32FromBuf","hexToBuf","parseInt","hexFromBuf","hex","toString","latin1ToBuf","charCodeAt","latin1FromBuf","String","fromCharCode","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","Error","encode","utf8FromBuf","decode","randomBytes","size","_a","getRandomValues","Secret","constructor","fromLatin1","fromUTF8","fromBase32","fromHex","latin1","enumerable","utf8","base32","timingSafeEqual","a","b","out","HOTP","defaults","issuer","label","issuerInLabel","digits","counter","secret","generate","offset","byteLength","__pow","padStart","validate","token","delta","check","generatedToken","e","encodeURIComponent","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","parse","uri","uriGroups","match","_","Array","isArray","URIError","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","OTP","config","test","stringify","otp","version"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/otpauth.node.min.mjs b/dist/otpauth.node.min.mjs
index 72a6d3b..d7e1318 100644
--- a/dist/otpauth.node.min.mjs
+++ b/dist/otpauth.node.min.mjs
@@ -1,3 +1,3 @@
///
-import*as c from"node:crypto";const H=n=>{const e=new ArrayBuffer(8),r=new Uint8Array(e);let t=n;for(let s=7;s>=0&&t!==0;s--)r[s]=t&255,t-=r[s],t/=256;return e};var T=void 0;const d=(()=>{if(typeof globalThis=="object")return globalThis;Object.defineProperty(Object.prototype,"__GLOBALTHIS__",{get(){return this},configurable:!0});try{if(typeof __GLOBALTHIS__!="undefined")return __GLOBALTHIS__}finally{delete Object.prototype.__GLOBALTHIS__}if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof global!="undefined")return global})(),U={SHA1:"SHA-1",SHA224:"SHA-224",SHA256:"SHA-256",SHA384:"SHA-384",SHA512:"SHA-512","SHA3-224":"SHA3-224","SHA3-256":"SHA3-256","SHA3-384":"SHA3-384","SHA3-512":"SHA3-512"},v=(n,e,r)=>{if(c!=null&&c.createHmac){const t=c.createHmac(n,d.Buffer.from(e));return t.update(d.Buffer.from(r)),t.digest().buffer}else{const t=U[n.toUpperCase()];if(typeof t=="undefined")throw new TypeError("Unknown hash function");const s=new T(t,"ARRAYBUFFER");return s.setHMACKey(e,"ARRAYBUFFER"),s.update(r),s.getHMAC("ARRAYBUFFER")}},m="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",E=n=>{let e=n.length;for(;n[e-1]==="=";)--e;const r=(e=8&&(i-=8,s[o++]=a>>>i)}return t},L=n=>{const e=new Uint8Array(n);let r=0,t=0,s="";for(let i=0;i=5;)s+=m[t>>>r-5&31],r-=5;return r>0&&(s+=m[t<<5-r&31]),s},B=n=>{const e=new ArrayBuffer(n.length/2),r=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(n);let r="";for(let t=0;t{const e=new ArrayBuffer(n.length),r=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(n);let r="";for(let t=0;t{if(!y)throw new Error("Encoding API not available");return y.encode(n).buffer},x=n=>{if(!A)throw new Error("Encoding API not available");return A.decode(n)},j=n=>{var e;if(c!=null&&c.randomBytes)return c.randomBytes(n).buffer;if(!((e=d.crypto)!=null&&e.getRandomValues))throw new Error("Cryptography API not available");return d.crypto.getRandomValues(new Uint8Array(n)).buffer};class h{constructor({buffer:e,size:r=20}={}){this.buffer=typeof e=="undefined"?j(r):e}static fromLatin1(e){return new h({buffer:O(e)})}static fromUTF8(e){return new h({buffer:P(e)})}static fromBase32(e){return new h({buffer:E(e)})}static fromHex(e){return new h({buffer:B(e)})}get latin1(){return Object.defineProperty(this,"latin1",{enumerable:!0,value:R(this.buffer)}),this.latin1}get utf8(){return Object.defineProperty(this,"utf8",{enumerable:!0,value:x(this.buffer)}),this.utf8}get base32(){return Object.defineProperty(this,"base32",{enumerable:!0,value:L(this.buffer)}),this.base32}get hex(){return Object.defineProperty(this,"hex",{enumerable:!0,value:C(this.buffer)}),this.hex}}const k=(n,e)=>{if(c!=null&&c.timingSafeEqual)return c.timingSafeEqual(d.Buffer.from(n),d.Buffer.from(e));{if(n.length!==e.length)throw new TypeError("Input strings must have the same length");let r=-1,t=0;for(;++r0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&counter=${e(this.counter)}`}};class u{static get defaults(){return{issuer:"",label:"OTPAuth",issuerInLabel:!0,algorithm:"SHA1",digits:6,period:30,window:1}}constructor({issuer:e=u.defaults.issuer,label:r=u.defaults.label,issuerInLabel:t=u.defaults.issuerInLabel,secret:s=new h,algorithm:i=u.defaults.algorithm,digits:a=u.defaults.digits,period:o=u.defaults.period}={}){this.issuer=e,this.label=r,this.issuerInLabel=t,this.secret=typeof s=="string"?h.fromBase32(s):s,this.algorithm=i.toUpperCase(),this.digits=a,this.period=o}static generate({secret:e,algorithm:r,digits:t,period:s=u.defaults.period,timestamp:i=Date.now()}){return p.generate({secret:e,algorithm:r,digits:t,counter:Math.floor(i/1e3/s)})}generate({timestamp:e=Date.now()}={}){return u.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:e})}static validate({token:e,secret:r,algorithm:t,digits:s,period:i=u.defaults.period,timestamp:a=Date.now(),window:o}){return p.validate({token:e,secret:r,algorithm:t,digits:s,counter:Math.floor(a/1e3/i),window:o})}validate({token:e,timestamp:r,window:t}){return u.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:r,window:t})}toString(){const e=encodeURIComponent;return`otpauth://totp/${this.issuer.length>0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&period=${e(this.period)}`}}const M=/^otpauth:\/\/([ht]otp)\/(.+)\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i,D=/^[2-7A-Z]+=*$/i,G=/^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i,Y=/^[+-]?\d+$/,$=/^\+?[1-9]\d*$/;class Z{static parse(e){let r;try{r=e.match(M)}catch(f){}if(!Array.isArray(r))throw new URIError("Invalid URI format");const t=r[1].toLowerCase(),s=r[2].split(/(?::|%3A) *(.+)/i,2).map(decodeURIComponent),i=r[3].split("&").reduce((f,g)=>{const w=g.split(/=(.*)/,2).map(decodeURIComponent),I=w[0].toLowerCase(),S=w[1],b=f;return b[I]=S,b},{});let a;const o={};if(t==="hotp")if(a=p,typeof i.counter!="undefined"&&Y.test(i.counter))o.counter=parseInt(i.counter,10);else throw new TypeError("Missing or invalid 'counter' parameter");else if(t==="totp"){if(a=u,typeof i.period!="undefined")if($.test(i.period))o.period=parseInt(i.period,10);else throw new TypeError("Invalid 'period' parameter")}else throw new TypeError("Unknown OTP type");if(typeof i.issuer!="undefined"&&(o.issuer=i.issuer),s.length===2?(o.label=s[1],typeof o.issuer=="undefined"||o.issuer===""?o.issuer=s[0]:s[0]===""&&(o.issuerInLabel=!1)):(o.label=s[0],typeof o.issuer!="undefined"&&o.issuer!==""&&(o.issuerInLabel=!1)),typeof i.secret!="undefined"&&D.test(i.secret))o.secret=i.secret;else throw new TypeError("Missing or invalid 'secret' parameter");if(typeof i.algorithm!="undefined")if(G.test(i.algorithm))o.algorithm=i.algorithm;else throw new TypeError("Invalid 'algorithm' parameter");if(typeof i.digits!="undefined")if($.test(i.digits))o.digits=parseInt(i.digits,10);else throw new TypeError("Invalid 'digits' parameter");return new a(o)}static stringify(e){if(e instanceof p||e instanceof u)return e.toString();throw new TypeError("Invalid 'HOTP/TOTP' object")}}const V="9.2.3";export{p as HOTP,h as Secret,u as TOTP,Z as URI,V as version};
+import*as g from"node:crypto";const H=n=>{const e=new ArrayBuffer(8),r=new Uint8Array(e);let t=n;for(let s=7;s>=0&&t!==0;s--)r[s]=t&255,t-=r[s],t/=256;return e};var T=void 0;const h=(()=>{if(typeof globalThis=="object")return globalThis;Object.defineProperty(Object.prototype,"__GLOBALTHIS__",{get(){return this},configurable:!0});try{if(typeof __GLOBALTHIS__!="undefined")return __GLOBALTHIS__}finally{delete Object.prototype.__GLOBALTHIS__}if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof global!="undefined")return global})(),U={SHA1:"SHA-1",SHA224:"SHA-224",SHA256:"SHA-256",SHA384:"SHA-384",SHA512:"SHA-512","SHA3-224":"SHA3-224","SHA3-256":"SHA3-256","SHA3-384":"SHA3-384","SHA3-512":"SHA3-512"},v=(n,e,r)=>{if(g!=null&&g.createHmac){const t=g.createHmac(n,h.Buffer.from(e));return t.update(h.Buffer.from(r)),t.digest().buffer}else{const t=U[n.toUpperCase()];if(typeof t=="undefined")throw new TypeError("Unknown hash function");const s=new T(t,"ARRAYBUFFER");return s.setHMACKey(e,"ARRAYBUFFER"),s.update(r),s.getHMAC("ARRAYBUFFER")}},w="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",E=n=>{let e=n.length;for(;n[e-1]==="=";)--e;const r=(e=8&&(i-=8,s[o++]=a>>>i)}return t},L=n=>{const e=new Uint8Array(n);let r=0,t=0,s="";for(let i=0;i=5;)s+=w[t>>>r-5&31],r-=5;return r>0&&(s+=w[t<<5-r&31]),s},B=n=>{const e=new ArrayBuffer(n.length/2),r=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(n);let r="";for(let t=0;t{const e=new ArrayBuffer(n.length),r=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(n);let r="";for(let t=0;t{if(!y)throw new Error("Encoding API not available");return y.encode(n).buffer},x=n=>{if(!A)throw new Error("Encoding API not available");return A.decode(n)},j=n=>{var e;if(g!=null&&g.randomBytes)return g.randomBytes(n).buffer;if(!((e=h.crypto)!=null&&e.getRandomValues))throw new Error("Cryptography API not available");return h.crypto.getRandomValues(new Uint8Array(n)).buffer};class c{constructor({buffer:e,size:r=20}={}){this.buffer=typeof e=="undefined"?j(r):e}static fromLatin1(e){return new c({buffer:O(e)})}static fromUTF8(e){return new c({buffer:P(e)})}static fromBase32(e){return new c({buffer:E(e)})}static fromHex(e){return new c({buffer:B(e)})}get latin1(){return Object.defineProperty(this,"latin1",{enumerable:!0,value:R(this.buffer)}),this.latin1}get utf8(){return Object.defineProperty(this,"utf8",{enumerable:!0,value:x(this.buffer)}),this.utf8}get base32(){return Object.defineProperty(this,"base32",{enumerable:!0,value:L(this.buffer)}),this.base32}get hex(){return Object.defineProperty(this,"hex",{enumerable:!0,value:C(this.buffer)}),this.hex}}const k=(n,e)=>{if(g!=null&&g.timingSafeEqual)return g.timingSafeEqual(h.Buffer.from(n),h.Buffer.from(e));{if(n.length!==e.length)throw new TypeError("Input strings must have the same length");let r=-1,t=0;for(;++r{const m=l.generate({secret:r,algorithm:t,digits:s,counter:f});k(e,m)&&(o=f-i)};d(i);for(let f=1;f<=a&&o===null&&(d(i-f),!(o!==null||(d(i+f),o!==null)));++f);return o}validate({token:e,counter:r=this.counter,window:t}){return l.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,counter:r,window:t})}toString(){const e=encodeURIComponent;return`otpauth://hotp/${this.issuer.length>0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&counter=${e(this.counter)}`}};class u{static get defaults(){return{issuer:"",label:"OTPAuth",issuerInLabel:!0,algorithm:"SHA1",digits:6,period:30,window:1}}constructor({issuer:e=u.defaults.issuer,label:r=u.defaults.label,issuerInLabel:t=u.defaults.issuerInLabel,secret:s=new c,algorithm:i=u.defaults.algorithm,digits:a=u.defaults.digits,period:o=u.defaults.period}={}){this.issuer=e,this.label=r,this.issuerInLabel=t,this.secret=typeof s=="string"?c.fromBase32(s):s,this.algorithm=i.toUpperCase(),this.digits=a,this.period=o}static generate({secret:e,algorithm:r,digits:t,period:s=u.defaults.period,timestamp:i=Date.now()}){return p.generate({secret:e,algorithm:r,digits:t,counter:Math.floor(i/1e3/s)})}generate({timestamp:e=Date.now()}={}){return u.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:e})}static validate({token:e,secret:r,algorithm:t,digits:s,period:i=u.defaults.period,timestamp:a=Date.now(),window:o}){return p.validate({token:e,secret:r,algorithm:t,digits:s,counter:Math.floor(a/1e3/i),window:o})}validate({token:e,timestamp:r,window:t}){return u.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:r,window:t})}toString(){const e=encodeURIComponent;return`otpauth://totp/${this.issuer.length>0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&period=${e(this.period)}`}}const M=/^otpauth:\/\/([ht]otp)\/(.+)\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i,D=/^[2-7A-Z]+=*$/i,G=/^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i,Y=/^[+-]?\d+$/,$=/^\+?[1-9]\d*$/;class Z{static parse(e){let r;try{r=e.match(M)}catch(d){}if(!Array.isArray(r))throw new URIError("Invalid URI format");const t=r[1].toLowerCase(),s=r[2].split(/(?::|%3A) *(.+)/i,2).map(decodeURIComponent),i=r[3].split("&").reduce((d,f)=>{const m=f.split(/=(.*)/,2).map(decodeURIComponent),I=m[0].toLowerCase(),S=m[1],b=d;return b[I]=S,b},{});let a;const o={};if(t==="hotp")if(a=p,typeof i.counter!="undefined"&&Y.test(i.counter))o.counter=parseInt(i.counter,10);else throw new TypeError("Missing or invalid 'counter' parameter");else if(t==="totp"){if(a=u,typeof i.period!="undefined")if($.test(i.period))o.period=parseInt(i.period,10);else throw new TypeError("Invalid 'period' parameter")}else throw new TypeError("Unknown OTP type");if(typeof i.issuer!="undefined"&&(o.issuer=i.issuer),s.length===2?(o.label=s[1],typeof o.issuer=="undefined"||o.issuer===""?o.issuer=s[0]:s[0]===""&&(o.issuerInLabel=!1)):(o.label=s[0],typeof o.issuer!="undefined"&&o.issuer!==""&&(o.issuerInLabel=!1)),typeof i.secret!="undefined"&&D.test(i.secret))o.secret=i.secret;else throw new TypeError("Missing or invalid 'secret' parameter");if(typeof i.algorithm!="undefined")if(G.test(i.algorithm))o.algorithm=i.algorithm;else throw new TypeError("Invalid 'algorithm' parameter");if(typeof i.digits!="undefined")if($.test(i.digits))o.digits=parseInt(i.digits,10);else throw new TypeError("Invalid 'digits' parameter");return new a(o)}static stringify(e){if(e instanceof p||e instanceof u)return e.toString();throw new TypeError("Invalid 'HOTP/TOTP' object")}}const V="9.2.4";export{p as HOTP,c as Secret,u as TOTP,Z as URI,V as version};
//# sourceMappingURL=otpauth.node.min.mjs.map
diff --git a/dist/otpauth.node.min.mjs.map b/dist/otpauth.node.min.mjs.map
index 8e3f3bf..6068364 100644
--- a/dist/otpauth.node.min.mjs.map
+++ b/dist/otpauth.node.min.mjs.map
@@ -1 +1 @@
-{"version":3,"file":"otpauth.node.min.mjs","sources":["../src/utils/encoding/uint.js","../src/utils/global-scope.js","../src/utils/crypto/hmac-digest.js","../src/utils/encoding/base32.js","../src/utils/encoding/hex.js","../src/utils/encoding/latin1.js","../src/utils/encoding/utf8.js","../src/utils/crypto/random-bytes.js","../src/secret.js","../src/utils/crypto/timing-safe-equal.js","../src/hotp.js","../src/totp.js","../src/uri.js","../src/version.js"],"sourcesContent":["/**\n * Converts an integer to an ArrayBuffer.\n * @param {number} num Integer.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst uintToBuf = (num) => {\n const buf = new ArrayBuffer(8);\n const arr = new Uint8Array(buf);\n let acc = num;\n\n for (let i = 7; i >= 0; i--) {\n if (acc === 0) break;\n arr[i] = acc & 255;\n acc -= arr[i];\n acc /= 256;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let num = 0;\n\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] !== 0) {\n num *= 256;\n num += arr[i];\n }\n }\n\n return num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * \"globalThis\" ponyfill.\n * @see [A horrifying globalThis polyfill in universal JavaScript](https://mathiasbynens.be/notes/globalthis)\n * @type {Object.}\n */\nconst globalScope = (() => {\n if (typeof globalThis === \"object\") return globalThis;\n else {\n Object.defineProperty(Object.prototype, \"__GLOBALTHIS__\", {\n get() {\n return this;\n },\n configurable: true,\n });\n try {\n // @ts-ignore\n if (typeof __GLOBALTHIS__ !== \"undefined\") return __GLOBALTHIS__;\n } finally {\n // @ts-ignore\n delete Object.prototype.__GLOBALTHIS__;\n }\n }\n\n // Still unable to determine \"globalThis\", fall back to a naive method.\n if (typeof self !== \"undefined\") return self;\n else if (typeof window !== \"undefined\") return window;\n else if (typeof global !== \"undefined\") return global;\n\n return undefined;\n})();\n\nexport { globalScope };\n","import * as crypto from \"node:crypto\";\nimport jsSHA from \"jssha\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * OpenSSL to jsSHA algorithms map.\n * @type {Object.}\n */\nconst OPENSSL_JSSHA_ALGO_MAP = {\n SHA1: \"SHA-1\",\n SHA224: \"SHA-224\",\n SHA256: \"SHA-256\",\n SHA384: \"SHA-384\",\n SHA512: \"SHA-512\",\n \"SHA3-224\": \"SHA3-224\",\n \"SHA3-256\": \"SHA3-256\",\n \"SHA3-384\": \"SHA3-384\",\n \"SHA3-512\": \"SHA3-512\",\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n if (crypto?.createHmac) {\n const hmac = crypto.createHmac(algorithm, globalScope.Buffer.from(key));\n hmac.update(globalScope.Buffer.from(message));\n return hmac.digest().buffer;\n } else {\n const variant = OPENSSL_JSSHA_ALGO_MAP[algorithm.toUpperCase()];\n if (typeof variant === \"undefined\") {\n throw new TypeError(\"Unknown hash function\");\n }\n const hmac = new jsSHA(variant, \"ARRAYBUFFER\");\n hmac.setHMACKey(key, \"ARRAYBUFFER\");\n hmac.update(message);\n return hmac.getHMAC(\"ARRAYBUFFER\");\n }\n};\n\nexport { hmacDigest };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * @see [LinusU/base32-decode](https://github.com/LinusU/base32-decode)\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n // Canonicalize to all upper case and remove padding if it exists.\n let end = str.length;\n while (str[end - 1] === \"=\") --end;\n const cstr = (end < str.length ? str.substring(0, end) : str).toUpperCase();\n\n const buf = new ArrayBuffer(((cstr.length * 5) / 8) | 0);\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let index = 0;\n\n for (let i = 0; i < cstr.length; i++) {\n const idx = ALPHABET.indexOf(cstr[i]);\n if (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n value = (value << 5) | idx;\n bits += 5;\n\n if (bits >= 8) {\n bits -= 8;\n arr[index++] = value >>> bits;\n }\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * @see [LinusU/base32-encode](https://github.com/LinusU/base32-encode)\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n value = (value << 8) | arr[i];\n bits += 8;\n\n while (bits >= 5) {\n str += ALPHABET[(value >>> (bits - 5)) & 31];\n bits -= 5;\n }\n }\n\n if (bits > 0) {\n str += ALPHABET[(value << (5 - bits)) & 31];\n }\n\n return str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n const buf = new ArrayBuffer(str.length / 2);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i += 2) {\n arr[i / 2] = parseInt(str.substring(i, i + 2), 16);\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n const hex = arr[i].toString(16);\n if (hex.length === 1) str += \"0\";\n str += hex;\n }\n\n return str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n const buf = new ArrayBuffer(str.length);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i) & 0xff;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n str += String.fromCharCode(arr[i]);\n }\n\n return str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalScope } from \"../global-scope.js\";\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalScope.TextEncoder\n ? new globalScope.TextEncoder(\"utf-8\")\n : null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalScope.TextDecoder\n ? new globalScope.TextDecoder(\"utf-8\")\n : null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n if (!ENCODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n if (!DECODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n if (crypto?.randomBytes) {\n return crypto.randomBytes(size).buffer;\n } else {\n if (!globalScope.crypto?.getRandomValues) {\n throw new Error(\"Cryptography API not available\");\n }\n return globalScope.crypto.getRandomValues(new Uint8Array(size)).buffer;\n }\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from \"./utils/encoding/base32.js\";\nimport { hexToBuf, hexFromBuf } from \"./utils/encoding/hex.js\";\nimport { latin1ToBuf, latin1FromBuf } from \"./utils/encoding/latin1.js\";\nimport { utf8ToBuf, utf8FromBuf } from \"./utils/encoding/utf8.js\";\nimport { randomBytes } from \"./utils/crypto/random-bytes.js\";\n\n/**\n * OTP secret key.\n */\nclass Secret {\n /**\n * Creates a secret key object.\n * @param {Object} [config] Configuration options.\n * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n */\n constructor({ buffer, size = 20 } = {}) {\n /**\n * Secret key.\n * @type {ArrayBuffer}\n */\n this.buffer = typeof buffer === \"undefined\" ? randomBytes(size) : buffer;\n }\n\n /**\n * Converts a Latin-1 string to a Secret object.\n * @param {string} str Latin-1 string.\n * @returns {Secret} Secret object.\n */\n static fromLatin1(str) {\n return new Secret({ buffer: latin1ToBuf(str) });\n }\n\n /**\n * Converts an UTF-8 string to a Secret object.\n * @param {string} str UTF-8 string.\n * @returns {Secret} Secret object.\n */\n static fromUTF8(str) {\n return new Secret({ buffer: utf8ToBuf(str) });\n }\n\n /**\n * Converts a base32 string to a Secret object.\n * @param {string} str Base32 string.\n * @returns {Secret} Secret object.\n */\n static fromBase32(str) {\n return new Secret({ buffer: base32ToBuf(str) });\n }\n\n /**\n * Converts a hexadecimal string to a Secret object.\n * @param {string} str Hexadecimal string.\n * @returns {Secret} Secret object.\n */\n static fromHex(str) {\n return new Secret({ buffer: hexToBuf(str) });\n }\n\n /**\n * Latin-1 string representation of secret key.\n * @type {string}\n */\n get latin1() {\n Object.defineProperty(this, \"latin1\", {\n enumerable: true,\n value: latin1FromBuf(this.buffer),\n });\n\n return this.latin1;\n }\n\n /**\n * UTF-8 string representation of secret key.\n * @type {string}\n */\n get utf8() {\n Object.defineProperty(this, \"utf8\", {\n enumerable: true,\n value: utf8FromBuf(this.buffer),\n });\n\n return this.utf8;\n }\n\n /**\n * Base32 string representation of secret key.\n * @type {string}\n */\n get base32() {\n Object.defineProperty(this, \"base32\", {\n enumerable: true,\n value: base32FromBuf(this.buffer),\n });\n\n return this.base32;\n }\n\n /**\n * Hexadecimal string representation of secret key.\n * @type {string}\n */\n get hex() {\n Object.defineProperty(this, \"hex\", {\n enumerable: true,\n value: hexFromBuf(this.buffer),\n });\n\n return this.hex;\n }\n}\n\nexport { Secret };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n if (crypto?.timingSafeEqual) {\n return crypto.timingSafeEqual(\n globalScope.Buffer.from(a),\n globalScope.Buffer.from(b),\n );\n } else {\n if (a.length !== b.length) {\n throw new TypeError(\"Input strings must have the same length\");\n }\n let i = -1;\n let out = 0;\n while (++i < a.length) {\n out |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return out === 0;\n }\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from \"./utils/encoding/uint.js\";\nimport { hmacDigest } from \"./utils/crypto/hmac-digest.js\";\nimport { Secret } from \"./secret.js\";\nimport { timingSafeEqual } from \"./utils/crypto/timing-safe-equal.js\";\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * @see [RFC 4226](https://tools.ietf.org/html/rfc4226)\n */\nclass HOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * counter: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n counter: 0,\n window: 1,\n };\n }\n\n /**\n * Creates an HOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Initial counter value.\n */\n constructor({\n issuer = HOTP.defaults.issuer,\n label = HOTP.defaults.label,\n issuerInLabel = HOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Initial counter value.\n * @type {number}\n */\n this.counter = counter;\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Counter value.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n }) {\n const digest = new Uint8Array(\n hmacDigest(algorithm, secret.buffer, uintToBuf(counter)),\n );\n const offset = digest[digest.byteLength - 1] & 15;\n const otp =\n (((digest[offset] & 127) << 24) |\n ((digest[offset + 1] & 255) << 16) |\n ((digest[offset + 2] & 255) << 8) |\n (digest[offset + 3] & 255)) %\n 10 ** digits;\n\n return otp.toString().padStart(digits, \"0\");\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.counter=this.counter++] Counter value.\n * @returns {string} Token.\n */\n generate({ counter = this.counter++ } = {}) {\n return HOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n });\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.counter=0] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n counter = HOTP.defaults.counter,\n window = HOTP.defaults.window,\n }) {\n // Return early if the token length does not match the digit number.\n if (token.length !== digits) return null;\n\n let delta = null;\n\n for (let i = counter - window; i <= counter + window; ++i) {\n const generatedToken = HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: i,\n });\n\n if (timingSafeEqual(token, generatedToken)) {\n delta = i - counter;\n }\n }\n\n return delta;\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.counter=this.counter] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, counter = this.counter, window }) {\n return HOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://hotp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `counter=${e(this.counter)}`\n );\n }\n}\n\nexport { HOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { Secret } from \"./secret.js\";\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * @see [RFC 6238](https://tools.ietf.org/html/rfc6238)\n */\nclass TOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * period: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n period: 30,\n window: 1,\n };\n }\n\n /**\n * Creates a TOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n */\n constructor({\n issuer = TOTP.defaults.issuer,\n label = TOTP.defaults.label,\n issuerInLabel = TOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = TOTP.defaults.algorithm,\n digits = TOTP.defaults.digits,\n period = TOTP.defaults.period,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Token time-step duration.\n * @type {number}\n */\n this.period = period;\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n }) {\n return HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n });\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n generate({ timestamp = Date.now() } = {}) {\n return TOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n window,\n }) {\n return HOTP.validate({\n token,\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n window,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, timestamp, window }) {\n return TOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://totp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `period=${e(this.period)}`\n );\n }\n}\n\nexport { TOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { TOTP } from \"./totp.js\";\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX =\n /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * @see [Key URI Format](https://github.com/google/google-authenticator/wiki/Key-Uri-Format)\n */\nclass URI {\n /**\n * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n * @param {string} uri Google Authenticator Key URI.\n * @returns {HOTP|TOTP} HOTP/TOTP object.\n */\n static parse(uri) {\n let uriGroups;\n\n try {\n uriGroups = uri.match(OTPURI_REGEX);\n } catch (error) {\n /* Handled below */\n }\n\n if (!Array.isArray(uriGroups)) {\n throw new URIError(\"Invalid URI format\");\n }\n\n // Extract URI groups.\n const uriType = uriGroups[1].toLowerCase();\n const uriLabel = uriGroups[2]\n .split(/(?::|%3A) *(.+)/i, 2)\n .map(decodeURIComponent);\n /** @type {Object.} */\n const uriParams = uriGroups[3].split(\"&\").reduce((acc, cur) => {\n const pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n const pairKey = pairArr[0].toLowerCase();\n const pairVal = pairArr[1];\n /** @type {Object.} */\n const pairAcc = acc;\n\n pairAcc[pairKey] = pairVal;\n return pairAcc;\n }, {});\n\n // 'OTP' will be instantiated with 'config' argument.\n let OTP;\n const config = {};\n\n if (uriType === \"hotp\") {\n OTP = HOTP;\n\n // Counter: required\n if (\n typeof uriParams.counter !== \"undefined\" &&\n INTEGER_REGEX.test(uriParams.counter)\n ) {\n config.counter = parseInt(uriParams.counter, 10);\n } else {\n throw new TypeError(\"Missing or invalid 'counter' parameter\");\n }\n } else if (uriType === \"totp\") {\n OTP = TOTP;\n\n // Period: optional\n if (typeof uriParams.period !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n config.period = parseInt(uriParams.period, 10);\n } else {\n throw new TypeError(\"Invalid 'period' parameter\");\n }\n }\n } else {\n throw new TypeError(\"Unknown OTP type\");\n }\n\n // Label: required\n // Issuer: optional\n if (typeof uriParams.issuer !== \"undefined\") {\n config.issuer = uriParams.issuer;\n }\n if (uriLabel.length === 2) {\n config.label = uriLabel[1];\n if (typeof config.issuer === \"undefined\" || config.issuer === \"\") {\n config.issuer = uriLabel[0];\n } else if (uriLabel[0] === \"\") {\n config.issuerInLabel = false;\n }\n } else {\n config.label = uriLabel[0];\n if (typeof config.issuer !== \"undefined\" && config.issuer !== \"\") {\n config.issuerInLabel = false;\n }\n }\n\n // Secret: required\n if (\n typeof uriParams.secret !== \"undefined\" &&\n SECRET_REGEX.test(uriParams.secret)\n ) {\n config.secret = uriParams.secret;\n } else {\n throw new TypeError(\"Missing or invalid 'secret' parameter\");\n }\n\n // Algorithm: optional\n if (typeof uriParams.algorithm !== \"undefined\") {\n if (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n config.algorithm = uriParams.algorithm;\n } else {\n throw new TypeError(\"Invalid 'algorithm' parameter\");\n }\n }\n\n // Digits: optional\n if (typeof uriParams.digits !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n config.digits = parseInt(uriParams.digits, 10);\n } else {\n throw new TypeError(\"Invalid 'digits' parameter\");\n }\n }\n\n return new OTP(config);\n }\n\n /**\n * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n * @param {HOTP|TOTP} otp HOTP/TOTP object.\n * @returns {string} Google Authenticator Key URI.\n */\n static stringify(otp) {\n if (otp instanceof HOTP || otp instanceof TOTP) {\n return otp.toString();\n }\n\n throw new TypeError(\"Invalid 'HOTP/TOTP' object\");\n }\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = \"__OTPAUTH_VERSION__\";\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","globalScope","globalThis","Object","defineProperty","prototype","get","configurable","__GLOBALTHIS__","self","window","global","OPENSSL_JSSHA_ALGO_MAP","SHA1","SHA224","SHA256","SHA384","SHA512","hmacDigest","algorithm","key","message","crypto","createHmac","hmac","Buffer","from","update","digest","buffer","variant","toUpperCase","TypeError","jsSHA","setHMACKey","getHMAC","ALPHABET","base32ToBuf","str","end","length","cstr","substring","bits","value","index","idx","indexOf","base32FromBuf","hexToBuf","parseInt","hexFromBuf","hex","toString","latin1ToBuf","charCodeAt","latin1FromBuf","String","fromCharCode","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","Error","encode","utf8FromBuf","decode","randomBytes","size","_a","getRandomValues","Secret","constructor","fromLatin1","fromUTF8","fromBase32","fromHex","latin1","enumerable","utf8","base32","timingSafeEqual","a","b","out","HOTP","defaults","issuer","label","issuerInLabel","digits","counter","secret","generate","offset","byteLength","__pow","padStart","validate","token","delta","generatedToken","e","encodeURIComponent","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","parse","uri","uriGroups","match","error","Array","isArray","URIError","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","OTP","config","test","stringify","otp","version"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"otpauth.node.min.mjs","sources":["../src/utils/encoding/uint.js","../src/utils/global-scope.js","../src/utils/crypto/hmac-digest.js","../src/utils/encoding/base32.js","../src/utils/encoding/hex.js","../src/utils/encoding/latin1.js","../src/utils/encoding/utf8.js","../src/utils/crypto/random-bytes.js","../src/secret.js","../src/utils/crypto/timing-safe-equal.js","../src/hotp.js","../src/totp.js","../src/uri.js","../src/version.js"],"sourcesContent":["/**\n * Converts an integer to an ArrayBuffer.\n * @param {number} num Integer.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst uintToBuf = (num) => {\n const buf = new ArrayBuffer(8);\n const arr = new Uint8Array(buf);\n let acc = num;\n\n for (let i = 7; i >= 0; i--) {\n if (acc === 0) break;\n arr[i] = acc & 255;\n acc -= arr[i];\n acc /= 256;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let num = 0;\n\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] !== 0) {\n num *= 256;\n num += arr[i];\n }\n }\n\n return num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * \"globalThis\" ponyfill.\n * @see [A horrifying globalThis polyfill in universal JavaScript](https://mathiasbynens.be/notes/globalthis)\n * @type {Object.}\n */\nconst globalScope = (() => {\n if (typeof globalThis === \"object\") return globalThis;\n else {\n Object.defineProperty(Object.prototype, \"__GLOBALTHIS__\", {\n get() {\n return this;\n },\n configurable: true,\n });\n try {\n // @ts-ignore\n // eslint-disable-next-line no-undef\n if (typeof __GLOBALTHIS__ !== \"undefined\") return __GLOBALTHIS__;\n } finally {\n // @ts-ignore\n delete Object.prototype.__GLOBALTHIS__;\n }\n }\n\n // Still unable to determine \"globalThis\", fall back to a naive method.\n if (typeof self !== \"undefined\") return self;\n else if (typeof window !== \"undefined\") return window;\n else if (typeof global !== \"undefined\") return global;\n\n return undefined;\n})();\n\nexport { globalScope };\n","import * as crypto from \"node:crypto\";\nimport jsSHA from \"jssha\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * OpenSSL to jsSHA algorithms map.\n * @type {Object.}\n */\nconst OPENSSL_JSSHA_ALGO_MAP = {\n SHA1: \"SHA-1\",\n SHA224: \"SHA-224\",\n SHA256: \"SHA-256\",\n SHA384: \"SHA-384\",\n SHA512: \"SHA-512\",\n \"SHA3-224\": \"SHA3-224\",\n \"SHA3-256\": \"SHA3-256\",\n \"SHA3-384\": \"SHA3-384\",\n \"SHA3-512\": \"SHA3-512\",\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n if (crypto?.createHmac) {\n const hmac = crypto.createHmac(algorithm, globalScope.Buffer.from(key));\n hmac.update(globalScope.Buffer.from(message));\n return hmac.digest().buffer;\n } else {\n const variant = OPENSSL_JSSHA_ALGO_MAP[algorithm.toUpperCase()];\n if (typeof variant === \"undefined\") {\n throw new TypeError(\"Unknown hash function\");\n }\n const hmac = new jsSHA(variant, \"ARRAYBUFFER\");\n hmac.setHMACKey(key, \"ARRAYBUFFER\");\n hmac.update(message);\n return hmac.getHMAC(\"ARRAYBUFFER\");\n }\n};\n\nexport { hmacDigest };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * @see [LinusU/base32-decode](https://github.com/LinusU/base32-decode)\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n // Canonicalize to all upper case and remove padding if it exists.\n let end = str.length;\n while (str[end - 1] === \"=\") --end;\n const cstr = (end < str.length ? str.substring(0, end) : str).toUpperCase();\n\n const buf = new ArrayBuffer(((cstr.length * 5) / 8) | 0);\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let index = 0;\n\n for (let i = 0; i < cstr.length; i++) {\n const idx = ALPHABET.indexOf(cstr[i]);\n if (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n value = (value << 5) | idx;\n bits += 5;\n\n if (bits >= 8) {\n bits -= 8;\n arr[index++] = value >>> bits;\n }\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * @see [LinusU/base32-encode](https://github.com/LinusU/base32-encode)\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let bits = 0;\n let value = 0;\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n value = (value << 8) | arr[i];\n bits += 8;\n\n while (bits >= 5) {\n str += ALPHABET[(value >>> (bits - 5)) & 31];\n bits -= 5;\n }\n }\n\n if (bits > 0) {\n str += ALPHABET[(value << (5 - bits)) & 31];\n }\n\n return str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n const buf = new ArrayBuffer(str.length / 2);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i += 2) {\n arr[i / 2] = parseInt(str.substring(i, i + 2), 16);\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n const hex = arr[i].toString(16);\n if (hex.length === 1) str += \"0\";\n str += hex;\n }\n\n return str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n const buf = new ArrayBuffer(str.length);\n const arr = new Uint8Array(buf);\n\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i) & 0xff;\n }\n\n return buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n const arr = new Uint8Array(buf);\n let str = \"\";\n\n for (let i = 0; i < arr.length; i++) {\n str += String.fromCharCode(arr[i]);\n }\n\n return str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalScope } from \"../global-scope.js\";\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalScope.TextEncoder\n ? new globalScope.TextEncoder(\"utf-8\")\n : null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalScope.TextDecoder\n ? new globalScope.TextDecoder(\"utf-8\")\n : null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n if (!ENCODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n if (!DECODER) {\n throw new Error(\"Encoding API not available\");\n }\n\n return DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n if (crypto?.randomBytes) {\n return crypto.randomBytes(size).buffer;\n } else {\n if (!globalScope.crypto?.getRandomValues) {\n throw new Error(\"Cryptography API not available\");\n }\n return globalScope.crypto.getRandomValues(new Uint8Array(size)).buffer;\n }\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from \"./utils/encoding/base32.js\";\nimport { hexToBuf, hexFromBuf } from \"./utils/encoding/hex.js\";\nimport { latin1ToBuf, latin1FromBuf } from \"./utils/encoding/latin1.js\";\nimport { utf8ToBuf, utf8FromBuf } from \"./utils/encoding/utf8.js\";\nimport { randomBytes } from \"./utils/crypto/random-bytes.js\";\n\n/**\n * OTP secret key.\n */\nclass Secret {\n /**\n * Creates a secret key object.\n * @param {Object} [config] Configuration options.\n * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n */\n constructor({ buffer, size = 20 } = {}) {\n /**\n * Secret key.\n * @type {ArrayBuffer}\n */\n this.buffer = typeof buffer === \"undefined\" ? randomBytes(size) : buffer;\n }\n\n /**\n * Converts a Latin-1 string to a Secret object.\n * @param {string} str Latin-1 string.\n * @returns {Secret} Secret object.\n */\n static fromLatin1(str) {\n return new Secret({ buffer: latin1ToBuf(str) });\n }\n\n /**\n * Converts an UTF-8 string to a Secret object.\n * @param {string} str UTF-8 string.\n * @returns {Secret} Secret object.\n */\n static fromUTF8(str) {\n return new Secret({ buffer: utf8ToBuf(str) });\n }\n\n /**\n * Converts a base32 string to a Secret object.\n * @param {string} str Base32 string.\n * @returns {Secret} Secret object.\n */\n static fromBase32(str) {\n return new Secret({ buffer: base32ToBuf(str) });\n }\n\n /**\n * Converts a hexadecimal string to a Secret object.\n * @param {string} str Hexadecimal string.\n * @returns {Secret} Secret object.\n */\n static fromHex(str) {\n return new Secret({ buffer: hexToBuf(str) });\n }\n\n /**\n * Latin-1 string representation of secret key.\n * @type {string}\n */\n get latin1() {\n Object.defineProperty(this, \"latin1\", {\n enumerable: true,\n value: latin1FromBuf(this.buffer),\n });\n\n return this.latin1;\n }\n\n /**\n * UTF-8 string representation of secret key.\n * @type {string}\n */\n get utf8() {\n Object.defineProperty(this, \"utf8\", {\n enumerable: true,\n value: utf8FromBuf(this.buffer),\n });\n\n return this.utf8;\n }\n\n /**\n * Base32 string representation of secret key.\n * @type {string}\n */\n get base32() {\n Object.defineProperty(this, \"base32\", {\n enumerable: true,\n value: base32FromBuf(this.buffer),\n });\n\n return this.base32;\n }\n\n /**\n * Hexadecimal string representation of secret key.\n * @type {string}\n */\n get hex() {\n Object.defineProperty(this, \"hex\", {\n enumerable: true,\n value: hexFromBuf(this.buffer),\n });\n\n return this.hex;\n }\n}\n\nexport { Secret };\n","import * as crypto from \"node:crypto\";\n\nimport { globalScope } from \"../global-scope.js\";\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n if (crypto?.timingSafeEqual) {\n return crypto.timingSafeEqual(\n globalScope.Buffer.from(a),\n globalScope.Buffer.from(b),\n );\n } else {\n if (a.length !== b.length) {\n throw new TypeError(\"Input strings must have the same length\");\n }\n let i = -1;\n let out = 0;\n while (++i < a.length) {\n out |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return out === 0;\n }\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from \"./utils/encoding/uint.js\";\nimport { hmacDigest } from \"./utils/crypto/hmac-digest.js\";\nimport { Secret } from \"./secret.js\";\nimport { timingSafeEqual } from \"./utils/crypto/timing-safe-equal.js\";\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * @see [RFC 4226](https://tools.ietf.org/html/rfc4226)\n */\nclass HOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * counter: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n counter: 0,\n window: 1,\n };\n }\n\n /**\n * Creates an HOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Initial counter value.\n */\n constructor({\n issuer = HOTP.defaults.issuer,\n label = HOTP.defaults.label,\n issuerInLabel = HOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Initial counter value.\n * @type {number}\n */\n this.counter = counter;\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.counter=0] Counter value.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm = HOTP.defaults.algorithm,\n digits = HOTP.defaults.digits,\n counter = HOTP.defaults.counter,\n }) {\n const digest = new Uint8Array(\n hmacDigest(algorithm, secret.buffer, uintToBuf(counter)),\n );\n const offset = digest[digest.byteLength - 1] & 15;\n const otp =\n (((digest[offset] & 127) << 24) |\n ((digest[offset + 1] & 255) << 16) |\n ((digest[offset + 2] & 255) << 8) |\n (digest[offset + 3] & 255)) %\n 10 ** digits;\n\n return otp.toString().padStart(digits, \"0\");\n }\n\n /**\n * Generates an HOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.counter=this.counter++] Counter value.\n * @returns {string} Token.\n */\n generate({ counter = this.counter++ } = {}) {\n return HOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n });\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.counter=0] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n counter = HOTP.defaults.counter,\n window = HOTP.defaults.window,\n }) {\n // Return early if the token length does not match the digit number.\n if (token.length !== digits) return null;\n\n let delta = null;\n\n const check = (/** @type {number} */ i) => {\n const generatedToken = HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: i,\n });\n if (timingSafeEqual(token, generatedToken)) {\n delta = i - counter;\n }\n };\n\n check(counter);\n for (let i = 1; i <= window && delta === null; ++i) {\n check(counter - i);\n if (delta !== null) break;\n check(counter + i);\n if (delta !== null) break;\n }\n\n return delta;\n }\n\n /**\n * Validates an HOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.counter=this.counter] Counter value.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, counter = this.counter, window }) {\n return HOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n counter,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://hotp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `counter=${e(this.counter)}`\n );\n }\n}\n\nexport { HOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { Secret } from \"./secret.js\";\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * @see [RFC 6238](https://tools.ietf.org/html/rfc6238)\n */\nclass TOTP {\n /**\n * Default configuration.\n * @type {{\n * issuer: string,\n * label: string,\n * issuerInLabel: boolean,\n * algorithm: string,\n * digits: number,\n * period: number\n * window: number\n * }}\n */\n static get defaults() {\n return {\n issuer: \"\",\n label: \"OTPAuth\",\n issuerInLabel: true,\n algorithm: \"SHA1\",\n digits: 6,\n period: 30,\n window: 1,\n };\n }\n\n /**\n * Creates a TOTP object.\n * @param {Object} [config] Configuration options.\n * @param {string} [config.issuer=''] Account provider.\n * @param {string} [config.label='OTPAuth'] Account label.\n * @param {boolean} [config.issuerInLabel=true] Include issuer prefix in label.\n * @param {Secret|string} [config.secret=Secret] Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n */\n constructor({\n issuer = TOTP.defaults.issuer,\n label = TOTP.defaults.label,\n issuerInLabel = TOTP.defaults.issuerInLabel,\n secret = new Secret(),\n algorithm = TOTP.defaults.algorithm,\n digits = TOTP.defaults.digits,\n period = TOTP.defaults.period,\n } = {}) {\n /**\n * Account provider.\n * @type {string}\n */\n this.issuer = issuer;\n /**\n * Account label.\n * @type {string}\n */\n this.label = label;\n /**\n * Include issuer prefix in label.\n * @type {boolean}\n */\n this.issuerInLabel = issuerInLabel;\n /**\n * Secret key.\n * @type {Secret}\n */\n this.secret =\n typeof secret === \"string\" ? Secret.fromBase32(secret) : secret;\n /**\n * HMAC hashing algorithm.\n * @type {string}\n */\n this.algorithm = algorithm.toUpperCase();\n /**\n * Token length.\n * @type {number}\n */\n this.digits = digits;\n /**\n * Token time-step duration.\n * @type {number}\n */\n this.period = period;\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} [config.digits=6] Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n static generate({\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n }) {\n return HOTP.generate({\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n });\n }\n\n /**\n * Generates a TOTP token.\n * @param {Object} [config] Configuration options.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @returns {string} Token.\n */\n generate({ timestamp = Date.now() } = {}) {\n return TOTP.generate({\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {Secret} config.secret Secret key.\n * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n * @param {number} config.digits Token length.\n * @param {number} [config.period=30] Token time-step duration.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n static validate({\n token,\n secret,\n algorithm,\n digits,\n period = TOTP.defaults.period,\n timestamp = Date.now(),\n window,\n }) {\n return HOTP.validate({\n token,\n secret,\n algorithm,\n digits,\n counter: Math.floor(timestamp / 1000 / period),\n window,\n });\n }\n\n /**\n * Validates a TOTP token.\n * @param {Object} config Configuration options.\n * @param {string} config.token Token value.\n * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n * @param {number} [config.window=1] Window of counter values to test.\n * @returns {number|null} Token delta or null if it is not found in the search window, in which case it should be considered invalid.\n */\n validate({ token, timestamp, window }) {\n return TOTP.validate({\n token,\n secret: this.secret,\n algorithm: this.algorithm,\n digits: this.digits,\n period: this.period,\n timestamp,\n window,\n });\n }\n\n /**\n * Returns a Google Authenticator key URI.\n * @returns {string} URI.\n */\n toString() {\n const e = encodeURIComponent;\n return (\n \"otpauth://totp/\" +\n `${\n this.issuer.length > 0\n ? this.issuerInLabel\n ? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?issuer=${e(this.issuer)}&`\n : `${e(this.label)}?`\n }` +\n `secret=${e(this.secret.base32)}&` +\n `algorithm=${e(this.algorithm)}&` +\n `digits=${e(this.digits)}&` +\n `period=${e(this.period)}`\n );\n }\n}\n\nexport { TOTP };\n","import { HOTP } from \"./hotp.js\";\nimport { TOTP } from \"./totp.js\";\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX =\n /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * @see [Key URI Format](https://github.com/google/google-authenticator/wiki/Key-Uri-Format)\n */\nclass URI {\n /**\n * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n * @param {string} uri Google Authenticator Key URI.\n * @returns {HOTP|TOTP} HOTP/TOTP object.\n */\n static parse(uri) {\n let uriGroups;\n\n try {\n uriGroups = uri.match(OTPURI_REGEX);\n // eslint-disable-next-line no-unused-vars\n } catch (_) {\n /* Handled below */\n }\n\n if (!Array.isArray(uriGroups)) {\n throw new URIError(\"Invalid URI format\");\n }\n\n // Extract URI groups.\n const uriType = uriGroups[1].toLowerCase();\n const uriLabel = uriGroups[2]\n .split(/(?::|%3A) *(.+)/i, 2)\n .map(decodeURIComponent);\n /** @type {Object.} */\n const uriParams = uriGroups[3].split(\"&\").reduce((acc, cur) => {\n const pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n const pairKey = pairArr[0].toLowerCase();\n const pairVal = pairArr[1];\n /** @type {Object.} */\n const pairAcc = acc;\n\n pairAcc[pairKey] = pairVal;\n return pairAcc;\n }, {});\n\n // 'OTP' will be instantiated with 'config' argument.\n let OTP;\n const config = {};\n\n if (uriType === \"hotp\") {\n OTP = HOTP;\n\n // Counter: required\n if (\n typeof uriParams.counter !== \"undefined\" &&\n INTEGER_REGEX.test(uriParams.counter)\n ) {\n config.counter = parseInt(uriParams.counter, 10);\n } else {\n throw new TypeError(\"Missing or invalid 'counter' parameter\");\n }\n } else if (uriType === \"totp\") {\n OTP = TOTP;\n\n // Period: optional\n if (typeof uriParams.period !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n config.period = parseInt(uriParams.period, 10);\n } else {\n throw new TypeError(\"Invalid 'period' parameter\");\n }\n }\n } else {\n throw new TypeError(\"Unknown OTP type\");\n }\n\n // Label: required\n // Issuer: optional\n if (typeof uriParams.issuer !== \"undefined\") {\n config.issuer = uriParams.issuer;\n }\n if (uriLabel.length === 2) {\n config.label = uriLabel[1];\n if (typeof config.issuer === \"undefined\" || config.issuer === \"\") {\n config.issuer = uriLabel[0];\n } else if (uriLabel[0] === \"\") {\n config.issuerInLabel = false;\n }\n } else {\n config.label = uriLabel[0];\n if (typeof config.issuer !== \"undefined\" && config.issuer !== \"\") {\n config.issuerInLabel = false;\n }\n }\n\n // Secret: required\n if (\n typeof uriParams.secret !== \"undefined\" &&\n SECRET_REGEX.test(uriParams.secret)\n ) {\n config.secret = uriParams.secret;\n } else {\n throw new TypeError(\"Missing or invalid 'secret' parameter\");\n }\n\n // Algorithm: optional\n if (typeof uriParams.algorithm !== \"undefined\") {\n if (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n config.algorithm = uriParams.algorithm;\n } else {\n throw new TypeError(\"Invalid 'algorithm' parameter\");\n }\n }\n\n // Digits: optional\n if (typeof uriParams.digits !== \"undefined\") {\n if (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n config.digits = parseInt(uriParams.digits, 10);\n } else {\n throw new TypeError(\"Invalid 'digits' parameter\");\n }\n }\n\n return new OTP(config);\n }\n\n /**\n * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n * @param {HOTP|TOTP} otp HOTP/TOTP object.\n * @returns {string} Google Authenticator Key URI.\n */\n static stringify(otp) {\n if (otp instanceof HOTP || otp instanceof TOTP) {\n return otp.toString();\n }\n\n throw new TypeError(\"Invalid 'HOTP/TOTP' object\");\n }\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = \"__OTPAUTH_VERSION__\";\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","globalScope","globalThis","Object","defineProperty","prototype","get","configurable","__GLOBALTHIS__","self","window","global","OPENSSL_JSSHA_ALGO_MAP","SHA1","SHA224","SHA256","SHA384","SHA512","hmacDigest","algorithm","key","message","crypto","createHmac","hmac","Buffer","from","update","digest","buffer","variant","toUpperCase","TypeError","jsSHA","setHMACKey","getHMAC","ALPHABET","base32ToBuf","str","end","length","cstr","substring","bits","value","index","idx","indexOf","base32FromBuf","hexToBuf","parseInt","hexFromBuf","hex","toString","latin1ToBuf","charCodeAt","latin1FromBuf","String","fromCharCode","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","Error","encode","utf8FromBuf","decode","randomBytes","size","_a","getRandomValues","Secret","constructor","fromLatin1","fromUTF8","fromBase32","fromHex","latin1","enumerable","utf8","base32","timingSafeEqual","a","b","out","HOTP","defaults","issuer","label","issuerInLabel","digits","counter","secret","generate","offset","byteLength","__pow","padStart","validate","token","delta","check","generatedToken","e","encodeURIComponent","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","parse","uri","uriGroups","match","_","Array","isArray","URIError","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","OTP","config","test","stringify","otp","version"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/otpauth.node.mjs b/dist/otpauth.node.mjs
index 8ea898e..88f50f0 100644
--- a/dist/otpauth.node.mjs
+++ b/dist/otpauth.node.mjs
@@ -36,6 +36,7 @@ const globalScope = (() => {
});
try {
// @ts-ignore
+ // eslint-disable-next-line no-undef
if (typeof __GLOBALTHIS__ !== "undefined") return __GLOBALTHIS__;
} finally {
// @ts-ignore
@@ -541,7 +542,7 @@ class HOTP {
// Return early if the token length does not match the digit number.
if (token.length !== digits) return null;
let delta = null;
- for (let i = counter - window; i <= counter + window; ++i) {
+ const check = ( /** @type {number} */i) => {
const generatedToken = HOTP.generate({
secret,
algorithm,
@@ -551,6 +552,13 @@ class HOTP {
if (timingSafeEqual(token, generatedToken)) {
delta = i - counter;
}
+ };
+ check(counter);
+ for (let i = 1; i <= window && delta === null; ++i) {
+ check(counter - i);
+ if (delta !== null) break;
+ check(counter + i);
+ if (delta !== null) break;
}
return delta;
}
@@ -826,7 +834,8 @@ class URI {
let uriGroups;
try {
uriGroups = uri.match(OTPURI_REGEX);
- } catch (error) {
+ // eslint-disable-next-line no-unused-vars
+ } catch (_) {
/* Handled below */
}
if (!Array.isArray(uriGroups)) {
@@ -937,6 +946,6 @@ class URI {
* Library version.
* @type {string}
*/
-const version = "9.2.3";
+const version = "9.2.4";
export { HOTP, Secret, TOTP, URI, version };
diff --git a/dist/otpauth.umd.js b/dist/otpauth.umd.js
index e743636..e20fa92 100644
--- a/dist/otpauth.umd.js
+++ b/dist/otpauth.umd.js
@@ -762,6 +762,7 @@
});
try {
// @ts-ignore
+ // eslint-disable-next-line no-undef
if (typeof __GLOBALTHIS__ !== "undefined") return __GLOBALTHIS__;
} finally {
// @ts-ignore
@@ -1259,7 +1260,7 @@
// Return early if the token length does not match the digit number.
if (token.length !== digits) return null;
let delta = null;
- for (let i = counter - window; i <= counter + window; ++i) {
+ const check = ( /** @type {number} */i) => {
const generatedToken = HOTP.generate({
secret,
algorithm,
@@ -1269,6 +1270,13 @@
if (timingSafeEqual(token, generatedToken)) {
delta = i - counter;
}
+ };
+ check(counter);
+ for (let i = 1; i <= window && delta === null; ++i) {
+ check(counter - i);
+ if (delta !== null) break;
+ check(counter + i);
+ if (delta !== null) break;
}
return delta;
}
@@ -1544,7 +1552,8 @@
let uriGroups;
try {
uriGroups = uri.match(OTPURI_REGEX);
- } catch (error) {
+ // eslint-disable-next-line no-unused-vars
+ } catch (_) {
/* Handled below */
}
if (!Array.isArray(uriGroups)) {
@@ -1655,7 +1664,7 @@
* Library version.
* @type {string}
*/
- const version = "9.2.3";
+ const version = "9.2.4";
exports.HOTP = HOTP;
exports.Secret = Secret;
diff --git a/dist/otpauth.umd.min.js b/dist/otpauth.umd.min.js
index 07e8d44..69d5998 100644
--- a/dist/otpauth.umd.min.js
+++ b/dist/otpauth.umd.min.js
@@ -1,3 +1,3 @@
///
-(function(C,P){typeof exports=="object"&&typeof module!="undefined"?P(exports):typeof define=="function"&&define.amd?define(["exports"],P):(C=typeof globalThis!="undefined"?globalThis:C||self,P(C.OTPAuth={}))})(this,function(C){"use strict";const P=r=>{const e=new ArrayBuffer(8),n=new Uint8Array(e);let t=r;for(let i=7;i>=0&&t!==0;i--)n[i]=t&255,t-=n[i],t/=256;return e};var Z=Object.freeze({__proto__:null,createHmac:void 0,randomBytes:void 0,timingSafeEqual:void 0});const W="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",_="ARRAYBUFFER not supported by this environment",ee="UINT8ARRAY not supported by this environment";function te(r,e,n,t){let i,s,u;const c=e||[0],a=(n=n||0)>>>3,l=t===-1?3:0;for(i=0;i>>2,c.length<=s&&c.push(0),c[s]|=r[i]<<8*(l+t*(u%4));return{value:c,binLen:8*r.length+n}}function F(r,e,n){switch(e){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(r){case"HEX":return function(t,i,s){return function(u,c,a,l){let d,h,f,g;if(u.length%2!=0)throw new Error("String of HEX type must be in byte increments");const p=c||[0],m=(a=a||0)>>>3,A=l===-1?3:0;for(d=0;d>>1)+m,f=g>>>2;p.length<=f;)p.push(0);p[f]|=h<<8*(A+l*(g%4))}return{value:p,binLen:4*u.length+a}}(t,i,s,n)};case"TEXT":return function(t,i,s){return function(u,c,a,l,d){let h,f,g,p,m,A,y,b,S=0;const H=a||[0],U=(l=l||0)>>>3;if(c==="UTF8")for(y=d===-1?3:0,g=0;gh?f.push(h):2048>h?(f.push(192|h>>>6),f.push(128|63&h)):55296>h||57344<=h?f.push(224|h>>>12,128|h>>>6&63,128|63&h):(g+=1,h=65536+((1023&h)<<10|1023&u.charCodeAt(g)),f.push(240|h>>>18,128|h>>>12&63,128|h>>>6&63,128|63&h)),p=0;p>>2;H.length<=m;)H.push(0);H[m]|=f[p]<<8*(y+d*(A%4)),S+=1}else for(y=d===-1?2:0,b=c==="UTF16LE"&&d!==1||c!=="UTF16LE"&&d===1,g=0;g>>8),A=S+U,m=A>>>2;H.length<=m;)H.push(0);H[m]|=h<<8*(y+d*(A%4)),S+=2}return{value:H,binLen:8*S+l}}(t,e,i,s,n)};case"B64":return function(t,i,s){return function(u,c,a,l){let d,h,f,g,p,m,A,y=0;const b=c||[0],S=(a=a||0)>>>3,H=l===-1?3:0,U=u.indexOf("=");if(u.search(/^[a-zA-Z0-9=+/]+$/)===-1)throw new Error("Invalid character in base-64 string");if(u=u.replace(/=/g,""),U!==-1&&U>>2;b.length<=m;)b.push(0);b[m]|=(g>>>16-8*f&255)<<8*(H+l*(A%4)),y+=1}}return{value:b,binLen:8*y+a}}(t,i,s,n)};case"BYTES":return function(t,i,s){return function(u,c,a,l){let d,h,f,g;const p=c||[0],m=(a=a||0)>>>3,A=l===-1?3:0;for(h=0;h>>2,p.length<=f&&p.push(0),p[f]|=d<<8*(A+l*(g%4));return{value:p,binLen:8*u.length+a}}(t,i,s,n)};case"ARRAYBUFFER":try{new ArrayBuffer(0)}catch(t){throw new Error(_)}return function(t,i,s){return function(u,c,a,l){return te(new Uint8Array(u),c,a,l)}(t,i,s,n)};case"UINT8ARRAY":try{new Uint8Array(0)}catch(t){throw new Error(ee)}return function(t,i,s){return te(t,i,s,n)};default:throw new Error("format must be HEX, TEXT, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY")}}function ne(r,e,n,t){switch(r){case"HEX":return function(i){return function(s,u,c,a){const l="0123456789abcdef";let d,h,f="";const g=u/8,p=c===-1?3:0;for(d=0;d>>2]>>>8*(p+c*(d%4)),f+=l.charAt(h>>>4&15)+l.charAt(15&h);return a.outputUpper?f.toUpperCase():f}(i,e,n,t)};case"B64":return function(i){return function(s,u,c,a){let l,d,h,f,g,p="";const m=u/8,A=c===-1?3:0;for(l=0;l>>2]:0,g=l+2>>2]:0,h=(s[l>>>2]>>>8*(A+c*(l%4))&255)<<16|(f>>>8*(A+c*((l+1)%4))&255)<<8|g>>>8*(A+c*((l+2)%4))&255,d=0;d<4;d+=1)p+=8*l+6*d<=u?W.charAt(h>>>6*(3-d)&63):a.b64Pad;return p}(i,e,n,t)};case"BYTES":return function(i){return function(s,u,c){let a,l,d="";const h=u/8,f=c===-1?3:0;for(a=0;a>>2]>>>8*(f+c*(a%4))&255,d+=String.fromCharCode(l);return d}(i,e,n)};case"ARRAYBUFFER":try{new ArrayBuffer(0)}catch(i){throw new Error(_)}return function(i){return function(s,u,c){let a;const l=u/8,d=new ArrayBuffer(l),h=new Uint8Array(d),f=c===-1?3:0;for(a=0;a>>2]>>>8*(f+c*(a%4))&255;return d}(i,e,n)};case"UINT8ARRAY":try{new Uint8Array(0)}catch(i){throw new Error(ee)}return function(i){return function(s,u,c){let a;const l=u/8,d=c===-1?3:0,h=new Uint8Array(l);for(a=0;a>>2]>>>8*(d+c*(a%4))&255;return h}(i,e,n)};default:throw new Error("format must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY")}}const O=4294967296,w=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],$=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],K=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],Y="Chosen SHA variant is not supported",re="Cannot set numRounds with MAC";function z(r,e){let n,t;const i=r.binLen>>>3,s=e.binLen>>>3,u=i<<3,c=4-i<<3;if(i%4!=0){for(n=0;n>>2,r.value[t]|=e.value[n>>>2]<>>2]>>>c;return(r.value.length<<2)-4>=s+i&&r.value.pop(),{value:r.value,binLen:r.binLen+e.binLen}}return{value:r.value.concat(e.value),binLen:r.binLen+e.binLen}}function ie(r){const e={outputUpper:!1,b64Pad:"=",outputLen:-1},n=r||{},t="Output length must be a multiple of 8";if(e.outputUpper=n.outputUpper||!1,n.b64Pad&&(e.b64Pad=n.b64Pad),n.outputLen){if(n.outputLen%8!=0)throw new Error(t);e.outputLen=n.outputLen}else if(n.shakeLen){if(n.shakeLen%8!=0)throw new Error(t);e.outputLen=n.shakeLen}if(typeof e.outputUpper!="boolean")throw new Error("Invalid outputUpper formatting option");if(typeof e.b64Pad!="string")throw new Error("Invalid b64Pad formatting option");return e}function B(r,e,n,t){const i=r+" must include a value and format";if(!e){if(!t)throw new Error(i);return t}if(e.value===void 0||!e.format)throw new Error(i);return F(e.format,e.encoding||"UTF8",n)(e.value)}class D{constructor(e,n,t){const i=t||{};if(this.t=n,this.i=i.encoding||"UTF8",this.numRounds=i.numRounds||1,isNaN(this.numRounds)||this.numRounds!==parseInt(this.numRounds,10)||1>this.numRounds)throw new Error("numRounds must a integer >= 1");this.o=e,this.h=[],this.u=0,this.l=!1,this.A=0,this.H=!1,this.S=[],this.p=[]}update(e){let n,t=0;const i=this.m>>>5,s=this.C(e,this.h,this.u),u=s.binLen,c=s.value,a=u>>>5;for(n=0;n>>5),this.u=u%this.m,this.l=!0,this}getHash(e,n){let t,i,s=this.R;const u=ie(n);if(this.K){if(u.outputLen===-1)throw new Error("Output length must be specified in options");s=u.outputLen}const c=ne(e,s,this.T,u);if(this.H&&this.g)return c(this.g(u));for(i=this.F(this.h.slice(),this.u,this.A,this.L(this.U),s),t=1;t>>24-s%32),i=this.F(i,s,0,this.B(this.o),s);return c(i)}setHMACKey(e,n,t){if(!this.M)throw new Error("Variant does not support HMAC");if(this.l)throw new Error("Cannot set MAC key after calling update");const i=F(n,(t||{}).encoding||"UTF8",this.T);this.k(i(e))}k(e){const n=this.m>>>3,t=n/4-1;let i;if(this.numRounds!==1)throw new Error(re);if(this.H)throw new Error("MAC key already set");for(n>>32-e}function L(r,e){return r>>>e|r<<32-e}function se(r,e){return r>>>e}function oe(r,e,n){return r^e^n}function ue(r,e,n){return r&e^~r&n}function he(r,e,n){return r&e^r&n^e&n}function ye(r){return L(r,2)^L(r,13)^L(r,22)}function I(r,e){const n=(65535&r)+(65535&e);return(65535&(r>>>16)+(e>>>16)+(n>>>16))<<16|65535&n}function He(r,e,n,t){const i=(65535&r)+(65535&e)+(65535&n)+(65535&t);return(65535&(r>>>16)+(e>>>16)+(n>>>16)+(t>>>16)+(i>>>16))<<16|65535&i}function x(r,e,n,t,i){const s=(65535&r)+(65535&e)+(65535&n)+(65535&t)+(65535&i);return(65535&(r>>>16)+(e>>>16)+(n>>>16)+(t>>>16)+(i>>>16)+(s>>>16))<<16|65535&s}function Ee(r){return L(r,7)^L(r,18)^se(r,3)}function Ne(r){return L(r,6)^L(r,11)^L(r,25)}function ve(r){return[1732584193,4023233417,2562383102,271733878,3285377520]}function ae(r,e){let n,t,i,s,u,c,a;const l=[];for(n=e[0],t=e[1],i=e[2],s=e[3],u=e[4],a=0;a<80;a+=1)l[a]=a<16?r[a]:M(l[a-3]^l[a-8]^l[a-14]^l[a-16],1),c=a<20?x(M(n,5),ue(t,i,s),u,1518500249,l[a]):a<40?x(M(n,5),oe(t,i,s),u,1859775393,l[a]):a<60?x(M(n,5),he(t,i,s),u,2400959708,l[a]):x(M(n,5),oe(t,i,s),u,3395469782,l[a]),u=s,s=i,i=M(t,30),t=n,n=c;return e[0]=I(n,e[0]),e[1]=I(t,e[1]),e[2]=I(i,e[2]),e[3]=I(s,e[3]),e[4]=I(u,e[4]),e}function Se(r,e,n,t){let i;const s=15+(e+65>>>9<<4),u=e+n;for(;r.length<=s;)r.push(0);for(r[e>>>5]|=128<<24-e%32,r[s]=4294967295&u,r[s-1]=u/O|0,i=0;i>>9<<4),A=l+d;for(;a.length<=m;)a.push(0);for(a[l>>>5]|=128<<24-l%32,a[m]=4294967295&A,a[m-1]=A/O|0,g=0;g32?(n=64-e,new o(r.I<>>n,r.N<>>n)):e!==0?(n=32-e,new o(r.N<>>n,r.I<>>n)):r}function R(r,e){let n;return e<32?(n=32-e,new o(r.N>>>e|r.I<>>e|r.N<>>e|r.N<>>e|r.I<>>e,r.I>>>e|r.N<<32-e)}function Re(r,e,n){return new o(r.N&e.N^r.N&n.N^e.N&n.N,r.I&e.I^r.I&n.I^e.I&n.I)}function Te(r){const e=R(r,28),n=R(r,34),t=R(r,39);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}function v(r,e){let n,t;n=(65535&r.I)+(65535&e.I),t=(r.I>>>16)+(e.I>>>16)+(n>>>16);const i=(65535&t)<<16|65535&n;return n=(65535&r.N)+(65535&e.N)+(t>>>16),t=(r.N>>>16)+(e.N>>>16)+(n>>>16),new o((65535&t)<<16|65535&n,i)}function Ce(r,e,n,t){let i,s;i=(65535&r.I)+(65535&e.I)+(65535&n.I)+(65535&t.I),s=(r.I>>>16)+(e.I>>>16)+(n.I>>>16)+(t.I>>>16)+(i>>>16);const u=(65535&s)<<16|65535&i;return i=(65535&r.N)+(65535&e.N)+(65535&n.N)+(65535&t.N)+(s>>>16),s=(r.N>>>16)+(e.N>>>16)+(n.N>>>16)+(t.N>>>16)+(i>>>16),new o((65535&s)<<16|65535&i,u)}function $e(r,e,n,t,i){let s,u;s=(65535&r.I)+(65535&e.I)+(65535&n.I)+(65535&t.I)+(65535&i.I),u=(r.I>>>16)+(e.I>>>16)+(n.I>>>16)+(t.I>>>16)+(i.I>>>16)+(s>>>16);const c=(65535&u)<<16|65535&s;return s=(65535&r.N)+(65535&e.N)+(65535&n.N)+(65535&t.N)+(65535&i.N)+(u>>>16),u=(r.N>>>16)+(e.N>>>16)+(n.N>>>16)+(t.N>>>16)+(i.N>>>16)+(s>>>16),new o((65535&u)<<16|65535&s,c)}function X(r,e){return new o(r.N^e.N,r.I^e.I)}function Ke(r){const e=R(r,19),n=R(r,61),t=we(r,6);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}function Be(r){const e=R(r,1),n=R(r,8),t=we(r,7);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}function Fe(r){const e=R(r,14),n=R(r,18),t=R(r,41);return new o(e.N^n.N^t.N,e.I^n.I^t.I)}const Me=[new o(w[0],3609767458),new o(w[1],602891725),new o(w[2],3964484399),new o(w[3],2173295548),new o(w[4],4081628472),new o(w[5],3053834265),new o(w[6],2937671579),new o(w[7],3664609560),new o(w[8],2734883394),new o(w[9],1164996542),new o(w[10],1323610764),new o(w[11],3590304994),new o(w[12],4068182383),new o(w[13],991336113),new o(w[14],633803317),new o(w[15],3479774868),new o(w[16],2666613458),new o(w[17],944711139),new o(w[18],2341262773),new o(w[19],2007800933),new o(w[20],1495990901),new o(w[21],1856431235),new o(w[22],3175218132),new o(w[23],2198950837),new o(w[24],3999719339),new o(w[25],766784016),new o(w[26],2566594879),new o(w[27],3203337956),new o(w[28],1034457026),new o(w[29],2466948901),new o(w[30],3758326383),new o(w[31],168717936),new o(w[32],1188179964),new o(w[33],1546045734),new o(w[34],1522805485),new o(w[35],2643833823),new o(w[36],2343527390),new o(w[37],1014477480),new o(w[38],1206759142),new o(w[39],344077627),new o(w[40],1290863460),new o(w[41],3158454273),new o(w[42],3505952657),new o(w[43],106217008),new o(w[44],3606008344),new o(w[45],1432725776),new o(w[46],1467031594),new o(w[47],851169720),new o(w[48],3100823752),new o(w[49],1363258195),new o(w[50],3750685593),new o(w[51],3785050280),new o(w[52],3318307427),new o(w[53],3812723403),new o(w[54],2003034995),new o(w[55],3602036899),new o(w[56],1575990012),new o(w[57],1125592928),new o(w[58],2716904306),new o(w[59],442776044),new o(w[60],593698344),new o(w[61],3733110249),new o(w[62],2999351573),new o(w[63],3815920427),new o(3391569614,3928383900),new o(3515267271,566280711),new o(3940187606,3454069534),new o(4118630271,4000239992),new o(116418474,1914138554),new o(174292421,2731055270),new o(289380356,3203993006),new o(460393269,320620315),new o(685471733,587496836),new o(852142971,1086792851),new o(1017036298,365543100),new o(1126000580,2618297676),new o(1288033470,3409855158),new o(1501505948,4234509866),new o(1607167915,987167468),new o(1816402316,1246189591)];function de(r){return r==="SHA-384"?[new o(3418070365,$[0]),new o(1654270250,$[1]),new o(2438529370,$[2]),new o(355462360,$[3]),new o(1731405415,$[4]),new o(41048885895,$[5]),new o(3675008525,$[6]),new o(1203062813,$[7])]:[new o(K[0],4089235720),new o(K[1],2227873595),new o(K[2],4271175723),new o(K[3],1595750129),new o(K[4],2917565137),new o(K[5],725511199),new o(K[6],4215389547),new o(K[7],327033209)]}function ge(r,e){let n,t,i,s,u,c,a,l,d,h,f,g;const p=[];for(n=e[0],t=e[1],i=e[2],s=e[3],u=e[4],c=e[5],a=e[6],l=e[7],f=0;f<80;f+=1)f<16?(g=2*f,p[f]=new o(r[g],r[g+1])):p[f]=Ce(Ke(p[f-2]),p[f-7],Be(p[f-15]),p[f-16]),d=$e(l,Fe(u),(A=c,y=a,new o((m=u).N&A.N^~m.N&y.N,m.I&A.I^~m.I&y.I)),Me[f],p[f]),h=v(Te(n),Re(n,t,i)),l=a,a=c,c=u,u=v(s,d),s=i,i=t,t=n,n=v(d,h);var m,A,y;return e[0]=v(n,e[0]),e[1]=v(t,e[1]),e[2]=v(i,e[2]),e[3]=v(s,e[3]),e[4]=v(u,e[4]),e[5]=v(c,e[5]),e[6]=v(a,e[6]),e[7]=v(l,e[7]),e}let ke=class extends D{constructor(r,e,n){if(r!=="SHA-384"&&r!=="SHA-512")throw new Error(Y);super(r,e,n);const t=n||{};this.g=this.Y,this.M=!0,this.T=-1,this.C=F(this.t,this.i,this.T),this.v=ge,this.L=function(i){return i.slice()},this.B=de,this.F=function(i,s,u,c){return function(a,l,d,h,f){let g,p;const m=31+(l+129>>>10<<5),A=l+d;for(;a.length<=m;)a.push(0);for(a[l>>>5]|=128<<24-l%32,a[m]=4294967295&A,a[m-1]=A/O|0,g=0;g>>1)%5][(t>>>1)/5|0]=X(e[(t>>>1)%5][(t>>>1)/5|0],new o(r[t+1],r[t]));for(n=0;n<24;n+=1){for(s=V(),t=0;t<5;t+=1)u[t]=(a=e[t][0],l=e[t][1],d=e[t][2],h=e[t][3],f=e[t][4],new o(a.N^l.N^d.N^h.N^f.N,a.I^l.I^d.I^h.I^f.I));for(t=0;t<5;t+=1)c[t]=X(u[(t+4)%5],fe(u[(t+1)%5],1));for(t=0;t<5;t+=1)for(i=0;i<5;i+=1)e[t][i]=X(e[t][i],c[t]);for(t=0;t<5;t+=1)for(i=0;i<5;i+=1)s[i][(2*t+3*i)%5]=fe(e[t][i],Oe[t][i]);for(t=0;t<5;t+=1)for(i=0;i<5;i+=1)e[t][i]=X(s[t][i],new o(~s[(t+1)%5][i].N&s[(t+2)%5][i].N,~s[(t+1)%5][i].I&s[(t+2)%5][i].I));e[0][0]=X(e[0][0],Pe[n])}var a,l,d,h,f;return e}function pe(r){let e,n,t=0;const i=[0,0],s=[4294967295&r,r/O&2097151];for(e=6;e>=0;e--)n=s[e>>2]>>>8*e&255,n===0&&t===0||(i[t+1>>2]|=n<<8*(t+1),t+=1);return t=t!==0?t:1,i[0]|=t,{value:t+1>4?i:[i[0]],binLen:8+8*t}}function J(r){return z(pe(r.binLen),r)}function me(r,e){let n,t=pe(e);t=z(t,r);const i=e>>>2,s=(i-t.value.length%i)%i;for(n=0;n>>5,ht=f>>>5;for(b=0;b=m;b+=G)p=q(h.slice(b,b+G),p),f-=m;for(h=h.slice(b),f%=m;h.length>>3,h[b>>2]^=A<=y));)U.push(S.N),H+=1,64*H%m==0&&(q(null,p),H=0);return U}(u,c,0,l,i,t,d)},s.hmacKey&&this.k(B("hmacKey",s.hmacKey,this.T))}O(r,e){const n=function(i){const s=i||{};return{funcName:B("funcName",s.funcName,1,{value:[],binLen:0}),customization:B("Customization",s.customization,1,{value:[],binLen:0})}}(r||{});e&&(n.funcName=e);const t=z(J(n.funcName),J(n.customization));if(n.customization.binLen!==0||n.funcName.binLen!==0){const i=me(t,this.m>>>3);for(let s=0;s>>5)this.U=this.v(i.slice(s,s+(this.m>>>5)),this.U),this.A+=this.m;return 4}return 31}X(r){const e=function(t){const i=t||{};return{kmacKey:B("kmacKey",i.kmacKey,1),funcName:{value:[1128353099],binLen:32},customization:B("Customization",i.customization,1,{value:[],binLen:0})}}(r||{});this.O(r,e.funcName);const n=me(J(e.kmacKey),this.m>>>3);for(let t=0;t>>5)this.U=this.v(n.slice(t,t+(this.m>>>5)),this.U),this.A+=this.m;this.H=!0}_(r){const e=z({value:this.h.slice(),binLen:this.u},function(n){let t,i,s=0;const u=[0,0],c=[4294967295&n,n/O&2097151];for(t=6;t>=0;t--)i=c[t>>2]>>>8*t&255,i===0&&s===0||(u[s>>2]|=i<<8*s,s+=1);return s=s!==0?s:1,u[s>>2]|=s<<8*s,{value:s+1>4?u:[u[0]],binLen:8+8*s}}(r.outputLen));return this.F(e.value,e.binLen,this.A,this.L(this.U),r.outputLen)}};class Xe{constructor(e,n,t){if(e=="SHA-1")this.P=new Ue(e,n,t);else if(e=="SHA-224"||e=="SHA-256")this.P=new Le(e,n,t);else if(e=="SHA-384"||e=="SHA-512")this.P=new ke(e,n,t);else{if(e!="SHA3-224"&&e!="SHA3-256"&&e!="SHA3-384"&&e!="SHA3-512"&&e!="SHAKE128"&&e!="SHAKE256"&&e!="CSHAKE128"&&e!="CSHAKE256"&&e!="KMAC128"&&e!="KMAC256")throw new Error(Y);this.P=new xe(e,n,t)}}update(e){return this.P.update(e),this}getHash(e,n){return this.P.getHash(e,n)}setHMACKey(e,n,t){this.P.setHMACKey(e,n,t)}getHMAC(e,n){return this.P.getHMAC(e,n)}}const k=(()=>{if(typeof globalThis=="object")return globalThis;Object.defineProperty(Object.prototype,"__GLOBALTHIS__",{get(){return this},configurable:!0});try{if(typeof __GLOBALTHIS__!="undefined")return __GLOBALTHIS__}finally{delete Object.prototype.__GLOBALTHIS__}if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof global!="undefined")return global})(),je={SHA1:"SHA-1",SHA224:"SHA-224",SHA256:"SHA-256",SHA384:"SHA-384",SHA512:"SHA-512","SHA3-224":"SHA3-224","SHA3-256":"SHA3-256","SHA3-384":"SHA3-384","SHA3-512":"SHA3-512"},ze=(r,e,n)=>{Z!=null;{const t=je[r.toUpperCase()];if(typeof t=="undefined")throw new TypeError("Unknown hash function");const i=new Xe(t,"ARRAYBUFFER");return i.setHMACKey(e,"ARRAYBUFFER"),i.update(n),i.getHMAC("ARRAYBUFFER")}},Q="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",De=r=>{let e=r.length;for(;r[e-1]==="=";)--e;const n=(e=8&&(s-=8,i[c++]=u>>>s)}return t},qe=r=>{const e=new Uint8Array(r);let n=0,t=0,i="";for(let s=0;s=5;)i+=Q[t>>>n-5&31],n-=5;return n>0&&(i+=Q[t<<5-n&31]),i},Ge=r=>{const e=new ArrayBuffer(r.length/2),n=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(r);let n="";for(let t=0;t{const e=new ArrayBuffer(r.length),n=new Uint8Array(e);for(let t=0;t{const e=new Uint8Array(r);let n="";for(let t=0;t{if(!Ae)throw new Error("Encoding API not available");return Ae.encode(r).buffer},We=r=>{if(!be)throw new Error("Encoding API not available");return be.decode(r)},_e=r=>{var e;if(Z!=null,!((e=k.crypto)!=null&&e.getRandomValues))throw new Error("Cryptography API not available");return k.crypto.getRandomValues(new Uint8Array(r)).buffer};class T{constructor({buffer:e,size:n=20}={}){this.buffer=typeof e=="undefined"?_e(n):e}static fromLatin1(e){return new T({buffer:Ve(e)})}static fromUTF8(e){return new T({buffer:Qe(e)})}static fromBase32(e){return new T({buffer:De(e)})}static fromHex(e){return new T({buffer:Ge(e)})}get latin1(){return Object.defineProperty(this,"latin1",{enumerable:!0,value:Je(this.buffer)}),this.latin1}get utf8(){return Object.defineProperty(this,"utf8",{enumerable:!0,value:We(this.buffer)}),this.utf8}get base32(){return Object.defineProperty(this,"base32",{enumerable:!0,value:qe(this.buffer)}),this.base32}get hex(){return Object.defineProperty(this,"hex",{enumerable:!0,value:Ze(this.buffer)}),this.hex}}const et=(r,e)=>{Z!=null;{if(r.length!==e.length)throw new TypeError("Input strings must have the same length");let n=-1,t=0;for(;++n0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&counter=${e(this.counter)}`}};class N{static get defaults(){return{issuer:"",label:"OTPAuth",issuerInLabel:!0,algorithm:"SHA1",digits:6,period:30,window:1}}constructor({issuer:e=N.defaults.issuer,label:n=N.defaults.label,issuerInLabel:t=N.defaults.issuerInLabel,secret:i=new T,algorithm:s=N.defaults.algorithm,digits:u=N.defaults.digits,period:c=N.defaults.period}={}){this.issuer=e,this.label=n,this.issuerInLabel=t,this.secret=typeof i=="string"?T.fromBase32(i):i,this.algorithm=s.toUpperCase(),this.digits=u,this.period=c}static generate({secret:e,algorithm:n,digits:t,period:i=N.defaults.period,timestamp:s=Date.now()}){return j.generate({secret:e,algorithm:n,digits:t,counter:Math.floor(s/1e3/i)})}generate({timestamp:e=Date.now()}={}){return N.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:e})}static validate({token:e,secret:n,algorithm:t,digits:i,period:s=N.defaults.period,timestamp:u=Date.now(),window:c}){return j.validate({token:e,secret:n,algorithm:t,digits:i,counter:Math.floor(u/1e3/s),window:c})}validate({token:e,timestamp:n,window:t}){return N.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:n,window:t})}toString(){const e=encodeURIComponent;return`otpauth://totp/${this.issuer.length>0?this.issuerInLabel?`${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?issuer=${e(this.issuer)}&`:`${e(this.label)}?`}secret=${e(this.secret.base32)}&algorithm=${e(this.algorithm)}&digits=${e(this.digits)}&period=${e(this.period)}`}}const nt=/^otpauth:\/\/([ht]otp)\/(.+)\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i,rt=/^[2-7A-Z]+=*$/i,it=/^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i,st=/^[+-]?\d+$/,Ie=/^\+?[1-9]\d*$/;class ot{static parse(e){let n;try{n=e.match(nt)}catch(a){}if(!Array.isArray(n))throw new URIError("Invalid URI format");const t=n[1].toLowerCase(),i=n[2].split(/(?::|%3A) *(.+)/i,2).map(decodeURIComponent),s=n[3].split("&").reduce((a,l)=>{const d=l.split(/=(.*)/,2).map(decodeURIComponent),h=d[0].toLowerCase(),f=d[1],g=a;return g[h]=f,g},{});let u;const c={};if(t==="hotp")if(u=j,typeof s.counter!="undefined"&&st.test(s.counter))c.counter=parseInt(s.counter,10);else throw new TypeError("Missing or invalid 'counter' parameter");else if(t==="totp"){if(u=N,typeof s.period!="undefined")if(Ie.test(s.period))c.period=parseInt(s.period,10);else throw new TypeError("Invalid 'period' parameter")}else throw new TypeError("Unknown OTP type");if(typeof s.issuer!="undefined"&&(c.issuer=s.issuer),i.length===2?(c.label=i[1],typeof c.issuer=="undefined"||c.issuer===""?c.issuer=i[0]:i[0]===""&&(c.issuerInLabel=!1)):(c.label=i[0],typeof c.issuer!="undefined"&&c.issuer!==""&&(c.issuerInLabel=!1)),typeof s.secret!="undefined"&&rt.test(s.secret))c.secret=s.secret;else throw new TypeError("Missing or invalid 'secret' parameter");if(typeof s.algorithm!="undefined")if(it.test(s.algorithm))c.algorithm=s.algorithm;else throw new TypeError("Invalid 'algorithm' parameter");if(typeof s.digits!="undefined")if(Ie.test(s.digits))c.digits=parseInt(s.digits,10);else throw new TypeError("Invalid 'digits' parameter");return new u(c)}static stringify(e){if(e instanceof j||e instanceof N)return e.toString();throw new TypeError("Invalid 'HOTP/TOTP' object")}}const ut="9.2.3";C.HOTP=j,C.Secret=T,C.TOTP=N,C.URI=ot,C.version=ut});
+(function(C,P){typeof exports=="object"&&typeof module!="undefined"?P(exports):typeof define=="function"&&define.amd?define(["exports"],P):(C=typeof globalThis!="undefined"?globalThis:C||self,P(C.OTPAuth={}))})(this,function(C){"use strict";const P=r=>{const e=new ArrayBuffer(8),n=new Uint8Array(e);let t=r;for(let i=7;i>=0&&t!==0;i--)n[i]=t&255,t-=n[i],t/=256;return e};var Z=Object.freeze({__proto__:null,createHmac:void 0,randomBytes:void 0,timingSafeEqual:void 0});const W="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",_="ARRAYBUFFER not supported by this environment",ee="UINT8ARRAY not supported by this environment";function te(r,e,n,t){let i,s,u;const c=e||[0],a=(n=n||0)>>>3,l=t===-1?3:0;for(i=0;i>>2,c.length<=s&&c.push(0),c[s]|=r[i]<<8*(l+t*(u%4));return{value:c,binLen:8*r.length+n}}function F(r,e,n){switch(e){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(r){case"HEX":return function(t,i,s){return function(u,c,a,l){let d,h,f,g;if(u.length%2!=0)throw new Error("String of HEX type must be in byte increments");const p=c||[0],m=(a=a||0)>>>3,A=l===-1?3:0;for(d=0;d>>1)+m,f=g>>>2;p.length<=f;)p.push(0);p[f]|=h<<8*(A+l*(g%4))}return{value:p,binLen:4*u.length+a}}(t,i,s,n)};case"TEXT":return function(t,i,s){return function(u,c,a,l,d){let h,f,g,p,m,A,y,b,S=0;const H=a||[0],U=(l=l||0)>>>3;if(c==="UTF8")for(y=d===-1?3:0,g=0;gh?f.push(h):2048>h?(f.push(192|h>>>6),f.push(128|63&h)):55296>h||57344<=h?f.push(224|h>>>12,128|h>>>6&63,128|63&h):(g+=1,h=65536+((1023&h)<<10|1023&u.charCodeAt(g)),f.push(240|h>>>18,128|h>>>12&63,128|h>>>6&63,128|63&h)),p=0;p>>2;H.length<=m;)H.push(0);H[m]|=f[p]<<8*(y+d*(A%4)),S+=1}else for(y=d===-1?2:0,b=c==="UTF16LE"&&d!==1||c!=="UTF16LE"&&d===1,g=0;g>>8),A=S+U,m=A>>>2;H.length<=m;)H.push(0);H[m]|=h<<8*(y+d*(A%4)),S+=2}return{value:H,binLen:8*S+l}}(t,e,i,s,n)};case"B64":return function(t,i,s){return function(u,c,a,l){let d,h,f,g,p,m,A,y=0;const b=c||[0],S=(a=a||0)>>>3,H=l===-1?3:0,U=u.indexOf("=");if(u.search(/^[a-zA-Z0-9=+/]+$/)===-1)throw new Error("Invalid character in base-64 string");if(u=u.replace(/=/g,""),U!==-1&&U>>2;b.length<=m;)b.push(0);b[m]|=(g>>>16-8*f&255)<<8*(H+l*(A%4)),y+=1}}return{value:b,binLen:8*y+a}}(t,i,s,n)};case"BYTES":return function(t,i,s){return function(u,c,a,l){let d,h,f,g;const p=c||[0],m=(a=a||0)>>>3,A=l===-1?3:0;for(h=0;h