@otplib/preset-v11 13.1.1 → 13.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +30 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +26 -22
- package/dist/index.js.map +1 -1
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/package.json +9 -8
package/dist/index.cjs
CHANGED
|
@@ -49,6 +49,7 @@ var import_hotp = require("@otplib/hotp");
|
|
|
49
49
|
var import_plugin_base32_scure = require("@otplib/plugin-base32-scure");
|
|
50
50
|
var import_plugin_crypto_noble = require("@otplib/plugin-crypto-noble");
|
|
51
51
|
var import_uri = require("@otplib/uri");
|
|
52
|
+
var import_base = require("@scure/base");
|
|
52
53
|
|
|
53
54
|
// src/types.ts
|
|
54
55
|
var HashAlgorithms = {
|
|
@@ -66,14 +67,12 @@ var KeyEncodings = {
|
|
|
66
67
|
};
|
|
67
68
|
|
|
68
69
|
// src/hotp.ts
|
|
69
|
-
var defaultCrypto = new import_plugin_crypto_noble.NobleCryptoPlugin();
|
|
70
|
-
var defaultBase32 = new import_plugin_base32_scure.ScureBase32Plugin();
|
|
71
70
|
function secretToBytes(secret, encoding) {
|
|
72
71
|
if (encoding === KeyEncodings.BASE32 || encoding === "base32") {
|
|
73
|
-
return
|
|
72
|
+
return import_plugin_base32_scure.base32.decode(secret);
|
|
74
73
|
}
|
|
75
74
|
if (encoding === KeyEncodings.HEX || encoding === "hex") {
|
|
76
|
-
return
|
|
75
|
+
return import_base.hex.decode(secret.replace(/\s/g, ""));
|
|
77
76
|
}
|
|
78
77
|
return (0, import_core.stringToBytes)(secret);
|
|
79
78
|
}
|
|
@@ -81,7 +80,10 @@ var HOTP = class _HOTP {
|
|
|
81
80
|
_options = {};
|
|
82
81
|
_defaultOptions = {};
|
|
83
82
|
constructor(defaultOptions = {}) {
|
|
84
|
-
this._defaultOptions = {
|
|
83
|
+
this._defaultOptions = {
|
|
84
|
+
...defaultOptions,
|
|
85
|
+
guardrails: (0, import_core.createGuardrails)(defaultOptions.guardrails)
|
|
86
|
+
};
|
|
85
87
|
this._options = {};
|
|
86
88
|
}
|
|
87
89
|
get options() {
|
|
@@ -94,7 +96,7 @@ var HOTP = class _HOTP {
|
|
|
94
96
|
return this._defaultOptions;
|
|
95
97
|
}
|
|
96
98
|
set defaultOptions(value) {
|
|
97
|
-
this._defaultOptions = value;
|
|
99
|
+
this._defaultOptions = { ...value };
|
|
98
100
|
}
|
|
99
101
|
get optionsAll() {
|
|
100
102
|
return this.allOptions();
|
|
@@ -107,8 +109,8 @@ var HOTP = class _HOTP {
|
|
|
107
109
|
algorithm: HashAlgorithms.SHA1,
|
|
108
110
|
digits: 6,
|
|
109
111
|
encoding: KeyEncodings.ASCII,
|
|
110
|
-
crypto:
|
|
111
|
-
base32:
|
|
112
|
+
crypto: import_plugin_crypto_noble.crypto,
|
|
113
|
+
base32: import_plugin_base32_scure.base32,
|
|
112
114
|
...this._defaultOptions,
|
|
113
115
|
...this._options
|
|
114
116
|
};
|
|
@@ -126,7 +128,8 @@ var HOTP = class _HOTP {
|
|
|
126
128
|
counter,
|
|
127
129
|
algorithm: opts.algorithm,
|
|
128
130
|
digits: opts.digits,
|
|
129
|
-
crypto: opts.crypto
|
|
131
|
+
crypto: opts.crypto,
|
|
132
|
+
guardrails: opts.guardrails
|
|
130
133
|
});
|
|
131
134
|
}
|
|
132
135
|
check(token, secret, counter) {
|
|
@@ -140,7 +143,8 @@ var HOTP = class _HOTP {
|
|
|
140
143
|
algorithm: opts.algorithm,
|
|
141
144
|
digits: opts.digits,
|
|
142
145
|
counterTolerance: 0,
|
|
143
|
-
crypto: opts.crypto
|
|
146
|
+
crypto: opts.crypto,
|
|
147
|
+
guardrails: opts.guardrails
|
|
144
148
|
});
|
|
145
149
|
return result.valid;
|
|
146
150
|
} catch {
|
|
@@ -170,8 +174,6 @@ var HOTP = class _HOTP {
|
|
|
170
174
|
};
|
|
171
175
|
|
|
172
176
|
// src/totp.ts
|
|
173
|
-
var defaultCrypto2 = new import_plugin_crypto_noble2.NobleCryptoPlugin();
|
|
174
|
-
var defaultBase322 = new import_plugin_base32_scure2.ScureBase32Plugin();
|
|
175
177
|
function parseWindow(window, step) {
|
|
176
178
|
if (window === void 0 || window === 0) {
|
|
177
179
|
return 0;
|
|
@@ -197,8 +199,8 @@ var TOTP = class _TOTP extends HOTP {
|
|
|
197
199
|
// v11 default was null, meaning "now"
|
|
198
200
|
step: 30,
|
|
199
201
|
window: 0,
|
|
200
|
-
crypto:
|
|
201
|
-
base32:
|
|
202
|
+
crypto: import_plugin_crypto_noble2.crypto,
|
|
203
|
+
base32: import_plugin_base32_scure2.base32,
|
|
202
204
|
...this._defaultOptions,
|
|
203
205
|
...this._options
|
|
204
206
|
};
|
|
@@ -219,7 +221,8 @@ var TOTP = class _TOTP extends HOTP {
|
|
|
219
221
|
epoch: opts.epoch,
|
|
220
222
|
// v11: already in seconds
|
|
221
223
|
t0: 0,
|
|
222
|
-
crypto: opts.crypto
|
|
224
|
+
crypto: opts.crypto,
|
|
225
|
+
guardrails: opts.guardrails
|
|
223
226
|
});
|
|
224
227
|
}
|
|
225
228
|
check(token, secret) {
|
|
@@ -241,7 +244,8 @@ var TOTP = class _TOTP extends HOTP {
|
|
|
241
244
|
// v11: already in seconds
|
|
242
245
|
t0: 0,
|
|
243
246
|
epochTolerance,
|
|
244
|
-
crypto: opts.crypto
|
|
247
|
+
crypto: opts.crypto,
|
|
248
|
+
guardrails: opts.guardrails
|
|
245
249
|
});
|
|
246
250
|
if (!result.valid) {
|
|
247
251
|
return null;
|
|
@@ -279,14 +283,12 @@ var TOTP = class _TOTP extends HOTP {
|
|
|
279
283
|
};
|
|
280
284
|
|
|
281
285
|
// src/authenticator.ts
|
|
282
|
-
var defaultCrypto3 = new import_plugin_crypto_noble3.NobleCryptoPlugin();
|
|
283
|
-
var defaultBase323 = new import_plugin_base32_scure3.ScureBase32Plugin();
|
|
284
286
|
function defaultKeyEncoder(secret, _encoding) {
|
|
285
287
|
const bytes = new TextEncoder().encode(secret);
|
|
286
|
-
return
|
|
288
|
+
return import_plugin_base32_scure3.base32.encode(bytes);
|
|
287
289
|
}
|
|
288
290
|
function defaultKeyDecoder(encodedSecret, _encoding) {
|
|
289
|
-
const bytes =
|
|
291
|
+
const bytes = import_plugin_base32_scure3.base32.decode(encodedSecret);
|
|
290
292
|
return new TextDecoder().decode(bytes);
|
|
291
293
|
}
|
|
292
294
|
function parseWindow2(window, step) {
|
|
@@ -315,8 +317,8 @@ var Authenticator = class _Authenticator extends TOTP {
|
|
|
315
317
|
window: 0,
|
|
316
318
|
keyEncoder: defaultKeyEncoder,
|
|
317
319
|
keyDecoder: defaultKeyDecoder,
|
|
318
|
-
crypto:
|
|
319
|
-
base32:
|
|
320
|
+
crypto: import_plugin_crypto_noble3.crypto,
|
|
321
|
+
base32: import_plugin_base32_scure3.base32,
|
|
320
322
|
...this._defaultOptions,
|
|
321
323
|
...this._options
|
|
322
324
|
};
|
|
@@ -328,7 +330,7 @@ var Authenticator = class _Authenticator extends TOTP {
|
|
|
328
330
|
}
|
|
329
331
|
generate(secret) {
|
|
330
332
|
const opts = this.allOptions();
|
|
331
|
-
const secretBytes =
|
|
333
|
+
const secretBytes = import_plugin_base32_scure3.base32.decode(secret);
|
|
332
334
|
return (0, import_totp2.generateSync)({
|
|
333
335
|
secret: secretBytes,
|
|
334
336
|
algorithm: opts.algorithm,
|
|
@@ -337,7 +339,8 @@ var Authenticator = class _Authenticator extends TOTP {
|
|
|
337
339
|
epoch: opts.epoch,
|
|
338
340
|
// v11: already in seconds
|
|
339
341
|
t0: 0,
|
|
340
|
-
crypto: opts.crypto
|
|
342
|
+
crypto: opts.crypto,
|
|
343
|
+
guardrails: opts.guardrails
|
|
341
344
|
});
|
|
342
345
|
}
|
|
343
346
|
check(token, secret) {
|
|
@@ -346,7 +349,7 @@ var Authenticator = class _Authenticator extends TOTP {
|
|
|
346
349
|
}
|
|
347
350
|
checkDelta(token, secret) {
|
|
348
351
|
const opts = this.allOptions();
|
|
349
|
-
const secretBytes =
|
|
352
|
+
const secretBytes = import_plugin_base32_scure3.base32.decode(secret);
|
|
350
353
|
const epochTolerance = parseWindow2(opts.window, opts.step);
|
|
351
354
|
try {
|
|
352
355
|
const result = (0, import_totp2.verifySync)({
|
|
@@ -359,7 +362,8 @@ var Authenticator = class _Authenticator extends TOTP {
|
|
|
359
362
|
// v11: already in seconds
|
|
360
363
|
t0: 0,
|
|
361
364
|
epochTolerance,
|
|
362
|
-
crypto: opts.crypto
|
|
365
|
+
crypto: opts.crypto,
|
|
366
|
+
guardrails: opts.guardrails
|
|
363
367
|
});
|
|
364
368
|
if (!result.valid) {
|
|
365
369
|
return null;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/authenticator.ts","../src/totp.ts","../src/hotp.ts","../src/types.ts"],"sourcesContent":["/**\n * @otplib/preset-v11\n *\n * v11 compatibility preset.\n */\n\nimport { Authenticator } from \"./authenticator.js\";\nimport { HOTP } from \"./hotp.js\";\nimport { TOTP } from \"./totp.js\";\n\nexport { HOTP, TOTP, Authenticator };\nexport * from \"./types.js\";\n\nexport const hotp = new HOTP();\nexport const totp = new TOTP();\nexport const authenticator = new Authenticator();\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible Authenticator class implementation.\n */\n\nimport { generateSecret as generateSecretCore } from \"@otplib/core\";\nimport { ScureBase32Plugin } from \"@otplib/plugin-base32-scure\";\nimport { NobleCryptoPlugin } from \"@otplib/plugin-crypto-noble\";\nimport { generateSync as totpGenerateSync, verifySync as totpVerifySync } from \"@otplib/totp\";\n\nimport { TOTP } from \"./totp.js\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type {\n AuthenticatorOptions,\n Base32SecretKey,\n SecretKey,\n KeyEncodings,\n ResolvedAuthenticatorOptions,\n} from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\nconst defaultCrypto = new NobleCryptoPlugin();\nconst defaultBase32 = new ScureBase32Plugin();\n\nfunction defaultKeyEncoder(secret: SecretKey, _encoding: KeyEncodings): Base32SecretKey {\n const bytes = new TextEncoder().encode(secret);\n return defaultBase32.encode(bytes);\n}\n\nfunction defaultKeyDecoder(encodedSecret: Base32SecretKey, _encoding: KeyEncodings): SecretKey {\n const bytes = defaultBase32.decode(encodedSecret);\n return new TextDecoder().decode(bytes);\n}\n\nfunction parseWindow(\n window: number | [number, number] | undefined,\n step: number,\n): number | [number, number] {\n if (window === undefined || window === 0) {\n return 0;\n }\n if (typeof window === \"number\") {\n // v11 treated window as steps\n return window * step;\n }\n return [window[0] * step, window[1] * step];\n}\n\nexport class Authenticator<T extends AuthenticatorOptions = AuthenticatorOptions> extends TOTP<T> {\n constructor(defaultOptions: Partial<T> = {}) {\n super(defaultOptions);\n }\n\n override create(defaultOptions: Partial<T> = {}): Authenticator<T> {\n return new Authenticator<T>(defaultOptions);\n }\n\n override allOptions(): Readonly<ResolvedAuthenticatorOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.HEX,\n epoch: null,\n step: 30,\n window: 0,\n keyEncoder: defaultKeyEncoder,\n keyDecoder: defaultKeyDecoder,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n\n const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1000);\n\n return Object.freeze({\n ...merged,\n epoch: epoch as number,\n }) as Readonly<ResolvedAuthenticatorOptions>;\n }\n\n override generate(secret: Base32SecretKey): string {\n const opts = this.allOptions();\n\n // Generate using decoded secret (as raw bytes)\n const secretBytes = defaultBase32.decode(secret);\n\n return totpGenerateSync({\n secret: secretBytes,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n crypto: opts.crypto,\n });\n }\n\n override check(token: string, secret: Base32SecretKey): boolean {\n const delta = this.checkDelta(token, secret);\n return typeof delta === \"number\";\n }\n\n override checkDelta(token: string, secret: Base32SecretKey): number | null {\n const opts = this.allOptions();\n const secretBytes = defaultBase32.decode(secret);\n const epochTolerance = parseWindow(opts.window, opts.step);\n\n try {\n const result = totpVerifySync({\n secret: secretBytes,\n token,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n epochTolerance,\n crypto: opts.crypto,\n });\n\n if (!result.valid) {\n return null;\n }\n\n return result.delta;\n } catch {\n return null;\n }\n }\n\n override verify(opts: { token: string; secret: Base32SecretKey }): boolean {\n if (typeof opts !== \"object\") {\n // v11 legacy behavior: verify requires object\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret);\n }\n\n encode(secret: SecretKey): Base32SecretKey {\n const opts = this.allOptions();\n return opts.keyEncoder(secret, opts.encoding);\n }\n\n decode(secret: Base32SecretKey): SecretKey {\n const opts = this.allOptions();\n return opts.keyDecoder(secret, opts.encoding);\n }\n\n generateSecret(numberOfBytes: number = 20): Base32SecretKey {\n const opts = this.allOptions();\n return generateSecretCore({\n crypto: opts.crypto,\n base32: opts.base32,\n length: numberOfBytes,\n });\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible TOTP class implementation.\n */\n\nimport { ScureBase32Plugin } from \"@otplib/plugin-base32-scure\";\nimport { NobleCryptoPlugin } from \"@otplib/plugin-crypto-noble\";\nimport {\n generateSync as totpGenerateSync,\n verifySync as totpVerifySync,\n getRemainingTime,\n} from \"@otplib/totp\";\nimport { generateTOTP as generateTOTPURI } from \"@otplib/uri\";\n\nimport { HOTP, secretToBytes } from \"./hotp.js\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type { TOTPOptions, SecretKey, ResolvedTOTPOptions } from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\nconst defaultCrypto = new NobleCryptoPlugin();\nconst defaultBase32 = new ScureBase32Plugin();\n\nfunction parseWindow(\n window: number | [number, number] | undefined,\n step: number,\n): number | [number, number] {\n if (window === undefined || window === 0) {\n return 0;\n }\n if (typeof window === \"number\") {\n // v11 treated window as steps\n return window * step;\n }\n return [window[0] * step, window[1] * step];\n}\n\nexport class TOTP<T extends TOTPOptions = TOTPOptions> extends HOTP<T> {\n constructor(defaultOptions: Partial<T> = {}) {\n super(defaultOptions);\n }\n\n override create(defaultOptions: Partial<T> = {}): TOTP<T> {\n return new TOTP<T>(defaultOptions);\n }\n\n override allOptions(): Readonly<ResolvedTOTPOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.ASCII,\n epoch: null, // v11 default was null, meaning \"now\"\n step: 30,\n window: 0,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n\n // Resolve epoch to seconds if null\n const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1000);\n\n return Object.freeze({\n ...merged,\n epoch: epoch as number,\n }) as Readonly<ResolvedTOTPOptions>;\n }\n\n generate(secret: SecretKey): string {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n return totpGenerateSync({\n secret: secretBytes,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n crypto: opts.crypto,\n });\n }\n\n check(token: string, secret: SecretKey): boolean {\n const delta = this.checkDelta(token, secret);\n return typeof delta === \"number\";\n }\n\n checkDelta(token: string, secret: SecretKey): number | null {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n const epochTolerance = parseWindow(opts.window, opts.step);\n\n try {\n const result = totpVerifySync({\n secret: secretBytes,\n token,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n epochTolerance,\n crypto: opts.crypto,\n });\n\n if (!result.valid) {\n return null;\n }\n\n return result.delta;\n } catch {\n return null;\n }\n }\n\n override verify(opts: { token: string; secret: SecretKey }): boolean {\n if (typeof opts !== \"object\") {\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret);\n }\n\n keyuri(accountName: string, issuer: string, secret: SecretKey): string {\n const opts = this.allOptions();\n\n return generateTOTPURI({\n label: accountName,\n issuer,\n secret,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n });\n }\n\n timeUsed(): number {\n const opts = this.allOptions();\n return opts.epoch % opts.step;\n }\n\n timeRemaining(): number {\n const opts = this.allOptions();\n return getRemainingTime(opts.epoch, opts.step, 0);\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible HOTP class implementation.\n */\n\nimport { stringToBytes, hexToBytes } from \"@otplib/core\";\nimport { generateSync as hotpGenerateSync, verifySync as hotpVerifySync } from \"@otplib/hotp\";\nimport { ScureBase32Plugin } from \"@otplib/plugin-base32-scure\";\nimport { NobleCryptoPlugin } from \"@otplib/plugin-crypto-noble\";\nimport { generateHOTP as generateHOTPURI } from \"@otplib/uri\";\n\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type { HOTPOptions, SecretKey, ResolvedHOTPOptions } from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\nconst defaultCrypto = new NobleCryptoPlugin();\nconst defaultBase32 = new ScureBase32Plugin();\n\n/**\n * Convert a string secret to bytes based on encoding\n */\nexport function secretToBytes(secret: SecretKey, encoding?: string): Uint8Array {\n if (encoding === KeyEncodingsConst.BASE32 || encoding === \"base32\") {\n return defaultBase32.decode(secret);\n }\n if (encoding === KeyEncodingsConst.HEX || encoding === \"hex\") {\n return hexToBytes(secret.replace(/\\s/g, \"\"));\n }\n return stringToBytes(secret);\n}\n\nexport class HOTP<T extends HOTPOptions = HOTPOptions> {\n protected _options: Partial<T> = {};\n protected _defaultOptions: Partial<T> = {};\n\n constructor(defaultOptions: Partial<T> = {}) {\n this._defaultOptions = { ...defaultOptions };\n this._options = {};\n }\n\n get options(): Partial<T> {\n return { ...this._defaultOptions, ...this._options };\n }\n\n set options(value: Partial<T>) {\n this._options = { ...value };\n }\n\n get defaultOptions(): Partial<T> {\n return this._defaultOptions;\n }\n\n set defaultOptions(value: Partial<T>) {\n this._defaultOptions = value;\n }\n\n get optionsAll(): Readonly<ResolvedHOTPOptions> {\n return this.allOptions();\n }\n\n create(defaultOptions: Partial<T> = {}): HOTP<T> {\n return new HOTP<T>(defaultOptions);\n }\n\n allOptions(): Readonly<ResolvedHOTPOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.ASCII,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n return Object.freeze(merged) as Readonly<ResolvedHOTPOptions>;\n }\n\n resetOptions(): this {\n this._options = {};\n return this;\n }\n\n generate(secret: SecretKey, counter: number): string {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n return hotpGenerateSync({\n secret: secretBytes,\n counter,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n crypto: opts.crypto,\n });\n }\n\n check(token: string, secret: SecretKey, counter: number): boolean {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n try {\n const result = hotpVerifySync({\n secret: secretBytes,\n token,\n counter,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n counterTolerance: 0,\n crypto: opts.crypto,\n });\n\n return result.valid;\n } catch {\n return false;\n }\n }\n\n verify(opts: { token: string; secret: SecretKey; counter: number }): boolean {\n if (typeof opts !== \"object\") {\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret, opts.counter);\n }\n\n keyuri(accountName: string, issuer: string, secret: SecretKey, counter: number): string {\n const opts = this.allOptions();\n\n return generateHOTPURI({\n label: accountName,\n issuer,\n secret,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n counter,\n });\n }\n\n getClass(): typeof HOTP {\n return HOTP;\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible type definitions.\n * v11 used functionality similar to v12 but with seconds-based epochs.\n */\n\nimport type { CryptoPlugin, Base32Plugin, HashAlgorithm } from \"@otplib/core\";\n\nexport const HashAlgorithms = {\n SHA1: \"sha1\",\n SHA256: \"sha256\",\n SHA512: \"sha512\",\n} as const;\n\nexport type HashAlgorithms = (typeof HashAlgorithms)[keyof typeof HashAlgorithms];\n\nexport const KeyEncodings = {\n ASCII: \"ascii\",\n HEX: \"hex\",\n BASE32: \"base32\",\n BASE64: \"base64\",\n LATIN1: \"latin1\",\n UTF8: \"utf8\",\n} as const;\n\nexport type KeyEncodings = (typeof KeyEncodings)[keyof typeof KeyEncodings];\n\nexport type SecretKey = string;\nexport type Base32SecretKey = string;\n\nexport type HOTPOptions = {\n algorithm?: HashAlgorithm;\n digits?: number;\n encoding?: KeyEncodings;\n crypto?: CryptoPlugin;\n base32?: Base32Plugin;\n};\n\nexport type TOTPOptions = HOTPOptions & {\n epoch?: number | null; // v11: seconds\n step?: number;\n window?: number | [number, number];\n};\n\nexport type KeyEncoder = (secret: SecretKey, encoding: KeyEncodings) => Base32SecretKey;\nexport type KeyDecoder = (encodedSecret: Base32SecretKey, encoding: KeyEncodings) => SecretKey;\n\nexport type AuthenticatorOptions = TOTPOptions & {\n keyEncoder?: KeyEncoder;\n keyDecoder?: KeyDecoder;\n};\n\nexport type ResolvedHOTPOptions = {\n algorithm: HashAlgorithm;\n digits: number;\n encoding: KeyEncodings;\n crypto: CryptoPlugin;\n base32: Base32Plugin;\n};\n\nexport type ResolvedTOTPOptions = ResolvedHOTPOptions & {\n epoch: number;\n step: number;\n window: number | [number, number];\n};\n\nexport type ResolvedAuthenticatorOptions = ResolvedTOTPOptions & {\n keyEncoder: KeyEncoder;\n keyDecoder: KeyDecoder;\n};\n"],"mappings":"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","names":["import_core","import_plugin_base32_scure","import_plugin_crypto_noble","import_totp","import_plugin_base32_scure","import_plugin_crypto_noble","import_uri","hotpGenerateSync","hotpVerifySync","generateHOTPURI","defaultCrypto","defaultBase32","totpGenerateSync","totpVerifySync","generateTOTPURI","defaultCrypto","defaultBase32","parseWindow","totpGenerateSync","totpVerifySync","generateSecretCore"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/authenticator.ts","../src/totp.ts","../src/hotp.ts","../src/types.ts"],"sourcesContent":["/**\n * @otplib/preset-v11\n *\n * v11 compatibility preset.\n */\n\nimport { Authenticator } from \"./authenticator.js\";\nimport { HOTP } from \"./hotp.js\";\nimport { TOTP } from \"./totp.js\";\n\nexport { HOTP, TOTP, Authenticator };\nexport * from \"./types.js\";\n\nexport const hotp = new HOTP();\nexport const totp = new TOTP();\nexport const authenticator = new Authenticator();\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible Authenticator class implementation.\n */\n\nimport { generateSecret as generateSecretCore } from \"@otplib/core\";\nimport { base32 as defaultBase32 } from \"@otplib/plugin-base32-scure\";\nimport { crypto as defaultCrypto } from \"@otplib/plugin-crypto-noble\";\nimport { generateSync as totpGenerateSync, verifySync as totpVerifySync } from \"@otplib/totp\";\n\nimport { TOTP } from \"./totp.js\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type {\n AuthenticatorOptions,\n Base32SecretKey,\n SecretKey,\n KeyEncodings,\n ResolvedAuthenticatorOptions,\n} from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\nfunction defaultKeyEncoder(secret: SecretKey, _encoding: KeyEncodings): Base32SecretKey {\n const bytes = new TextEncoder().encode(secret);\n return defaultBase32.encode(bytes);\n}\n\nfunction defaultKeyDecoder(encodedSecret: Base32SecretKey, _encoding: KeyEncodings): SecretKey {\n const bytes = defaultBase32.decode(encodedSecret);\n return new TextDecoder().decode(bytes);\n}\n\nfunction parseWindow(\n window: number | [number, number] | undefined,\n step: number,\n): number | [number, number] {\n if (window === undefined || window === 0) {\n return 0;\n }\n if (typeof window === \"number\") {\n // v11 treated window as steps\n return window * step;\n }\n return [window[0] * step, window[1] * step];\n}\n\nexport class Authenticator<T extends AuthenticatorOptions = AuthenticatorOptions> extends TOTP<T> {\n constructor(defaultOptions: Partial<T> = {}) {\n super(defaultOptions);\n }\n\n override create(defaultOptions: Partial<T> = {}): Authenticator<T> {\n return new Authenticator<T>(defaultOptions);\n }\n\n override allOptions(): Readonly<ResolvedAuthenticatorOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.HEX,\n epoch: null,\n step: 30,\n window: 0,\n keyEncoder: defaultKeyEncoder,\n keyDecoder: defaultKeyDecoder,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n\n const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1000);\n\n return Object.freeze({\n ...merged,\n epoch: epoch as number,\n }) as Readonly<ResolvedAuthenticatorOptions>;\n }\n\n override generate(secret: Base32SecretKey): string {\n const opts = this.allOptions();\n\n // Generate using decoded secret (as raw bytes)\n const secretBytes = defaultBase32.decode(secret);\n\n return totpGenerateSync({\n secret: secretBytes,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n }\n\n override check(token: string, secret: Base32SecretKey): boolean {\n const delta = this.checkDelta(token, secret);\n return typeof delta === \"number\";\n }\n\n override checkDelta(token: string, secret: Base32SecretKey): number | null {\n const opts = this.allOptions();\n const secretBytes = defaultBase32.decode(secret);\n const epochTolerance = parseWindow(opts.window, opts.step);\n\n try {\n const result = totpVerifySync({\n secret: secretBytes,\n token,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n epochTolerance,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n\n if (!result.valid) {\n return null;\n }\n\n return result.delta;\n } catch {\n return null;\n }\n }\n\n override verify(opts: { token: string; secret: Base32SecretKey }): boolean {\n if (typeof opts !== \"object\") {\n // v11 legacy behavior: verify requires object\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret);\n }\n\n encode(secret: SecretKey): Base32SecretKey {\n const opts = this.allOptions();\n return opts.keyEncoder(secret, opts.encoding);\n }\n\n decode(secret: Base32SecretKey): SecretKey {\n const opts = this.allOptions();\n return opts.keyDecoder(secret, opts.encoding);\n }\n\n generateSecret(numberOfBytes: number = 20): Base32SecretKey {\n const opts = this.allOptions();\n return generateSecretCore({\n crypto: opts.crypto,\n base32: opts.base32,\n length: numberOfBytes,\n });\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible TOTP class implementation.\n */\n\nimport { base32 as defaultBase32 } from \"@otplib/plugin-base32-scure\";\nimport { crypto as defaultCrypto } from \"@otplib/plugin-crypto-noble\";\nimport {\n generateSync as totpGenerateSync,\n verifySync as totpVerifySync,\n getRemainingTime,\n} from \"@otplib/totp\";\nimport { generateTOTP as generateTOTPURI } from \"@otplib/uri\";\n\nimport { HOTP, secretToBytes } from \"./hotp.js\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type { TOTPOptions, SecretKey, ResolvedTOTPOptions } from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\nfunction parseWindow(\n window: number | [number, number] | undefined,\n step: number,\n): number | [number, number] {\n if (window === undefined || window === 0) {\n return 0;\n }\n if (typeof window === \"number\") {\n // v11 treated window as steps\n return window * step;\n }\n return [window[0] * step, window[1] * step];\n}\n\nexport class TOTP<T extends TOTPOptions = TOTPOptions> extends HOTP<T> {\n constructor(defaultOptions: Partial<T> = {}) {\n super(defaultOptions);\n }\n\n override create(defaultOptions: Partial<T> = {}): TOTP<T> {\n return new TOTP<T>(defaultOptions);\n }\n\n override allOptions(): Readonly<ResolvedTOTPOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.ASCII,\n epoch: null, // v11 default was null, meaning \"now\"\n step: 30,\n window: 0,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n\n // Resolve epoch to seconds if null\n const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1000);\n\n return Object.freeze({\n ...merged,\n epoch: epoch as number,\n }) as Readonly<ResolvedTOTPOptions>;\n }\n\n generate(secret: SecretKey): string {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n return totpGenerateSync({\n secret: secretBytes,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n }\n\n check(token: string, secret: SecretKey): boolean {\n const delta = this.checkDelta(token, secret);\n return typeof delta === \"number\";\n }\n\n checkDelta(token: string, secret: SecretKey): number | null {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n const epochTolerance = parseWindow(opts.window, opts.step);\n\n try {\n const result = totpVerifySync({\n secret: secretBytes,\n token,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n epochTolerance,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n\n if (!result.valid) {\n return null;\n }\n\n return result.delta;\n } catch {\n return null;\n }\n }\n\n override verify(opts: { token: string; secret: SecretKey }): boolean {\n if (typeof opts !== \"object\") {\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret);\n }\n\n keyuri(accountName: string, issuer: string, secret: SecretKey): string {\n const opts = this.allOptions();\n\n return generateTOTPURI({\n label: accountName,\n issuer,\n secret,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n });\n }\n\n timeUsed(): number {\n const opts = this.allOptions();\n return opts.epoch % opts.step;\n }\n\n timeRemaining(): number {\n const opts = this.allOptions();\n return getRemainingTime(opts.epoch, opts.step, 0);\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible HOTP class implementation.\n */\n\nimport { stringToBytes, createGuardrails } from \"@otplib/core\";\nimport { generateSync as hotpGenerateSync, verifySync as hotpVerifySync } from \"@otplib/hotp\";\nimport { base32 as defaultBase32 } from \"@otplib/plugin-base32-scure\";\nimport { crypto as defaultCrypto } from \"@otplib/plugin-crypto-noble\";\nimport { generateHOTP as generateHOTPURI } from \"@otplib/uri\";\nimport { hex } from \"@scure/base\";\n\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type { HOTPOptions, SecretKey, ResolvedHOTPOptions } from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\n/**\n * Convert a string secret to bytes based on encoding\n */\nexport function secretToBytes(secret: SecretKey, encoding?: string): Uint8Array {\n if (encoding === KeyEncodingsConst.BASE32 || encoding === \"base32\") {\n return defaultBase32.decode(secret);\n }\n if (encoding === KeyEncodingsConst.HEX || encoding === \"hex\") {\n return hex.decode(secret.replace(/\\s/g, \"\"));\n }\n return stringToBytes(secret);\n}\n\nexport class HOTP<T extends HOTPOptions = HOTPOptions> {\n protected _options: Partial<T> = {};\n protected _defaultOptions: Partial<T> = {};\n\n constructor(defaultOptions: Partial<T> = {}) {\n this._defaultOptions = {\n ...defaultOptions,\n guardrails: createGuardrails(defaultOptions.guardrails),\n } as Partial<T>;\n this._options = {};\n }\n\n get options(): Partial<T> {\n return { ...this._defaultOptions, ...this._options };\n }\n\n set options(value: Partial<T>) {\n this._options = { ...value };\n }\n\n get defaultOptions(): Partial<T> {\n return this._defaultOptions;\n }\n\n set defaultOptions(value: Partial<T>) {\n this._defaultOptions = { ...value };\n }\n\n get optionsAll(): Readonly<ResolvedHOTPOptions> {\n return this.allOptions();\n }\n\n create(defaultOptions: Partial<T> = {}): HOTP<T> {\n return new HOTP<T>(defaultOptions);\n }\n\n allOptions(): Readonly<ResolvedHOTPOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.ASCII,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n return Object.freeze(merged) as Readonly<ResolvedHOTPOptions>;\n }\n\n resetOptions(): this {\n this._options = {};\n return this;\n }\n\n generate(secret: SecretKey, counter: number): string {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n return hotpGenerateSync({\n secret: secretBytes,\n counter,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n }\n\n check(token: string, secret: SecretKey, counter: number): boolean {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n try {\n const result = hotpVerifySync({\n secret: secretBytes,\n token,\n counter,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n counterTolerance: 0,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n\n return result.valid;\n } catch {\n return false;\n }\n }\n\n verify(opts: { token: string; secret: SecretKey; counter: number }): boolean {\n if (typeof opts !== \"object\") {\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret, opts.counter);\n }\n\n keyuri(accountName: string, issuer: string, secret: SecretKey, counter: number): string {\n const opts = this.allOptions();\n\n return generateHOTPURI({\n label: accountName,\n issuer,\n secret,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n counter,\n });\n }\n\n getClass(): typeof HOTP {\n return HOTP;\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible type definitions.\n * v11 used functionality similar to v12 but with seconds-based epochs.\n */\n\nimport type { CryptoPlugin, Base32Plugin, HashAlgorithm, OTPGuardrails } from \"@otplib/core\";\n\nexport const HashAlgorithms = {\n SHA1: \"sha1\",\n SHA256: \"sha256\",\n SHA512: \"sha512\",\n} as const;\n\nexport type HashAlgorithms = (typeof HashAlgorithms)[keyof typeof HashAlgorithms];\n\nexport const KeyEncodings = {\n ASCII: \"ascii\",\n HEX: \"hex\",\n BASE32: \"base32\",\n BASE64: \"base64\",\n LATIN1: \"latin1\",\n UTF8: \"utf8\",\n} as const;\n\nexport type KeyEncodings = (typeof KeyEncodings)[keyof typeof KeyEncodings];\n\nexport type SecretKey = string;\nexport type Base32SecretKey = string;\n\nexport type HOTPOptions = {\n algorithm?: HashAlgorithm;\n digits?: number;\n encoding?: KeyEncodings;\n crypto?: CryptoPlugin;\n base32?: Base32Plugin;\n guardrails?: OTPGuardrails;\n};\n\nexport type TOTPOptions = HOTPOptions & {\n epoch?: number | null; // v11: seconds\n step?: number;\n window?: number | [number, number];\n};\n\nexport type KeyEncoder = (secret: SecretKey, encoding: KeyEncodings) => Base32SecretKey;\nexport type KeyDecoder = (encodedSecret: Base32SecretKey, encoding: KeyEncodings) => SecretKey;\n\nexport type AuthenticatorOptions = TOTPOptions & {\n keyEncoder?: KeyEncoder;\n keyDecoder?: KeyDecoder;\n};\n\nexport type ResolvedHOTPOptions = {\n algorithm: HashAlgorithm;\n digits: number;\n encoding: KeyEncodings;\n crypto: CryptoPlugin;\n base32: Base32Plugin;\n guardrails: OTPGuardrails;\n};\n\nexport type ResolvedTOTPOptions = ResolvedHOTPOptions & {\n epoch: number;\n step: number;\n window: number | [number, number];\n};\n\nexport type ResolvedAuthenticatorOptions = ResolvedTOTPOptions & {\n keyEncoder: KeyEncoder;\n keyDecoder: KeyDecoder;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,IAAAA,eAAqD;AACrD,IAAAC,8BAAwC;AACxC,IAAAC,8BAAwC;AACxC,IAAAC,eAA+E;;;ACH/E,IAAAC,8BAAwC;AACxC,IAAAC,8BAAwC;AACxC,kBAIO;AACP,IAAAC,cAAgD;;;ACPhD,kBAAgD;AAChD,kBAA+E;AAC/E,iCAAwC;AACxC,iCAAwC;AACxC,iBAAgD;AAChD,kBAAoB;;;ACFb,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AACV;AAIO,IAAM,eAAe;AAAA,EAC1B,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AACR;;;ADHO,SAAS,cAAc,QAAmB,UAA+B;AAC9E,MAAI,aAAa,aAAkB,UAAU,aAAa,UAAU;AAClE,WAAO,2BAAAC,OAAc,OAAO,MAAM;AAAA,EACpC;AACA,MAAI,aAAa,aAAkB,OAAO,aAAa,OAAO;AAC5D,WAAO,gBAAI,OAAO,OAAO,QAAQ,OAAO,EAAE,CAAC;AAAA,EAC7C;AACA,aAAO,2BAAc,MAAM;AAC7B;AAEO,IAAM,OAAN,MAAM,MAA0C;AAAA,EAC3C,WAAuB,CAAC;AAAA,EACxB,kBAA8B,CAAC;AAAA,EAEzC,YAAY,iBAA6B,CAAC,GAAG;AAC3C,SAAK,kBAAkB;AAAA,MACrB,GAAG;AAAA,MACH,gBAAY,8BAAiB,eAAe,UAAU;AAAA,IACxD;AACA,SAAK,WAAW,CAAC;AAAA,EACnB;AAAA,EAEA,IAAI,UAAsB;AACxB,WAAO,EAAE,GAAG,KAAK,iBAAiB,GAAG,KAAK,SAAS;AAAA,EACrD;AAAA,EAEA,IAAI,QAAQ,OAAmB;AAC7B,SAAK,WAAW,EAAE,GAAG,MAAM;AAAA,EAC7B;AAAA,EAEA,IAAI,iBAA6B;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAAe,OAAmB;AACpC,SAAK,kBAAkB,EAAE,GAAG,MAAM;AAAA,EACpC;AAAA,EAEA,IAAI,aAA4C;AAC9C,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,OAAO,iBAA6B,CAAC,GAAY;AAC/C,WAAO,IAAI,MAAQ,cAAc;AAAA,EACnC;AAAA,EAEA,aAA4C;AAC1C,UAAM,SAAS;AAAA,MACb,WAAW,eAAe;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU,aAAkB;AAAA,MAC5B,QAAQ,2BAAAC;AAAA,MACR,QAAQ,2BAAAD;AAAA,MACR,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,IACV;AACA,WAAO,OAAO,OAAO,MAAM;AAAA,EAC7B;AAAA,EAEA,eAAqB;AACnB,SAAK,WAAW,CAAC;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,QAAmB,SAAyB;AACnD,UAAM,OAAO,KAAK,WAAW;AAC7B,UAAM,cAAc,cAAc,QAAQ,KAAK,QAAQ;AAEvD,eAAO,YAAAE,cAAiB;AAAA,MACtB,QAAQ;AAAA,MACR;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAe,QAAmB,SAA0B;AAChE,UAAM,OAAO,KAAK,WAAW;AAC7B,UAAM,cAAc,cAAc,QAAQ,KAAK,QAAQ;AAEvD,QAAI;AACF,YAAM,aAAS,YAAAC,YAAe;AAAA,QAC5B,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,kBAAkB;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,MACnB,CAAC;AAED,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,MAAsE;AAC3E,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,WAAO,KAAK,MAAM,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO;AAAA,EACzD;AAAA,EAEA,OAAO,aAAqB,QAAgB,QAAmB,SAAyB;AACtF,UAAM,OAAO,KAAK,WAAW;AAE7B,eAAO,WAAAC,cAAgB;AAAA,MACrB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,WAAwB;AACtB,WAAO;AAAA,EACT;AACF;;;AD3HA,SAAS,YACP,QACA,MAC2B;AAC3B,MAAI,WAAW,UAAa,WAAW,GAAG;AACxC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,UAAU;AAE9B,WAAO,SAAS;AAAA,EAClB;AACA,SAAO,CAAC,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,IAAI;AAC5C;AAEO,IAAM,OAAN,MAAM,cAAkD,KAAQ;AAAA,EACrE,YAAY,iBAA6B,CAAC,GAAG;AAC3C,UAAM,cAAc;AAAA,EACtB;AAAA,EAES,OAAO,iBAA6B,CAAC,GAAY;AACxD,WAAO,IAAI,MAAQ,cAAc;AAAA,EACnC;AAAA,EAES,aAA4C;AACnD,UAAM,SAAS;AAAA,MACb,WAAW,eAAe;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU,aAAkB;AAAA,MAC5B,OAAO;AAAA;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,4BAAAC;AAAA,MACR,QAAQ,4BAAAC;AAAA,MACR,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,IACV;AAGA,UAAM,QAAQ,OAAO,UAAU,OAAO,OAAO,QAAQ,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAEjF,WAAO,OAAO,OAAO;AAAA,MACnB,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,SAAS,QAA2B;AAClC,UAAM,OAAO,KAAK,WAAW;AAC7B,UAAM,cAAc,cAAc,QAAQ,KAAK,QAAQ;AAEvD,eAAO,YAAAC,cAAiB;AAAA,MACtB,QAAQ;AAAA,MACR,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA;AAAA,MACZ,IAAI;AAAA,MACJ,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAe,QAA4B;AAC/C,UAAM,QAAQ,KAAK,WAAW,OAAO,MAAM;AAC3C,WAAO,OAAO,UAAU;AAAA,EAC1B;AAAA,EAEA,WAAW,OAAe,QAAkC;AAC1D,UAAM,OAAO,KAAK,WAAW;AAC7B,UAAM,cAAc,cAAc,QAAQ,KAAK,QAAQ;AACvD,UAAM,iBAAiB,YAAY,KAAK,QAAQ,KAAK,IAAI;AAEzD,QAAI;AACF,YAAM,aAAS,YAAAC,YAAe;AAAA,QAC5B,QAAQ;AAAA,QACR;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA;AAAA,QACZ,IAAI;AAAA,QACJ;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,MACnB,CAAC;AAED,UAAI,CAAC,OAAO,OAAO;AACjB,eAAO;AAAA,MACT;AAEA,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAES,OAAO,MAAqD;AACnE,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,WAAO,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM;AAAA,EAC3C;AAAA,EAEA,OAAO,aAAqB,QAAgB,QAA2B;AACrE,UAAM,OAAO,KAAK,WAAW;AAE7B,eAAO,YAAAC,cAAgB;AAAA,MACrB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,WAAmB;AACjB,UAAM,OAAO,KAAK,WAAW;AAC7B,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA,EAEA,gBAAwB;AACtB,UAAM,OAAO,KAAK,WAAW;AAC7B,eAAO,8BAAiB,KAAK,OAAO,KAAK,MAAM,CAAC;AAAA,EAClD;AACF;;;AD3HA,SAAS,kBAAkB,QAAmB,WAA0C;AACtF,QAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,MAAM;AAC7C,SAAO,4BAAAC,OAAc,OAAO,KAAK;AACnC;AAEA,SAAS,kBAAkB,eAAgC,WAAoC;AAC7F,QAAM,QAAQ,4BAAAA,OAAc,OAAO,aAAa;AAChD,SAAO,IAAI,YAAY,EAAE,OAAO,KAAK;AACvC;AAEA,SAASC,aACP,QACA,MAC2B;AAC3B,MAAI,WAAW,UAAa,WAAW,GAAG;AACxC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,UAAU;AAE9B,WAAO,SAAS;AAAA,EAClB;AACA,SAAO,CAAC,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,IAAI;AAC5C;AAEO,IAAM,gBAAN,MAAM,uBAA6E,KAAQ;AAAA,EAChG,YAAY,iBAA6B,CAAC,GAAG;AAC3C,UAAM,cAAc;AAAA,EACtB;AAAA,EAES,OAAO,iBAA6B,CAAC,GAAqB;AACjE,WAAO,IAAI,eAAiB,cAAc;AAAA,EAC5C;AAAA,EAES,aAAqD;AAC5D,UAAM,SAAS;AAAA,MACb,WAAW,eAAe;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU,aAAkB;AAAA,MAC5B,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,QAAQ,4BAAAC;AAAA,MACR,QAAQ,4BAAAF;AAAA,MACR,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,IACV;AAEA,UAAM,QAAQ,OAAO,UAAU,OAAO,OAAO,QAAQ,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAEjF,WAAO,OAAO,OAAO;AAAA,MACnB,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAES,SAAS,QAAiC;AACjD,UAAM,OAAO,KAAK,WAAW;AAG7B,UAAM,cAAc,4BAAAA,OAAc,OAAO,MAAM;AAE/C,eAAO,aAAAG,cAAiB;AAAA,MACtB,QAAQ;AAAA,MACR,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA;AAAA,MACZ,IAAI;AAAA,MACJ,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAES,MAAM,OAAe,QAAkC;AAC9D,UAAM,QAAQ,KAAK,WAAW,OAAO,MAAM;AAC3C,WAAO,OAAO,UAAU;AAAA,EAC1B;AAAA,EAES,WAAW,OAAe,QAAwC;AACzE,UAAM,OAAO,KAAK,WAAW;AAC7B,UAAM,cAAc,4BAAAH,OAAc,OAAO,MAAM;AAC/C,UAAM,iBAAiBC,aAAY,KAAK,QAAQ,KAAK,IAAI;AAEzD,QAAI;AACF,YAAM,aAAS,aAAAG,YAAe;AAAA,QAC5B,QAAQ;AAAA,QACR;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA;AAAA,QACZ,IAAI;AAAA,QACJ;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,MACnB,CAAC;AAED,UAAI,CAAC,OAAO,OAAO;AACjB,eAAO;AAAA,MACT;AAEA,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAES,OAAO,MAA2D;AACzE,QAAI,OAAO,SAAS,UAAU;AAE5B,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,WAAO,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM;AAAA,EAC3C;AAAA,EAEA,OAAO,QAAoC;AACzC,UAAM,OAAO,KAAK,WAAW;AAC7B,WAAO,KAAK,WAAW,QAAQ,KAAK,QAAQ;AAAA,EAC9C;AAAA,EAEA,OAAO,QAAoC;AACzC,UAAM,OAAO,KAAK,WAAW;AAC7B,WAAO,KAAK,WAAW,QAAQ,KAAK,QAAQ;AAAA,EAC9C;AAAA,EAEA,eAAe,gBAAwB,IAAqB;AAC1D,UAAM,OAAO,KAAK,WAAW;AAC7B,eAAO,aAAAC,gBAAmB;AAAA,MACxB,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;;;ADjJO,IAAM,OAAO,IAAI,KAAK;AACtB,IAAM,OAAO,IAAI,KAAK;AACtB,IAAM,gBAAgB,IAAI,cAAc;","names":["import_core","import_plugin_base32_scure","import_plugin_crypto_noble","import_totp","import_plugin_base32_scure","import_plugin_crypto_noble","import_uri","defaultBase32","defaultCrypto","hotpGenerateSync","hotpVerifySync","generateHOTPURI","defaultCrypto","defaultBase32","totpGenerateSync","totpVerifySync","generateTOTPURI","defaultBase32","parseWindow","defaultCrypto","totpGenerateSync","totpVerifySync","generateSecretCore"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HashAlgorithm, CryptoPlugin, Base32Plugin } from '@otplib/core';
|
|
1
|
+
import { HashAlgorithm, CryptoPlugin, Base32Plugin, OTPGuardrails } from '@otplib/core';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @otplib/preset-v11
|
|
@@ -30,6 +30,7 @@ type HOTPOptions = {
|
|
|
30
30
|
encoding?: KeyEncodings;
|
|
31
31
|
crypto?: CryptoPlugin;
|
|
32
32
|
base32?: Base32Plugin;
|
|
33
|
+
guardrails?: OTPGuardrails;
|
|
33
34
|
};
|
|
34
35
|
type TOTPOptions = HOTPOptions & {
|
|
35
36
|
epoch?: number | null;
|
|
@@ -48,6 +49,7 @@ type ResolvedHOTPOptions = {
|
|
|
48
49
|
encoding: KeyEncodings;
|
|
49
50
|
crypto: CryptoPlugin;
|
|
50
51
|
base32: Base32Plugin;
|
|
52
|
+
guardrails: OTPGuardrails;
|
|
51
53
|
};
|
|
52
54
|
type ResolvedTOTPOptions = ResolvedHOTPOptions & {
|
|
53
55
|
epoch: number;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HashAlgorithm, CryptoPlugin, Base32Plugin } from '@otplib/core';
|
|
1
|
+
import { HashAlgorithm, CryptoPlugin, Base32Plugin, OTPGuardrails } from '@otplib/core';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @otplib/preset-v11
|
|
@@ -30,6 +30,7 @@ type HOTPOptions = {
|
|
|
30
30
|
encoding?: KeyEncodings;
|
|
31
31
|
crypto?: CryptoPlugin;
|
|
32
32
|
base32?: Base32Plugin;
|
|
33
|
+
guardrails?: OTPGuardrails;
|
|
33
34
|
};
|
|
34
35
|
type TOTPOptions = HOTPOptions & {
|
|
35
36
|
epoch?: number | null;
|
|
@@ -48,6 +49,7 @@ type ResolvedHOTPOptions = {
|
|
|
48
49
|
encoding: KeyEncodings;
|
|
49
50
|
crypto: CryptoPlugin;
|
|
50
51
|
base32: Base32Plugin;
|
|
52
|
+
guardrails: OTPGuardrails;
|
|
51
53
|
};
|
|
52
54
|
type ResolvedTOTPOptions = ResolvedHOTPOptions & {
|
|
53
55
|
epoch: number;
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// src/authenticator.ts
|
|
2
2
|
import { generateSecret as generateSecretCore } from "@otplib/core";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { base32 as defaultBase323 } from "@otplib/plugin-base32-scure";
|
|
4
|
+
import { crypto as defaultCrypto3 } from "@otplib/plugin-crypto-noble";
|
|
5
5
|
import { generateSync as totpGenerateSync2, verifySync as totpVerifySync2 } from "@otplib/totp";
|
|
6
6
|
|
|
7
7
|
// src/totp.ts
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { base32 as defaultBase322 } from "@otplib/plugin-base32-scure";
|
|
9
|
+
import { crypto as defaultCrypto2 } from "@otplib/plugin-crypto-noble";
|
|
10
10
|
import {
|
|
11
11
|
generateSync as totpGenerateSync,
|
|
12
12
|
verifySync as totpVerifySync,
|
|
@@ -15,11 +15,12 @@ import {
|
|
|
15
15
|
import { generateTOTP as generateTOTPURI } from "@otplib/uri";
|
|
16
16
|
|
|
17
17
|
// src/hotp.ts
|
|
18
|
-
import { stringToBytes,
|
|
18
|
+
import { stringToBytes, createGuardrails } from "@otplib/core";
|
|
19
19
|
import { generateSync as hotpGenerateSync, verifySync as hotpVerifySync } from "@otplib/hotp";
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
20
|
+
import { base32 as defaultBase32 } from "@otplib/plugin-base32-scure";
|
|
21
|
+
import { crypto as defaultCrypto } from "@otplib/plugin-crypto-noble";
|
|
22
22
|
import { generateHOTP as generateHOTPURI } from "@otplib/uri";
|
|
23
|
+
import { hex } from "@scure/base";
|
|
23
24
|
|
|
24
25
|
// src/types.ts
|
|
25
26
|
var HashAlgorithms = {
|
|
@@ -37,14 +38,12 @@ var KeyEncodings = {
|
|
|
37
38
|
};
|
|
38
39
|
|
|
39
40
|
// src/hotp.ts
|
|
40
|
-
var defaultCrypto = new NobleCryptoPlugin();
|
|
41
|
-
var defaultBase32 = new ScureBase32Plugin();
|
|
42
41
|
function secretToBytes(secret, encoding) {
|
|
43
42
|
if (encoding === KeyEncodings.BASE32 || encoding === "base32") {
|
|
44
43
|
return defaultBase32.decode(secret);
|
|
45
44
|
}
|
|
46
45
|
if (encoding === KeyEncodings.HEX || encoding === "hex") {
|
|
47
|
-
return
|
|
46
|
+
return hex.decode(secret.replace(/\s/g, ""));
|
|
48
47
|
}
|
|
49
48
|
return stringToBytes(secret);
|
|
50
49
|
}
|
|
@@ -52,7 +51,10 @@ var HOTP = class _HOTP {
|
|
|
52
51
|
_options = {};
|
|
53
52
|
_defaultOptions = {};
|
|
54
53
|
constructor(defaultOptions = {}) {
|
|
55
|
-
this._defaultOptions = {
|
|
54
|
+
this._defaultOptions = {
|
|
55
|
+
...defaultOptions,
|
|
56
|
+
guardrails: createGuardrails(defaultOptions.guardrails)
|
|
57
|
+
};
|
|
56
58
|
this._options = {};
|
|
57
59
|
}
|
|
58
60
|
get options() {
|
|
@@ -65,7 +67,7 @@ var HOTP = class _HOTP {
|
|
|
65
67
|
return this._defaultOptions;
|
|
66
68
|
}
|
|
67
69
|
set defaultOptions(value) {
|
|
68
|
-
this._defaultOptions = value;
|
|
70
|
+
this._defaultOptions = { ...value };
|
|
69
71
|
}
|
|
70
72
|
get optionsAll() {
|
|
71
73
|
return this.allOptions();
|
|
@@ -97,7 +99,8 @@ var HOTP = class _HOTP {
|
|
|
97
99
|
counter,
|
|
98
100
|
algorithm: opts.algorithm,
|
|
99
101
|
digits: opts.digits,
|
|
100
|
-
crypto: opts.crypto
|
|
102
|
+
crypto: opts.crypto,
|
|
103
|
+
guardrails: opts.guardrails
|
|
101
104
|
});
|
|
102
105
|
}
|
|
103
106
|
check(token, secret, counter) {
|
|
@@ -111,7 +114,8 @@ var HOTP = class _HOTP {
|
|
|
111
114
|
algorithm: opts.algorithm,
|
|
112
115
|
digits: opts.digits,
|
|
113
116
|
counterTolerance: 0,
|
|
114
|
-
crypto: opts.crypto
|
|
117
|
+
crypto: opts.crypto,
|
|
118
|
+
guardrails: opts.guardrails
|
|
115
119
|
});
|
|
116
120
|
return result.valid;
|
|
117
121
|
} catch {
|
|
@@ -141,8 +145,6 @@ var HOTP = class _HOTP {
|
|
|
141
145
|
};
|
|
142
146
|
|
|
143
147
|
// src/totp.ts
|
|
144
|
-
var defaultCrypto2 = new NobleCryptoPlugin2();
|
|
145
|
-
var defaultBase322 = new ScureBase32Plugin2();
|
|
146
148
|
function parseWindow(window, step) {
|
|
147
149
|
if (window === void 0 || window === 0) {
|
|
148
150
|
return 0;
|
|
@@ -190,7 +192,8 @@ var TOTP = class _TOTP extends HOTP {
|
|
|
190
192
|
epoch: opts.epoch,
|
|
191
193
|
// v11: already in seconds
|
|
192
194
|
t0: 0,
|
|
193
|
-
crypto: opts.crypto
|
|
195
|
+
crypto: opts.crypto,
|
|
196
|
+
guardrails: opts.guardrails
|
|
194
197
|
});
|
|
195
198
|
}
|
|
196
199
|
check(token, secret) {
|
|
@@ -212,7 +215,8 @@ var TOTP = class _TOTP extends HOTP {
|
|
|
212
215
|
// v11: already in seconds
|
|
213
216
|
t0: 0,
|
|
214
217
|
epochTolerance,
|
|
215
|
-
crypto: opts.crypto
|
|
218
|
+
crypto: opts.crypto,
|
|
219
|
+
guardrails: opts.guardrails
|
|
216
220
|
});
|
|
217
221
|
if (!result.valid) {
|
|
218
222
|
return null;
|
|
@@ -250,8 +254,6 @@ var TOTP = class _TOTP extends HOTP {
|
|
|
250
254
|
};
|
|
251
255
|
|
|
252
256
|
// src/authenticator.ts
|
|
253
|
-
var defaultCrypto3 = new NobleCryptoPlugin3();
|
|
254
|
-
var defaultBase323 = new ScureBase32Plugin3();
|
|
255
257
|
function defaultKeyEncoder(secret, _encoding) {
|
|
256
258
|
const bytes = new TextEncoder().encode(secret);
|
|
257
259
|
return defaultBase323.encode(bytes);
|
|
@@ -308,7 +310,8 @@ var Authenticator = class _Authenticator extends TOTP {
|
|
|
308
310
|
epoch: opts.epoch,
|
|
309
311
|
// v11: already in seconds
|
|
310
312
|
t0: 0,
|
|
311
|
-
crypto: opts.crypto
|
|
313
|
+
crypto: opts.crypto,
|
|
314
|
+
guardrails: opts.guardrails
|
|
312
315
|
});
|
|
313
316
|
}
|
|
314
317
|
check(token, secret) {
|
|
@@ -330,7 +333,8 @@ var Authenticator = class _Authenticator extends TOTP {
|
|
|
330
333
|
// v11: already in seconds
|
|
331
334
|
t0: 0,
|
|
332
335
|
epochTolerance,
|
|
333
|
-
crypto: opts.crypto
|
|
336
|
+
crypto: opts.crypto,
|
|
337
|
+
guardrails: opts.guardrails
|
|
334
338
|
});
|
|
335
339
|
if (!result.valid) {
|
|
336
340
|
return null;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/authenticator.ts","../src/totp.ts","../src/hotp.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["/**\n * @otplib/preset-v11\n *\n * v11-compatible Authenticator class implementation.\n */\n\nimport { generateSecret as generateSecretCore } from \"@otplib/core\";\nimport { ScureBase32Plugin } from \"@otplib/plugin-base32-scure\";\nimport { NobleCryptoPlugin } from \"@otplib/plugin-crypto-noble\";\nimport { generateSync as totpGenerateSync, verifySync as totpVerifySync } from \"@otplib/totp\";\n\nimport { TOTP } from \"./totp.js\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type {\n AuthenticatorOptions,\n Base32SecretKey,\n SecretKey,\n KeyEncodings,\n ResolvedAuthenticatorOptions,\n} from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\nconst defaultCrypto = new NobleCryptoPlugin();\nconst defaultBase32 = new ScureBase32Plugin();\n\nfunction defaultKeyEncoder(secret: SecretKey, _encoding: KeyEncodings): Base32SecretKey {\n const bytes = new TextEncoder().encode(secret);\n return defaultBase32.encode(bytes);\n}\n\nfunction defaultKeyDecoder(encodedSecret: Base32SecretKey, _encoding: KeyEncodings): SecretKey {\n const bytes = defaultBase32.decode(encodedSecret);\n return new TextDecoder().decode(bytes);\n}\n\nfunction parseWindow(\n window: number | [number, number] | undefined,\n step: number,\n): number | [number, number] {\n if (window === undefined || window === 0) {\n return 0;\n }\n if (typeof window === \"number\") {\n // v11 treated window as steps\n return window * step;\n }\n return [window[0] * step, window[1] * step];\n}\n\nexport class Authenticator<T extends AuthenticatorOptions = AuthenticatorOptions> extends TOTP<T> {\n constructor(defaultOptions: Partial<T> = {}) {\n super(defaultOptions);\n }\n\n override create(defaultOptions: Partial<T> = {}): Authenticator<T> {\n return new Authenticator<T>(defaultOptions);\n }\n\n override allOptions(): Readonly<ResolvedAuthenticatorOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.HEX,\n epoch: null,\n step: 30,\n window: 0,\n keyEncoder: defaultKeyEncoder,\n keyDecoder: defaultKeyDecoder,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n\n const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1000);\n\n return Object.freeze({\n ...merged,\n epoch: epoch as number,\n }) as Readonly<ResolvedAuthenticatorOptions>;\n }\n\n override generate(secret: Base32SecretKey): string {\n const opts = this.allOptions();\n\n // Generate using decoded secret (as raw bytes)\n const secretBytes = defaultBase32.decode(secret);\n\n return totpGenerateSync({\n secret: secretBytes,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n crypto: opts.crypto,\n });\n }\n\n override check(token: string, secret: Base32SecretKey): boolean {\n const delta = this.checkDelta(token, secret);\n return typeof delta === \"number\";\n }\n\n override checkDelta(token: string, secret: Base32SecretKey): number | null {\n const opts = this.allOptions();\n const secretBytes = defaultBase32.decode(secret);\n const epochTolerance = parseWindow(opts.window, opts.step);\n\n try {\n const result = totpVerifySync({\n secret: secretBytes,\n token,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n epochTolerance,\n crypto: opts.crypto,\n });\n\n if (!result.valid) {\n return null;\n }\n\n return result.delta;\n } catch {\n return null;\n }\n }\n\n override verify(opts: { token: string; secret: Base32SecretKey }): boolean {\n if (typeof opts !== \"object\") {\n // v11 legacy behavior: verify requires object\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret);\n }\n\n encode(secret: SecretKey): Base32SecretKey {\n const opts = this.allOptions();\n return opts.keyEncoder(secret, opts.encoding);\n }\n\n decode(secret: Base32SecretKey): SecretKey {\n const opts = this.allOptions();\n return opts.keyDecoder(secret, opts.encoding);\n }\n\n generateSecret(numberOfBytes: number = 20): Base32SecretKey {\n const opts = this.allOptions();\n return generateSecretCore({\n crypto: opts.crypto,\n base32: opts.base32,\n length: numberOfBytes,\n });\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible TOTP class implementation.\n */\n\nimport { ScureBase32Plugin } from \"@otplib/plugin-base32-scure\";\nimport { NobleCryptoPlugin } from \"@otplib/plugin-crypto-noble\";\nimport {\n generateSync as totpGenerateSync,\n verifySync as totpVerifySync,\n getRemainingTime,\n} from \"@otplib/totp\";\nimport { generateTOTP as generateTOTPURI } from \"@otplib/uri\";\n\nimport { HOTP, secretToBytes } from \"./hotp.js\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type { TOTPOptions, SecretKey, ResolvedTOTPOptions } from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\nconst defaultCrypto = new NobleCryptoPlugin();\nconst defaultBase32 = new ScureBase32Plugin();\n\nfunction parseWindow(\n window: number | [number, number] | undefined,\n step: number,\n): number | [number, number] {\n if (window === undefined || window === 0) {\n return 0;\n }\n if (typeof window === \"number\") {\n // v11 treated window as steps\n return window * step;\n }\n return [window[0] * step, window[1] * step];\n}\n\nexport class TOTP<T extends TOTPOptions = TOTPOptions> extends HOTP<T> {\n constructor(defaultOptions: Partial<T> = {}) {\n super(defaultOptions);\n }\n\n override create(defaultOptions: Partial<T> = {}): TOTP<T> {\n return new TOTP<T>(defaultOptions);\n }\n\n override allOptions(): Readonly<ResolvedTOTPOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.ASCII,\n epoch: null, // v11 default was null, meaning \"now\"\n step: 30,\n window: 0,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n\n // Resolve epoch to seconds if null\n const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1000);\n\n return Object.freeze({\n ...merged,\n epoch: epoch as number,\n }) as Readonly<ResolvedTOTPOptions>;\n }\n\n generate(secret: SecretKey): string {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n return totpGenerateSync({\n secret: secretBytes,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n crypto: opts.crypto,\n });\n }\n\n check(token: string, secret: SecretKey): boolean {\n const delta = this.checkDelta(token, secret);\n return typeof delta === \"number\";\n }\n\n checkDelta(token: string, secret: SecretKey): number | null {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n const epochTolerance = parseWindow(opts.window, opts.step);\n\n try {\n const result = totpVerifySync({\n secret: secretBytes,\n token,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n epochTolerance,\n crypto: opts.crypto,\n });\n\n if (!result.valid) {\n return null;\n }\n\n return result.delta;\n } catch {\n return null;\n }\n }\n\n override verify(opts: { token: string; secret: SecretKey }): boolean {\n if (typeof opts !== \"object\") {\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret);\n }\n\n keyuri(accountName: string, issuer: string, secret: SecretKey): string {\n const opts = this.allOptions();\n\n return generateTOTPURI({\n label: accountName,\n issuer,\n secret,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n });\n }\n\n timeUsed(): number {\n const opts = this.allOptions();\n return opts.epoch % opts.step;\n }\n\n timeRemaining(): number {\n const opts = this.allOptions();\n return getRemainingTime(opts.epoch, opts.step, 0);\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible HOTP class implementation.\n */\n\nimport { stringToBytes, hexToBytes } from \"@otplib/core\";\nimport { generateSync as hotpGenerateSync, verifySync as hotpVerifySync } from \"@otplib/hotp\";\nimport { ScureBase32Plugin } from \"@otplib/plugin-base32-scure\";\nimport { NobleCryptoPlugin } from \"@otplib/plugin-crypto-noble\";\nimport { generateHOTP as generateHOTPURI } from \"@otplib/uri\";\n\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type { HOTPOptions, SecretKey, ResolvedHOTPOptions } from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\nconst defaultCrypto = new NobleCryptoPlugin();\nconst defaultBase32 = new ScureBase32Plugin();\n\n/**\n * Convert a string secret to bytes based on encoding\n */\nexport function secretToBytes(secret: SecretKey, encoding?: string): Uint8Array {\n if (encoding === KeyEncodingsConst.BASE32 || encoding === \"base32\") {\n return defaultBase32.decode(secret);\n }\n if (encoding === KeyEncodingsConst.HEX || encoding === \"hex\") {\n return hexToBytes(secret.replace(/\\s/g, \"\"));\n }\n return stringToBytes(secret);\n}\n\nexport class HOTP<T extends HOTPOptions = HOTPOptions> {\n protected _options: Partial<T> = {};\n protected _defaultOptions: Partial<T> = {};\n\n constructor(defaultOptions: Partial<T> = {}) {\n this._defaultOptions = { ...defaultOptions };\n this._options = {};\n }\n\n get options(): Partial<T> {\n return { ...this._defaultOptions, ...this._options };\n }\n\n set options(value: Partial<T>) {\n this._options = { ...value };\n }\n\n get defaultOptions(): Partial<T> {\n return this._defaultOptions;\n }\n\n set defaultOptions(value: Partial<T>) {\n this._defaultOptions = value;\n }\n\n get optionsAll(): Readonly<ResolvedHOTPOptions> {\n return this.allOptions();\n }\n\n create(defaultOptions: Partial<T> = {}): HOTP<T> {\n return new HOTP<T>(defaultOptions);\n }\n\n allOptions(): Readonly<ResolvedHOTPOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.ASCII,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n return Object.freeze(merged) as Readonly<ResolvedHOTPOptions>;\n }\n\n resetOptions(): this {\n this._options = {};\n return this;\n }\n\n generate(secret: SecretKey, counter: number): string {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n return hotpGenerateSync({\n secret: secretBytes,\n counter,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n crypto: opts.crypto,\n });\n }\n\n check(token: string, secret: SecretKey, counter: number): boolean {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n try {\n const result = hotpVerifySync({\n secret: secretBytes,\n token,\n counter,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n counterTolerance: 0,\n crypto: opts.crypto,\n });\n\n return result.valid;\n } catch {\n return false;\n }\n }\n\n verify(opts: { token: string; secret: SecretKey; counter: number }): boolean {\n if (typeof opts !== \"object\") {\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret, opts.counter);\n }\n\n keyuri(accountName: string, issuer: string, secret: SecretKey, counter: number): string {\n const opts = this.allOptions();\n\n return generateHOTPURI({\n label: accountName,\n issuer,\n secret,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n counter,\n });\n }\n\n getClass(): typeof HOTP {\n return HOTP;\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible type definitions.\n * v11 used functionality similar to v12 but with seconds-based epochs.\n */\n\nimport type { CryptoPlugin, Base32Plugin, HashAlgorithm } from \"@otplib/core\";\n\nexport const HashAlgorithms = {\n SHA1: \"sha1\",\n SHA256: \"sha256\",\n SHA512: \"sha512\",\n} as const;\n\nexport type HashAlgorithms = (typeof HashAlgorithms)[keyof typeof HashAlgorithms];\n\nexport const KeyEncodings = {\n ASCII: \"ascii\",\n HEX: \"hex\",\n BASE32: \"base32\",\n BASE64: \"base64\",\n LATIN1: \"latin1\",\n UTF8: \"utf8\",\n} as const;\n\nexport type KeyEncodings = (typeof KeyEncodings)[keyof typeof KeyEncodings];\n\nexport type SecretKey = string;\nexport type Base32SecretKey = string;\n\nexport type HOTPOptions = {\n algorithm?: HashAlgorithm;\n digits?: number;\n encoding?: KeyEncodings;\n crypto?: CryptoPlugin;\n base32?: Base32Plugin;\n};\n\nexport type TOTPOptions = HOTPOptions & {\n epoch?: number | null; // v11: seconds\n step?: number;\n window?: number | [number, number];\n};\n\nexport type KeyEncoder = (secret: SecretKey, encoding: KeyEncodings) => Base32SecretKey;\nexport type KeyDecoder = (encodedSecret: Base32SecretKey, encoding: KeyEncodings) => SecretKey;\n\nexport type AuthenticatorOptions = TOTPOptions & {\n keyEncoder?: KeyEncoder;\n keyDecoder?: KeyDecoder;\n};\n\nexport type ResolvedHOTPOptions = {\n algorithm: HashAlgorithm;\n digits: number;\n encoding: KeyEncodings;\n crypto: CryptoPlugin;\n base32: Base32Plugin;\n};\n\nexport type ResolvedTOTPOptions = ResolvedHOTPOptions & {\n epoch: number;\n step: number;\n window: number | [number, number];\n};\n\nexport type ResolvedAuthenticatorOptions = ResolvedTOTPOptions & {\n keyEncoder: KeyEncoder;\n keyDecoder: KeyDecoder;\n};\n","/**\n * @otplib/preset-v11\n *\n * v11 compatibility preset.\n */\n\nimport { Authenticator } from \"./authenticator.js\";\nimport { HOTP } from \"./hotp.js\";\nimport { TOTP } from \"./totp.js\";\n\nexport { HOTP, TOTP, Authenticator };\nexport * from \"./types.js\";\n\nexport const hotp = new HOTP();\nexport const totp = new TOTP();\nexport const authenticator = new Authenticator();\n"],"mappings":"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","names":["ScureBase32Plugin","NobleCryptoPlugin","totpGenerateSync","totpVerifySync","ScureBase32Plugin","NobleCryptoPlugin","defaultCrypto","NobleCryptoPlugin","defaultBase32","ScureBase32Plugin","defaultCrypto","NobleCryptoPlugin","defaultBase32","ScureBase32Plugin","parseWindow","totpGenerateSync","totpVerifySync"]}
|
|
1
|
+
{"version":3,"sources":["../src/authenticator.ts","../src/totp.ts","../src/hotp.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["/**\n * @otplib/preset-v11\n *\n * v11-compatible Authenticator class implementation.\n */\n\nimport { generateSecret as generateSecretCore } from \"@otplib/core\";\nimport { base32 as defaultBase32 } from \"@otplib/plugin-base32-scure\";\nimport { crypto as defaultCrypto } from \"@otplib/plugin-crypto-noble\";\nimport { generateSync as totpGenerateSync, verifySync as totpVerifySync } from \"@otplib/totp\";\n\nimport { TOTP } from \"./totp.js\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type {\n AuthenticatorOptions,\n Base32SecretKey,\n SecretKey,\n KeyEncodings,\n ResolvedAuthenticatorOptions,\n} from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\nfunction defaultKeyEncoder(secret: SecretKey, _encoding: KeyEncodings): Base32SecretKey {\n const bytes = new TextEncoder().encode(secret);\n return defaultBase32.encode(bytes);\n}\n\nfunction defaultKeyDecoder(encodedSecret: Base32SecretKey, _encoding: KeyEncodings): SecretKey {\n const bytes = defaultBase32.decode(encodedSecret);\n return new TextDecoder().decode(bytes);\n}\n\nfunction parseWindow(\n window: number | [number, number] | undefined,\n step: number,\n): number | [number, number] {\n if (window === undefined || window === 0) {\n return 0;\n }\n if (typeof window === \"number\") {\n // v11 treated window as steps\n return window * step;\n }\n return [window[0] * step, window[1] * step];\n}\n\nexport class Authenticator<T extends AuthenticatorOptions = AuthenticatorOptions> extends TOTP<T> {\n constructor(defaultOptions: Partial<T> = {}) {\n super(defaultOptions);\n }\n\n override create(defaultOptions: Partial<T> = {}): Authenticator<T> {\n return new Authenticator<T>(defaultOptions);\n }\n\n override allOptions(): Readonly<ResolvedAuthenticatorOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.HEX,\n epoch: null,\n step: 30,\n window: 0,\n keyEncoder: defaultKeyEncoder,\n keyDecoder: defaultKeyDecoder,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n\n const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1000);\n\n return Object.freeze({\n ...merged,\n epoch: epoch as number,\n }) as Readonly<ResolvedAuthenticatorOptions>;\n }\n\n override generate(secret: Base32SecretKey): string {\n const opts = this.allOptions();\n\n // Generate using decoded secret (as raw bytes)\n const secretBytes = defaultBase32.decode(secret);\n\n return totpGenerateSync({\n secret: secretBytes,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n }\n\n override check(token: string, secret: Base32SecretKey): boolean {\n const delta = this.checkDelta(token, secret);\n return typeof delta === \"number\";\n }\n\n override checkDelta(token: string, secret: Base32SecretKey): number | null {\n const opts = this.allOptions();\n const secretBytes = defaultBase32.decode(secret);\n const epochTolerance = parseWindow(opts.window, opts.step);\n\n try {\n const result = totpVerifySync({\n secret: secretBytes,\n token,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n epochTolerance,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n\n if (!result.valid) {\n return null;\n }\n\n return result.delta;\n } catch {\n return null;\n }\n }\n\n override verify(opts: { token: string; secret: Base32SecretKey }): boolean {\n if (typeof opts !== \"object\") {\n // v11 legacy behavior: verify requires object\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret);\n }\n\n encode(secret: SecretKey): Base32SecretKey {\n const opts = this.allOptions();\n return opts.keyEncoder(secret, opts.encoding);\n }\n\n decode(secret: Base32SecretKey): SecretKey {\n const opts = this.allOptions();\n return opts.keyDecoder(secret, opts.encoding);\n }\n\n generateSecret(numberOfBytes: number = 20): Base32SecretKey {\n const opts = this.allOptions();\n return generateSecretCore({\n crypto: opts.crypto,\n base32: opts.base32,\n length: numberOfBytes,\n });\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible TOTP class implementation.\n */\n\nimport { base32 as defaultBase32 } from \"@otplib/plugin-base32-scure\";\nimport { crypto as defaultCrypto } from \"@otplib/plugin-crypto-noble\";\nimport {\n generateSync as totpGenerateSync,\n verifySync as totpVerifySync,\n getRemainingTime,\n} from \"@otplib/totp\";\nimport { generateTOTP as generateTOTPURI } from \"@otplib/uri\";\n\nimport { HOTP, secretToBytes } from \"./hotp.js\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type { TOTPOptions, SecretKey, ResolvedTOTPOptions } from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\nfunction parseWindow(\n window: number | [number, number] | undefined,\n step: number,\n): number | [number, number] {\n if (window === undefined || window === 0) {\n return 0;\n }\n if (typeof window === \"number\") {\n // v11 treated window as steps\n return window * step;\n }\n return [window[0] * step, window[1] * step];\n}\n\nexport class TOTP<T extends TOTPOptions = TOTPOptions> extends HOTP<T> {\n constructor(defaultOptions: Partial<T> = {}) {\n super(defaultOptions);\n }\n\n override create(defaultOptions: Partial<T> = {}): TOTP<T> {\n return new TOTP<T>(defaultOptions);\n }\n\n override allOptions(): Readonly<ResolvedTOTPOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.ASCII,\n epoch: null, // v11 default was null, meaning \"now\"\n step: 30,\n window: 0,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n\n // Resolve epoch to seconds if null\n const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1000);\n\n return Object.freeze({\n ...merged,\n epoch: epoch as number,\n }) as Readonly<ResolvedTOTPOptions>;\n }\n\n generate(secret: SecretKey): string {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n return totpGenerateSync({\n secret: secretBytes,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n }\n\n check(token: string, secret: SecretKey): boolean {\n const delta = this.checkDelta(token, secret);\n return typeof delta === \"number\";\n }\n\n checkDelta(token: string, secret: SecretKey): number | null {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n const epochTolerance = parseWindow(opts.window, opts.step);\n\n try {\n const result = totpVerifySync({\n secret: secretBytes,\n token,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n epochTolerance,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n\n if (!result.valid) {\n return null;\n }\n\n return result.delta;\n } catch {\n return null;\n }\n }\n\n override verify(opts: { token: string; secret: SecretKey }): boolean {\n if (typeof opts !== \"object\") {\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret);\n }\n\n keyuri(accountName: string, issuer: string, secret: SecretKey): string {\n const opts = this.allOptions();\n\n return generateTOTPURI({\n label: accountName,\n issuer,\n secret,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n });\n }\n\n timeUsed(): number {\n const opts = this.allOptions();\n return opts.epoch % opts.step;\n }\n\n timeRemaining(): number {\n const opts = this.allOptions();\n return getRemainingTime(opts.epoch, opts.step, 0);\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible HOTP class implementation.\n */\n\nimport { stringToBytes, createGuardrails } from \"@otplib/core\";\nimport { generateSync as hotpGenerateSync, verifySync as hotpVerifySync } from \"@otplib/hotp\";\nimport { base32 as defaultBase32 } from \"@otplib/plugin-base32-scure\";\nimport { crypto as defaultCrypto } from \"@otplib/plugin-crypto-noble\";\nimport { generateHOTP as generateHOTPURI } from \"@otplib/uri\";\nimport { hex } from \"@scure/base\";\n\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types.js\";\n\nimport type { HOTPOptions, SecretKey, ResolvedHOTPOptions } from \"./types.js\";\nimport type { Digits } from \"@otplib/core\";\n\n/**\n * Convert a string secret to bytes based on encoding\n */\nexport function secretToBytes(secret: SecretKey, encoding?: string): Uint8Array {\n if (encoding === KeyEncodingsConst.BASE32 || encoding === \"base32\") {\n return defaultBase32.decode(secret);\n }\n if (encoding === KeyEncodingsConst.HEX || encoding === \"hex\") {\n return hex.decode(secret.replace(/\\s/g, \"\"));\n }\n return stringToBytes(secret);\n}\n\nexport class HOTP<T extends HOTPOptions = HOTPOptions> {\n protected _options: Partial<T> = {};\n protected _defaultOptions: Partial<T> = {};\n\n constructor(defaultOptions: Partial<T> = {}) {\n this._defaultOptions = {\n ...defaultOptions,\n guardrails: createGuardrails(defaultOptions.guardrails),\n } as Partial<T>;\n this._options = {};\n }\n\n get options(): Partial<T> {\n return { ...this._defaultOptions, ...this._options };\n }\n\n set options(value: Partial<T>) {\n this._options = { ...value };\n }\n\n get defaultOptions(): Partial<T> {\n return this._defaultOptions;\n }\n\n set defaultOptions(value: Partial<T>) {\n this._defaultOptions = { ...value };\n }\n\n get optionsAll(): Readonly<ResolvedHOTPOptions> {\n return this.allOptions();\n }\n\n create(defaultOptions: Partial<T> = {}): HOTP<T> {\n return new HOTP<T>(defaultOptions);\n }\n\n allOptions(): Readonly<ResolvedHOTPOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.ASCII,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n return Object.freeze(merged) as Readonly<ResolvedHOTPOptions>;\n }\n\n resetOptions(): this {\n this._options = {};\n return this;\n }\n\n generate(secret: SecretKey, counter: number): string {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n return hotpGenerateSync({\n secret: secretBytes,\n counter,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n }\n\n check(token: string, secret: SecretKey, counter: number): boolean {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n try {\n const result = hotpVerifySync({\n secret: secretBytes,\n token,\n counter,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n counterTolerance: 0,\n crypto: opts.crypto,\n guardrails: opts.guardrails,\n });\n\n return result.valid;\n } catch {\n return false;\n }\n }\n\n verify(opts: { token: string; secret: SecretKey; counter: number }): boolean {\n if (typeof opts !== \"object\") {\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret, opts.counter);\n }\n\n keyuri(accountName: string, issuer: string, secret: SecretKey, counter: number): string {\n const opts = this.allOptions();\n\n return generateHOTPURI({\n label: accountName,\n issuer,\n secret,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n counter,\n });\n }\n\n getClass(): typeof HOTP {\n return HOTP;\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible type definitions.\n * v11 used functionality similar to v12 but with seconds-based epochs.\n */\n\nimport type { CryptoPlugin, Base32Plugin, HashAlgorithm, OTPGuardrails } from \"@otplib/core\";\n\nexport const HashAlgorithms = {\n SHA1: \"sha1\",\n SHA256: \"sha256\",\n SHA512: \"sha512\",\n} as const;\n\nexport type HashAlgorithms = (typeof HashAlgorithms)[keyof typeof HashAlgorithms];\n\nexport const KeyEncodings = {\n ASCII: \"ascii\",\n HEX: \"hex\",\n BASE32: \"base32\",\n BASE64: \"base64\",\n LATIN1: \"latin1\",\n UTF8: \"utf8\",\n} as const;\n\nexport type KeyEncodings = (typeof KeyEncodings)[keyof typeof KeyEncodings];\n\nexport type SecretKey = string;\nexport type Base32SecretKey = string;\n\nexport type HOTPOptions = {\n algorithm?: HashAlgorithm;\n digits?: number;\n encoding?: KeyEncodings;\n crypto?: CryptoPlugin;\n base32?: Base32Plugin;\n guardrails?: OTPGuardrails;\n};\n\nexport type TOTPOptions = HOTPOptions & {\n epoch?: number | null; // v11: seconds\n step?: number;\n window?: number | [number, number];\n};\n\nexport type KeyEncoder = (secret: SecretKey, encoding: KeyEncodings) => Base32SecretKey;\nexport type KeyDecoder = (encodedSecret: Base32SecretKey, encoding: KeyEncodings) => SecretKey;\n\nexport type AuthenticatorOptions = TOTPOptions & {\n keyEncoder?: KeyEncoder;\n keyDecoder?: KeyDecoder;\n};\n\nexport type ResolvedHOTPOptions = {\n algorithm: HashAlgorithm;\n digits: number;\n encoding: KeyEncodings;\n crypto: CryptoPlugin;\n base32: Base32Plugin;\n guardrails: OTPGuardrails;\n};\n\nexport type ResolvedTOTPOptions = ResolvedHOTPOptions & {\n epoch: number;\n step: number;\n window: number | [number, number];\n};\n\nexport type ResolvedAuthenticatorOptions = ResolvedTOTPOptions & {\n keyEncoder: KeyEncoder;\n keyDecoder: KeyDecoder;\n};\n","/**\n * @otplib/preset-v11\n *\n * v11 compatibility preset.\n */\n\nimport { Authenticator } from \"./authenticator.js\";\nimport { HOTP } from \"./hotp.js\";\nimport { TOTP } from \"./totp.js\";\n\nexport { HOTP, TOTP, Authenticator };\nexport * from \"./types.js\";\n\nexport const hotp = new HOTP();\nexport const totp = new TOTP();\nexport const authenticator = new Authenticator();\n"],"mappings":"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","names":["defaultBase32","defaultCrypto","totpGenerateSync","totpVerifySync","defaultBase32","defaultCrypto","defaultCrypto","defaultBase32","defaultBase32","parseWindow","defaultCrypto","totpGenerateSync","totpVerifySync"]}
|
package/dist/metafile-cjs.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/types.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/types.ts":{"bytes":1789,"imports":[],"format":"esm"},"src/hotp.ts":{"bytes":3929,"imports":[{"path":"@otplib/core","kind":"import-statement","external":true},{"path":"@otplib/hotp","kind":"import-statement","external":true},{"path":"@otplib/plugin-base32-scure","kind":"import-statement","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"import-statement","external":true},{"path":"@otplib/uri","kind":"import-statement","external":true},{"path":"@scure/base","kind":"import-statement","external":true},{"path":"src/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/totp.ts":{"bytes":3951,"imports":[{"path":"@otplib/plugin-base32-scure","kind":"import-statement","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"import-statement","external":true},{"path":"@otplib/totp","kind":"import-statement","external":true},{"path":"@otplib/uri","kind":"import-statement","external":true},{"path":"src/hotp.ts","kind":"import-statement","original":"./hotp.js"},{"path":"src/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/authenticator.ts":{"bytes":4539,"imports":[{"path":"@otplib/core","kind":"import-statement","external":true},{"path":"@otplib/plugin-base32-scure","kind":"import-statement","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"import-statement","external":true},{"path":"@otplib/totp","kind":"import-statement","external":true},{"path":"src/totp.ts","kind":"import-statement","original":"./totp.js"},{"path":"src/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/index.ts":{"bytes":365,"imports":[{"path":"src/authenticator.ts","kind":"import-statement","original":"./authenticator.js"},{"path":"src/hotp.ts","kind":"import-statement","original":"./hotp.js"},{"path":"src/totp.ts","kind":"import-statement","original":"./totp.js"},{"path":"src/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"}},"outputs":{"dist/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":22963},"dist/index.cjs":{"imports":[{"path":"@otplib/core","kind":"require-call","external":true},{"path":"@otplib/plugin-base32-scure","kind":"require-call","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"require-call","external":true},{"path":"@otplib/totp","kind":"require-call","external":true},{"path":"@otplib/plugin-base32-scure","kind":"require-call","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"require-call","external":true},{"path":"@otplib/totp","kind":"require-call","external":true},{"path":"@otplib/uri","kind":"require-call","external":true},{"path":"@otplib/core","kind":"require-call","external":true},{"path":"@otplib/hotp","kind":"require-call","external":true},{"path":"@otplib/plugin-base32-scure","kind":"require-call","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"require-call","external":true},{"path":"@otplib/uri","kind":"require-call","external":true},{"path":"@scure/base","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/index.ts","inputs":{"src/index.ts":{"bytesInOutput":418},"src/authenticator.ts":{"bytesInOutput":3434},"src/totp.ts":{"bytesInOutput":3071},"src/hotp.ts":{"bytesInOutput":3080},"src/types.ts":{"bytesInOutput":212}},"bytes":11369}}}
|
package/dist/metafile-esm.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/types.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/types.ts":{"bytes":1789,"imports":[],"format":"esm"},"src/hotp.ts":{"bytes":3929,"imports":[{"path":"@otplib/core","kind":"import-statement","external":true},{"path":"@otplib/hotp","kind":"import-statement","external":true},{"path":"@otplib/plugin-base32-scure","kind":"import-statement","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"import-statement","external":true},{"path":"@otplib/uri","kind":"import-statement","external":true},{"path":"@scure/base","kind":"import-statement","external":true},{"path":"src/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/totp.ts":{"bytes":3951,"imports":[{"path":"@otplib/plugin-base32-scure","kind":"import-statement","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"import-statement","external":true},{"path":"@otplib/totp","kind":"import-statement","external":true},{"path":"@otplib/uri","kind":"import-statement","external":true},{"path":"src/hotp.ts","kind":"import-statement","original":"./hotp.js"},{"path":"src/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/authenticator.ts":{"bytes":4539,"imports":[{"path":"@otplib/core","kind":"import-statement","external":true},{"path":"@otplib/plugin-base32-scure","kind":"import-statement","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"import-statement","external":true},{"path":"@otplib/totp","kind":"import-statement","external":true},{"path":"src/totp.ts","kind":"import-statement","original":"./totp.js"},{"path":"src/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/index.ts":{"bytes":365,"imports":[{"path":"src/authenticator.ts","kind":"import-statement","original":"./authenticator.js"},{"path":"src/hotp.ts","kind":"import-statement","original":"./hotp.js"},{"path":"src/totp.ts","kind":"import-statement","original":"./totp.js"},{"path":"src/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"}},"outputs":{"dist/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":22707},"dist/index.js":{"imports":[{"path":"@otplib/core","kind":"import-statement","external":true},{"path":"@otplib/plugin-base32-scure","kind":"import-statement","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"import-statement","external":true},{"path":"@otplib/totp","kind":"import-statement","external":true},{"path":"@otplib/plugin-base32-scure","kind":"import-statement","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"import-statement","external":true},{"path":"@otplib/totp","kind":"import-statement","external":true},{"path":"@otplib/uri","kind":"import-statement","external":true},{"path":"@otplib/core","kind":"import-statement","external":true},{"path":"@otplib/hotp","kind":"import-statement","external":true},{"path":"@otplib/plugin-base32-scure","kind":"import-statement","external":true},{"path":"@otplib/plugin-crypto-noble","kind":"import-statement","external":true},{"path":"@otplib/uri","kind":"import-statement","external":true},{"path":"@scure/base","kind":"import-statement","external":true}],"exports":["Authenticator","HOTP","HashAlgorithms","KeyEncodings","TOTP","authenticator","hotp","totp"],"entryPoint":"src/index.ts","inputs":{"src/authenticator.ts":{"bytesInOutput":3348},"src/totp.ts":{"bytesInOutput":3067},"src/hotp.ts":{"bytesInOutput":3019},"src/types.ts":{"bytesInOutput":212},"src/index.ts":{"bytesInOutput":87}},"bytes":9991}}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@otplib/preset-v11",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.2.1",
|
|
4
4
|
"description": "v11 compatibility preset for otplib",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Gerald Yeo <support@yeojz.dev>",
|
|
@@ -47,17 +47,18 @@
|
|
|
47
47
|
"LICENSE"
|
|
48
48
|
],
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@
|
|
51
|
-
"@otplib/
|
|
52
|
-
"@otplib/
|
|
53
|
-
"@otplib/
|
|
54
|
-
"@otplib/
|
|
55
|
-
"@otplib/
|
|
50
|
+
"@scure/base": "^2.0.0",
|
|
51
|
+
"@otplib/totp": "13.2.1",
|
|
52
|
+
"@otplib/hotp": "13.2.1",
|
|
53
|
+
"@otplib/core": "13.2.1",
|
|
54
|
+
"@otplib/uri": "13.2.1",
|
|
55
|
+
"@otplib/plugin-crypto-noble": "13.2.1",
|
|
56
|
+
"@otplib/plugin-base32-scure": "13.2.1"
|
|
56
57
|
},
|
|
57
58
|
"devDependencies": {
|
|
58
59
|
"tsup": "^8.0.1",
|
|
59
60
|
"typescript": "^5.3.3",
|
|
60
|
-
"vitest": "^4.0.
|
|
61
|
+
"vitest": "^4.0.18",
|
|
61
62
|
"@repo/testing": "13.0.1"
|
|
62
63
|
},
|
|
63
64
|
"publishConfig": {
|