//! otpauth 9.6.0 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth /// // @ts-nocheck "use strict";function e(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,i.get?i:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,Object.freeze(t)}var t=e(require("node:crypto"));const r=(()=>{if("object"==typeof globalThis)return globalThis;Object.defineProperty(Object.prototype,"__GLOBALTHIS__",{get(){return this},configurable:!0});try{if("undefined"!=typeof __GLOBALTHIS__)return __GLOBALTHIS__}finally{delete Object.prototype.__GLOBALTHIS__}return"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0})(),i=e=>{switch(!0){case/^(?:SHA-?1|SSL3-SHA1)$/i.test(e):return"SHA1";case/^SHA(?:2?-)?224$/i.test(e):return"SHA224";case/^SHA(?:2?-)?256$/i.test(e):return"SHA256";case/^SHA(?:2?-)?384$/i.test(e):return"SHA384";case/^SHA(?:2?-)?512$/i.test(e):return"SHA512";case/^SHA3-224$/i.test(e):return"SHA3-224";case/^SHA3-256$/i.test(e):return"SHA3-256";case/^SHA3-384$/i.test(e):return"SHA3-384";case/^SHA3-512$/i.test(e):return"SHA3-512";default:throw new TypeError(`Unknown hash algorithm: ${e}`)}},s=(e,i,s)=>{if(t?.createHmac){const n=t.createHmac(e,r.Buffer.from(i));return n.update(r.Buffer.from(s)),n.digest()}throw new Error("Missing HMAC function")},n="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",o=e=>{let t=(e=e.replace(/ /g,"").toUpperCase()).length;for(;"="===e[t-1];)--t;t=8&&(s-=8,i[a++]=o>>>s)}return i},a=e=>{let t=0,r=0,i="";for(let s=0;s=5;)i+=n[r>>>t-5&31],t-=5;return t>0&&(i+=n[r<<5-t&31]),i},u="0123456789ABCDEF",l=e=>{e=e.replace(/ /g,"").toUpperCase();const t=new ArrayBuffer(e.length/2),r=new Uint8Array(t);for(let t=0;t{let t="";for(let r=0;r{const t=new ArrayBuffer(e.length),r=new Uint8Array(t);for(let t=0;t{let t="";for(let r=0;r{if(!f)throw new Error("Encoding API not available");return f.encode(e)},p=e=>{if(!g)throw new Error("Encoding API not available");return g.decode(e)};class b{static fromLatin1(e){return new b({buffer:c(e).buffer})}static fromUTF8(e){return new b({buffer:m(e).buffer})}static fromBase32(e){return new b({buffer:o(e).buffer})}static fromHex(e){return new b({buffer:l(e).buffer})}get buffer(){return this.bytes.buffer}get latin1(){return Object.defineProperty(this,"latin1",{enumerable:!0,writable:!1,configurable:!1,value:d(this.bytes)}),this.latin1}get utf8(){return Object.defineProperty(this,"utf8",{enumerable:!0,writable:!1,configurable:!1,value:p(this.bytes)}),this.utf8}get base32(){return Object.defineProperty(this,"base32",{enumerable:!0,writable:!1,configurable:!1,value:a(this.bytes)}),this.base32}get hex(){return Object.defineProperty(this,"hex",{enumerable:!0,writable:!1,configurable:!1,value:h(this.bytes)}),this.hex}constructor({buffer:e,size:i=20}={}){this.bytes=void 0===e?(e=>{if(t?.randomBytes)return t.randomBytes(e);if(r.crypto?.getRandomValues)return r.crypto.getRandomValues(new Uint8Array(e));throw new Error("Cryptography API not available")})(i):new Uint8Array(e),Object.defineProperty(this,"bytes",{enumerable:!0,writable:!1,configurable:!1,value:this.bytes})}}class w{static get defaults(){return{issuer:"",label:"OTPAuth",issuerInLabel:!0,algorithm:"SHA1",digits:6,counter:0,window:1}} static generate({secret:e,algorithm:t=w.defaults.algorithm,digits:r=w.defaults.digits,counter:i=w.defaults.counter,hmac:n=s}){const o="string"==typeof e?b.fromBase32(e):e,a=(e=>{const t=new ArrayBuffer(8),r=new Uint8Array(t);let i=e;for(let e=7;e>=0&&0!==i;e--)r[e]=255&i,i-=r[e],i/=256;return r})(i),u=n(t,o.bytes,a);if(!u?.byteLength||u.byteLength<19)throw new TypeError("Return value must be at least 19 bytes");const l=15&u[u.byteLength-1];return(((127&u[l])<<24|(255&u[l+1])<<16|(255&u[l+2])<<8|255&u[l+3])%10**r).toString().padStart(r,"0")}generate({counter:e=this.counter++}={}){return w.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,counter:e,hmac:this.hmac})}static validate({token:e,secret:i,algorithm:n,digits:o=w.defaults.digits,counter:a=w.defaults.counter,window:u=w.defaults.window,afterCounter:l,hmac:h=s}){if("string"!=typeof e||e.length!==o||!/^\d+$/.test(e))return null;let c=null;const d=s=>{if(!(s>(l??-1/0)))return;const u=w.generate({secret:i,algorithm:n,digits:o,counter:s,hmac:h});((e,i)=>{if(t?.timingSafeEqual)return t.timingSafeEqual(r.Buffer.from(e),r.Buffer.from(i));{if(e.length!==i.length)throw new TypeError("Input strings must have the same length");let t=-1,r=0;for(;++t0?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)}`} constructor({issuer:e=w.defaults.issuer,label:t=w.defaults.label,issuerInLabel:r=w.defaults.issuerInLabel,secret:s=new b,algorithm:n=w.defaults.algorithm,digits:o=w.defaults.digits,counter:a=w.defaults.counter,hmac:u}={}){this.issuer=e,this.label=t,this.issuerInLabel=r,this.secret="string"==typeof s?b.fromBase32(s):s,this.algorithm=u?n:i(n),this.digits=o,this.counter=a,this.hmac=u}}class y{static get defaults(){return{issuer:"",label:"OTPAuth",issuerInLabel:!0,algorithm:"SHA1",digits:6,period:30,window:1}}static counter({period:e=y.defaults.period,timestamp:t=Date.now()}={}){return Math.floor(t/1e3/e)}counter({timestamp:e=Date.now()}={}){return y.counter({period:this.period,timestamp:e})}static remaining({period:e=y.defaults.period,timestamp:t=Date.now()}={}){return 1e3*e-t%(1e3*e)}remaining({timestamp:e=Date.now()}={}){return y.remaining({period:this.period,timestamp:e})}static generate({secret:e,algorithm:t,digits:r,period:i=y.defaults.period,timestamp:s=Date.now(),hmac:n}){return w.generate({secret:e,algorithm:t,digits:r,counter:y.counter({period:i,timestamp:s}),hmac:n})}generate({timestamp:e=Date.now()}={}){return y.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:e,hmac:this.hmac})}static validate({token:e,secret:t,algorithm:r,digits:i,period:s=y.defaults.period,timestamp:n=Date.now(),window:o,afterCounter:a,hmac:u}){return w.validate({token:e,secret:t,algorithm:r,digits:i,counter:y.counter({period:s,timestamp:n}),window:o,afterCounter:a,hmac:u})}validate({token:e,timestamp:t,window:r,afterCounter:i}){return y.validate({token:e,secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:t,window:r,afterCounter:i,hmac:this.hmac})}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)}`}constructor({issuer:e=y.defaults.issuer,label:t=y.defaults.label,issuerInLabel:r=y.defaults.issuerInLabel,secret:s=new b,algorithm:n=y.defaults.algorithm,digits:o=y.defaults.digits,period:a=y.defaults.period,hmac:u}={}){this.issuer=e,this.label=t,this.issuerInLabel=r,this.secret="string"==typeof s?b.fromBase32(s):s,this.algorithm=u?n:i(n),this.digits=o,this.period=a,this.hmac=u}}const A=/^otpauth:\/\/([ht]otp)\/(.+)\?([A-Z0-9.~_-]+=[^?&]*(?:&[A-Z0-9.~_-]+=[^?&]*)*)$/i,v=/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:^|[^\uD800-\uDBFF])[\uDC00-\uDFFF]/,S=/^[2-7A-Z]{2,}=*$/i,I=/^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i,$=/^[A-Z0-9]+(?:[_-][A-Z0-9]+)*$/i,H=/^[+-]?\d+$/,T=/^\+?[1-9]\d*$/;exports.HOTP=w,exports.Secret=b,exports.TOTP=y,exports.URI=class{static parse(e,{hmac:t}={}){let r;try{r=e.match(A)}catch(e){}if(!Array.isArray(r)||v.test(e))throw new URIError("Invalid URI format");const i=r[1].toLowerCase(),s=r[2].split(/(?::|%3A) *(.+)/i,2).map(decodeURIComponent),n=r[3].split("&").reduce((e,t)=>{const r=t.split(/=(.*)/,2).map(decodeURIComponent),i=r[0].toLowerCase(),s=r[1],n=e;return n[i]=s,n},{});let o;const a={};if("hotp"===i){o=w;const e=Number.parseInt(n.counter,10);if(void 0===n.counter||!H.test(n.counter)||!Number.isSafeInteger(e))throw new TypeError("Missing or invalid 'counter' parameter");a.counter=e}else{if("totp"!==i)throw new TypeError("Unknown OTP type");if(o=y,void 0!==n.period){const e=Number.parseInt(n.period,10);if(!T.test(n.period)||!Number.isSafeInteger(e))throw new TypeError("Invalid 'period' parameter");a.period=e}}if(void 0!==n.issuer&&(a.issuer=n.issuer),2===s.length?(a.label=s[1],void 0===a.issuer||""===a.issuer?a.issuer=s[0]:""===s[0]&&(a.issuerInLabel=!1)):(a.label=s[0], void 0!==a.issuer&&""!==a.issuer&&(a.issuerInLabel=!1)),void 0===n.secret||!S.test(n.secret))throw new TypeError("Missing or invalid 'secret' parameter");if(a.secret=n.secret,void 0!==n.algorithm){if(!(t?$:I).test(n.algorithm))throw new TypeError("Invalid 'algorithm' parameter");a.algorithm=n.algorithm}if(void 0!==n.digits){const e=Number.parseInt(n.digits,10);if(!(T.test(n.digits)&&e<=10))throw new TypeError("Invalid 'digits' parameter");a.digits=e}return void 0!==t&&(a.hmac=t),new o(a)}static stringify(e){if(e instanceof w||e instanceof y)return e.toString();throw new TypeError("Invalid 'HOTP/TOTP' object")}},exports.version="9.6.0"; //# sourceMappingURL=otpauth.node.min.cjs.map