OLD | NEW |
| (Empty) |
1 """OpenSSL/M2Crypto 3DES implementation.""" | |
2 | |
3 from cryptomath import * | |
4 from TripleDES import * | |
5 | |
6 if m2cryptoLoaded: | |
7 | |
8 def new(key, mode, IV): | |
9 return OpenSSL_TripleDES(key, mode, IV) | |
10 | |
11 class OpenSSL_TripleDES(TripleDES): | |
12 | |
13 def __init__(self, key, mode, IV): | |
14 TripleDES.__init__(self, key, mode, IV, "openssl") | |
15 self.key = key | |
16 self.IV = IV | |
17 | |
18 def _createContext(self, encrypt): | |
19 context = m2.cipher_ctx_new() | |
20 cipherType = m2.des_ede3_cbc() | |
21 m2.cipher_init(context, cipherType, self.key, self.IV, encrypt) | |
22 return context | |
23 | |
24 def encrypt(self, plaintext): | |
25 TripleDES.encrypt(self, plaintext) | |
26 context = self._createContext(1) | |
27 ciphertext = m2.cipher_update(context, plaintext) | |
28 m2.cipher_ctx_free(context) | |
29 self.IV = ciphertext[-self.block_size:] | |
30 return ciphertext | |
31 | |
32 def decrypt(self, ciphertext): | |
33 TripleDES.decrypt(self, ciphertext) | |
34 context = self._createContext(0) | |
35 #I think M2Crypto has a bug - it fails to decrypt and return the las
t block passed in. | |
36 #To work around this, we append sixteen zeros to the string, below: | |
37 plaintext = m2.cipher_update(context, ciphertext+('\0'*16)) | |
38 | |
39 #If this bug is ever fixed, then plaintext will end up having a garb
age | |
40 #plaintext block on the end. That's okay - the below code will igno
re it. | |
41 plaintext = plaintext[:len(ciphertext)] | |
42 m2.cipher_ctx_free(context) | |
43 self.IV = ciphertext[-self.block_size:] | |
44 return plaintext | |
OLD | NEW |