61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
![]() |
import { getHOTP } from "./OTPGenerator.js"
|
||
|
"use bigint"
|
||
|
/**
|
||
|
* TOTP instance
|
||
|
*/
|
||
|
export class TOTP{
|
||
|
/**
|
||
|
*
|
||
|
* @param {string} secret base32 encoded string
|
||
|
* @param {string} issuer issuer of TOTP
|
||
|
* @param {number} [digits=6] number of digits in OTP token
|
||
|
* @param {number} [fetchTime=30] period of token in seconds
|
||
|
* @param {number} [timeOffset=0] time offset for token in seconds
|
||
|
* @param {string} [hashType='SHA-1'] type of hash (more in jsSHA documentation)
|
||
|
*/
|
||
|
constructor(secret,
|
||
|
issuer,
|
||
|
digits = 6,
|
||
|
fetchTime = 30,
|
||
|
timeOffset = 0,
|
||
|
hashType = 'SHA-1')
|
||
|
{
|
||
|
this.secret = secret
|
||
|
this.issuer = issuer
|
||
|
this.digits = digits
|
||
|
this.fetchTime = fetchTime
|
||
|
this.timeOffset = timeOffset
|
||
|
this.hashType = hashType
|
||
|
}
|
||
|
/**
|
||
|
*
|
||
|
* @param {number} time time for counter (default unix time epoch)
|
||
|
* @returns OTP instance
|
||
|
*/
|
||
|
getOTP(time = Date.now()){
|
||
|
const unixTime = (time / 1000 + this.timeOffset) / this.fetchTime
|
||
|
const otp = getHOTP(Math.floor(unixTime), this.secret, this.digits)
|
||
|
const expireTime = time +
|
||
|
(this.fetchTime -
|
||
|
(time / 1000 + this.timeOffset) %
|
||
|
this.fetchTime) * 1000
|
||
|
|
||
|
return new OTP(otp, expireTime)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Class for TOTP.getOTP result
|
||
|
*/
|
||
|
export class OTP{
|
||
|
/**
|
||
|
*
|
||
|
* @param {string} otp OTP string
|
||
|
* @param {number} expireTime time in seconds to reset OTP
|
||
|
*/
|
||
|
constructor(otp, expireTime)
|
||
|
{
|
||
|
this.otp = otp
|
||
|
this.expireTime = expireTime
|
||
|
}
|
||
|
}
|