totp_test.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334
  1. package totp
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/xlzd/gotp"
  6. )
  7. func TestVerifyWithSkew(t *testing.T) {
  8. secret := "JBSWY3DPEHPK3PXP"
  9. totp := gotp.NewDefaultTOTP(secret)
  10. // Anchor mid-window so a step boundary can't fall between sampling and verify.
  11. now := time.Unix((time.Now().Unix()/30)*30+15, 0).UTC()
  12. if !VerifyWithSkew(secret, totp.AtTime(now), now) {
  13. t.Fatal("current window code should verify")
  14. }
  15. if !VerifyWithSkew(secret, totp.AtTime(now.Add(-30*time.Second)), now) {
  16. t.Fatal("previous window code should verify (clock skew)")
  17. }
  18. if !VerifyWithSkew(secret, totp.AtTime(now.Add(30*time.Second)), now) {
  19. t.Fatal("next window code should verify (clock skew)")
  20. }
  21. if VerifyWithSkew(secret, totp.AtTime(now.Add(-60*time.Second)), now) {
  22. t.Fatal("code two windows old should not verify")
  23. }
  24. if VerifyWithSkew(secret, totp.AtTime(now.Add(60*time.Second)), now) {
  25. t.Fatal("code two windows ahead should not verify")
  26. }
  27. if VerifyWithSkew(secret, "000000", now) {
  28. t.Fatal("wrong code should not verify")
  29. }
  30. }