crypto.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from binascii import hexlify
  2. from attic.testsuite import AtticTestCase
  3. from attic.crypto import pbkdf2_sha256, get_random_bytes, AES, AES_GCM_MODE, AES_CTR_MODE, \
  4. bytes_to_long, bytes_to_int, long_to_bytes
  5. class CryptoTestCase(AtticTestCase):
  6. def test_bytes_to_int(self):
  7. self.assert_equal(bytes_to_int(b'\0\0\0\1'), 1)
  8. def test_bytes_to_long(self):
  9. self.assert_equal(bytes_to_long(b'\0\0\0\0\0\0\0\1'), 1)
  10. self.assert_equal(long_to_bytes(1), b'\0\0\0\0\0\0\0\1')
  11. def test_pbkdf2_sha256(self):
  12. self.assert_equal(hexlify(pbkdf2_sha256(b'password', b'salt', 1, 32)),
  13. b'120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b')
  14. self.assert_equal(hexlify(pbkdf2_sha256(b'password', b'salt', 2, 32)),
  15. b'ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43')
  16. self.assert_equal(hexlify(pbkdf2_sha256(b'password', b'salt', 4096, 32)),
  17. b'c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a')
  18. def test_get_random_bytes(self):
  19. bytes = get_random_bytes(10)
  20. bytes2 = get_random_bytes(10)
  21. self.assert_equal(len(bytes), 10)
  22. self.assert_equal(len(bytes2), 10)
  23. self.assert_not_equal(bytes, bytes2)
  24. def test_aes_ctr(self):
  25. key = b'X' * 32
  26. iv = b'\0' * 16
  27. data = b'foo' * 10
  28. # encrypt
  29. aes = AES(mode=AES_CTR_MODE, is_encrypt=True, key=key, iv=iv)
  30. _, cdata = aes.compute_tag_and_encrypt(data)
  31. self.assert_equal(hexlify(cdata), b'c6efb702de12498f34a2c2bbc8149e759996d08bf6dc5c610aefc0c3a466')
  32. # decrypt (correct tag/cdata)
  33. aes = AES(mode=AES_CTR_MODE, is_encrypt=False, key=key, iv=iv)
  34. pdata = aes.check_tag_and_decrypt(None, cdata)
  35. self.assert_equal(data, pdata)
  36. def test_aes_gcm(self):
  37. key = b'X' * 32
  38. iv = b'A' * 16
  39. data = b'foo' * 10
  40. # encrypt
  41. aes = AES(mode=AES_GCM_MODE, is_encrypt=True, key=key, iv=iv)
  42. tag, cdata = aes.compute_tag_and_encrypt(data)
  43. self.assert_equal(hexlify(tag), b'c98aa10eb6b7031bcc2160878d9438fb00000000000000000000000000000000')
  44. self.assert_equal(hexlify(cdata), b'841bcce405df769d22ee9f7f012edf5dc7fb2594d924c7400ffd050f2741')
  45. # decrypt (correct tag/cdata)
  46. aes = AES(mode=AES_GCM_MODE, is_encrypt=False, key=key, iv=iv)
  47. pdata = aes.check_tag_and_decrypt(tag, cdata)
  48. self.assert_equal(data, pdata)
  49. # decrypt (incorrect tag/cdata)
  50. aes = AES(mode=AES_GCM_MODE, is_encrypt=False, key=key, iv=iv)
  51. cdata = b'x' + cdata[1:] # corrupt cdata
  52. self.assertRaises(Exception, aes.check_tag_and_decrypt, tag, cdata)