Support for "irregular" secret lengths
I realized whilst turning 2FA for Dropbox that they use a secret length that's not a multiplier of 8, which breaks Go's base32 decoder.
This commit is contained in:
parent
6b23ae7ae9
commit
5bc8ff087a
24
gauth.go
24
gauth.go
@ -16,13 +16,22 @@ import (
|
||||
)
|
||||
|
||||
func TimeStamp() (int64, int) {
|
||||
time := time.Now().Unix()
|
||||
return time / 30, int(time % 30);
|
||||
time := time.Now().Unix()
|
||||
return time / 30, int(time % 30)
|
||||
}
|
||||
|
||||
func normalizeSecret(sec string) string {
|
||||
noPadding := strings.ToUpper(strings.Replace(sec, " ", "", -1))
|
||||
padLength := 8 - (len(noPadding) % 8)
|
||||
if padLength < 8 {
|
||||
return noPadding + strings.Repeat("=", padLength)
|
||||
} else {
|
||||
return noPadding
|
||||
}
|
||||
}
|
||||
|
||||
func AuthCode(sec string, ts int64) (string, error) {
|
||||
normalizedSec := strings.ToUpper(strings.Replace(sec, " ", "", -1))
|
||||
key, err := base32.StdEncoding.DecodeString(normalizedSec)
|
||||
key, err := base32.StdEncoding.DecodeString(sec)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@ -77,12 +86,13 @@ func main() {
|
||||
prevTS := currentTS - 1
|
||||
nextTS := currentTS + 1
|
||||
|
||||
fmt.Println(" prev curr next");
|
||||
for name, secret := range cfg {
|
||||
fmt.Println(" prev curr next")
|
||||
for name, rawSecret := range cfg {
|
||||
secret := normalizeSecret(rawSecret)
|
||||
prevToken := authCodeOrDie(secret, prevTS)
|
||||
currentToken := authCodeOrDie(secret, currentTS)
|
||||
nextToken := authCodeOrDie(secret, nextTS)
|
||||
fmt.Printf("%-10s %s %s %s\n", name, prevToken, currentToken, nextToken)
|
||||
}
|
||||
fmt.Printf("[%-29s]\n", strings.Repeat("=", progress));
|
||||
fmt.Printf("[%-29s]\n", strings.Repeat("=", progress))
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user