diff options
author | Donald Stufft <donald@stufft.io> | 2013-10-22 09:38:29 -0700 |
---|---|---|
committer | Donald Stufft <donald@stufft.io> | 2013-10-22 09:38:29 -0700 |
commit | ab73ed9a6fadd69c7d394617fac6d6d2ab818abf (patch) | |
tree | aac1716584b03ae125a675d6346dd454ec50d525 /cryptography | |
parent | 2647636426d8a566cd1f0519cb67716e08715996 (diff) | |
parent | fbcc564cd234d3b6c29ddd40fa66d50d39c5c8dd (diff) | |
download | cryptography-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.py | 8 | ||||
-rw-r--r-- | cryptography/primitives/block/ciphers.py | 24 |
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 |