@otplib/preset-v11 12.0.0 → 13.0.0

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
- The MIT License (MIT)
1
+ MIT License
2
2
 
3
- Copyright (c) 2014 Gerald Yeo <contact@fusedthought.com>
3
+ Copyright (c) 2026 Gerald Yeo
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,20 +1,37 @@
1
1
  # @otplib/preset-v11
2
2
 
3
- > Preset with v11.x compatibility adapter for otplib@v12.x
3
+ > Drop-in replacement adapter for migrating `otplib` from v11 to v13.
4
4
 
5
- See our [project readme][project-v-readme] for more information
6
- or visit the [demo website][project-v-site].
5
+ This adapter mimics the v11 API while using v13's plugins under the hood. However, some fundamental changes from v13 may carry over.
7
6
 
8
- ## Install
7
+ **Note:** This is intended as a temporary bridge to help you upgrade to v13 without rewriting your entire application immediately. We strongly recommend fully migrating to the new v13 API when possible.
8
+
9
+ ## Installation
9
10
 
10
11
  ```bash
11
- npm install --save @otplib/preset-v11
12
+ npm install @otplib/preset-v11
13
+ pnpm add @otplib/preset-v11
14
+ yarn add @otplib/preset-v11
12
15
  ```
13
16
 
14
- ## License
17
+ ## Usage
18
+
19
+ This package provides a drop-in replacement for `otplib` v11, using the v13 core.
15
20
 
16
- `@otplib/preset-v11` is [MIT licensed][project-license]
21
+ ```javascript
22
+ import { authenticator, hotp, totp } from "@otplib/preset-v11";
23
+
24
+ const secret = authenticator.generateSecret();
25
+ const token = authenticator.generate(secret);
26
+ const isValid = authenticator.check(token, secret);
27
+ ```
28
+
29
+ ## Compatibility Notes
30
+
31
+ - **Epoch**: Uses seconds (UNIX timestamp), same as v11.
32
+ - **Error Handling**: `check` and `verify` methods swallow errors and return `false`, matching v11 behavior.
33
+ - **Secret Length**: Enforces strict secret length (> 16 bytes) due to v13 core security requirements.
34
+
35
+ ## License
17
36
 
18
- [project-license]: https://github.com/yeojz/otplib/blob/master/LICENSE
19
- [project-v-readme]: https://github.com/yeojz/otplib/blob/master/README.md
20
- [project-v-site]: https://otplib.yeojz.dev
37
+ [MIT](./LICENSE) © 2026 Gerald Yeo
package/dist/index.cjs ADDED
@@ -0,0 +1,411 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ Authenticator: () => Authenticator,
24
+ HOTP: () => HOTP,
25
+ HashAlgorithms: () => HashAlgorithms,
26
+ KeyEncodings: () => KeyEncodings,
27
+ TOTP: () => TOTP,
28
+ authenticator: () => authenticator,
29
+ hotp: () => hotp,
30
+ totp: () => totp
31
+ });
32
+ module.exports = __toCommonJS(index_exports);
33
+
34
+ // src/authenticator.ts
35
+ var import_core2 = require("@otplib/core");
36
+ var import_plugin_base32_scure3 = require("@otplib/plugin-base32-scure");
37
+ var import_plugin_crypto_noble3 = require("@otplib/plugin-crypto-noble");
38
+ var import_totp2 = require("@otplib/totp");
39
+
40
+ // src/totp.ts
41
+ var import_plugin_base32_scure2 = require("@otplib/plugin-base32-scure");
42
+ var import_plugin_crypto_noble2 = require("@otplib/plugin-crypto-noble");
43
+ var import_totp = require("@otplib/totp");
44
+ var import_uri2 = require("@otplib/uri");
45
+
46
+ // src/hotp.ts
47
+ var import_core = require("@otplib/core");
48
+ var import_hotp = require("@otplib/hotp");
49
+ var import_plugin_base32_scure = require("@otplib/plugin-base32-scure");
50
+ var import_plugin_crypto_noble = require("@otplib/plugin-crypto-noble");
51
+ var import_uri = require("@otplib/uri");
52
+
53
+ // src/types.ts
54
+ var HashAlgorithms = {
55
+ SHA1: "sha1",
56
+ SHA256: "sha256",
57
+ SHA512: "sha512"
58
+ };
59
+ var KeyEncodings = {
60
+ ASCII: "ascii",
61
+ HEX: "hex",
62
+ BASE32: "base32",
63
+ BASE64: "base64",
64
+ LATIN1: "latin1",
65
+ UTF8: "utf8"
66
+ };
67
+
68
+ // src/hotp.ts
69
+ var defaultCrypto = new import_plugin_crypto_noble.NobleCryptoPlugin();
70
+ var defaultBase32 = new import_plugin_base32_scure.ScureBase32Plugin();
71
+ function secretToBytes(secret, encoding) {
72
+ if (encoding === KeyEncodings.BASE32 || encoding === "base32") {
73
+ return defaultBase32.decode(secret);
74
+ }
75
+ if (encoding === KeyEncodings.HEX || encoding === "hex") {
76
+ return (0, import_core.hexToBytes)(secret.replace(/\s/g, ""));
77
+ }
78
+ return (0, import_core.stringToBytes)(secret);
79
+ }
80
+ var HOTP = class _HOTP {
81
+ _options = {};
82
+ _defaultOptions = {};
83
+ constructor(defaultOptions = {}) {
84
+ this._defaultOptions = { ...defaultOptions };
85
+ this._options = {};
86
+ }
87
+ get options() {
88
+ return { ...this._defaultOptions, ...this._options };
89
+ }
90
+ set options(value) {
91
+ this._options = { ...value };
92
+ }
93
+ get defaultOptions() {
94
+ return this._defaultOptions;
95
+ }
96
+ set defaultOptions(value) {
97
+ this._defaultOptions = value;
98
+ }
99
+ get optionsAll() {
100
+ return this.allOptions();
101
+ }
102
+ create(defaultOptions = {}) {
103
+ return new _HOTP(defaultOptions);
104
+ }
105
+ allOptions() {
106
+ const merged = {
107
+ algorithm: HashAlgorithms.SHA1,
108
+ digits: 6,
109
+ encoding: KeyEncodings.ASCII,
110
+ crypto: defaultCrypto,
111
+ base32: defaultBase32,
112
+ ...this._defaultOptions,
113
+ ...this._options
114
+ };
115
+ return Object.freeze(merged);
116
+ }
117
+ resetOptions() {
118
+ this._options = {};
119
+ return this;
120
+ }
121
+ generate(secret, counter) {
122
+ const opts = this.allOptions();
123
+ const secretBytes = secretToBytes(secret, opts.encoding);
124
+ return (0, import_hotp.generateSync)({
125
+ secret: secretBytes,
126
+ counter,
127
+ algorithm: opts.algorithm,
128
+ digits: opts.digits,
129
+ crypto: opts.crypto
130
+ });
131
+ }
132
+ check(token, secret, counter) {
133
+ const opts = this.allOptions();
134
+ const secretBytes = secretToBytes(secret, opts.encoding);
135
+ try {
136
+ const result = (0, import_hotp.verifySync)({
137
+ secret: secretBytes,
138
+ token,
139
+ counter,
140
+ algorithm: opts.algorithm,
141
+ digits: opts.digits,
142
+ counterTolerance: 0,
143
+ crypto: opts.crypto
144
+ });
145
+ return result.valid;
146
+ } catch {
147
+ return false;
148
+ }
149
+ }
150
+ verify(opts) {
151
+ if (typeof opts !== "object") {
152
+ throw new Error("Expecting argument 0 of verify to be an object");
153
+ }
154
+ return this.check(opts.token, opts.secret, opts.counter);
155
+ }
156
+ keyuri(accountName, issuer, secret, counter) {
157
+ const opts = this.allOptions();
158
+ return (0, import_uri.generateHOTP)({
159
+ label: accountName,
160
+ issuer,
161
+ secret,
162
+ algorithm: opts.algorithm,
163
+ digits: opts.digits,
164
+ counter
165
+ });
166
+ }
167
+ getClass() {
168
+ return _HOTP;
169
+ }
170
+ };
171
+
172
+ // src/totp.ts
173
+ var defaultCrypto2 = new import_plugin_crypto_noble2.NobleCryptoPlugin();
174
+ var defaultBase322 = new import_plugin_base32_scure2.ScureBase32Plugin();
175
+ function parseWindow(window, step) {
176
+ if (window === void 0 || window === 0) {
177
+ return 0;
178
+ }
179
+ if (typeof window === "number") {
180
+ return window * step;
181
+ }
182
+ return [window[0] * step, window[1] * step];
183
+ }
184
+ var TOTP = class _TOTP extends HOTP {
185
+ constructor(defaultOptions = {}) {
186
+ super(defaultOptions);
187
+ }
188
+ create(defaultOptions = {}) {
189
+ return new _TOTP(defaultOptions);
190
+ }
191
+ allOptions() {
192
+ const merged = {
193
+ algorithm: HashAlgorithms.SHA1,
194
+ digits: 6,
195
+ encoding: KeyEncodings.ASCII,
196
+ epoch: null,
197
+ // v11 default was null, meaning "now"
198
+ step: 30,
199
+ window: 0,
200
+ crypto: defaultCrypto2,
201
+ base32: defaultBase322,
202
+ ...this._defaultOptions,
203
+ ...this._options
204
+ };
205
+ const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1e3);
206
+ return Object.freeze({
207
+ ...merged,
208
+ epoch
209
+ });
210
+ }
211
+ generate(secret) {
212
+ const opts = this.allOptions();
213
+ const secretBytes = secretToBytes(secret, opts.encoding);
214
+ return (0, import_totp.generateSync)({
215
+ secret: secretBytes,
216
+ algorithm: opts.algorithm,
217
+ digits: opts.digits,
218
+ period: opts.step,
219
+ epoch: opts.epoch,
220
+ // v11: already in seconds
221
+ t0: 0,
222
+ crypto: opts.crypto
223
+ });
224
+ }
225
+ check(token, secret) {
226
+ const delta = this.checkDelta(token, secret);
227
+ return typeof delta === "number";
228
+ }
229
+ checkDelta(token, secret) {
230
+ const opts = this.allOptions();
231
+ const secretBytes = secretToBytes(secret, opts.encoding);
232
+ const epochTolerance = parseWindow(opts.window, opts.step);
233
+ try {
234
+ const result = (0, import_totp.verifySync)({
235
+ secret: secretBytes,
236
+ token,
237
+ algorithm: opts.algorithm,
238
+ digits: opts.digits,
239
+ period: opts.step,
240
+ epoch: opts.epoch,
241
+ // v11: already in seconds
242
+ t0: 0,
243
+ epochTolerance,
244
+ crypto: opts.crypto
245
+ });
246
+ if (!result.valid) {
247
+ return null;
248
+ }
249
+ return result.delta;
250
+ } catch {
251
+ return null;
252
+ }
253
+ }
254
+ verify(opts) {
255
+ if (typeof opts !== "object") {
256
+ throw new Error("Expecting argument 0 of verify to be an object");
257
+ }
258
+ return this.check(opts.token, opts.secret);
259
+ }
260
+ keyuri(accountName, issuer, secret) {
261
+ const opts = this.allOptions();
262
+ return (0, import_uri2.generateTOTP)({
263
+ label: accountName,
264
+ issuer,
265
+ secret,
266
+ algorithm: opts.algorithm,
267
+ digits: opts.digits,
268
+ period: opts.step
269
+ });
270
+ }
271
+ timeUsed() {
272
+ const opts = this.allOptions();
273
+ return opts.epoch % opts.step;
274
+ }
275
+ timeRemaining() {
276
+ const opts = this.allOptions();
277
+ return (0, import_totp.getRemainingTime)(opts.epoch, opts.step, 0);
278
+ }
279
+ };
280
+
281
+ // src/authenticator.ts
282
+ var defaultCrypto3 = new import_plugin_crypto_noble3.NobleCryptoPlugin();
283
+ var defaultBase323 = new import_plugin_base32_scure3.ScureBase32Plugin();
284
+ function defaultKeyEncoder(secret, _encoding) {
285
+ const bytes = new TextEncoder().encode(secret);
286
+ return defaultBase323.encode(bytes);
287
+ }
288
+ function defaultKeyDecoder(encodedSecret, _encoding) {
289
+ const bytes = defaultBase323.decode(encodedSecret);
290
+ return new TextDecoder().decode(bytes);
291
+ }
292
+ function parseWindow2(window, step) {
293
+ if (window === void 0 || window === 0) {
294
+ return 0;
295
+ }
296
+ if (typeof window === "number") {
297
+ return window * step;
298
+ }
299
+ return [window[0] * step, window[1] * step];
300
+ }
301
+ var Authenticator = class _Authenticator extends TOTP {
302
+ constructor(defaultOptions = {}) {
303
+ super(defaultOptions);
304
+ }
305
+ create(defaultOptions = {}) {
306
+ return new _Authenticator(defaultOptions);
307
+ }
308
+ allOptions() {
309
+ const merged = {
310
+ algorithm: HashAlgorithms.SHA1,
311
+ digits: 6,
312
+ encoding: KeyEncodings.HEX,
313
+ epoch: null,
314
+ step: 30,
315
+ window: 0,
316
+ keyEncoder: defaultKeyEncoder,
317
+ keyDecoder: defaultKeyDecoder,
318
+ crypto: defaultCrypto3,
319
+ base32: defaultBase323,
320
+ ...this._defaultOptions,
321
+ ...this._options
322
+ };
323
+ const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1e3);
324
+ return Object.freeze({
325
+ ...merged,
326
+ epoch
327
+ });
328
+ }
329
+ generate(secret) {
330
+ const opts = this.allOptions();
331
+ const secretBytes = defaultBase323.decode(secret);
332
+ return (0, import_totp2.generateSync)({
333
+ secret: secretBytes,
334
+ algorithm: opts.algorithm,
335
+ digits: opts.digits,
336
+ period: opts.step,
337
+ epoch: opts.epoch,
338
+ // v11: already in seconds
339
+ t0: 0,
340
+ crypto: opts.crypto
341
+ });
342
+ }
343
+ check(token, secret) {
344
+ const delta = this.checkDelta(token, secret);
345
+ return typeof delta === "number";
346
+ }
347
+ checkDelta(token, secret) {
348
+ const opts = this.allOptions();
349
+ const secretBytes = defaultBase323.decode(secret);
350
+ const epochTolerance = parseWindow2(opts.window, opts.step);
351
+ try {
352
+ const result = (0, import_totp2.verifySync)({
353
+ secret: secretBytes,
354
+ token,
355
+ algorithm: opts.algorithm,
356
+ digits: opts.digits,
357
+ period: opts.step,
358
+ epoch: opts.epoch,
359
+ // v11: already in seconds
360
+ t0: 0,
361
+ epochTolerance,
362
+ crypto: opts.crypto
363
+ });
364
+ if (!result.valid) {
365
+ return null;
366
+ }
367
+ return result.delta;
368
+ } catch {
369
+ return null;
370
+ }
371
+ }
372
+ verify(opts) {
373
+ if (typeof opts !== "object") {
374
+ throw new Error("Expecting argument 0 of verify to be an object");
375
+ }
376
+ return this.check(opts.token, opts.secret);
377
+ }
378
+ encode(secret) {
379
+ const opts = this.allOptions();
380
+ return opts.keyEncoder(secret, opts.encoding);
381
+ }
382
+ decode(secret) {
383
+ const opts = this.allOptions();
384
+ return opts.keyDecoder(secret, opts.encoding);
385
+ }
386
+ generateSecret(numberOfBytes = 20) {
387
+ const opts = this.allOptions();
388
+ return (0, import_core2.generateSecret)({
389
+ crypto: opts.crypto,
390
+ base32: opts.base32,
391
+ length: numberOfBytes
392
+ });
393
+ }
394
+ };
395
+
396
+ // src/index.ts
397
+ var hotp = new HOTP();
398
+ var totp = new TOTP();
399
+ var authenticator = new Authenticator();
400
+ // Annotate the CommonJS export names for ESM import in node:
401
+ 0 && (module.exports = {
402
+ Authenticator,
403
+ HOTP,
404
+ HashAlgorithms,
405
+ KeyEncodings,
406
+ TOTP,
407
+ authenticator,
408
+ hotp,
409
+ totp
410
+ });
411
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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\";\nimport { HOTP } from \"./hotp\";\nimport { TOTP } from \"./totp\";\n\nexport { HOTP, TOTP, Authenticator };\nexport * from \"./types\";\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\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types\";\n\nimport type {\n AuthenticatorOptions,\n Base32SecretKey,\n SecretKey,\n KeyEncodings,\n ResolvedAuthenticatorOptions,\n} from \"./types\";\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\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types\";\n\nimport type { TOTPOptions, SecretKey, ResolvedTOTPOptions } from \"./types\";\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\";\n\nimport type { HOTPOptions, SecretKey, ResolvedHOTPOptions } from \"./types\";\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"]}
@@ -0,0 +1,139 @@
1
+ import { HashAlgorithm, CryptoPlugin, Base32Plugin } from '@otplib/core';
2
+
3
+ /**
4
+ * @otplib/preset-v11
5
+ *
6
+ * v11-compatible type definitions.
7
+ * v11 used functionality similar to v12 but with seconds-based epochs.
8
+ */
9
+
10
+ declare const HashAlgorithms: {
11
+ readonly SHA1: "sha1";
12
+ readonly SHA256: "sha256";
13
+ readonly SHA512: "sha512";
14
+ };
15
+ type HashAlgorithms = (typeof HashAlgorithms)[keyof typeof HashAlgorithms];
16
+ declare const KeyEncodings: {
17
+ readonly ASCII: "ascii";
18
+ readonly HEX: "hex";
19
+ readonly BASE32: "base32";
20
+ readonly BASE64: "base64";
21
+ readonly LATIN1: "latin1";
22
+ readonly UTF8: "utf8";
23
+ };
24
+ type KeyEncodings = (typeof KeyEncodings)[keyof typeof KeyEncodings];
25
+ type SecretKey = string;
26
+ type Base32SecretKey = string;
27
+ type HOTPOptions = {
28
+ algorithm?: HashAlgorithm;
29
+ digits?: number;
30
+ encoding?: KeyEncodings;
31
+ crypto?: CryptoPlugin;
32
+ base32?: Base32Plugin;
33
+ };
34
+ type TOTPOptions = HOTPOptions & {
35
+ epoch?: number | null;
36
+ step?: number;
37
+ window?: number | [number, number];
38
+ };
39
+ type KeyEncoder = (secret: SecretKey, encoding: KeyEncodings) => Base32SecretKey;
40
+ type KeyDecoder = (encodedSecret: Base32SecretKey, encoding: KeyEncodings) => SecretKey;
41
+ type AuthenticatorOptions = TOTPOptions & {
42
+ keyEncoder?: KeyEncoder;
43
+ keyDecoder?: KeyDecoder;
44
+ };
45
+ type ResolvedHOTPOptions = {
46
+ algorithm: HashAlgorithm;
47
+ digits: number;
48
+ encoding: KeyEncodings;
49
+ crypto: CryptoPlugin;
50
+ base32: Base32Plugin;
51
+ };
52
+ type ResolvedTOTPOptions = ResolvedHOTPOptions & {
53
+ epoch: number;
54
+ step: number;
55
+ window: number | [number, number];
56
+ };
57
+ type ResolvedAuthenticatorOptions = ResolvedTOTPOptions & {
58
+ keyEncoder: KeyEncoder;
59
+ keyDecoder: KeyDecoder;
60
+ };
61
+
62
+ /**
63
+ * @otplib/preset-v11
64
+ *
65
+ * v11-compatible HOTP class implementation.
66
+ */
67
+
68
+ declare class HOTP<T extends HOTPOptions = HOTPOptions> {
69
+ protected _options: Partial<T>;
70
+ protected _defaultOptions: Partial<T>;
71
+ constructor(defaultOptions?: Partial<T>);
72
+ get options(): Partial<T>;
73
+ set options(value: Partial<T>);
74
+ get defaultOptions(): Partial<T>;
75
+ set defaultOptions(value: Partial<T>);
76
+ get optionsAll(): Readonly<ResolvedHOTPOptions>;
77
+ create(defaultOptions?: Partial<T>): HOTP<T>;
78
+ allOptions(): Readonly<ResolvedHOTPOptions>;
79
+ resetOptions(): this;
80
+ generate(secret: SecretKey, counter: number): string;
81
+ check(token: string, secret: SecretKey, counter: number): boolean;
82
+ verify(opts: {
83
+ token: string;
84
+ secret: SecretKey;
85
+ counter: number;
86
+ }): boolean;
87
+ keyuri(accountName: string, issuer: string, secret: SecretKey, counter: number): string;
88
+ getClass(): typeof HOTP;
89
+ }
90
+
91
+ /**
92
+ * @otplib/preset-v11
93
+ *
94
+ * v11-compatible TOTP class implementation.
95
+ */
96
+
97
+ declare class TOTP<T extends TOTPOptions = TOTPOptions> extends HOTP<T> {
98
+ constructor(defaultOptions?: Partial<T>);
99
+ create(defaultOptions?: Partial<T>): TOTP<T>;
100
+ allOptions(): Readonly<ResolvedTOTPOptions>;
101
+ generate(secret: SecretKey): string;
102
+ check(token: string, secret: SecretKey): boolean;
103
+ checkDelta(token: string, secret: SecretKey): number | null;
104
+ verify(opts: {
105
+ token: string;
106
+ secret: SecretKey;
107
+ }): boolean;
108
+ keyuri(accountName: string, issuer: string, secret: SecretKey): string;
109
+ timeUsed(): number;
110
+ timeRemaining(): number;
111
+ }
112
+
113
+ /**
114
+ * @otplib/preset-v11
115
+ *
116
+ * v11-compatible Authenticator class implementation.
117
+ */
118
+
119
+ declare class Authenticator<T extends AuthenticatorOptions = AuthenticatorOptions> extends TOTP<T> {
120
+ constructor(defaultOptions?: Partial<T>);
121
+ create(defaultOptions?: Partial<T>): Authenticator<T>;
122
+ allOptions(): Readonly<ResolvedAuthenticatorOptions>;
123
+ generate(secret: Base32SecretKey): string;
124
+ check(token: string, secret: Base32SecretKey): boolean;
125
+ checkDelta(token: string, secret: Base32SecretKey): number | null;
126
+ verify(opts: {
127
+ token: string;
128
+ secret: Base32SecretKey;
129
+ }): boolean;
130
+ encode(secret: SecretKey): Base32SecretKey;
131
+ decode(secret: Base32SecretKey): SecretKey;
132
+ generateSecret(numberOfBytes?: number): Base32SecretKey;
133
+ }
134
+
135
+ declare const hotp: HOTP<HOTPOptions>;
136
+ declare const totp: TOTP<TOTPOptions>;
137
+ declare const authenticator: Authenticator<AuthenticatorOptions>;
138
+
139
+ export { Authenticator, type AuthenticatorOptions, type Base32SecretKey, HOTP, type HOTPOptions, HashAlgorithms, type KeyDecoder, type KeyEncoder, KeyEncodings, type ResolvedAuthenticatorOptions, type ResolvedHOTPOptions, type ResolvedTOTPOptions, type SecretKey, TOTP, type TOTPOptions, authenticator, hotp, totp };