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