1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
package gotp
// HMAC-based OTP counters.
type HOTP struct {
OTP
}
func NewHOTP(secret string, digits int, hasher *Hasher) *HOTP {
otp := NewOTP(secret, digits, hasher)
return &HOTP{OTP: otp}
}
func NewDefaultHOTP(secret string) *HOTP {
return NewHOTP(secret, 6, nil)
}
// Generates the OTP for the given count.
func (h *HOTP) At(count int) string {
return h.generateOTP(count)
}
/*
Verify OTP.
params:
otp: the OTP to check against
count: the OTP HMAC counter
*/
func (h *HOTP) Verify(otp string, count int) bool {
return otp == h.At(count)
}
/*
Returns the provisioning URI for the OTP.
This can then be encoded in a QR Code and used to provision an OTP app like Google Authenticator.
See also:
https://github.com/google/google-authenticator/wiki/Key-Uri-Format
params:
accountName: name of the account
issuerName: the name of the OTP issuer; this will be the organization title of the OTP entry in Authenticator
initialCount: starting HMAC counter value
returns: provisioning URI
*/
func (h *HOTP) ProvisioningUri(accountName, issuerName string, initialCount int) string {
return BuildUri(
OtpTypeHotp,
h.secret,
accountName,
issuerName,
h.hasher.HashName,
initialCount,
h.digits,
0)
}
|