-
Notifications
You must be signed in to change notification settings - Fork 65
/
hotp.go
58 lines (47 loc) · 1.23 KB
/
hotp.go
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(int64(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)
}