aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Gaynor <alex.gaynor@gmail.com>2013-08-08 19:36:44 -0700
committerAlex Gaynor <alex.gaynor@gmail.com>2013-08-08 19:36:44 -0700
commit95b8620e738b36a1e6e4bd015149bcb0851b3da9 (patch)
tree779d7b8198cd4300f06857cd770f64a8f1befc86
parent4bc451924ce0f98c0300aa13463ea8e995ea8c93 (diff)
downloadcryptography-95b8620e738b36a1e6e4bd015149bcb0851b3da9.tar.gz
cryptography-95b8620e738b36a1e6e4bd015149bcb0851b3da9.tar.bz2
cryptography-95b8620e738b36a1e6e4bd015149bcb0851b3da9.zip
Started stubbing stuff out, including a simple test, now is the part where we
write some actual cryptographic software. So yeah.
-rw-r--r--cryptography/primitives/__init__.py0
-rw-r--r--cryptography/primitives/block/__init__.py6
-rw-r--r--cryptography/primitives/block/base.py8
-rw-r--r--cryptography/primitives/block/ciphers.py4
-rw-r--r--cryptography/primitives/block/modes.py5
-rw-r--r--cryptography/primitives/block/padding.py2
-rw-r--r--docs/primitives/symmetric-encryption.rst6
-rw-r--r--tests/primitives/test_block.py23
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