aboutsummaryrefslogtreecommitdiffstats
path: root/cryptography
diff options
context:
space:
mode:
authorDonald Stufft <donald@stufft.io>2013-10-22 09:38:29 -0700
committerDonald Stufft <donald@stufft.io>2013-10-22 09:38:29 -0700
commitab73ed9a6fadd69c7d394617fac6d6d2ab818abf (patch)
treeaac1716584b03ae125a675d6346dd454ec50d525 /cryptography
parent2647636426d8a566cd1f0519cb67716e08715996 (diff)
parentfbcc564cd234d3b6c29ddd40fa66d50d39c5c8dd (diff)
downloadcryptography-ab73ed9a6fadd69c7d394617fac6d6d2ab818abf.tar.gz
cryptography-ab73ed9a6fadd69c7d394617fac6d6d2ab818abf.tar.bz2
cryptography-ab73ed9a6fadd69c7d394617fac6d6d2ab818abf.zip
Merge pull request #108 from alex/triple-des
[WIP] Add TripleDES
Diffstat (limited to 'cryptography')
-rw-r--r--cryptography/bindings/openssl/api.py8
-rw-r--r--cryptography/primitives/block/ciphers.py24
2 files changed, 31 insertions, 1 deletions
diff --git a/cryptography/bindings/openssl/api.py b/cryptography/bindings/openssl/api.py
index 7d189d62..3d92c144 100644
--- a/cryptography/bindings/openssl/api.py
+++ b/cryptography/bindings/openssl/api.py
@@ -19,7 +19,7 @@ import sys
import cffi
from cryptography.primitives import interfaces
-from cryptography.primitives.block.ciphers import AES, Camellia
+from cryptography.primitives.block.ciphers import AES, Camellia, TripleDES
from cryptography.primitives.block.modes import CBC, CTR, ECB, OFB, CFB
@@ -135,6 +135,12 @@ class API(object):
mode_cls,
GetCipherByName("{cipher.name}-{cipher.key_size}-{mode.name}")
)
+ for mode_cls in [CBC, CFB, OFB]:
+ self.register_cipher_adapter(
+ TripleDES,
+ mode_cls,
+ GetCipherByName("des-ede3-{mode.name}")
+ )
def create_block_cipher_context(self, cipher, mode):
ctx = self.lib.EVP_CIPHER_CTX_new()
diff --git a/cryptography/primitives/block/ciphers.py b/cryptography/primitives/block/ciphers.py
index 4ac150a4..4143b89d 100644
--- a/cryptography/primitives/block/ciphers.py
+++ b/cryptography/primitives/block/ciphers.py
@@ -52,3 +52,27 @@ class Camellia(object):
@property
def key_size(self):
return len(self.key) * 8
+
+
+class TripleDES(object):
+ name = "3DES"
+ block_size = 64
+ key_sizes = frozenset([64, 128, 192])
+
+ def __init__(self, key):
+ super(TripleDES, self).__init__()
+ if len(key) == 8:
+ key += key + key
+ elif len(key) == 16:
+ key += key[:8]
+ self.key = key
+
+ # Verify that the key size matches the expected key size
+ if self.key_size not in self.key_sizes:
+ raise ValueError("Invalid key size ({0}) for {1}".format(
+ self.key_size, self.name
+ ))
+
+ @property
+ def key_size(self):
+ return len(self.key) * 8