diff --git a/CHANGES.rst b/CHANGES.rst index 829f6f5..5d5ed09 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,9 @@ +v4.0.0 +====== + +#41: Instead of PyCrypto or PyCryptodome, the encrypting backend +now relies on PyCryptodomex. + v3.5.2 ====== diff --git a/keyrings/alt/file.py b/keyrings/alt/file.py index 1a900e0..459924e 100644 --- a/keyrings/alt/file.py +++ b/keyrings/alt/file.py @@ -33,7 +33,7 @@ def decrypt(self, password_encrypted, assoc=None): class Encrypted(object): """ - PyCrypto-backed Encryption support + PyCryptodome-backed Encryption support """ scheme = '[PBKDF2] AES256.CFB' @@ -44,8 +44,8 @@ def _create_cipher(self, password, salt, IV): """ Create the cipher object to encrypt or decrypt a payload. """ - from Crypto.Protocol.KDF import PBKDF2 - from Crypto.Cipher import AES + from Cryptodome.Protocol.KDF import PBKDF2 + from Cryptodome.Cipher import AES pw = PBKDF2(password, salt, dkLen=self.block_size) return AES.new(pw[: self.block_size], AES.MODE_CFB, IV) @@ -65,7 +65,7 @@ def _get_new_password(self): class EncryptedKeyring(Encrypted, Keyring): - """PyCrypto File Keyring""" + """PyCryptodome File Keyring""" filename = 'crypted_pass.cfg' pw_prefix = 'pw:'.encode() @@ -75,11 +75,11 @@ class EncryptedKeyring(Encrypted, Keyring): def priority(self): "Applicable for all platforms, but not recommended." try: - __import__('Crypto.Cipher.AES') - __import__('Crypto.Protocol.KDF') - __import__('Crypto.Random') + __import__('Cryptodome.Cipher.AES') + __import__('Cryptodome.Protocol.KDF') + __import__('Cryptodome.Random') except ImportError: # pragma: no cover - raise RuntimeError("PyCrypto required") + raise RuntimeError("pycryptodomex required") if not json: # pragma: no cover raise RuntimeError("JSON implementation such as simplejson required.") return 0.6 @@ -190,10 +190,10 @@ def _lock(self): def encrypt(self, password, assoc=None): # encrypt password, ignore associated data - from Crypto.Random import get_random_bytes + from Cryptodome.Random import get_random_bytes salt = get_random_bytes(self.block_size) - from Crypto.Cipher import AES + from Cryptodome.Cipher import AES IV = get_random_bytes(AES.block_size) cipher = self._create_cipher(self.keyring_key, salt, IV) diff --git a/keyrings/alt/tests/test_crypto.py b/keyrings/alt/tests/test_crypto.py index 2079f3a..cfc782a 100644 --- a/keyrings/alt/tests/test_crypto.py +++ b/keyrings/alt/tests/test_crypto.py @@ -10,15 +10,15 @@ def is_crypto_supported(): try: - __import__('Crypto.Cipher.AES') - __import__('Crypto.Protocol.KDF') - __import__('Crypto.Random') + __import__('Cryptodome.Cipher.AES') + __import__('Cryptodome.Protocol.KDF') + __import__('Cryptodome.Random') except ImportError: return False return True -@pytest.mark.skipif(not is_crypto_supported(), reason="Need Crypto module") +@pytest.mark.skipif(not is_crypto_supported(), reason="Need pycryptodomex module") class TestCryptedFileKeyring(FileKeyringTests): @pytest.fixture(autouse=True) def mocked_getpass(self, monkeypatch): diff --git a/keyrings/alt/tests/test_file.py b/keyrings/alt/tests/test_file.py index cc74b50..62192da 100644 --- a/keyrings/alt/tests/test_file.py +++ b/keyrings/alt/tests/test_file.py @@ -157,7 +157,7 @@ def test_version(self): class TestEncryptedFileKeyring(FileKeyringTests): @pytest.fixture(autouse=True) def crypt_fixture(self, monkeypatch): - pytest.importorskip('Crypto') + pytest.importorskip('Cryptodome') fake_getpass = mock.Mock(return_value='abcdef') monkeypatch.setattr(getpass, 'getpass', fake_getpass) diff --git a/setup.cfg b/setup.cfg index 862f66e..1304537 100644 --- a/setup.cfg +++ b/setup.cfg @@ -41,7 +41,7 @@ testing = keyring >= 20 fs>=0.5,<2 - pycryptodome + pycryptodomex # gdata doesn't currently install on Python 3 # http://code.google.com/p/gdata-python-client/issues/detail?id=229