@otplib/preset-v11 12.0.1 → 13.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -2
- package/README.md +27 -10
- package/dist/index.cjs +411 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +139 -0
- package/dist/index.d.ts +139 -0
- package/dist/index.js +381 -0
- package/dist/index.js.map +1 -0
- package/package.json +67 -17
- package/index.d.ts +0 -126
- package/index.js +0 -133
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { HashAlgorithm, CryptoPlugin, Base32Plugin } from '@otplib/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @otplib/preset-v11
|
|
5
|
+
*
|
|
6
|
+
* v11-compatible type definitions.
|
|
7
|
+
* v11 used functionality similar to v12 but with seconds-based epochs.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
declare const HashAlgorithms: {
|
|
11
|
+
readonly SHA1: "sha1";
|
|
12
|
+
readonly SHA256: "sha256";
|
|
13
|
+
readonly SHA512: "sha512";
|
|
14
|
+
};
|
|
15
|
+
type HashAlgorithms = (typeof HashAlgorithms)[keyof typeof HashAlgorithms];
|
|
16
|
+
declare const KeyEncodings: {
|
|
17
|
+
readonly ASCII: "ascii";
|
|
18
|
+
readonly HEX: "hex";
|
|
19
|
+
readonly BASE32: "base32";
|
|
20
|
+
readonly BASE64: "base64";
|
|
21
|
+
readonly LATIN1: "latin1";
|
|
22
|
+
readonly UTF8: "utf8";
|
|
23
|
+
};
|
|
24
|
+
type KeyEncodings = (typeof KeyEncodings)[keyof typeof KeyEncodings];
|
|
25
|
+
type SecretKey = string;
|
|
26
|
+
type Base32SecretKey = string;
|
|
27
|
+
type HOTPOptions = {
|
|
28
|
+
algorithm?: HashAlgorithm;
|
|
29
|
+
digits?: number;
|
|
30
|
+
encoding?: KeyEncodings;
|
|
31
|
+
crypto?: CryptoPlugin;
|
|
32
|
+
base32?: Base32Plugin;
|
|
33
|
+
};
|
|
34
|
+
type TOTPOptions = HOTPOptions & {
|
|
35
|
+
epoch?: number | null;
|
|
36
|
+
step?: number;
|
|
37
|
+
window?: number | [number, number];
|
|
38
|
+
};
|
|
39
|
+
type KeyEncoder = (secret: SecretKey, encoding: KeyEncodings) => Base32SecretKey;
|
|
40
|
+
type KeyDecoder = (encodedSecret: Base32SecretKey, encoding: KeyEncodings) => SecretKey;
|
|
41
|
+
type AuthenticatorOptions = TOTPOptions & {
|
|
42
|
+
keyEncoder?: KeyEncoder;
|
|
43
|
+
keyDecoder?: KeyDecoder;
|
|
44
|
+
};
|
|
45
|
+
type ResolvedHOTPOptions = {
|
|
46
|
+
algorithm: HashAlgorithm;
|
|
47
|
+
digits: number;
|
|
48
|
+
encoding: KeyEncodings;
|
|
49
|
+
crypto: CryptoPlugin;
|
|
50
|
+
base32: Base32Plugin;
|
|
51
|
+
};
|
|
52
|
+
type ResolvedTOTPOptions = ResolvedHOTPOptions & {
|
|
53
|
+
epoch: number;
|
|
54
|
+
step: number;
|
|
55
|
+
window: number | [number, number];
|
|
56
|
+
};
|
|
57
|
+
type ResolvedAuthenticatorOptions = ResolvedTOTPOptions & {
|
|
58
|
+
keyEncoder: KeyEncoder;
|
|
59
|
+
keyDecoder: KeyDecoder;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @otplib/preset-v11
|
|
64
|
+
*
|
|
65
|
+
* v11-compatible HOTP class implementation.
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
declare class HOTP<T extends HOTPOptions = HOTPOptions> {
|
|
69
|
+
protected _options: Partial<T>;
|
|
70
|
+
protected _defaultOptions: Partial<T>;
|
|
71
|
+
constructor(defaultOptions?: Partial<T>);
|
|
72
|
+
get options(): Partial<T>;
|
|
73
|
+
set options(value: Partial<T>);
|
|
74
|
+
get defaultOptions(): Partial<T>;
|
|
75
|
+
set defaultOptions(value: Partial<T>);
|
|
76
|
+
get optionsAll(): Readonly<ResolvedHOTPOptions>;
|
|
77
|
+
create(defaultOptions?: Partial<T>): HOTP<T>;
|
|
78
|
+
allOptions(): Readonly<ResolvedHOTPOptions>;
|
|
79
|
+
resetOptions(): this;
|
|
80
|
+
generate(secret: SecretKey, counter: number): string;
|
|
81
|
+
check(token: string, secret: SecretKey, counter: number): boolean;
|
|
82
|
+
verify(opts: {
|
|
83
|
+
token: string;
|
|
84
|
+
secret: SecretKey;
|
|
85
|
+
counter: number;
|
|
86
|
+
}): boolean;
|
|
87
|
+
keyuri(accountName: string, issuer: string, secret: SecretKey, counter: number): string;
|
|
88
|
+
getClass(): typeof HOTP;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @otplib/preset-v11
|
|
93
|
+
*
|
|
94
|
+
* v11-compatible TOTP class implementation.
|
|
95
|
+
*/
|
|
96
|
+
|
|
97
|
+
declare class TOTP<T extends TOTPOptions = TOTPOptions> extends HOTP<T> {
|
|
98
|
+
constructor(defaultOptions?: Partial<T>);
|
|
99
|
+
create(defaultOptions?: Partial<T>): TOTP<T>;
|
|
100
|
+
allOptions(): Readonly<ResolvedTOTPOptions>;
|
|
101
|
+
generate(secret: SecretKey): string;
|
|
102
|
+
check(token: string, secret: SecretKey): boolean;
|
|
103
|
+
checkDelta(token: string, secret: SecretKey): number | null;
|
|
104
|
+
verify(opts: {
|
|
105
|
+
token: string;
|
|
106
|
+
secret: SecretKey;
|
|
107
|
+
}): boolean;
|
|
108
|
+
keyuri(accountName: string, issuer: string, secret: SecretKey): string;
|
|
109
|
+
timeUsed(): number;
|
|
110
|
+
timeRemaining(): number;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* @otplib/preset-v11
|
|
115
|
+
*
|
|
116
|
+
* v11-compatible Authenticator class implementation.
|
|
117
|
+
*/
|
|
118
|
+
|
|
119
|
+
declare class Authenticator<T extends AuthenticatorOptions = AuthenticatorOptions> extends TOTP<T> {
|
|
120
|
+
constructor(defaultOptions?: Partial<T>);
|
|
121
|
+
create(defaultOptions?: Partial<T>): Authenticator<T>;
|
|
122
|
+
allOptions(): Readonly<ResolvedAuthenticatorOptions>;
|
|
123
|
+
generate(secret: Base32SecretKey): string;
|
|
124
|
+
check(token: string, secret: Base32SecretKey): boolean;
|
|
125
|
+
checkDelta(token: string, secret: Base32SecretKey): number | null;
|
|
126
|
+
verify(opts: {
|
|
127
|
+
token: string;
|
|
128
|
+
secret: Base32SecretKey;
|
|
129
|
+
}): boolean;
|
|
130
|
+
encode(secret: SecretKey): Base32SecretKey;
|
|
131
|
+
decode(secret: Base32SecretKey): SecretKey;
|
|
132
|
+
generateSecret(numberOfBytes?: number): Base32SecretKey;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
declare const hotp: HOTP<HOTPOptions>;
|
|
136
|
+
declare const totp: TOTP<TOTPOptions>;
|
|
137
|
+
declare const authenticator: Authenticator<AuthenticatorOptions>;
|
|
138
|
+
|
|
139
|
+
export { Authenticator, type AuthenticatorOptions, type Base32SecretKey, HOTP, type HOTPOptions, HashAlgorithms, type KeyDecoder, type KeyEncoder, KeyEncodings, type ResolvedAuthenticatorOptions, type ResolvedHOTPOptions, type ResolvedTOTPOptions, type SecretKey, TOTP, type TOTPOptions, authenticator, hotp, totp };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
// src/authenticator.ts
|
|
2
|
+
import { generateSecret as generateSecretCore } from "@otplib/core";
|
|
3
|
+
import { ScureBase32Plugin as ScureBase32Plugin3 } from "@otplib/plugin-base32-scure";
|
|
4
|
+
import { NobleCryptoPlugin as NobleCryptoPlugin3 } from "@otplib/plugin-crypto-noble";
|
|
5
|
+
import { generateSync as totpGenerateSync2, verifySync as totpVerifySync2 } from "@otplib/totp";
|
|
6
|
+
|
|
7
|
+
// src/totp.ts
|
|
8
|
+
import { ScureBase32Plugin as ScureBase32Plugin2 } from "@otplib/plugin-base32-scure";
|
|
9
|
+
import { NobleCryptoPlugin as NobleCryptoPlugin2 } 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, hexToBytes } from "@otplib/core";
|
|
19
|
+
import { generateSync as hotpGenerateSync, verifySync as hotpVerifySync } from "@otplib/hotp";
|
|
20
|
+
import { ScureBase32Plugin } from "@otplib/plugin-base32-scure";
|
|
21
|
+
import { NobleCryptoPlugin } from "@otplib/plugin-crypto-noble";
|
|
22
|
+
import { generateHOTP as generateHOTPURI } from "@otplib/uri";
|
|
23
|
+
|
|
24
|
+
// src/types.ts
|
|
25
|
+
var HashAlgorithms = {
|
|
26
|
+
SHA1: "sha1",
|
|
27
|
+
SHA256: "sha256",
|
|
28
|
+
SHA512: "sha512"
|
|
29
|
+
};
|
|
30
|
+
var KeyEncodings = {
|
|
31
|
+
ASCII: "ascii",
|
|
32
|
+
HEX: "hex",
|
|
33
|
+
BASE32: "base32",
|
|
34
|
+
BASE64: "base64",
|
|
35
|
+
LATIN1: "latin1",
|
|
36
|
+
UTF8: "utf8"
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/hotp.ts
|
|
40
|
+
var defaultCrypto = new NobleCryptoPlugin();
|
|
41
|
+
var defaultBase32 = new ScureBase32Plugin();
|
|
42
|
+
function secretToBytes(secret, encoding) {
|
|
43
|
+
if (encoding === KeyEncodings.BASE32 || encoding === "base32") {
|
|
44
|
+
return defaultBase32.decode(secret);
|
|
45
|
+
}
|
|
46
|
+
if (encoding === KeyEncodings.HEX || encoding === "hex") {
|
|
47
|
+
return hexToBytes(secret.replace(/\s/g, ""));
|
|
48
|
+
}
|
|
49
|
+
return stringToBytes(secret);
|
|
50
|
+
}
|
|
51
|
+
var HOTP = class _HOTP {
|
|
52
|
+
_options = {};
|
|
53
|
+
_defaultOptions = {};
|
|
54
|
+
constructor(defaultOptions = {}) {
|
|
55
|
+
this._defaultOptions = { ...defaultOptions };
|
|
56
|
+
this._options = {};
|
|
57
|
+
}
|
|
58
|
+
get options() {
|
|
59
|
+
return { ...this._defaultOptions, ...this._options };
|
|
60
|
+
}
|
|
61
|
+
set options(value) {
|
|
62
|
+
this._options = { ...value };
|
|
63
|
+
}
|
|
64
|
+
get defaultOptions() {
|
|
65
|
+
return this._defaultOptions;
|
|
66
|
+
}
|
|
67
|
+
set defaultOptions(value) {
|
|
68
|
+
this._defaultOptions = value;
|
|
69
|
+
}
|
|
70
|
+
get optionsAll() {
|
|
71
|
+
return this.allOptions();
|
|
72
|
+
}
|
|
73
|
+
create(defaultOptions = {}) {
|
|
74
|
+
return new _HOTP(defaultOptions);
|
|
75
|
+
}
|
|
76
|
+
allOptions() {
|
|
77
|
+
const merged = {
|
|
78
|
+
algorithm: HashAlgorithms.SHA1,
|
|
79
|
+
digits: 6,
|
|
80
|
+
encoding: KeyEncodings.ASCII,
|
|
81
|
+
crypto: defaultCrypto,
|
|
82
|
+
base32: defaultBase32,
|
|
83
|
+
...this._defaultOptions,
|
|
84
|
+
...this._options
|
|
85
|
+
};
|
|
86
|
+
return Object.freeze(merged);
|
|
87
|
+
}
|
|
88
|
+
resetOptions() {
|
|
89
|
+
this._options = {};
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
generate(secret, counter) {
|
|
93
|
+
const opts = this.allOptions();
|
|
94
|
+
const secretBytes = secretToBytes(secret, opts.encoding);
|
|
95
|
+
return hotpGenerateSync({
|
|
96
|
+
secret: secretBytes,
|
|
97
|
+
counter,
|
|
98
|
+
algorithm: opts.algorithm,
|
|
99
|
+
digits: opts.digits,
|
|
100
|
+
crypto: opts.crypto
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
check(token, secret, counter) {
|
|
104
|
+
const opts = this.allOptions();
|
|
105
|
+
const secretBytes = secretToBytes(secret, opts.encoding);
|
|
106
|
+
try {
|
|
107
|
+
const result = hotpVerifySync({
|
|
108
|
+
secret: secretBytes,
|
|
109
|
+
token,
|
|
110
|
+
counter,
|
|
111
|
+
algorithm: opts.algorithm,
|
|
112
|
+
digits: opts.digits,
|
|
113
|
+
counterTolerance: 0,
|
|
114
|
+
crypto: opts.crypto
|
|
115
|
+
});
|
|
116
|
+
return result.valid;
|
|
117
|
+
} catch {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
verify(opts) {
|
|
122
|
+
if (typeof opts !== "object") {
|
|
123
|
+
throw new Error("Expecting argument 0 of verify to be an object");
|
|
124
|
+
}
|
|
125
|
+
return this.check(opts.token, opts.secret, opts.counter);
|
|
126
|
+
}
|
|
127
|
+
keyuri(accountName, issuer, secret, counter) {
|
|
128
|
+
const opts = this.allOptions();
|
|
129
|
+
return generateHOTPURI({
|
|
130
|
+
label: accountName,
|
|
131
|
+
issuer,
|
|
132
|
+
secret,
|
|
133
|
+
algorithm: opts.algorithm,
|
|
134
|
+
digits: opts.digits,
|
|
135
|
+
counter
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
getClass() {
|
|
139
|
+
return _HOTP;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// src/totp.ts
|
|
144
|
+
var defaultCrypto2 = new NobleCryptoPlugin2();
|
|
145
|
+
var defaultBase322 = new ScureBase32Plugin2();
|
|
146
|
+
function parseWindow(window, step) {
|
|
147
|
+
if (window === void 0 || window === 0) {
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
if (typeof window === "number") {
|
|
151
|
+
return window * step;
|
|
152
|
+
}
|
|
153
|
+
return [window[0] * step, window[1] * step];
|
|
154
|
+
}
|
|
155
|
+
var TOTP = class _TOTP extends HOTP {
|
|
156
|
+
constructor(defaultOptions = {}) {
|
|
157
|
+
super(defaultOptions);
|
|
158
|
+
}
|
|
159
|
+
create(defaultOptions = {}) {
|
|
160
|
+
return new _TOTP(defaultOptions);
|
|
161
|
+
}
|
|
162
|
+
allOptions() {
|
|
163
|
+
const merged = {
|
|
164
|
+
algorithm: HashAlgorithms.SHA1,
|
|
165
|
+
digits: 6,
|
|
166
|
+
encoding: KeyEncodings.ASCII,
|
|
167
|
+
epoch: null,
|
|
168
|
+
// v11 default was null, meaning "now"
|
|
169
|
+
step: 30,
|
|
170
|
+
window: 0,
|
|
171
|
+
crypto: defaultCrypto2,
|
|
172
|
+
base32: defaultBase322,
|
|
173
|
+
...this._defaultOptions,
|
|
174
|
+
...this._options
|
|
175
|
+
};
|
|
176
|
+
const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1e3);
|
|
177
|
+
return Object.freeze({
|
|
178
|
+
...merged,
|
|
179
|
+
epoch
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
generate(secret) {
|
|
183
|
+
const opts = this.allOptions();
|
|
184
|
+
const secretBytes = secretToBytes(secret, opts.encoding);
|
|
185
|
+
return totpGenerateSync({
|
|
186
|
+
secret: secretBytes,
|
|
187
|
+
algorithm: opts.algorithm,
|
|
188
|
+
digits: opts.digits,
|
|
189
|
+
period: opts.step,
|
|
190
|
+
epoch: opts.epoch,
|
|
191
|
+
// v11: already in seconds
|
|
192
|
+
t0: 0,
|
|
193
|
+
crypto: opts.crypto
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
check(token, secret) {
|
|
197
|
+
const delta = this.checkDelta(token, secret);
|
|
198
|
+
return typeof delta === "number";
|
|
199
|
+
}
|
|
200
|
+
checkDelta(token, secret) {
|
|
201
|
+
const opts = this.allOptions();
|
|
202
|
+
const secretBytes = secretToBytes(secret, opts.encoding);
|
|
203
|
+
const epochTolerance = parseWindow(opts.window, opts.step);
|
|
204
|
+
try {
|
|
205
|
+
const result = totpVerifySync({
|
|
206
|
+
secret: secretBytes,
|
|
207
|
+
token,
|
|
208
|
+
algorithm: opts.algorithm,
|
|
209
|
+
digits: opts.digits,
|
|
210
|
+
period: opts.step,
|
|
211
|
+
epoch: opts.epoch,
|
|
212
|
+
// v11: already in seconds
|
|
213
|
+
t0: 0,
|
|
214
|
+
epochTolerance,
|
|
215
|
+
crypto: opts.crypto
|
|
216
|
+
});
|
|
217
|
+
if (!result.valid) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
return result.delta;
|
|
221
|
+
} catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
verify(opts) {
|
|
226
|
+
if (typeof opts !== "object") {
|
|
227
|
+
throw new Error("Expecting argument 0 of verify to be an object");
|
|
228
|
+
}
|
|
229
|
+
return this.check(opts.token, opts.secret);
|
|
230
|
+
}
|
|
231
|
+
keyuri(accountName, issuer, secret) {
|
|
232
|
+
const opts = this.allOptions();
|
|
233
|
+
return generateTOTPURI({
|
|
234
|
+
label: accountName,
|
|
235
|
+
issuer,
|
|
236
|
+
secret,
|
|
237
|
+
algorithm: opts.algorithm,
|
|
238
|
+
digits: opts.digits,
|
|
239
|
+
period: opts.step
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
timeUsed() {
|
|
243
|
+
const opts = this.allOptions();
|
|
244
|
+
return opts.epoch % opts.step;
|
|
245
|
+
}
|
|
246
|
+
timeRemaining() {
|
|
247
|
+
const opts = this.allOptions();
|
|
248
|
+
return getRemainingTime(opts.epoch, opts.step, 0);
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
// src/authenticator.ts
|
|
253
|
+
var defaultCrypto3 = new NobleCryptoPlugin3();
|
|
254
|
+
var defaultBase323 = new ScureBase32Plugin3();
|
|
255
|
+
function defaultKeyEncoder(secret, _encoding) {
|
|
256
|
+
const bytes = new TextEncoder().encode(secret);
|
|
257
|
+
return defaultBase323.encode(bytes);
|
|
258
|
+
}
|
|
259
|
+
function defaultKeyDecoder(encodedSecret, _encoding) {
|
|
260
|
+
const bytes = defaultBase323.decode(encodedSecret);
|
|
261
|
+
return new TextDecoder().decode(bytes);
|
|
262
|
+
}
|
|
263
|
+
function parseWindow2(window, step) {
|
|
264
|
+
if (window === void 0 || window === 0) {
|
|
265
|
+
return 0;
|
|
266
|
+
}
|
|
267
|
+
if (typeof window === "number") {
|
|
268
|
+
return window * step;
|
|
269
|
+
}
|
|
270
|
+
return [window[0] * step, window[1] * step];
|
|
271
|
+
}
|
|
272
|
+
var Authenticator = class _Authenticator extends TOTP {
|
|
273
|
+
constructor(defaultOptions = {}) {
|
|
274
|
+
super(defaultOptions);
|
|
275
|
+
}
|
|
276
|
+
create(defaultOptions = {}) {
|
|
277
|
+
return new _Authenticator(defaultOptions);
|
|
278
|
+
}
|
|
279
|
+
allOptions() {
|
|
280
|
+
const merged = {
|
|
281
|
+
algorithm: HashAlgorithms.SHA1,
|
|
282
|
+
digits: 6,
|
|
283
|
+
encoding: KeyEncodings.HEX,
|
|
284
|
+
epoch: null,
|
|
285
|
+
step: 30,
|
|
286
|
+
window: 0,
|
|
287
|
+
keyEncoder: defaultKeyEncoder,
|
|
288
|
+
keyDecoder: defaultKeyDecoder,
|
|
289
|
+
crypto: defaultCrypto3,
|
|
290
|
+
base32: defaultBase323,
|
|
291
|
+
...this._defaultOptions,
|
|
292
|
+
...this._options
|
|
293
|
+
};
|
|
294
|
+
const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1e3);
|
|
295
|
+
return Object.freeze({
|
|
296
|
+
...merged,
|
|
297
|
+
epoch
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
generate(secret) {
|
|
301
|
+
const opts = this.allOptions();
|
|
302
|
+
const secretBytes = defaultBase323.decode(secret);
|
|
303
|
+
return totpGenerateSync2({
|
|
304
|
+
secret: secretBytes,
|
|
305
|
+
algorithm: opts.algorithm,
|
|
306
|
+
digits: opts.digits,
|
|
307
|
+
period: opts.step,
|
|
308
|
+
epoch: opts.epoch,
|
|
309
|
+
// v11: already in seconds
|
|
310
|
+
t0: 0,
|
|
311
|
+
crypto: opts.crypto
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
check(token, secret) {
|
|
315
|
+
const delta = this.checkDelta(token, secret);
|
|
316
|
+
return typeof delta === "number";
|
|
317
|
+
}
|
|
318
|
+
checkDelta(token, secret) {
|
|
319
|
+
const opts = this.allOptions();
|
|
320
|
+
const secretBytes = defaultBase323.decode(secret);
|
|
321
|
+
const epochTolerance = parseWindow2(opts.window, opts.step);
|
|
322
|
+
try {
|
|
323
|
+
const result = totpVerifySync2({
|
|
324
|
+
secret: secretBytes,
|
|
325
|
+
token,
|
|
326
|
+
algorithm: opts.algorithm,
|
|
327
|
+
digits: opts.digits,
|
|
328
|
+
period: opts.step,
|
|
329
|
+
epoch: opts.epoch,
|
|
330
|
+
// v11: already in seconds
|
|
331
|
+
t0: 0,
|
|
332
|
+
epochTolerance,
|
|
333
|
+
crypto: opts.crypto
|
|
334
|
+
});
|
|
335
|
+
if (!result.valid) {
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
return result.delta;
|
|
339
|
+
} catch {
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
verify(opts) {
|
|
344
|
+
if (typeof opts !== "object") {
|
|
345
|
+
throw new Error("Expecting argument 0 of verify to be an object");
|
|
346
|
+
}
|
|
347
|
+
return this.check(opts.token, opts.secret);
|
|
348
|
+
}
|
|
349
|
+
encode(secret) {
|
|
350
|
+
const opts = this.allOptions();
|
|
351
|
+
return opts.keyEncoder(secret, opts.encoding);
|
|
352
|
+
}
|
|
353
|
+
decode(secret) {
|
|
354
|
+
const opts = this.allOptions();
|
|
355
|
+
return opts.keyDecoder(secret, opts.encoding);
|
|
356
|
+
}
|
|
357
|
+
generateSecret(numberOfBytes = 20) {
|
|
358
|
+
const opts = this.allOptions();
|
|
359
|
+
return generateSecretCore({
|
|
360
|
+
crypto: opts.crypto,
|
|
361
|
+
base32: opts.base32,
|
|
362
|
+
length: numberOfBytes
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
// src/index.ts
|
|
368
|
+
var hotp = new HOTP();
|
|
369
|
+
var totp = new TOTP();
|
|
370
|
+
var authenticator = new Authenticator();
|
|
371
|
+
export {
|
|
372
|
+
Authenticator,
|
|
373
|
+
HOTP,
|
|
374
|
+
HashAlgorithms,
|
|
375
|
+
KeyEncodings,
|
|
376
|
+
TOTP,
|
|
377
|
+
authenticator,
|
|
378
|
+
hotp,
|
|
379
|
+
totp
|
|
380
|
+
};
|
|
381
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/authenticator.ts","../src/totp.ts","../src/hotp.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["/**\n * @otplib/preset-v11\n *\n * v11-compatible Authenticator class implementation.\n */\n\nimport { generateSecret as generateSecretCore } from \"@otplib/core\";\nimport { ScureBase32Plugin } from \"@otplib/plugin-base32-scure\";\nimport { NobleCryptoPlugin } from \"@otplib/plugin-crypto-noble\";\nimport { generateSync as totpGenerateSync, verifySync as totpVerifySync } from \"@otplib/totp\";\n\nimport { TOTP } from \"./totp\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types\";\n\nimport type {\n AuthenticatorOptions,\n Base32SecretKey,\n SecretKey,\n KeyEncodings,\n ResolvedAuthenticatorOptions,\n} from \"./types\";\nimport type { Digits } from \"@otplib/core\";\n\nconst defaultCrypto = new NobleCryptoPlugin();\nconst defaultBase32 = new ScureBase32Plugin();\n\nfunction defaultKeyEncoder(secret: SecretKey, _encoding: KeyEncodings): Base32SecretKey {\n const bytes = new TextEncoder().encode(secret);\n return defaultBase32.encode(bytes);\n}\n\nfunction defaultKeyDecoder(encodedSecret: Base32SecretKey, _encoding: KeyEncodings): SecretKey {\n const bytes = defaultBase32.decode(encodedSecret);\n return new TextDecoder().decode(bytes);\n}\n\nfunction parseWindow(\n window: number | [number, number] | undefined,\n step: number,\n): number | [number, number] {\n if (window === undefined || window === 0) {\n return 0;\n }\n if (typeof window === \"number\") {\n // v11 treated window as steps\n return window * step;\n }\n return [window[0] * step, window[1] * step];\n}\n\nexport class Authenticator<T extends AuthenticatorOptions = AuthenticatorOptions> extends TOTP<T> {\n constructor(defaultOptions: Partial<T> = {}) {\n super(defaultOptions);\n }\n\n override create(defaultOptions: Partial<T> = {}): Authenticator<T> {\n return new Authenticator<T>(defaultOptions);\n }\n\n override allOptions(): Readonly<ResolvedAuthenticatorOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.HEX,\n epoch: null,\n step: 30,\n window: 0,\n keyEncoder: defaultKeyEncoder,\n keyDecoder: defaultKeyDecoder,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n\n const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1000);\n\n return Object.freeze({\n ...merged,\n epoch: epoch as number,\n }) as Readonly<ResolvedAuthenticatorOptions>;\n }\n\n override generate(secret: Base32SecretKey): string {\n const opts = this.allOptions();\n\n // Generate using decoded secret (as raw bytes)\n const secretBytes = defaultBase32.decode(secret);\n\n return totpGenerateSync({\n secret: secretBytes,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n crypto: opts.crypto,\n });\n }\n\n override check(token: string, secret: Base32SecretKey): boolean {\n const delta = this.checkDelta(token, secret);\n return typeof delta === \"number\";\n }\n\n override checkDelta(token: string, secret: Base32SecretKey): number | null {\n const opts = this.allOptions();\n const secretBytes = defaultBase32.decode(secret);\n const epochTolerance = parseWindow(opts.window, opts.step);\n\n try {\n const result = totpVerifySync({\n secret: secretBytes,\n token,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n epochTolerance,\n crypto: opts.crypto,\n });\n\n if (!result.valid) {\n return null;\n }\n\n return result.delta;\n } catch {\n return null;\n }\n }\n\n override verify(opts: { token: string; secret: Base32SecretKey }): boolean {\n if (typeof opts !== \"object\") {\n // v11 legacy behavior: verify requires object\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret);\n }\n\n encode(secret: SecretKey): Base32SecretKey {\n const opts = this.allOptions();\n return opts.keyEncoder(secret, opts.encoding);\n }\n\n decode(secret: Base32SecretKey): SecretKey {\n const opts = this.allOptions();\n return opts.keyDecoder(secret, opts.encoding);\n }\n\n generateSecret(numberOfBytes: number = 20): Base32SecretKey {\n const opts = this.allOptions();\n return generateSecretCore({\n crypto: opts.crypto,\n base32: opts.base32,\n length: numberOfBytes,\n });\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible TOTP class implementation.\n */\n\nimport { ScureBase32Plugin } from \"@otplib/plugin-base32-scure\";\nimport { NobleCryptoPlugin } from \"@otplib/plugin-crypto-noble\";\nimport {\n generateSync as totpGenerateSync,\n verifySync as totpVerifySync,\n getRemainingTime,\n} from \"@otplib/totp\";\nimport { generateTOTP as generateTOTPURI } from \"@otplib/uri\";\n\nimport { HOTP, secretToBytes } from \"./hotp\";\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types\";\n\nimport type { TOTPOptions, SecretKey, ResolvedTOTPOptions } from \"./types\";\nimport type { Digits } from \"@otplib/core\";\n\nconst defaultCrypto = new NobleCryptoPlugin();\nconst defaultBase32 = new ScureBase32Plugin();\n\nfunction parseWindow(\n window: number | [number, number] | undefined,\n step: number,\n): number | [number, number] {\n if (window === undefined || window === 0) {\n return 0;\n }\n if (typeof window === \"number\") {\n // v11 treated window as steps\n return window * step;\n }\n return [window[0] * step, window[1] * step];\n}\n\nexport class TOTP<T extends TOTPOptions = TOTPOptions> extends HOTP<T> {\n constructor(defaultOptions: Partial<T> = {}) {\n super(defaultOptions);\n }\n\n override create(defaultOptions: Partial<T> = {}): TOTP<T> {\n return new TOTP<T>(defaultOptions);\n }\n\n override allOptions(): Readonly<ResolvedTOTPOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.ASCII,\n epoch: null, // v11 default was null, meaning \"now\"\n step: 30,\n window: 0,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n\n // Resolve epoch to seconds if null\n const epoch = merged.epoch !== null ? merged.epoch : Math.floor(Date.now() / 1000);\n\n return Object.freeze({\n ...merged,\n epoch: epoch as number,\n }) as Readonly<ResolvedTOTPOptions>;\n }\n\n generate(secret: SecretKey): string {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n return totpGenerateSync({\n secret: secretBytes,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n crypto: opts.crypto,\n });\n }\n\n check(token: string, secret: SecretKey): boolean {\n const delta = this.checkDelta(token, secret);\n return typeof delta === \"number\";\n }\n\n checkDelta(token: string, secret: SecretKey): number | null {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n const epochTolerance = parseWindow(opts.window, opts.step);\n\n try {\n const result = totpVerifySync({\n secret: secretBytes,\n token,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n epoch: opts.epoch, // v11: already in seconds\n t0: 0,\n epochTolerance,\n crypto: opts.crypto,\n });\n\n if (!result.valid) {\n return null;\n }\n\n return result.delta;\n } catch {\n return null;\n }\n }\n\n override verify(opts: { token: string; secret: SecretKey }): boolean {\n if (typeof opts !== \"object\") {\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret);\n }\n\n keyuri(accountName: string, issuer: string, secret: SecretKey): string {\n const opts = this.allOptions();\n\n return generateTOTPURI({\n label: accountName,\n issuer,\n secret,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n period: opts.step,\n });\n }\n\n timeUsed(): number {\n const opts = this.allOptions();\n return opts.epoch % opts.step;\n }\n\n timeRemaining(): number {\n const opts = this.allOptions();\n return getRemainingTime(opts.epoch, opts.step, 0);\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible HOTP class implementation.\n */\n\nimport { stringToBytes, hexToBytes } from \"@otplib/core\";\nimport { generateSync as hotpGenerateSync, verifySync as hotpVerifySync } from \"@otplib/hotp\";\nimport { ScureBase32Plugin } from \"@otplib/plugin-base32-scure\";\nimport { NobleCryptoPlugin } from \"@otplib/plugin-crypto-noble\";\nimport { generateHOTP as generateHOTPURI } from \"@otplib/uri\";\n\nimport { HashAlgorithms, KeyEncodings as KeyEncodingsConst } from \"./types\";\n\nimport type { HOTPOptions, SecretKey, ResolvedHOTPOptions } from \"./types\";\nimport type { Digits } from \"@otplib/core\";\n\nconst defaultCrypto = new NobleCryptoPlugin();\nconst defaultBase32 = new ScureBase32Plugin();\n\n/**\n * Convert a string secret to bytes based on encoding\n */\nexport function secretToBytes(secret: SecretKey, encoding?: string): Uint8Array {\n if (encoding === KeyEncodingsConst.BASE32 || encoding === \"base32\") {\n return defaultBase32.decode(secret);\n }\n if (encoding === KeyEncodingsConst.HEX || encoding === \"hex\") {\n return hexToBytes(secret.replace(/\\s/g, \"\"));\n }\n return stringToBytes(secret);\n}\n\nexport class HOTP<T extends HOTPOptions = HOTPOptions> {\n protected _options: Partial<T> = {};\n protected _defaultOptions: Partial<T> = {};\n\n constructor(defaultOptions: Partial<T> = {}) {\n this._defaultOptions = { ...defaultOptions };\n this._options = {};\n }\n\n get options(): Partial<T> {\n return { ...this._defaultOptions, ...this._options };\n }\n\n set options(value: Partial<T>) {\n this._options = { ...value };\n }\n\n get defaultOptions(): Partial<T> {\n return this._defaultOptions;\n }\n\n set defaultOptions(value: Partial<T>) {\n this._defaultOptions = value;\n }\n\n get optionsAll(): Readonly<ResolvedHOTPOptions> {\n return this.allOptions();\n }\n\n create(defaultOptions: Partial<T> = {}): HOTP<T> {\n return new HOTP<T>(defaultOptions);\n }\n\n allOptions(): Readonly<ResolvedHOTPOptions> {\n const merged = {\n algorithm: HashAlgorithms.SHA1,\n digits: 6,\n encoding: KeyEncodingsConst.ASCII,\n crypto: defaultCrypto,\n base32: defaultBase32,\n ...this._defaultOptions,\n ...this._options,\n };\n return Object.freeze(merged) as Readonly<ResolvedHOTPOptions>;\n }\n\n resetOptions(): this {\n this._options = {};\n return this;\n }\n\n generate(secret: SecretKey, counter: number): string {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n return hotpGenerateSync({\n secret: secretBytes,\n counter,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n crypto: opts.crypto,\n });\n }\n\n check(token: string, secret: SecretKey, counter: number): boolean {\n const opts = this.allOptions();\n const secretBytes = secretToBytes(secret, opts.encoding);\n\n try {\n const result = hotpVerifySync({\n secret: secretBytes,\n token,\n counter,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n counterTolerance: 0,\n crypto: opts.crypto,\n });\n\n return result.valid;\n } catch {\n return false;\n }\n }\n\n verify(opts: { token: string; secret: SecretKey; counter: number }): boolean {\n if (typeof opts !== \"object\") {\n throw new Error(\"Expecting argument 0 of verify to be an object\");\n }\n return this.check(opts.token, opts.secret, opts.counter);\n }\n\n keyuri(accountName: string, issuer: string, secret: SecretKey, counter: number): string {\n const opts = this.allOptions();\n\n return generateHOTPURI({\n label: accountName,\n issuer,\n secret,\n algorithm: opts.algorithm,\n digits: opts.digits as Digits,\n counter,\n });\n }\n\n getClass(): typeof HOTP {\n return HOTP;\n }\n}\n","/**\n * @otplib/preset-v11\n *\n * v11-compatible type definitions.\n * v11 used functionality similar to v12 but with seconds-based epochs.\n */\n\nimport type { CryptoPlugin, Base32Plugin, HashAlgorithm } from \"@otplib/core\";\n\nexport const HashAlgorithms = {\n SHA1: \"sha1\",\n SHA256: \"sha256\",\n SHA512: \"sha512\",\n} as const;\n\nexport type HashAlgorithms = (typeof HashAlgorithms)[keyof typeof HashAlgorithms];\n\nexport const KeyEncodings = {\n ASCII: \"ascii\",\n HEX: \"hex\",\n BASE32: \"base32\",\n BASE64: \"base64\",\n LATIN1: \"latin1\",\n UTF8: \"utf8\",\n} as const;\n\nexport type KeyEncodings = (typeof KeyEncodings)[keyof typeof KeyEncodings];\n\nexport type SecretKey = string;\nexport type Base32SecretKey = string;\n\nexport type HOTPOptions = {\n algorithm?: HashAlgorithm;\n digits?: number;\n encoding?: KeyEncodings;\n crypto?: CryptoPlugin;\n base32?: Base32Plugin;\n};\n\nexport type TOTPOptions = HOTPOptions & {\n epoch?: number | null; // v11: seconds\n step?: number;\n window?: number | [number, number];\n};\n\nexport type KeyEncoder = (secret: SecretKey, encoding: KeyEncodings) => Base32SecretKey;\nexport type KeyDecoder = (encodedSecret: Base32SecretKey, encoding: KeyEncodings) => SecretKey;\n\nexport type AuthenticatorOptions = TOTPOptions & {\n keyEncoder?: KeyEncoder;\n keyDecoder?: KeyDecoder;\n};\n\nexport type ResolvedHOTPOptions = {\n algorithm: HashAlgorithm;\n digits: number;\n encoding: KeyEncodings;\n crypto: CryptoPlugin;\n base32: Base32Plugin;\n};\n\nexport type ResolvedTOTPOptions = ResolvedHOTPOptions & {\n epoch: number;\n step: number;\n window: number | [number, number];\n};\n\nexport type ResolvedAuthenticatorOptions = ResolvedTOTPOptions & {\n keyEncoder: KeyEncoder;\n keyDecoder: KeyDecoder;\n};\n","/**\n * @otplib/preset-v11\n *\n * v11 compatibility preset.\n */\n\nimport { Authenticator } from \"./authenticator\";\nimport { HOTP } from \"./hotp\";\nimport { TOTP } from \"./totp\";\n\nexport { HOTP, TOTP, Authenticator };\nexport * from \"./types\";\n\nexport const hotp = new HOTP();\nexport const totp = new TOTP();\nexport const authenticator = new Authenticator();\n"],"mappings":"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","names":["ScureBase32Plugin","NobleCryptoPlugin","totpGenerateSync","totpVerifySync","ScureBase32Plugin","NobleCryptoPlugin","defaultCrypto","NobleCryptoPlugin","defaultBase32","ScureBase32Plugin","defaultCrypto","NobleCryptoPlugin","defaultBase32","ScureBase32Plugin","parseWindow","totpGenerateSync","totpVerifySync"]}
|
package/package.json
CHANGED
|
@@ -1,25 +1,75 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@otplib/preset-v11",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
3
|
+
"version": "13.0.1",
|
|
4
|
+
"description": "v11 compatibility preset for otplib",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Gerald Yeo <support@yeojz.dev>",
|
|
7
|
+
"homepage": "https://otplib.yeojz.dev",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/yeojz/otplib.git",
|
|
11
|
+
"directory": "packages/v11-adapter"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/yeojz/otplib/issues"
|
|
8
15
|
},
|
|
9
|
-
"scripts": {},
|
|
10
16
|
"keywords": [
|
|
11
|
-
"
|
|
12
|
-
"
|
|
17
|
+
"otp",
|
|
18
|
+
"hotp",
|
|
19
|
+
"totp",
|
|
20
|
+
"2fa",
|
|
21
|
+
"mfa",
|
|
22
|
+
"authenticator",
|
|
23
|
+
"migration",
|
|
24
|
+
"v11",
|
|
25
|
+
"adapter"
|
|
26
|
+
],
|
|
27
|
+
"sideEffects": false,
|
|
28
|
+
"type": "module",
|
|
29
|
+
"main": "./dist/index.cjs",
|
|
30
|
+
"module": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"import": {
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"default": "./dist/index.js"
|
|
37
|
+
},
|
|
38
|
+
"require": {
|
|
39
|
+
"types": "./dist/index.d.cts",
|
|
40
|
+
"default": "./dist/index.cjs"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE"
|
|
13
48
|
],
|
|
14
49
|
"dependencies": {
|
|
15
|
-
"@otplib/core": "
|
|
16
|
-
"@otplib/
|
|
17
|
-
"@otplib/
|
|
50
|
+
"@otplib/core": "13.0.1",
|
|
51
|
+
"@otplib/totp": "13.0.1",
|
|
52
|
+
"@otplib/hotp": "13.0.1",
|
|
53
|
+
"@otplib/uri": "13.0.1",
|
|
54
|
+
"@otplib/plugin-base32-scure": "13.0.1",
|
|
55
|
+
"@otplib/plugin-crypto-noble": "13.0.1"
|
|
18
56
|
},
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"tsup": "^8.0.1",
|
|
59
|
+
"typescript": "^5.3.3",
|
|
60
|
+
"vitest": "^4.0.16",
|
|
61
|
+
"@repo/testing": "13.0.1"
|
|
62
|
+
},
|
|
63
|
+
"publishConfig": {
|
|
64
|
+
"access": "public"
|
|
65
|
+
},
|
|
66
|
+
"scripts": {
|
|
67
|
+
"build": "tsup",
|
|
68
|
+
"dev": "tsup --watch",
|
|
69
|
+
"test": "vitest",
|
|
70
|
+
"test:ci": "vitest run --coverage",
|
|
71
|
+
"typecheck": "tsc --noEmit",
|
|
72
|
+
"lint": "eslint src/",
|
|
73
|
+
"clean": "rm -rf dist .tsbuildinfo"
|
|
74
|
+
}
|
|
25
75
|
}
|