@@ -94,40 +94,37 @@ def __init__(self, key, iv, salt='12345678'):
9494 self .salt = create_string_buffer (salt )
9595
9696 self .encryptor = EVP_CIPHER_CTX ()
97- EVP_CIPHER_CTX_init (byref (self .encryptor ))
98- EVP_CipherInit (byref (self .encryptor ), EVP_aes_256_cbc (), self .key_data , self .iv , c_int (1 ))
99- EVP_CIPHER_CTX_set_padding (byref (self .encryptor ), c_int (1 ))
97+ self ._init_cipher (byref (self .encryptor ), 1 )
10098
10199 self .decryptor = EVP_CIPHER_CTX ()
102- EVP_CIPHER_CTX_init (byref (self .decryptor ))
103- EVP_CipherInit (byref (self .decryptor ), EVP_aes_256_cbc (), self .key_data , self .iv , c_int (0 ))
104- EVP_CIPHER_CTX_set_padding (byref (self .decryptor ), c_int (1 ))
100+ self ._init_cipher (byref (self .decryptor ), 0 )
105101
106- def encrypt (self , data ):
102+ def _init_cipher (self , ctypes_cipher , crypt_mode ):
103+ """ crypt_mode parameter is a flag deciding whether the cipher should be
104+ used for encryption (1) or decryption (0) """
105+ EVP_CIPHER_CTX_init (ctypes_cipher )
106+ EVP_CipherInit (ctypes_cipher , EVP_aes_256_cbc (), self .key_data , self .iv , c_int (crypt_mode ))
107+ EVP_CIPHER_CTX_set_padding (ctypes_cipher , c_int (1 ))
108+
109+ def _process_data (self , ctypes_cipher , data ):
107110 length = c_int (len (data ))
108111 buf_length = c_int (length .value + AES_BLOCK_SIZE )
109112 buf = create_string_buffer (buf_length .value )
110113
111114 final_buf = create_string_buffer (AES_BLOCK_SIZE )
112115 final_length = c_int (0 )
113116
114- EVP_CipherUpdate (byref ( self . encryptor ) , buf , byref (buf_length ), create_string_buffer (data ), length )
115- EVP_CipherFinal (byref ( self . encryptor ) , final_buf , byref (final_length ))
117+ EVP_CipherUpdate (ctypes_cipher , buf , byref (buf_length ), create_string_buffer (data ), length )
118+ EVP_CipherFinal (ctypes_cipher , final_buf , byref (final_length ))
116119
117120 return string_at (buf , buf_length ) + string_at (final_buf , final_length )
118121
119- def decrypt (self , data ):
120- length = c_int (len (data ))
121- buf_length = c_int (length .value + AES_BLOCK_SIZE )
122- buf = create_string_buffer (buf_length .value )
123-
124- final_buf = create_string_buffer (AES_BLOCK_SIZE )
125- final_length = c_int (0 )
126122
127- EVP_CipherUpdate ( byref ( self . decryptor ), buf , byref ( buf_length ), create_string_buffer ( data ), length )
128- EVP_CipherFinal (byref (self .decryptor ), final_buf , byref ( final_length ) )
123+ def encrypt ( self , data ):
124+ return self . _process_data (byref (self .encryptor ), data )
129125
130- return string_at (buf , buf_length ) + string_at (final_buf , final_length )
126+ def decrypt (self , data ):
127+ return self ._process_data (byref (self .decryptor ), data )
131128
132129
133130
0 commit comments