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{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 {\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 {\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 {\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":"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"} \ 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{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 {\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 {\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.umd.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 {\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/docs/classes/HOTP.html b/docs/classes/HOTP.html index e9deea0..15080e2 100644 --- a/docs/classes/HOTP.html +++ b/docs/classes/HOTP.html @@ -1,6 +1,6 @@ HOTP | otpauth

Class HOTP

HOTP: An HMAC-based One-time Password Algorithm.

Constructors

Constructors

Properties

algorithm counter digits @@ -23,34 +23,34 @@
  • issuerInLabel: undefined | boolean

    Include issuer prefix in label.

  • label: undefined | string

    Account label.

  • secret: undefined | string | Secret

    Secret key.

    -
  • Returns HOTP

    Properties

    algorithm: string

    HMAC hashing algorithm.

    -
    counter: number

    Initial counter value.

    -
    digits: number

    Token length.

    -
    issuer: string

    Account provider.

    -
    issuerInLabel: boolean

    Include issuer prefix in label.

    -
    label: string

    Account label.

    -
    secret: Secret

    Secret key.

    -

    Accessors

    • get defaults(): {
          algorithm: string;
          counter: number;
          digits: number;
          issuer: string;
          issuerInLabel: boolean;
          label: string;
          window: number;
      }
    • Default configuration.

      -

      Returns {
          algorithm: string;
          counter: number;
          digits: number;
          issuer: string;
          issuerInLabel: boolean;
          label: string;
          window: number;
      }

      • algorithm: string
      • counter: number
      • digits: number
      • issuer: string
      • issuerInLabel: boolean
      • label: string
      • window: number

    Methods

    • Generates an HOTP token.

      +

    Returns HOTP

    Properties

    algorithm: string

    HMAC hashing algorithm.

    +
    counter: number

    Initial counter value.

    +
    digits: number

    Token length.

    +
    issuer: string

    Account provider.

    +
    issuerInLabel: boolean

    Include issuer prefix in label.

    +
    label: string

    Account label.

    +
    secret: Secret

    Secret key.

    +

    Accessors

    • get defaults(): {
          algorithm: string;
          counter: number;
          digits: number;
          issuer: string;
          issuerInLabel: boolean;
          label: string;
          window: number;
      }
    • Default configuration.

      +

      Returns {
          algorithm: string;
          counter: number;
          digits: number;
          issuer: string;
          issuerInLabel: boolean;
          label: string;
          window: number;
      }

      • algorithm: string
      • counter: number
      • digits: number
      • issuer: string
      • issuerInLabel: boolean
      • label: string
      • window: number

    Methods

    • Generates an HOTP token.

      Parameters

      • Optional config: {
            counter: undefined | number;
        } = {}

        Configuration options.

        • counter: undefined | number

          Counter value.

      Returns string

      Token.

      -
    • Returns a Google Authenticator key URI.

      +
    • Returns a Google Authenticator key URI.

      Returns string

      URI.

      -
    • Validates an HOTP token.

      +
    • Validates an HOTP token.

      Parameters

      • config: {
            counter: undefined | number;
            token: string;
            window: undefined | number;
        }

        Configuration options.

        • counter: undefined | number

          Counter value.

        • token: string

          Token value.

        • window: undefined | number

          Window of counter values to test.

      Returns null | number

      Token delta or null if it is not found in the search window, in which case it should be considered invalid.

      -
    • Generates an HOTP token.

      +
    • Generates an HOTP token.

      Parameters

      • config: {
            algorithm: undefined | string;
            counter: undefined | number;
            digits: undefined | number;
            secret: Secret;
        }

        Configuration options.

        • algorithm: undefined | string

          HMAC hashing algorithm.

        • counter: undefined | number

          Counter value.

        • digits: undefined | number

          Token length.

        • secret: Secret

          Secret key.

      Returns string

      Token.

      -
    • Validates an HOTP token.

      +
    • Validates an HOTP token.

      Parameters

      • config: {
            algorithm: undefined | string;
            counter: undefined | number;
            digits: number;
            secret: Secret;
            token: string;
            window: undefined | number;
        }

        Configuration options.

        • algorithm: undefined | string

          HMAC hashing algorithm.

        • counter: undefined | number

          Counter value.

          @@ -59,4 +59,4 @@
        • token: string

          Token value.

        • window: undefined | number

          Window of counter values to test.

      Returns null | number

      Token delta or null if it is not found in the search window, in which case it should be considered invalid.

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/classes/Secret.html b/docs/classes/Secret.html index 87c7a3a..a3a59c7 100644 --- a/docs/classes/Secret.html +++ b/docs/classes/Secret.html @@ -1,5 +1,5 @@ Secret | otpauth

    Class Secret

    OTP secret key.

    -

    Constructors

    Constructors

    Properties

    Accessors

    base32 hex @@ -13,21 +13,21 @@

    Parameters

    • Optional config: {
          buffer: undefined | ArrayBuffer;
          size: undefined | number;
      } = {}

      Configuration options.

      • buffer: undefined | ArrayBuffer

        Secret key.

      • size: undefined | number

        Number of random bytes to generate, ignored if 'buffer' is provided.

        -

    Returns Secret

    Properties

    buffer: ArrayBuffer

    Secret key.

    -

    Accessors

    • get base32(): string
    • Base32 string representation of secret key.

      -

      Returns string

    • get hex(): string
    • Hexadecimal string representation of secret key.

      -

      Returns string

    • get latin1(): string
    • Latin-1 string representation of secret key.

      -

      Returns string

    • get utf8(): string
    • UTF-8 string representation of secret key.

      -

      Returns string

    Methods

    • Converts a base32 string to a Secret object.

      +

    Returns Secret

    Properties

    buffer: ArrayBuffer

    Secret key.

    +

    Accessors

    • get base32(): string
    • Base32 string representation of secret key.

      +

      Returns string

    • get hex(): string
    • Hexadecimal string representation of secret key.

      +

      Returns string

    • get latin1(): string
    • Latin-1 string representation of secret key.

      +

      Returns string

    • get utf8(): string
    • UTF-8 string representation of secret key.

      +

      Returns string

    Methods

    • Converts a base32 string to a Secret object.

      Parameters

      • str: string

        Base32 string.

      Returns Secret

      Secret object.

      -
    • Converts a hexadecimal string to a Secret object.

      +
    • Converts a hexadecimal string to a Secret object.

      Parameters

      • str: string

        Hexadecimal string.

      Returns Secret

      Secret object.

      -
    • Converts a Latin-1 string to a Secret object.

      +
    • Converts a Latin-1 string to a Secret object.

      Parameters

      • str: string

        Latin-1 string.

      Returns Secret

      Secret object.

      -
    • Converts an UTF-8 string to a Secret object.

      +
    • Converts an UTF-8 string to a Secret object.

      Parameters

      • str: string

        UTF-8 string.

      Returns Secret

      Secret object.

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/classes/TOTP.html b/docs/classes/TOTP.html index b47b85d..bc74d66 100644 --- a/docs/classes/TOTP.html +++ b/docs/classes/TOTP.html @@ -1,6 +1,6 @@ TOTP | otpauth

    Class TOTP

    TOTP: Time-Based One-Time Password Algorithm.

    Constructors

    Constructors

    Properties

    algorithm digits issuer @@ -23,27 +23,27 @@
  • label: undefined | string

    Account label.

  • period: undefined | number

    Token time-step duration.

  • secret: undefined | string | Secret

    Secret key.

    -
  • Returns TOTP

    Properties

    algorithm: string

    HMAC hashing algorithm.

    -
    digits: number

    Token length.

    -
    issuer: string

    Account provider.

    -
    issuerInLabel: boolean

    Include issuer prefix in label.

    -
    label: string

    Account label.

    -
    period: number

    Token time-step duration.

    -
    secret: Secret

    Secret key.

    -

    Accessors

    • get defaults(): {
          algorithm: string;
          digits: number;
          issuer: string;
          issuerInLabel: boolean;
          label: string;
          period: number;
          window: number;
      }
    • Default configuration.

      -

      Returns {
          algorithm: string;
          digits: number;
          issuer: string;
          issuerInLabel: boolean;
          label: string;
          period: number;
          window: number;
      }

      • algorithm: string
      • digits: number
      • issuer: string
      • issuerInLabel: boolean
      • label: string
      • period: number
      • window: number

    Methods

    • Generates a TOTP token.

      +

    Returns TOTP

    Properties

    algorithm: string

    HMAC hashing algorithm.

    +
    digits: number

    Token length.

    +
    issuer: string

    Account provider.

    +
    issuerInLabel: boolean

    Include issuer prefix in label.

    +
    label: string

    Account label.

    +
    period: number

    Token time-step duration.

    +
    secret: Secret

    Secret key.

    +

    Accessors

    • get defaults(): {
          algorithm: string;
          digits: number;
          issuer: string;
          issuerInLabel: boolean;
          label: string;
          period: number;
          window: number;
      }
    • Default configuration.

      +

      Returns {
          algorithm: string;
          digits: number;
          issuer: string;
          issuerInLabel: boolean;
          label: string;
          period: number;
          window: number;
      }

      • algorithm: string
      • digits: number
      • issuer: string
      • issuerInLabel: boolean
      • label: string
      • period: number
      • window: number

    Methods

    • Generates a TOTP token.

      Parameters

      • Optional config: {
            timestamp: undefined | number;
        } = {}

        Configuration options.

        • timestamp: undefined | number

          Timestamp value in milliseconds.

      Returns string

      Token.

      -
    • Returns a Google Authenticator key URI.

      +
    • Returns a Google Authenticator key URI.

      Returns string

      URI.

      -
    • Validates a TOTP token.

      +
    • Validates a TOTP token.

      Parameters

      • config: {
            timestamp: undefined | number;
            token: string;
            window: undefined | number;
        }

        Configuration options.

        • timestamp: undefined | number

          Timestamp value in milliseconds.

        • token: string

          Token value.

        • window: undefined | number

          Window of counter values to test.

      Returns null | number

      Token delta or null if it is not found in the search window, in which case it should be considered invalid.

      -
    • Generates a TOTP token.

      +
    • Generates a TOTP token.

      Parameters

      • config: {
            algorithm: undefined | string;
            digits: undefined | number;
            period: undefined | number;
            secret: Secret;
            timestamp: undefined | number;
        }

        Configuration options.

        • algorithm: undefined | string

          HMAC hashing algorithm.

        • digits: undefined | number

          Token length.

          @@ -51,7 +51,7 @@
        • secret: Secret

          Secret key.

        • timestamp: undefined | number

          Timestamp value in milliseconds.

      Returns string

      Token.

      -
    • Validates a TOTP token.

      +
    • Validates a TOTP token.

      Parameters

      • config: {
            algorithm: undefined | string;
            digits: number;
            period: undefined | number;
            secret: Secret;
            timestamp: undefined | number;
            token: string;
            window: undefined | number;
        }

        Configuration options.

        • algorithm: undefined | string

          HMAC hashing algorithm.

        • digits: number

          Token length.

          @@ -61,4 +61,4 @@
        • token: string

          Token value.

        • window: undefined | number

          Window of counter values to test.

      Returns null | number

      Token delta or null if it is not found in the search window, in which case it should be considered invalid.

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/classes/URI.html b/docs/classes/URI.html index edb962c..1bc7b7d 100644 --- a/docs/classes/URI.html +++ b/docs/classes/URI.html @@ -1,12 +1,12 @@ URI | otpauth

    Class URI

    HOTP/TOTP object/string conversion.

    Constructors

    Constructors

    Methods

    Constructors

    Methods

    • Parses a Google Authenticator key URI and returns an HOTP/TOTP object.

      Parameters

      • uri: string

        Google Authenticator Key URI.

      Returns HOTP | TOTP

      HOTP/TOTP object.

      -
    • Converts an HOTP/TOTP object to a Google Authenticator key URI.

      +
    • Converts an HOTP/TOTP object to a Google Authenticator key URI.

      Parameters

      Returns string

      Google Authenticator Key URI.

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/variables/version.html b/docs/variables/version.html index 3bda84c..4959dca 100644 --- a/docs/variables/version.html +++ b/docs/variables/version.html @@ -1,2 +1,2 @@ version | otpauth

    Variable versionConst

    version: string = "__OTPAUTH_VERSION__"

    Library version.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ea06d6c..2808935 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "otpauth", - "version": "9.2.3", + "version": "9.2.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "otpauth", - "version": "9.2.3", + "version": "9.2.4", "license": "MIT", "dependencies": { "jssha": "~3.3.1" diff --git a/package.json b/package.json index 5768ec2..1c73a36 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "otpauth", - "version": "9.2.3", + "version": "9.2.4", "description": "One Time Password (HOTP/TOTP) library for Node.js, Deno, Bun and browsers", "keywords": [ "otp",