@otplib/preset-v11 13.2.1 → 13.4.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/README.md CHANGED
@@ -38,4 +38,4 @@ For a full guide on migrating to v13 refer to the [Migration Guide](https://otpl
38
38
 
39
39
  ## License
40
40
 
41
- [MIT](./LICENSE) © 2026 Gerald Yeo
41
+ [MIT](./LICENSE)
package/dist/index.cjs CHANGED
@@ -1,415 +1,2 @@
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
- var import_base = require("@scure/base");
53
-
54
- // src/types.ts
55
- var HashAlgorithms = {
56
- SHA1: "sha1",
57
- SHA256: "sha256",
58
- SHA512: "sha512"
59
- };
60
- var KeyEncodings = {
61
- ASCII: "ascii",
62
- HEX: "hex",
63
- BASE32: "base32",
64
- BASE64: "base64",
65
- LATIN1: "latin1",
66
- UTF8: "utf8"
67
- };
68
-
69
- // src/hotp.ts
70
- function secretToBytes(secret, encoding) {
71
- if (encoding === KeyEncodings.BASE32 || encoding === "base32") {
72
- return import_plugin_base32_scure.base32.decode(secret);
73
- }
74
- if (encoding === KeyEncodings.HEX || encoding === "hex") {
75
- return import_base.hex.decode(secret.replace(/\s/g, ""));
76
- }
77
- return (0, import_core.stringToBytes)(secret);
78
- }
79
- var HOTP = class _HOTP {
80
- _options = {};
81
- _defaultOptions = {};
82
- constructor(defaultOptions = {}) {
83
- this._defaultOptions = {
84
- ...defaultOptions,
85
- guardrails: (0, import_core.createGuardrails)(defaultOptions.guardrails)
86
- };
87
- this._options = {};
88
- }
89
- get options() {
90
- return { ...this._defaultOptions, ...this._options };
91
- }
92
- set options(value) {
93
- this._options = { ...value };
94
- }
95
- get defaultOptions() {
96
- return this._defaultOptions;
97
- }
98
- set defaultOptions(value) {
99
- this._defaultOptions = { ...value };
100
- }
101
- get optionsAll() {
102
- return this.allOptions();
103
- }
104
- create(defaultOptions = {}) {
105
- return new _HOTP(defaultOptions);
106
- }
107
- allOptions() {
108
- const merged = {
109
- algorithm: HashAlgorithms.SHA1,
110
- digits: 6,
111
- encoding: KeyEncodings.ASCII,
112
- crypto: import_plugin_crypto_noble.crypto,
113
- base32: import_plugin_base32_scure.base32,
114
- ...this._defaultOptions,
115
- ...this._options
116
- };
117
- return Object.freeze(merged);
118
- }
119
- resetOptions() {
120
- this._options = {};
121
- return this;
122
- }
123
- generate(secret, counter) {
124
- const opts = this.allOptions();
125
- const secretBytes = secretToBytes(secret, opts.encoding);
126
- return (0, import_hotp.generateSync)({
127
- secret: secretBytes,
128
- counter,
129
- algorithm: opts.algorithm,
130
- digits: opts.digits,
131
- crypto: opts.crypto,
132
- guardrails: opts.guardrails
133
- });
134
- }
135
- check(token, secret, counter) {
136
- const opts = this.allOptions();
137
- const secretBytes = secretToBytes(secret, opts.encoding);
138
- try {
139
- const result = (0, import_hotp.verifySync)({
140
- secret: secretBytes,
141
- token,
142
- counter,
143
- algorithm: opts.algorithm,
144
- digits: opts.digits,
145
- counterTolerance: 0,
146
- crypto: opts.crypto,
147
- guardrails: opts.guardrails
148
- });
149
- return result.valid;
150
- } catch {
151
- return false;
152
- }
153
- }
154
- verify(opts) {
155
- if (typeof opts !== "object") {
156
- throw new Error("Expecting argument 0 of verify to be an object");
157
- }
158
- return this.check(opts.token, opts.secret, opts.counter);
159
- }
160
- keyuri(accountName, issuer, secret, counter) {
161
- const opts = this.allOptions();
162
- return (0, import_uri.generateHOTP)({
163
- label: accountName,
164
- issuer,
165
- secret,
166
- algorithm: opts.algorithm,
167
- digits: opts.digits,
168
- counter
169
- });
170
- }
171
- getClass() {
172
- return _HOTP;
173
- }
174
- };
175
-
176
- // src/totp.ts
177
- function parseWindow(window, step) {
178
- if (window === void 0 || window === 0) {
179
- return 0;
180
- }
181
- if (typeof window === "number") {
182
- return window * step;
183
- }
184
- return [window[0] * step, window[1] * step];
185
- }
186
- var TOTP = class _TOTP extends HOTP {
187
- constructor(defaultOptions = {}) {
188
- super(defaultOptions);
189
- }
190
- create(defaultOptions = {}) {
191
- return new _TOTP(defaultOptions);
192
- }
193
- allOptions() {
194
- const merged = {
195
- algorithm: HashAlgorithms.SHA1,
196
- digits: 6,
197
- encoding: KeyEncodings.ASCII,
198
- epoch: null,
199
- // v11 default was null, meaning "now"
200
- step: 30,
201
- window: 0,
202
- crypto: import_plugin_crypto_noble2.crypto,
203
- base32: import_plugin_base32_scure2.base32,
204
- ...this._defaultOptions,
205
- ...this._options
206
- };
207
- const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1e3);
208
- return Object.freeze({
209
- ...merged,
210
- epoch
211
- });
212
- }
213
- generate(secret) {
214
- const opts = this.allOptions();
215
- const secretBytes = secretToBytes(secret, opts.encoding);
216
- return (0, import_totp.generateSync)({
217
- secret: secretBytes,
218
- algorithm: opts.algorithm,
219
- digits: opts.digits,
220
- period: opts.step,
221
- epoch: opts.epoch,
222
- // v11: already in seconds
223
- t0: 0,
224
- crypto: opts.crypto,
225
- guardrails: opts.guardrails
226
- });
227
- }
228
- check(token, secret) {
229
- const delta = this.checkDelta(token, secret);
230
- return typeof delta === "number";
231
- }
232
- checkDelta(token, secret) {
233
- const opts = this.allOptions();
234
- const secretBytes = secretToBytes(secret, opts.encoding);
235
- const epochTolerance = parseWindow(opts.window, opts.step);
236
- try {
237
- const result = (0, import_totp.verifySync)({
238
- secret: secretBytes,
239
- token,
240
- algorithm: opts.algorithm,
241
- digits: opts.digits,
242
- period: opts.step,
243
- epoch: opts.epoch,
244
- // v11: already in seconds
245
- t0: 0,
246
- epochTolerance,
247
- crypto: opts.crypto,
248
- guardrails: opts.guardrails
249
- });
250
- if (!result.valid) {
251
- return null;
252
- }
253
- return result.delta;
254
- } catch {
255
- return null;
256
- }
257
- }
258
- verify(opts) {
259
- if (typeof opts !== "object") {
260
- throw new Error("Expecting argument 0 of verify to be an object");
261
- }
262
- return this.check(opts.token, opts.secret);
263
- }
264
- keyuri(accountName, issuer, secret) {
265
- const opts = this.allOptions();
266
- return (0, import_uri2.generateTOTP)({
267
- label: accountName,
268
- issuer,
269
- secret,
270
- algorithm: opts.algorithm,
271
- digits: opts.digits,
272
- period: opts.step
273
- });
274
- }
275
- timeUsed() {
276
- const opts = this.allOptions();
277
- return opts.epoch % opts.step;
278
- }
279
- timeRemaining() {
280
- const opts = this.allOptions();
281
- return (0, import_totp.getRemainingTime)(opts.epoch, opts.step, 0);
282
- }
283
- };
284
-
285
- // src/authenticator.ts
286
- function defaultKeyEncoder(secret, _encoding) {
287
- const bytes = new TextEncoder().encode(secret);
288
- return import_plugin_base32_scure3.base32.encode(bytes);
289
- }
290
- function defaultKeyDecoder(encodedSecret, _encoding) {
291
- const bytes = import_plugin_base32_scure3.base32.decode(encodedSecret);
292
- return new TextDecoder().decode(bytes);
293
- }
294
- function parseWindow2(window, step) {
295
- if (window === void 0 || window === 0) {
296
- return 0;
297
- }
298
- if (typeof window === "number") {
299
- return window * step;
300
- }
301
- return [window[0] * step, window[1] * step];
302
- }
303
- var Authenticator = class _Authenticator extends TOTP {
304
- constructor(defaultOptions = {}) {
305
- super(defaultOptions);
306
- }
307
- create(defaultOptions = {}) {
308
- return new _Authenticator(defaultOptions);
309
- }
310
- allOptions() {
311
- const merged = {
312
- algorithm: HashAlgorithms.SHA1,
313
- digits: 6,
314
- encoding: KeyEncodings.HEX,
315
- epoch: null,
316
- step: 30,
317
- window: 0,
318
- keyEncoder: defaultKeyEncoder,
319
- keyDecoder: defaultKeyDecoder,
320
- crypto: import_plugin_crypto_noble3.crypto,
321
- base32: import_plugin_base32_scure3.base32,
322
- ...this._defaultOptions,
323
- ...this._options
324
- };
325
- const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1e3);
326
- return Object.freeze({
327
- ...merged,
328
- epoch
329
- });
330
- }
331
- generate(secret) {
332
- const opts = this.allOptions();
333
- const secretBytes = import_plugin_base32_scure3.base32.decode(secret);
334
- return (0, import_totp2.generateSync)({
335
- secret: secretBytes,
336
- algorithm: opts.algorithm,
337
- digits: opts.digits,
338
- period: opts.step,
339
- epoch: opts.epoch,
340
- // v11: already in seconds
341
- t0: 0,
342
- crypto: opts.crypto,
343
- guardrails: opts.guardrails
344
- });
345
- }
346
- check(token, secret) {
347
- const delta = this.checkDelta(token, secret);
348
- return typeof delta === "number";
349
- }
350
- checkDelta(token, secret) {
351
- const opts = this.allOptions();
352
- const secretBytes = import_plugin_base32_scure3.base32.decode(secret);
353
- const epochTolerance = parseWindow2(opts.window, opts.step);
354
- try {
355
- const result = (0, import_totp2.verifySync)({
356
- secret: secretBytes,
357
- token,
358
- algorithm: opts.algorithm,
359
- digits: opts.digits,
360
- period: opts.step,
361
- epoch: opts.epoch,
362
- // v11: already in seconds
363
- t0: 0,
364
- epochTolerance,
365
- crypto: opts.crypto,
366
- guardrails: opts.guardrails
367
- });
368
- if (!result.valid) {
369
- return null;
370
- }
371
- return result.delta;
372
- } catch {
373
- return null;
374
- }
375
- }
376
- verify(opts) {
377
- if (typeof opts !== "object") {
378
- throw new Error("Expecting argument 0 of verify to be an object");
379
- }
380
- return this.check(opts.token, opts.secret);
381
- }
382
- encode(secret) {
383
- const opts = this.allOptions();
384
- return opts.keyEncoder(secret, opts.encoding);
385
- }
386
- decode(secret) {
387
- const opts = this.allOptions();
388
- return opts.keyDecoder(secret, opts.encoding);
389
- }
390
- generateSecret(numberOfBytes = 20) {
391
- const opts = this.allOptions();
392
- return (0, import_core2.generateSecret)({
393
- crypto: opts.crypto,
394
- base32: opts.base32,
395
- length: numberOfBytes
396
- });
397
- }
398
- };
399
-
400
- // src/index.ts
401
- var hotp = new HOTP();
402
- var totp = new TOTP();
403
- var authenticator = new Authenticator();
404
- // Annotate the CommonJS export names for ESM import in node:
405
- 0 && (module.exports = {
406
- Authenticator,
407
- HOTP,
408
- HashAlgorithms,
409
- KeyEncodings,
410
- TOTP,
411
- authenticator,
412
- hotp,
413
- totp
414
- });
1
+ "use strict";var O=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var D=(o,e)=>{for(var t in e)O(o,t,{get:e[t],enumerable:!0})},R=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of B(e))!k.call(o,n)&&n!==t&&O(o,n,{get:()=>e[n],enumerable:!(r=A(e,n))||r.enumerable});return o};var C=o=>R(O({},"__esModule",{value:!0}),o);var V={};D(V,{Authenticator:()=>g,HOTP:()=>a,HashAlgorithms:()=>c,KeyEncodings:()=>s,TOTP:()=>p,authenticator:()=>z,hotp:()=>G,totp:()=>U});module.exports=C(V);var x=require("@otplib/core"),y=require("@otplib/plugin-base32-scure"),H=require("@otplib/plugin-crypto-noble"),f=require("@otplib/totp");var P=require("@otplib/plugin-base32-scure"),E=require("@otplib/plugin-crypto-noble"),d=require("@otplib/totp"),v=require("@otplib/uri");var m=require("@otplib/core"),h=require("@otplib/hotp"),T=require("@otplib/plugin-base32-scure"),b=require("@otplib/plugin-crypto-noble"),S=require("@otplib/uri"),K=require("@scure/base");var c={SHA1:"sha1",SHA256:"sha256",SHA512:"sha512"},s={ASCII:"ascii",HEX:"hex",BASE32:"base32",BASE64:"base64",LATIN1:"latin1",UTF8:"utf8"};function u(o,e){return e===s.BASE32||e==="base32"?T.base32.decode(o):e===s.HEX||e==="hex"?K.hex.decode(o.replace(/\s/g,"")):(0,m.stringToBytes)(o)}var a=class o{_options={};_defaultOptions={};constructor(e={}){this._defaultOptions={...e,guardrails:(0,m.createGuardrails)(e.guardrails)},this._options={}}get options(){return{...this._defaultOptions,...this._options}}set options(e){this._options={...e}}get defaultOptions(){return this._defaultOptions}set defaultOptions(e){this._defaultOptions={...e}}get optionsAll(){return this.allOptions()}create(e={}){return new o(e)}allOptions(){let e={algorithm:c.SHA1,digits:6,encoding:s.ASCII,crypto:b.crypto,base32:T.base32,...this._defaultOptions,...this._options};return Object.freeze(e)}resetOptions(){return this._options={},this}generate(e,t){let r=this.allOptions(),n=u(e,r.encoding);return(0,h.generateSync)({secret:n,counter:t,algorithm:r.algorithm,digits:r.digits,crypto:r.crypto,guardrails:r.guardrails})}check(e,t,r){let n=this.allOptions(),i=u(t,n.encoding);try{return(0,h.verifySync)({secret:i,token:e,counter:r,algorithm:n.algorithm,digits:n.digits,counterTolerance:0,crypto:n.crypto,guardrails:n.guardrails}).valid}catch{return!1}}verify(e){if(typeof e!="object")throw new Error("Expecting argument 0 of verify to be an object");return this.check(e.token,e.secret,e.counter)}keyuri(e,t,r,n){let i=this.allOptions();return(0,S.generateHOTP)({label:e,issuer:t,secret:r,algorithm:i.algorithm,digits:i.digits,counter:n})}getClass(){return o}};function _(o,e){return o===void 0||o===0?0:typeof o=="number"?o*e:[o[0]*e,o[1]*e]}var p=class o extends a{constructor(e={}){super(e)}create(e={}){return new o(e)}allOptions(){let e={algorithm:c.SHA1,digits:6,encoding:s.ASCII,epoch:null,step:30,window:0,crypto:E.crypto,base32:P.base32,...this._defaultOptions,...this._options},t=e.epoch!==null?e.epoch:Math.floor(Date.now()/1e3);return Object.freeze({...e,epoch:t})}generate(e){let t=this.allOptions(),r=u(e,t.encoding);return(0,d.generateSync)({secret:r,algorithm:t.algorithm,digits:t.digits,period:t.step,epoch:t.epoch,t0:0,crypto:t.crypto,guardrails:t.guardrails})}check(e,t){return typeof this.checkDelta(e,t)=="number"}checkDelta(e,t){let r=this.allOptions(),n=u(t,r.encoding),i=_(r.window,r.step);try{let l=(0,d.verifySync)({secret:n,token:e,algorithm:r.algorithm,digits:r.digits,period:r.step,epoch:r.epoch,t0:0,epochTolerance:i,crypto:r.crypto,guardrails:r.guardrails});return l.valid?l.delta:null}catch{return null}}verify(e){if(typeof e!="object")throw new Error("Expecting argument 0 of verify to be an object");return this.check(e.token,e.secret)}keyuri(e,t,r){let n=this.allOptions();return(0,v.generateTOTP)({label:e,issuer:t,secret:r,algorithm:n.algorithm,digits:n.digits,period:n.step})}timeUsed(){let e=this.allOptions();return e.epoch%e.step}timeRemaining(){let e=this.allOptions();return(0,d.getRemainingTime)(e.epoch,e.step,0)}};function j(o,e){let t=new TextEncoder().encode(o);return y.base32.encode(t)}function w(o,e){let t=y.base32.decode(o);return new TextDecoder().decode(t)}function I(o,e){return o===void 0||o===0?0:typeof o=="number"?o*e:[o[0]*e,o[1]*e]}var g=class o extends p{constructor(e={}){super(e)}create(e={}){return new o(e)}allOptions(){let e={algorithm:c.SHA1,digits:6,encoding:s.HEX,epoch:null,step:30,window:0,keyEncoder:j,keyDecoder:w,crypto:H.crypto,base32:y.base32,...this._defaultOptions,...this._options},t=e.epoch!==null?e.epoch:Math.floor(Date.now()/1e3);return Object.freeze({...e,epoch:t})}generate(e){let t=this.allOptions(),r=y.base32.decode(e);return(0,f.generateSync)({secret:r,algorithm:t.algorithm,digits:t.digits,period:t.step,epoch:t.epoch,t0:0,crypto:t.crypto,guardrails:t.guardrails})}check(e,t){return typeof this.checkDelta(e,t)=="number"}checkDelta(e,t){let r=this.allOptions(),n=y.base32.decode(t),i=I(r.window,r.step);try{let l=(0,f.verifySync)({secret:n,token:e,algorithm:r.algorithm,digits:r.digits,period:r.step,epoch:r.epoch,t0:0,epochTolerance:i,crypto:r.crypto,guardrails:r.guardrails});return l.valid?l.delta:null}catch{return null}}verify(e){if(typeof e!="object")throw new Error("Expecting argument 0 of verify to be an object");return this.check(e.token,e.secret)}encode(e){let t=this.allOptions();return t.keyEncoder(e,t.encoding)}decode(e){let t=this.allOptions();return t.keyDecoder(e,t.encoding)}generateSecret(e=20){let t=this.allOptions();return(0,x.generateSecret)({crypto:t.crypto,base32:t.base32,length:e})}};var G=new a,U=new p,z=new g;0&&(module.exports={Authenticator,HOTP,HashAlgorithms,KeyEncodings,TOTP,authenticator,hotp,totp});
415
2
  //# sourceMappingURL=index.cjs.map
@@ -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 { 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"]}
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":"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","names":["index_exports","__export","Authenticator","HOTP","HashAlgorithms","KeyEncodings","TOTP","authenticator","hotp","totp","__toCommonJS","import_core","import_plugin_base32_scure","import_plugin_crypto_noble","import_totp","import_plugin_base32_scure","import_plugin_crypto_noble","import_totp","import_uri","import_core","import_hotp","import_plugin_base32_scure","import_plugin_crypto_noble","import_uri","import_base","HashAlgorithms","KeyEncodings","secretToBytes","secret","encoding","KeyEncodings","defaultBase32","HOTP","_HOTP","defaultOptions","value","merged","HashAlgorithms","defaultCrypto","counter","opts","secretBytes","hotpGenerateSync","token","hotpVerifySync","accountName","issuer","generateHOTPURI","parseWindow","window","step","TOTP","_TOTP","HOTP","defaultOptions","merged","HashAlgorithms","KeyEncodings","defaultCrypto","defaultBase32","epoch","secret","opts","secretBytes","secretToBytes","totpGenerateSync","token","epochTolerance","result","totpVerifySync","accountName","issuer","generateTOTPURI","defaultKeyEncoder","secret","_encoding","bytes","defaultBase32","defaultKeyDecoder","encodedSecret","parseWindow","window","step","Authenticator","_Authenticator","TOTP","defaultOptions","merged","HashAlgorithms","KeyEncodings","defaultCrypto","epoch","opts","secretBytes","totpGenerateSync","token","epochTolerance","result","totpVerifySync","numberOfBytes","generateSecretCore","hotp","HOTP","totp","TOTP","authenticator","Authenticator"]}
package/dist/index.js CHANGED
@@ -1,385 +1,2 @@
1
- // src/authenticator.ts
2
- import { generateSecret as generateSecretCore } from "@otplib/core";
3
- import { base32 as defaultBase323 } from "@otplib/plugin-base32-scure";
4
- import { crypto as defaultCrypto3 } from "@otplib/plugin-crypto-noble";
5
- import { generateSync as totpGenerateSync2, verifySync as totpVerifySync2 } from "@otplib/totp";
6
-
7
- // src/totp.ts
8
- import { base32 as defaultBase322 } from "@otplib/plugin-base32-scure";
9
- import { crypto as defaultCrypto2 } from "@otplib/plugin-crypto-noble";
10
- import {
11
- generateSync as totpGenerateSync,
12
- verifySync as totpVerifySync,
13
- getRemainingTime
14
- } from "@otplib/totp";
15
- import { generateTOTP as generateTOTPURI } from "@otplib/uri";
16
-
17
- // src/hotp.ts
18
- import { stringToBytes, createGuardrails } from "@otplib/core";
19
- import { generateSync as hotpGenerateSync, verifySync as hotpVerifySync } from "@otplib/hotp";
20
- import { base32 as defaultBase32 } from "@otplib/plugin-base32-scure";
21
- import { crypto as defaultCrypto } from "@otplib/plugin-crypto-noble";
22
- import { generateHOTP as generateHOTPURI } from "@otplib/uri";
23
- import { hex } from "@scure/base";
24
-
25
- // src/types.ts
26
- var HashAlgorithms = {
27
- SHA1: "sha1",
28
- SHA256: "sha256",
29
- SHA512: "sha512"
30
- };
31
- var KeyEncodings = {
32
- ASCII: "ascii",
33
- HEX: "hex",
34
- BASE32: "base32",
35
- BASE64: "base64",
36
- LATIN1: "latin1",
37
- UTF8: "utf8"
38
- };
39
-
40
- // src/hotp.ts
41
- function secretToBytes(secret, encoding) {
42
- if (encoding === KeyEncodings.BASE32 || encoding === "base32") {
43
- return defaultBase32.decode(secret);
44
- }
45
- if (encoding === KeyEncodings.HEX || encoding === "hex") {
46
- return hex.decode(secret.replace(/\s/g, ""));
47
- }
48
- return stringToBytes(secret);
49
- }
50
- var HOTP = class _HOTP {
51
- _options = {};
52
- _defaultOptions = {};
53
- constructor(defaultOptions = {}) {
54
- this._defaultOptions = {
55
- ...defaultOptions,
56
- guardrails: createGuardrails(defaultOptions.guardrails)
57
- };
58
- this._options = {};
59
- }
60
- get options() {
61
- return { ...this._defaultOptions, ...this._options };
62
- }
63
- set options(value) {
64
- this._options = { ...value };
65
- }
66
- get defaultOptions() {
67
- return this._defaultOptions;
68
- }
69
- set defaultOptions(value) {
70
- this._defaultOptions = { ...value };
71
- }
72
- get optionsAll() {
73
- return this.allOptions();
74
- }
75
- create(defaultOptions = {}) {
76
- return new _HOTP(defaultOptions);
77
- }
78
- allOptions() {
79
- const merged = {
80
- algorithm: HashAlgorithms.SHA1,
81
- digits: 6,
82
- encoding: KeyEncodings.ASCII,
83
- crypto: defaultCrypto,
84
- base32: defaultBase32,
85
- ...this._defaultOptions,
86
- ...this._options
87
- };
88
- return Object.freeze(merged);
89
- }
90
- resetOptions() {
91
- this._options = {};
92
- return this;
93
- }
94
- generate(secret, counter) {
95
- const opts = this.allOptions();
96
- const secretBytes = secretToBytes(secret, opts.encoding);
97
- return hotpGenerateSync({
98
- secret: secretBytes,
99
- counter,
100
- algorithm: opts.algorithm,
101
- digits: opts.digits,
102
- crypto: opts.crypto,
103
- guardrails: opts.guardrails
104
- });
105
- }
106
- check(token, secret, counter) {
107
- const opts = this.allOptions();
108
- const secretBytes = secretToBytes(secret, opts.encoding);
109
- try {
110
- const result = hotpVerifySync({
111
- secret: secretBytes,
112
- token,
113
- counter,
114
- algorithm: opts.algorithm,
115
- digits: opts.digits,
116
- counterTolerance: 0,
117
- crypto: opts.crypto,
118
- guardrails: opts.guardrails
119
- });
120
- return result.valid;
121
- } catch {
122
- return false;
123
- }
124
- }
125
- verify(opts) {
126
- if (typeof opts !== "object") {
127
- throw new Error("Expecting argument 0 of verify to be an object");
128
- }
129
- return this.check(opts.token, opts.secret, opts.counter);
130
- }
131
- keyuri(accountName, issuer, secret, counter) {
132
- const opts = this.allOptions();
133
- return generateHOTPURI({
134
- label: accountName,
135
- issuer,
136
- secret,
137
- algorithm: opts.algorithm,
138
- digits: opts.digits,
139
- counter
140
- });
141
- }
142
- getClass() {
143
- return _HOTP;
144
- }
145
- };
146
-
147
- // src/totp.ts
148
- function parseWindow(window, step) {
149
- if (window === void 0 || window === 0) {
150
- return 0;
151
- }
152
- if (typeof window === "number") {
153
- return window * step;
154
- }
155
- return [window[0] * step, window[1] * step];
156
- }
157
- var TOTP = class _TOTP extends HOTP {
158
- constructor(defaultOptions = {}) {
159
- super(defaultOptions);
160
- }
161
- create(defaultOptions = {}) {
162
- return new _TOTP(defaultOptions);
163
- }
164
- allOptions() {
165
- const merged = {
166
- algorithm: HashAlgorithms.SHA1,
167
- digits: 6,
168
- encoding: KeyEncodings.ASCII,
169
- epoch: null,
170
- // v11 default was null, meaning "now"
171
- step: 30,
172
- window: 0,
173
- crypto: defaultCrypto2,
174
- base32: defaultBase322,
175
- ...this._defaultOptions,
176
- ...this._options
177
- };
178
- const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1e3);
179
- return Object.freeze({
180
- ...merged,
181
- epoch
182
- });
183
- }
184
- generate(secret) {
185
- const opts = this.allOptions();
186
- const secretBytes = secretToBytes(secret, opts.encoding);
187
- return totpGenerateSync({
188
- secret: secretBytes,
189
- algorithm: opts.algorithm,
190
- digits: opts.digits,
191
- period: opts.step,
192
- epoch: opts.epoch,
193
- // v11: already in seconds
194
- t0: 0,
195
- crypto: opts.crypto,
196
- guardrails: opts.guardrails
197
- });
198
- }
199
- check(token, secret) {
200
- const delta = this.checkDelta(token, secret);
201
- return typeof delta === "number";
202
- }
203
- checkDelta(token, secret) {
204
- const opts = this.allOptions();
205
- const secretBytes = secretToBytes(secret, opts.encoding);
206
- const epochTolerance = parseWindow(opts.window, opts.step);
207
- try {
208
- const result = totpVerifySync({
209
- secret: secretBytes,
210
- token,
211
- algorithm: opts.algorithm,
212
- digits: opts.digits,
213
- period: opts.step,
214
- epoch: opts.epoch,
215
- // v11: already in seconds
216
- t0: 0,
217
- epochTolerance,
218
- crypto: opts.crypto,
219
- guardrails: opts.guardrails
220
- });
221
- if (!result.valid) {
222
- return null;
223
- }
224
- return result.delta;
225
- } catch {
226
- return null;
227
- }
228
- }
229
- verify(opts) {
230
- if (typeof opts !== "object") {
231
- throw new Error("Expecting argument 0 of verify to be an object");
232
- }
233
- return this.check(opts.token, opts.secret);
234
- }
235
- keyuri(accountName, issuer, secret) {
236
- const opts = this.allOptions();
237
- return generateTOTPURI({
238
- label: accountName,
239
- issuer,
240
- secret,
241
- algorithm: opts.algorithm,
242
- digits: opts.digits,
243
- period: opts.step
244
- });
245
- }
246
- timeUsed() {
247
- const opts = this.allOptions();
248
- return opts.epoch % opts.step;
249
- }
250
- timeRemaining() {
251
- const opts = this.allOptions();
252
- return getRemainingTime(opts.epoch, opts.step, 0);
253
- }
254
- };
255
-
256
- // src/authenticator.ts
257
- function defaultKeyEncoder(secret, _encoding) {
258
- const bytes = new TextEncoder().encode(secret);
259
- return defaultBase323.encode(bytes);
260
- }
261
- function defaultKeyDecoder(encodedSecret, _encoding) {
262
- const bytes = defaultBase323.decode(encodedSecret);
263
- return new TextDecoder().decode(bytes);
264
- }
265
- function parseWindow2(window, step) {
266
- if (window === void 0 || window === 0) {
267
- return 0;
268
- }
269
- if (typeof window === "number") {
270
- return window * step;
271
- }
272
- return [window[0] * step, window[1] * step];
273
- }
274
- var Authenticator = class _Authenticator extends TOTP {
275
- constructor(defaultOptions = {}) {
276
- super(defaultOptions);
277
- }
278
- create(defaultOptions = {}) {
279
- return new _Authenticator(defaultOptions);
280
- }
281
- allOptions() {
282
- const merged = {
283
- algorithm: HashAlgorithms.SHA1,
284
- digits: 6,
285
- encoding: KeyEncodings.HEX,
286
- epoch: null,
287
- step: 30,
288
- window: 0,
289
- keyEncoder: defaultKeyEncoder,
290
- keyDecoder: defaultKeyDecoder,
291
- crypto: defaultCrypto3,
292
- base32: defaultBase323,
293
- ...this._defaultOptions,
294
- ...this._options
295
- };
296
- const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1e3);
297
- return Object.freeze({
298
- ...merged,
299
- epoch
300
- });
301
- }
302
- generate(secret) {
303
- const opts = this.allOptions();
304
- const secretBytes = defaultBase323.decode(secret);
305
- return totpGenerateSync2({
306
- secret: secretBytes,
307
- algorithm: opts.algorithm,
308
- digits: opts.digits,
309
- period: opts.step,
310
- epoch: opts.epoch,
311
- // v11: already in seconds
312
- t0: 0,
313
- crypto: opts.crypto,
314
- guardrails: opts.guardrails
315
- });
316
- }
317
- check(token, secret) {
318
- const delta = this.checkDelta(token, secret);
319
- return typeof delta === "number";
320
- }
321
- checkDelta(token, secret) {
322
- const opts = this.allOptions();
323
- const secretBytes = defaultBase323.decode(secret);
324
- const epochTolerance = parseWindow2(opts.window, opts.step);
325
- try {
326
- const result = totpVerifySync2({
327
- secret: secretBytes,
328
- token,
329
- algorithm: opts.algorithm,
330
- digits: opts.digits,
331
- period: opts.step,
332
- epoch: opts.epoch,
333
- // v11: already in seconds
334
- t0: 0,
335
- epochTolerance,
336
- crypto: opts.crypto,
337
- guardrails: opts.guardrails
338
- });
339
- if (!result.valid) {
340
- return null;
341
- }
342
- return result.delta;
343
- } catch {
344
- return null;
345
- }
346
- }
347
- verify(opts) {
348
- if (typeof opts !== "object") {
349
- throw new Error("Expecting argument 0 of verify to be an object");
350
- }
351
- return this.check(opts.token, opts.secret);
352
- }
353
- encode(secret) {
354
- const opts = this.allOptions();
355
- return opts.keyEncoder(secret, opts.encoding);
356
- }
357
- decode(secret) {
358
- const opts = this.allOptions();
359
- return opts.keyDecoder(secret, opts.encoding);
360
- }
361
- generateSecret(numberOfBytes = 20) {
362
- const opts = this.allOptions();
363
- return generateSecretCore({
364
- crypto: opts.crypto,
365
- base32: opts.base32,
366
- length: numberOfBytes
367
- });
368
- }
369
- };
370
-
371
- // src/index.ts
372
- var hotp = new HOTP();
373
- var totp = new TOTP();
374
- var authenticator = new Authenticator();
375
- export {
376
- Authenticator,
377
- HOTP,
378
- HashAlgorithms,
379
- KeyEncodings,
380
- TOTP,
381
- authenticator,
382
- hotp,
383
- totp
384
- };
1
+ import{generateSecret as B}from"@otplib/core";import{base32 as y}from"@otplib/plugin-base32-scure";import{crypto as k}from"@otplib/plugin-crypto-noble";import{generateSync as D,verifySync as R}from"@otplib/totp";import{base32 as K}from"@otplib/plugin-base32-scure";import{crypto as P}from"@otplib/plugin-crypto-noble";import{generateSync as E,verifySync as v,getRemainingTime as x}from"@otplib/totp";import{generateTOTP as H}from"@otplib/uri";import{stringToBytes as m,createGuardrails as h}from"@otplib/core";import{generateSync as f,verifySync as O}from"@otplib/hotp";import{base32 as g}from"@otplib/plugin-base32-scure";import{crypto as T}from"@otplib/plugin-crypto-noble";import{generateHOTP as b}from"@otplib/uri";import{hex as S}from"@scure/base";var a={SHA1:"sha1",SHA256:"sha256",SHA512:"sha512"},i={ASCII:"ascii",HEX:"hex",BASE32:"base32",BASE64:"base64",LATIN1:"latin1",UTF8:"utf8"};function d(o,e){return e===i.BASE32||e==="base32"?g.decode(o):e===i.HEX||e==="hex"?S.decode(o.replace(/\s/g,"")):m(o)}var p=class o{_options={};_defaultOptions={};constructor(e={}){this._defaultOptions={...e,guardrails:h(e.guardrails)},this._options={}}get options(){return{...this._defaultOptions,...this._options}}set options(e){this._options={...e}}get defaultOptions(){return this._defaultOptions}set defaultOptions(e){this._defaultOptions={...e}}get optionsAll(){return this.allOptions()}create(e={}){return new o(e)}allOptions(){let e={algorithm:a.SHA1,digits:6,encoding:i.ASCII,crypto:T,base32:g,...this._defaultOptions,...this._options};return Object.freeze(e)}resetOptions(){return this._options={},this}generate(e,t){let r=this.allOptions(),n=d(e,r.encoding);return f({secret:n,counter:t,algorithm:r.algorithm,digits:r.digits,crypto:r.crypto,guardrails:r.guardrails})}check(e,t,r){let n=this.allOptions(),s=d(t,n.encoding);try{return O({secret:s,token:e,counter:r,algorithm:n.algorithm,digits:n.digits,counterTolerance:0,crypto:n.crypto,guardrails:n.guardrails}).valid}catch{return!1}}verify(e){if(typeof e!="object")throw new Error("Expecting argument 0 of verify to be an object");return this.check(e.token,e.secret,e.counter)}keyuri(e,t,r,n){let s=this.allOptions();return b({label:e,issuer:t,secret:r,algorithm:s.algorithm,digits:s.digits,counter:n})}getClass(){return o}};function A(o,e){return o===void 0||o===0?0:typeof o=="number"?o*e:[o[0]*e,o[1]*e]}var l=class o extends p{constructor(e={}){super(e)}create(e={}){return new o(e)}allOptions(){let e={algorithm:a.SHA1,digits:6,encoding:i.ASCII,epoch:null,step:30,window:0,crypto:P,base32:K,...this._defaultOptions,...this._options},t=e.epoch!==null?e.epoch:Math.floor(Date.now()/1e3);return Object.freeze({...e,epoch:t})}generate(e){let t=this.allOptions(),r=d(e,t.encoding);return E({secret:r,algorithm:t.algorithm,digits:t.digits,period:t.step,epoch:t.epoch,t0:0,crypto:t.crypto,guardrails:t.guardrails})}check(e,t){return typeof this.checkDelta(e,t)=="number"}checkDelta(e,t){let r=this.allOptions(),n=d(t,r.encoding),s=A(r.window,r.step);try{let c=v({secret:n,token:e,algorithm:r.algorithm,digits:r.digits,period:r.step,epoch:r.epoch,t0:0,epochTolerance:s,crypto:r.crypto,guardrails:r.guardrails});return c.valid?c.delta:null}catch{return null}}verify(e){if(typeof e!="object")throw new Error("Expecting argument 0 of verify to be an object");return this.check(e.token,e.secret)}keyuri(e,t,r){let n=this.allOptions();return H({label:e,issuer:t,secret:r,algorithm:n.algorithm,digits:n.digits,period:n.step})}timeUsed(){let e=this.allOptions();return e.epoch%e.step}timeRemaining(){let e=this.allOptions();return x(e.epoch,e.step,0)}};function C(o,e){let t=new TextEncoder().encode(o);return y.encode(t)}function _(o,e){let t=y.decode(o);return new TextDecoder().decode(t)}function j(o,e){return o===void 0||o===0?0:typeof o=="number"?o*e:[o[0]*e,o[1]*e]}var u=class o extends l{constructor(e={}){super(e)}create(e={}){return new o(e)}allOptions(){let e={algorithm:a.SHA1,digits:6,encoding:i.HEX,epoch:null,step:30,window:0,keyEncoder:C,keyDecoder:_,crypto:k,base32:y,...this._defaultOptions,...this._options},t=e.epoch!==null?e.epoch:Math.floor(Date.now()/1e3);return Object.freeze({...e,epoch:t})}generate(e){let t=this.allOptions(),r=y.decode(e);return D({secret:r,algorithm:t.algorithm,digits:t.digits,period:t.step,epoch:t.epoch,t0:0,crypto:t.crypto,guardrails:t.guardrails})}check(e,t){return typeof this.checkDelta(e,t)=="number"}checkDelta(e,t){let r=this.allOptions(),n=y.decode(t),s=j(r.window,r.step);try{let c=R({secret:n,token:e,algorithm:r.algorithm,digits:r.digits,period:r.step,epoch:r.epoch,t0:0,epochTolerance:s,crypto:r.crypto,guardrails:r.guardrails});return c.valid?c.delta:null}catch{return null}}verify(e){if(typeof e!="object")throw new Error("Expecting argument 0 of verify to be an object");return this.check(e.token,e.secret)}encode(e){let t=this.allOptions();return t.keyEncoder(e,t.encoding)}decode(e){let t=this.allOptions();return t.keyDecoder(e,t.encoding)}generateSecret(e=20){let t=this.allOptions();return B({crypto:t.crypto,base32:t.base32,length:e})}};var ae=new p,pe=new l,le=new u;export{u as Authenticator,p as HOTP,a as HashAlgorithms,i as KeyEncodings,l as TOTP,le as authenticator,ae as hotp,pe as totp};
385
2
  //# sourceMappingURL=index.js.map
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 { 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"]}
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":["generateSecretCore","defaultBase32","defaultCrypto","totpGenerateSync","totpVerifySync","defaultBase32","defaultCrypto","totpGenerateSync","totpVerifySync","getRemainingTime","generateTOTPURI","stringToBytes","createGuardrails","hotpGenerateSync","hotpVerifySync","defaultBase32","defaultCrypto","generateHOTPURI","hex","HashAlgorithms","KeyEncodings","secretToBytes","secret","encoding","KeyEncodings","defaultBase32","hex","stringToBytes","HOTP","_HOTP","defaultOptions","createGuardrails","value","merged","HashAlgorithms","defaultCrypto","counter","opts","secretBytes","hotpGenerateSync","token","hotpVerifySync","accountName","issuer","generateHOTPURI","parseWindow","window","step","TOTP","_TOTP","HOTP","defaultOptions","merged","HashAlgorithms","KeyEncodings","defaultCrypto","defaultBase32","epoch","secret","opts","secretBytes","secretToBytes","totpGenerateSync","token","epochTolerance","result","totpVerifySync","accountName","issuer","generateTOTPURI","getRemainingTime","defaultKeyEncoder","secret","_encoding","bytes","defaultBase32","defaultKeyDecoder","encodedSecret","parseWindow","window","step","Authenticator","_Authenticator","TOTP","defaultOptions","merged","HashAlgorithms","KeyEncodings","defaultCrypto","epoch","opts","secretBytes","totpGenerateSync","token","epochTolerance","result","totpVerifySync","numberOfBytes","generateSecretCore","hotp","HOTP","totp","TOTP","authenticator","Authenticator"]}
@@ -1 +1 @@
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}}}
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":23021},"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":188},"src/authenticator.ts":{"bytesInOutput":1683},"src/totp.ts":{"bytesInOutput":1536},"src/hotp.ts":{"bytesInOutput":1685},"src/types.ts":{"bytesInOutput":140}},"bytes":5756}}}
@@ -1 +1 @@
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}}}
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":22937},"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":1666},"src/totp.ts":{"bytesInOutput":1549},"src/hotp.ts":{"bytesInOutput":1697},"src/types.ts":{"bytesInOutput":140},"src/index.ts":{"bytesInOutput":31}},"bytes":5211}}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@otplib/preset-v11",
3
- "version": "13.2.1",
3
+ "version": "13.4.0",
4
4
  "description": "v11 compatibility preset for otplib",
5
5
  "license": "MIT",
6
6
  "author": "Gerald Yeo <support@yeojz.dev>",
@@ -48,16 +48,16 @@
48
48
  ],
49
49
  "dependencies": {
50
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"
51
+ "@otplib/hotp": "13.4.0",
52
+ "@otplib/core": "13.4.0",
53
+ "@otplib/totp": "13.4.0",
54
+ "@otplib/uri": "13.4.0",
55
+ "@otplib/plugin-base32-scure": "13.4.0",
56
+ "@otplib/plugin-crypto-noble": "13.4.0"
57
57
  },
58
58
  "devDependencies": {
59
- "tsup": "^8.0.1",
60
- "typescript": "^5.3.3",
59
+ "tsup": "^8.5.1",
60
+ "typescript": "^5.9.3",
61
61
  "vitest": "^4.0.18",
62
62
  "@repo/testing": "13.0.1"
63
63
  },