test_otp.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from pwman_tstlib import *
  2. initTest(__file__)
  3. from base64 import b32decode
  4. from libpwman.otp import *
  5. class Test_OTP(TestCase):
  6. def test_totp(self):
  7. tBase = 1566319890
  8. results = {
  9. "SHA1" : ("71893792", "61002911"),
  10. "SHA256" : ("00589223", "95469059"),
  11. "SHA512" : ("66254736", "69059965"),
  12. }
  13. for hmacHash in ("SHA1", "SHA256", "SHA512"):
  14. for nrDigits in range(1, 8 + 1):
  15. for t in range(tBase - 2, tBase + 30 + 2):
  16. otp = totp(key="ORSXG5A=",
  17. nrDigits=nrDigits,
  18. hmacHash=hmacHash,
  19. t=float(t))
  20. if t < tBase + 15:
  21. self.assertEqual(otp, results[hmacHash][0][8 - nrDigits :])
  22. else:
  23. self.assertEqual(otp, results[hmacHash][1][8 - nrDigits :])
  24. self.assertEqual(otp,
  25. totp(key="ORSXG5A=".lower(),
  26. nrDigits=nrDigits,
  27. hmacHash=hmacHash,
  28. t=float(t)))
  29. self.assertEqual(otp,
  30. totp(key=b32decode("ORSXG5A=".encode("UTF-8")),
  31. nrDigits=nrDigits,
  32. hmacHash=hmacHash,
  33. t=float(t)))
  34. def test_totp_errors(self):
  35. self.assertRaises(OtpError, lambda: totp(key="ORSXG5A=", nrDigits=0))
  36. self.assertRaises(OtpError, lambda: totp(key="ORSXG5A=", nrDigits=9))
  37. self.assertRaises(OtpError, lambda: totp(key="ORSXG5A=", hmacHash="foobar"))
  38. self.assertRaises(OtpError, lambda: totp(key="ORSXG5A"))
  39. def test_hotp_errors(self):
  40. self.assertRaises(OtpError, lambda: hotp(key="ORSXG5A=", counter=-1))
  41. self.assertRaises(OtpError, lambda: hotp(key="ORSXG5A=", counter=2**64))