test_handlers_scrypt.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. """passlib.tests.test_handlers - tests for passlib hash algorithms"""
  2. #=============================================================================
  3. # imports
  4. #=============================================================================
  5. # core
  6. import logging; log = logging.getLogger(__name__)
  7. import warnings
  8. warnings.filterwarnings("ignore", ".*using builtin scrypt backend.*")
  9. # site
  10. # pkg
  11. from passlib import hash
  12. from passlib.tests.utils import HandlerCase, TEST_MODE
  13. from passlib.tests.test_handlers import UPASS_TABLE, PASS_TABLE_UTF8
  14. # module
  15. #=============================================================================
  16. # scrypt hash
  17. #=============================================================================
  18. class _scrypt_test(HandlerCase):
  19. handler = hash.scrypt
  20. known_correct_hashes = [
  21. #
  22. # excepted from test vectors from scrypt whitepaper
  23. # (http://www.tarsnap.com/scrypt/scrypt.pdf, appendix b),
  24. # and encoded using passlib's custom format
  25. #
  26. # salt=b""
  27. ("", "$scrypt$ln=4,r=1,p=1$$d9ZXYjhleyA7GcpCwYoEl/FrSETjB0ro39/6P+3iFEI"),
  28. # salt=b"NaCl"
  29. ("password", "$scrypt$ln=10,r=8,p=16$TmFDbA$/bq+HJ00cgB4VucZDQHp/nxq18vII3gw53N2Y0s3MWI"),
  30. #
  31. # custom
  32. #
  33. # simple test
  34. ("test", '$scrypt$ln=8,r=8,p=1$wlhLyXmP8b53bm1NKYVQqg$mTpvG8lzuuDk+DWz8HZIB6Vum6erDuUm0As5yU+VxWA'),
  35. # different block value
  36. ("password", '$scrypt$ln=8,r=2,p=1$dO6d0xoDoLT2PofQGoNQag$g/Wf2A0vhHhaJM+addK61QPBthSmYB6uVTtQzh8CM3o'),
  37. # different rounds
  38. (UPASS_TABLE, '$scrypt$ln=7,r=8,p=1$jjGmtDamdA4BQAjBeA9BSA$OiWRHhQtpDx7M/793x6UXK14AD512jg/qNm/hkWZG4M'),
  39. # alt encoding
  40. (PASS_TABLE_UTF8, '$scrypt$ln=7,r=8,p=1$jjGmtDamdA4BQAjBeA9BSA$OiWRHhQtpDx7M/793x6UXK14AD512jg/qNm/hkWZG4M'),
  41. # diff block & parallel counts as well
  42. ("nacl", '$scrypt$ln=1,r=4,p=2$yhnD+J+Tci4lZCwFgHCuVQ$fAsEWmxSHuC0cHKMwKVFPzrQukgvK09Sj+NueTSxKds')
  43. ]
  44. if TEST_MODE("full"):
  45. # add some hashes with larger rounds value.
  46. known_correct_hashes.extend([
  47. #
  48. # from scrypt whitepaper
  49. #
  50. # salt=b"SodiumChloride"
  51. ("pleaseletmein", "$scrypt$ln=14,r=8,p=1$U29kaXVtQ2hsb3JpZGU"
  52. "$cCO9yzr9c0hGHAbNgf046/2o+7qQT44+qbVD9lRdofI"),
  53. #
  54. # openwall format (https://gitlab.com/jas/scrypt-unix-crypt/blob/master/unix-scrypt.txt)
  55. #
  56. ("pleaseletmein",
  57. "$7$C6..../....SodiumChloride$kBGj9fHznVYFQMEn/qDCfrDevf9YDtcDdKvEqHJLV8D"),
  58. ])
  59. known_malformed_hashes = [
  60. # missing 'p' value
  61. '$scrypt$ln=10,r=1$wvif8/4fg1Cq9V7L2dv73w$bJcLia1lyfQ1X2x0xflehwVXPzWIUQWWdnlGwfVzBeQ',
  62. # rounds too low
  63. '$scrypt$ln=0,r=1,p=1$wvif8/4fg1Cq9V7L2dv73w$bJcLia1lyfQ1X2x0xflehwVXPzWIUQWWdnlGwfVzBeQ',
  64. # invalid block size
  65. '$scrypt$ln=10,r=A,p=1$wvif8/4fg1Cq9V7L2dv73w$bJcLia1lyfQ1X2x0xflehwVXPzWIUQWWdnlGwfVzBeQ',
  66. # r*p too large
  67. '$scrypt$ln=10,r=134217728,p=8$wvif8/4fg1Cq9V7L2dv73w$bJcLia1lyfQ1X2x0xflehwVXPzWIUQWWdnlGwfVzBeQ',
  68. ]
  69. def setUpWarnings(self):
  70. super(_scrypt_test, self).setUpWarnings()
  71. warnings.filterwarnings("ignore", ".*using builtin scrypt backend.*")
  72. def populate_settings(self, kwds):
  73. # builtin is still just way too slow.
  74. if self.backend == "builtin":
  75. kwds.setdefault("rounds", 6)
  76. super(_scrypt_test, self).populate_settings(kwds)
  77. class FuzzHashGenerator(HandlerCase.FuzzHashGenerator):
  78. def random_rounds(self):
  79. # decrease default rounds for fuzz testing to speed up volume.
  80. return self.randintgauss(4, 10, 6, 1)
  81. # create test cases for specific backends
  82. scrypt_stdlib_test = _scrypt_test.create_backend_case("stdlib")
  83. scrypt_scrypt_test = _scrypt_test.create_backend_case("scrypt")
  84. scrypt_builtin_test = _scrypt_test.create_backend_case("builtin")
  85. #=============================================================================
  86. # eof
  87. #=============================================================================