diff options
-rw-r--r-- | cryptography/primitives/__init__.py | 0 | ||||
-rw-r--r-- | cryptography/primitives/block/__init__.py | 6 | ||||
-rw-r--r-- | cryptography/primitives/block/base.py | 8 | ||||
-rw-r--r-- | cryptography/primitives/block/ciphers.py | 4 | ||||
-rw-r--r-- | cryptography/primitives/block/modes.py | 5 | ||||
-rw-r--r-- | cryptography/primitives/block/padding.py | 2 | ||||
-rw-r--r-- | docs/primitives/symmetric-encryption.rst | 6 | ||||
-rw-r--r-- | tests/primitives/test_block.py | 23 |
8 files changed, 51 insertions, 3 deletions
diff --git a/cryptography/primitives/__init__.py b/cryptography/primitives/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/cryptography/primitives/__init__.py diff --git a/cryptography/primitives/block/__init__.py b/cryptography/primitives/block/__init__.py new file mode 100644 index 00000000..e49fcf38 --- /dev/null +++ b/cryptography/primitives/block/__init__.py @@ -0,0 +1,6 @@ +from cryptography.primitives.block.base import BlockCipher + + +__all__ = [ + "BlockCipher", +] diff --git a/cryptography/primitives/block/base.py b/cryptography/primitives/block/base.py new file mode 100644 index 00000000..c2cc4327 --- /dev/null +++ b/cryptography/primitives/block/base.py @@ -0,0 +1,8 @@ +class BlockCipher(object): + def __init__(self, cipher, mode): + super(BlockCipher, self).__init__() + self.cipher = cipher + self.mode = mode + + def encrypt(self, plaintext): + raise NotImplementedError diff --git a/cryptography/primitives/block/ciphers.py b/cryptography/primitives/block/ciphers.py new file mode 100644 index 00000000..e4e570d7 --- /dev/null +++ b/cryptography/primitives/block/ciphers.py @@ -0,0 +1,4 @@ +class AES(object): + def __init__(self, key): + super(AES, self).__init__() + self.key = key diff --git a/cryptography/primitives/block/modes.py b/cryptography/primitives/block/modes.py new file mode 100644 index 00000000..d336ed37 --- /dev/null +++ b/cryptography/primitives/block/modes.py @@ -0,0 +1,5 @@ +class CBC(object): + def __init__(self, initialization_vector, padding): + super(CBC, self).__init__() + self.initialization_vector = initialization_vector + self.padding = padding diff --git a/cryptography/primitives/block/padding.py b/cryptography/primitives/block/padding.py new file mode 100644 index 00000000..67083495 --- /dev/null +++ b/cryptography/primitives/block/padding.py @@ -0,0 +1,2 @@ +class NoPadding(object): + pass diff --git a/docs/primitives/symmetric-encryption.rst b/docs/primitives/symmetric-encryption.rst index fe074f3e..29eb2823 100644 --- a/docs/primitives/symmetric-encryption.rst +++ b/docs/primitives/symmetric-encryption.rst @@ -12,7 +12,7 @@ where the encrypter and decrypter both use the same key. .. code-block:: pycon - >>> from cryptography.primitives.block import BlockCipher, cipher, mode, padding + >>> from cryptography.primitives.block import BlockCipher, ciphers, modes, padding >>> cipher = BlockCipher(cipher.AES(key), mode.CBC(iv, padding.PKCS7())) >>> cipher.encrypt("my secret message") + cipher.finalize() # The ciphertext @@ -36,7 +36,7 @@ where the encrypter and decrypter both use the same key. Ciphers ~~~~~~~ -.. class:: cryptography.primitives.block.cipher.AES(key) +.. class:: cryptography.primitives.block.ciphers.AES(key) AES (Advanced Encryption Standard) is a block cipher standardized by NIST. AES is both fast, and cryptographically strong. It is a good default @@ -49,7 +49,7 @@ Ciphers Modes ~~~~~ -.. class:: cryptography.primitives.block.mode.CBC(initialization_vector, padding) +.. class:: cryptography.primitives.block.modes.CBC(initialization_vector, padding) CBC (Cipher block chaining) is a mode of operation for block ciphers. It is considered cryptographically strong. diff --git a/tests/primitives/test_block.py b/tests/primitives/test_block.py new file mode 100644 index 00000000..e22d05ef --- /dev/null +++ b/tests/primitives/test_block.py @@ -0,0 +1,23 @@ +import binascii + +import pytest + +from cryptography.primitives.block import BlockCipher, ciphers, modes, padding + + +class TestBlockCipher(object): + @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"), [ + ( + b"9dc2c84a37850c11699818605f47958c", + b"256953b2feab2a04ae0180d8335bbed6", + b"2e586692e647f5028ec6fa47a55a2aab", + b"1b1ebd1fc45ec43037fd4844241a437f" + ), + ]) + def test_aes_cbc_nopadding(self, key, iv, plaintext, ciphertext): + cipher = BlockCipher( + ciphers.AES(binascii.unhexlify(key)), + modes.CBC(binascii.unhexlify(iv), padding.NoPadding()) + ) + actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize() + assert binascii.hexlify(actual_ciphertext) == ciphertext |