@@ -3,18 +3,19 @@ import { test } from 'node:test'
3
3
import base32Encode from 'base32-encode'
4
4
import { generateTOTP , getTOTPAuthUri , verifyTOTP } from './index.js'
5
5
6
- test ( 'OTP can be generated and verified' , ( ) => {
7
- const { secret, otp, algorithm, period, digits } = generateTOTP ( )
8
- assert . strictEqual ( algorithm , 'SHA1' )
6
+ test ( 'OTP can be generated and verified' , async ( ) => {
7
+ const { secret, otp, algorithm, period, digits } = await generateTOTP ( )
8
+
9
+ assert . strictEqual ( algorithm , 'SHA-1' )
9
10
assert . strictEqual ( period , 30 )
10
11
assert . strictEqual ( digits , 6 )
11
- const result = verifyTOTP ( { otp, secret } )
12
+ const result = await verifyTOTP ( { otp, secret } )
12
13
assert . deepStrictEqual ( result , { delta : 0 } )
13
14
} )
14
15
15
- test ( 'options can be customized' , ( ) => {
16
+ test ( 'options can be customized' , async ( ) => {
16
17
const options = {
17
- algorithm : 'SHA256 ' ,
18
+ algorithm : 'SHA-256 ' ,
18
19
period : 60 ,
19
20
digits : 8 ,
20
21
secret : base32Encode (
@@ -23,86 +24,86 @@ test('options can be customized', () => {
23
24
) . toString ( ) ,
24
25
charSet : 'abcdef' ,
25
26
}
26
- const { otp, ...config } = generateTOTP ( options )
27
+ const { otp, ...config } = await generateTOTP ( options )
27
28
assert . deepStrictEqual ( config , options )
28
- const result = verifyTOTP ( { otp, ...config } )
29
+ const result = await verifyTOTP ( { otp, ...config } )
29
30
assert . deepStrictEqual ( result , { delta : 0 } )
30
31
} )
31
32
32
- test ( 'Verify TOTP within the specified time window' , ( ) => {
33
- const { otp, secret } = generateTOTP ( )
34
- const result = verifyTOTP ( { otp, secret, window : 0 } )
33
+ test ( 'Verify TOTP within the specified time window' , async ( ) => {
34
+ const { otp, secret } = await generateTOTP ( )
35
+ const result = await verifyTOTP ( { otp, secret, window : 0 } )
35
36
assert . notStrictEqual ( result , null )
36
37
} )
37
38
38
- test ( 'Fail to verify an invalid TOTP' , ( ) => {
39
+ test ( 'Fail to verify an invalid TOTP' , async ( ) => {
39
40
const secret = Math . random ( ) . toString ( )
40
41
const tooShortNumber = Math . random ( ) . toString ( ) . slice ( 2 , 7 )
41
- const result = verifyTOTP ( { otp : tooShortNumber , secret } )
42
+ const result = await verifyTOTP ( { otp : tooShortNumber , secret } )
42
43
assert . strictEqual ( result , null )
43
44
} )
44
45
45
46
test ( 'Fail to verify TOTP outside the specified time window' , async ( ) => {
46
- const { otp, secret : key } = generateTOTP ( { period : 0.0001 } )
47
+ const { otp, secret : key } = await generateTOTP ( { period : 0.0001 } )
47
48
await new Promise ( ( resolve ) => setTimeout ( resolve , 1 ) )
48
- const result = verifyTOTP ( { otp, secret : key } )
49
+ const result = await verifyTOTP ( { otp, secret : key } )
49
50
assert . strictEqual ( result , null )
50
51
} )
51
52
52
53
test ( 'Clock drift is handled by window' , async ( ) => {
53
54
// super small period
54
- const { otp, secret : key , period } = generateTOTP ( { period : 0.0001 } )
55
+ const { otp, secret : key , period } = await generateTOTP ( { period : 0.0001 } )
55
56
// waiting a tiny bit
56
57
await new Promise ( ( resolve ) => setTimeout ( resolve , 1 ) )
57
58
// super big window (to accomodate slow machines running this test)
58
- const result = verifyTOTP ( { otp, secret : key , window : 200 , period } )
59
+ const result = await verifyTOTP ( { otp, secret : key , window : 200 , period } )
59
60
// should still validate
60
61
assert . notDeepStrictEqual ( result , null )
61
62
} )
62
63
63
- test ( 'Setting a different period config for generating and verifying will fail' , ( ) => {
64
+ test ( 'Setting a different period config for generating and verifying will fail' , async ( ) => {
64
65
const desiredPeriod = 60
65
- const { otp, secret, period } = generateTOTP ( {
66
+ const { otp, secret, period } = await generateTOTP ( {
66
67
period : desiredPeriod ,
67
68
} )
68
69
assert . strictEqual ( period , desiredPeriod )
69
- const result = verifyTOTP ( { otp, secret, period : period + 1 } )
70
+ const result = await verifyTOTP ( { otp, secret, period : period + 1 } )
70
71
assert . strictEqual ( result , null )
71
72
} )
72
73
73
- test ( 'Setting a different algo config for generating and verifying will fail' , ( ) => {
74
- const desiredAlgo = 'SHA512 '
75
- const { otp, secret, algorithm } = generateTOTP ( {
74
+ test ( 'Setting a different algo config for generating and verifying will fail' , async ( ) => {
75
+ const desiredAlgo = 'SHA-512 '
76
+ const { otp, secret, algorithm } = await generateTOTP ( {
76
77
algorithm : desiredAlgo ,
77
78
} )
78
79
assert . strictEqual ( algorithm , desiredAlgo )
79
- const result = verifyTOTP ( { otp, secret, algorithm : 'SHA1 ' } )
80
+ const result = await verifyTOTP ( { otp, secret, algorithm : 'SHA-1 ' } )
80
81
assert . strictEqual ( result , null )
81
82
} )
82
83
83
- test ( 'Generating and verifying also works with the algorithm name alias' , ( ) => {
84
- const desiredAlgo = 'SHA1 '
85
- const { otp, secret, algorithm } = generateTOTP ( {
84
+ test ( 'Generating and verifying also works with the algorithm name alias' , async ( ) => {
85
+ const desiredAlgo = 'SHA-1 '
86
+ const { otp, secret, algorithm } = await generateTOTP ( {
86
87
algorithm : desiredAlgo ,
87
88
} )
88
89
assert . strictEqual ( algorithm , desiredAlgo )
89
90
90
- const result = verifyTOTP ( { otp, secret, algorithm : 'sha1 ' } )
91
+ const result = await verifyTOTP ( { otp, secret, algorithm : 'sha-1 ' } )
91
92
assert . notStrictEqual ( result , null )
92
93
} )
93
94
94
- test ( 'Charset defaults to numbers' , ( ) => {
95
- const { otp } = generateTOTP ( )
95
+ test ( 'Charset defaults to numbers' , async ( ) => {
96
+ const { otp } = await generateTOTP ( )
96
97
assert . match ( otp , / ^ [ 0 - 9 ] + $ / )
97
98
} )
98
99
99
- test ( 'Charset can be customized' , ( ) => {
100
- const { otp } = generateTOTP ( { charSet : 'abcdef' } )
100
+ test ( 'Charset can be customized' , async ( ) => {
101
+ const { otp } = await generateTOTP ( { charSet : 'abcdef' } )
101
102
assert . match ( otp , / ^ [ a b c d e f ] + $ / )
102
103
} )
103
104
104
- test ( 'OTP Auth URI can be generated' , ( ) => {
105
- const { otp : _otp , secret, ...totpConfig } = generateTOTP ( )
105
+ test ( 'OTP Auth URI can be generated' , async ( ) => {
106
+ const { otp : _otp , secret, ...totpConfig } = await generateTOTP ( )
106
107
const issuer = Math . random ( ) . toString ( 16 ) . slice ( 2 )
107
108
const accountName = Math . random ( ) . toString ( 16 ) . slice ( 2 )
108
109
const uri = getTOTPAuthUri ( {
0 commit comments