tlslite/utils/openssl_tripledes.py
# Author: Trevor Perrin
# See the LICENSE file for legal information regarding use of this file.
"""OpenSSL/M2Crypto 3DES implementation."""
from .cryptomath import *
from .tripledes import *
if m2cryptoLoaded:
def new(key, mode, IV):
return OpenSSL_TripleDES(key, mode, IV)
class OpenSSL_TripleDES(TripleDES):
def __init__(self, key, mode, IV):
TripleDES.__init__(self, key, mode, IV, "openssl")
self._IV, self._key = IV, key
self._context = None
self._encrypt = None
def _init_context(self, encrypt=True):
cipherType = m2.des_ede3_cbc()
self._context = m2.cipher_ctx_new()
m2.cipher_init(self._context, cipherType, self._key, self._IV,
int(encrypt))
m2.cipher_set_padding(self._context, 0)
self._encrypt = encrypt
def encrypt(self, plaintext):
if self._context is None:
self._init_context(encrypt=True)
else:
assert self._encrypt, '.encrypt() not allowed after .decrypt()'
TripleDES.encrypt(self, plaintext)
ciphertext = m2.cipher_update(self._context, plaintext)
return bytearray(ciphertext)
def decrypt(self, ciphertext):
if self._context is None:
self._init_context(encrypt=False)
else:
assert not self._encrypt, \
'.decrypt() not allowed after .encrypt()'
TripleDES.decrypt(self, ciphertext)
plaintext = m2.cipher_update(self._context, ciphertext)
return bytearray(plaintext)
def __del__(self):
if self._context is not None:
m2.cipher_ctx_free(self._context)