ut_scrypt.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/env python3
  2. """
  3. test/unit_tests_d/ut_scrypt.py: password hashing unit test for the MMGen suite
  4. """
  5. from ..include.common import *
  6. class unit_test(object):
  7. def run_test(self,name,ut):
  8. import time
  9. msg_r('Testing password hashing...')
  10. qmsg('')
  11. from mmgen.crypto import scrypt_hash_passphrase
  12. salt = bytes.fromhex('f00f' * 16)
  13. presets = { '1': '64898d01ffcea1252c17411e7bd6c12d00191ee8ddcbf95420e5de8f37a7a1cb',
  14. '2': '625d0c59fcbcf85eca51b4337d3a4952e554c7c95fe32f4199ad0e9e9370e279',
  15. '3': 'b30a5cf0e606515be4a983cc4a1a4c21e04806f19aaa0ad354a353c83aecd3ee',
  16. '4': 'a3a1b99393734510b68adf2c2cfdc627a2bc3281913d8ea6fbb677d39781a9fa',
  17. '5': '0c7e1a672738cee49cf0ff6f3208190ca418e741835fd6995ce9558cc19f3f04',
  18. '6': '91f9d1c9baf3948433dab58dcc912d96035392c1db21ede96d2f369e025ab06d',
  19. '7': 'fcb2cd05268de43b0d2d45f78a56e5d446b0bd2d3b57bdbc77cc17a42942f1bd' }
  20. pws = ( ('', 'cc8d99ce7365d8a9d2422d71ce330e130b2cade46a8cc0459a3f83e1a6ac3d30'),
  21. ('foo', 'f0e2cce1d9980edf2373a2070ad3560c2506faf9bc50704a1bc5cdb3c7f63f3b'),
  22. ('φυβαρ', '64898d01ffcea1252c17411e7bd6c12d00191ee8ddcbf95420e5de8f37a7a1cb') )
  23. def test_passwords():
  24. for pw_base,res in pws:
  25. for pw in (pw_base,pw_base.encode()):
  26. pw_disp = "'"+pw+"'" if type(pw) == str else "b'"+pw.decode()+"'"
  27. if opt.quiet:
  28. omsg_r('.')
  29. else:
  30. msg_r(f'\n password {pw_disp:9} ')
  31. ret = scrypt_hash_passphrase(pw,salt,'1').hex()
  32. assert ret == res, ret
  33. def test_presets(do_presets):
  34. vmsg(' id N p r')
  35. for hp in do_presets:
  36. hp = str(hp)
  37. res = presets[hp]
  38. pw = 'φυβαρ'
  39. if opt.quiet:
  40. omsg_r('.')
  41. else:
  42. msg_r(f'\n {hp!r:3}: {g.hash_presets[hp]!r:12} ')
  43. st = time.time()
  44. ret = scrypt_hash_passphrase(pw,salt,hp).hex()
  45. t = time.time() - st
  46. vmsg('' if g.test_suite_deterministic else f' {t:0.4f} secs')
  47. assert ret == res, ret
  48. if opt.quiet:
  49. silence()
  50. g.force_standalone_scrypt_module = False
  51. vmsg('Passwords:')
  52. test_passwords()
  53. vmsg('Hash presets:')
  54. test_presets((1,2,3,4) if opt.fast else (1,2,3,4,5,6,7))
  55. g.force_standalone_scrypt_module = True
  56. vmsg('Passwords (standalone scrypt):')
  57. test_passwords()
  58. vmsg('Hash presets (standalone scrypt):')
  59. test_presets((1,2,3))
  60. if opt.quiet:
  61. end_silence()
  62. msg('OK')
  63. return True