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