| 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 |