<s> from __future__ import unicode_literals , division , absolute_import , print_function <EOL> from . . _errors import pretty_message <EOL> from . . _ffi import new , null , buffer_from_bytes , bytes_from_buffer , deref , struct , struct_bytes , unwrap <EOL> from . _cng import bcrypt , BcryptConst , handle_error , open_alg_handle , close_alg_handle <EOL> from . util import rand_bytes <EOL> from . . _types import type_name , byte_cls <EOL> __all__ = [ <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> ] <EOL> def aes_cbc_no_padding_encrypt ( key , data , iv ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) not in [ <NUM_LIT:16> , <NUM_LIT> , <NUM_LIT:32> ] : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> if not iv : <EOL> iv = rand_bytes ( <NUM_LIT:16> ) <EOL> elif len ( iv ) != <NUM_LIT:16> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( iv ) <EOL> ) ) <EOL> if len ( data ) % <NUM_LIT:16> != <NUM_LIT:0> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( data ) <EOL> ) ) <EOL> return ( iv , _encrypt ( '<STR_LIT>' , key , data , iv , False ) ) <EOL> def aes_cbc_no_padding_decrypt ( key , data , iv ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) not in [ <NUM_LIT:16> , <NUM_LIT> , <NUM_LIT:32> ] : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> if len ( iv ) != <NUM_LIT:16> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( iv ) <EOL> ) ) <EOL> return _decrypt ( '<STR_LIT>' , key , data , iv , False ) <EOL> def aes_cbc_pkcs7_encrypt ( key , data , iv ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) not in [ <NUM_LIT:16> , <NUM_LIT> , <NUM_LIT:32> ] : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> if not iv : <EOL> iv = rand_bytes ( <NUM_LIT:16> ) <EOL> elif len ( iv ) != <NUM_LIT:16> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( iv ) <EOL> ) ) <EOL> return ( iv , _encrypt ( '<STR_LIT>' , key , data , iv , True ) ) <EOL> def aes_cbc_pkcs7_decrypt ( key , data , iv ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) not in [ <NUM_LIT:16> , <NUM_LIT> , <NUM_LIT:32> ] : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> if len ( iv ) != <NUM_LIT:16> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( iv ) <EOL> ) ) <EOL> return _decrypt ( '<STR_LIT>' , key , data , iv , True ) <EOL> def rc4_encrypt ( key , data ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) < <NUM_LIT:5> or len ( key ) > <NUM_LIT:16> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> return _encrypt ( '<STR_LIT>' , key , data , None , None ) <EOL> def rc4_decrypt ( key , data ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) < <NUM_LIT:5> or len ( key ) > <NUM_LIT:16> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> return _decrypt ( '<STR_LIT>' , key , data , None , None ) <EOL> def rc2_cbc_pkcs5_encrypt ( key , data , iv ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) < <NUM_LIT:5> or len ( key ) > <NUM_LIT:16> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> if not iv : <EOL> iv = rand_bytes ( <NUM_LIT:8> ) <EOL> elif len ( iv ) != <NUM_LIT:8> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( iv ) <EOL> ) ) <EOL> return ( iv , _encrypt ( '<STR_LIT>' , key , data , iv , True ) ) <EOL> def rc2_cbc_pkcs5_decrypt ( key , data , iv ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) < <NUM_LIT:5> or len ( key ) > <NUM_LIT:16> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> if len ( iv ) != <NUM_LIT:8> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( iv ) <EOL> ) ) <EOL> return _decrypt ( '<STR_LIT>' , key , data , iv , True ) <EOL> def tripledes_cbc_pkcs5_encrypt ( key , data , iv ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) != <NUM_LIT:16> and len ( key ) != <NUM_LIT> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> if not iv : <EOL> iv = rand_bytes ( <NUM_LIT:8> ) <EOL> elif len ( iv ) != <NUM_LIT:8> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( iv ) <EOL> ) ) <EOL> cipher = '<STR_LIT>' <EOL> if len ( key ) == <NUM_LIT:16> : <EOL> cipher = '<STR_LIT>' <EOL> return ( iv , _encrypt ( cipher , key , data , iv , True ) ) <EOL> def tripledes_cbc_pkcs5_decrypt ( key , data , iv ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) != <NUM_LIT:16> and len ( key ) != <NUM_LIT> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> if len ( iv ) != <NUM_LIT:8> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( iv ) <EOL> ) ) <EOL> cipher = '<STR_LIT>' <EOL> if len ( key ) == <NUM_LIT:16> : <EOL> cipher = '<STR_LIT>' <EOL> return _decrypt ( cipher , key , data , iv , True ) <EOL> def des_cbc_pkcs5_encrypt ( key , data , iv ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) != <NUM_LIT:8> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> if not iv : <EOL> iv = rand_bytes ( <NUM_LIT:8> ) <EOL> elif len ( iv ) != <NUM_LIT:8> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( iv ) <EOL> ) ) <EOL> return ( iv , _encrypt ( '<STR_LIT>' , key , data , iv , True ) ) <EOL> def des_cbc_pkcs5_decrypt ( key , data , iv ) : <EOL> """<STR_LIT>""" <EOL> if len ( key ) != <NUM_LIT:8> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( key ) <EOL> ) ) <EOL> if len ( iv ) != <NUM_LIT:8> : <EOL> raise ValueError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> len ( iv ) <EOL> ) ) <EOL> return _decrypt ( '<STR_LIT>' , key , data , iv , True ) <EOL> def _create_key_handle ( cipher , key ) : <EOL> """<STR_LIT>""" <EOL> alg_handle = None <EOL> alg_constant = { <EOL> '<STR_LIT>' : BcryptConst . BCRYPT_AES_ALGORITHM , <EOL> '<STR_LIT>' : BcryptConst . BCRYPT_DES_ALGORITHM , <EOL> '<STR_LIT>' : BcryptConst . BCRYPT_3DES_112_ALGORITHM , <EOL> '<STR_LIT>' : BcryptConst . BCRYPT_3DES_ALGORITHM , <EOL> '<STR_LIT>' : BcryptConst . BCRYPT_RC2_ALGORITHM , <EOL> '<STR_LIT>' : BcryptConst . BCRYPT_RC4_ALGORITHM , <EOL> } [ cipher ] <EOL> try : <EOL> alg_handle = open_alg_handle ( alg_constant ) <EOL> blob_type = BcryptConst . BCRYPT_KEY_DATA_BLOB <EOL> blob_struct_pointer = struct ( bcrypt , '<STR_LIT>' ) <EOL> blob_struct = unwrap ( blob_struct_pointer ) <EOL> blob_struct . dwMagic = BcryptConst . BCRYPT_KEY_DATA_BLOB_MAGIC <EOL> blob_struct . dwVersion = BcryptConst . BCRYPT_KEY_DATA_BLOB_VERSION1 <EOL> blob_struct . cbKeyData = len ( key ) <EOL> blob = struct_bytes ( blob_struct_pointer ) + key <EOL> if cipher == '<STR_LIT>' : <EOL> buf = new ( bcrypt , '<STR_LIT>' , len ( key ) * <NUM_LIT:8> ) <EOL> res = bcrypt . BCryptSetProperty ( <EOL> alg_handle , <EOL> BcryptConst . BCRYPT_EFFECTIVE_KEY_LENGTH , <EOL> buf , <EOL> <NUM_LIT:4> , <EOL> <NUM_LIT:0> <EOL> ) <EOL> handle_error ( res ) <EOL> key_handle_pointer = new ( bcrypt , '<STR_LIT>' ) <EOL> res = bcrypt . BCryptImportKey ( <EOL> alg_handle , <EOL> null ( ) , <EOL> blob_type , <EOL> key_handle_pointer , <EOL> null ( ) , <EOL> <NUM_LIT:0> , <EOL> blob , <EOL> len ( blob ) , <EOL> <NUM_LIT:0> <EOL> ) <EOL> handle_error ( res ) <EOL> return unwrap ( key_handle_pointer ) <EOL> finally : <EOL> if alg_handle : <EOL> close_alg_handle ( alg_handle ) <EOL> def _encrypt ( cipher , key , data , iv , padding ) : <EOL> """<STR_LIT>""" <EOL> if not isinstance ( key , byte_cls ) : <EOL> raise TypeError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> type_name ( key ) <EOL> ) ) <EOL> if not isinstance ( data , byte_cls ) : <EOL> raise TypeError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> type_name ( data ) <EOL> ) ) <EOL> if cipher != '<STR_LIT>' and not isinstance ( iv , byte_cls ) : <EOL> raise TypeError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> type_name ( iv ) <EOL> ) ) <EOL> if cipher != '<STR_LIT>' and not padding : <EOL> raise ValueError ( '<STR_LIT>' ) <EOL> key_handle = None <EOL> try : <EOL> key_handle = _create_key_handle ( cipher , key ) <EOL> if iv is None : <EOL> iv_len = <NUM_LIT:0> <EOL> else : <EOL> iv_len = len ( iv ) <EOL> flags = <NUM_LIT:0> <EOL> if padding is True : <EOL> flags = BcryptConst . BCRYPT_BLOCK_PADDING <EOL> out_len = new ( bcrypt , '<STR_LIT>' ) <EOL> res = bcrypt . BCryptEncrypt ( <EOL> key_handle , <EOL> data , <EOL> len ( data ) , <EOL> null ( ) , <EOL> null ( ) , <EOL> <NUM_LIT:0> , <EOL> null ( ) , <EOL> <NUM_LIT:0> , <EOL> out_len , <EOL> flags <EOL> ) <EOL> handle_error ( res ) <EOL> buffer_len = deref ( out_len ) <EOL> buffer = buffer_from_bytes ( buffer_len ) <EOL> iv_buffer = buffer_from_bytes ( iv ) if iv else null ( ) <EOL> res = bcrypt . BCryptEncrypt ( <EOL> key_handle , <EOL> data , <EOL> len ( data ) , <EOL> null ( ) , <EOL> iv_buffer , <EOL> iv_len , <EOL> buffer , <EOL> buffer_len , <EOL> out_len , <EOL> flags <EOL> ) <EOL> handle_error ( res ) <EOL> return bytes_from_buffer ( buffer , deref ( out_len ) ) <EOL> finally : <EOL> if key_handle : <EOL> bcrypt . BCryptDestroyKey ( key_handle ) <EOL> def _decrypt ( cipher , key , data , iv , padding ) : <EOL> """<STR_LIT>""" <EOL> if not isinstance ( key , byte_cls ) : <EOL> raise TypeError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> type_name ( key ) <EOL> ) ) <EOL> if not isinstance ( data , byte_cls ) : <EOL> raise TypeError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> type_name ( data ) <EOL> ) ) <EOL> if cipher != '<STR_LIT>' and not isinstance ( iv , byte_cls ) : <EOL> raise TypeError ( pretty_message ( <EOL> '''<STR_LIT>''' , <EOL> type_name ( iv ) <EOL> ) ) <EOL> if cipher != '<STR_LIT>' and padding is None : <EOL> raise ValueError ( '<STR_LIT>' ) <EOL> key_handle = None <EOL> try : <EOL> key_handle = _create_key_handle ( cipher , key ) <EOL> if iv is None : <EOL> iv_len = <NUM_LIT:0> <EOL> else : <EOL> iv_len = len ( iv ) <EOL> flags = <NUM_LIT:0> <EOL> if padding is True : <EOL> flags = BcryptConst . BCRYPT_BLOCK_PADDING <EOL> out_len = new ( bcrypt , '<STR_LIT>' ) <EOL> res = bcrypt . BCryptDecrypt ( <EOL> key_handle , <EOL> data , <EOL> len ( data ) , <EOL> null ( ) , <EOL> null ( ) , <EOL> <NUM_LIT:0> , <EOL> null ( ) , <EOL> <NUM_LIT:0> , <EOL> out_len , <EOL> flags <EOL> ) <EOL> handle_error ( res ) <EOL> buffer_len = deref ( out_len ) <EOL> buffer = buffer_from_bytes ( buffer_len ) <EOL> iv_buffer = buffer_from_bytes ( iv ) if iv else null ( ) <EOL> res = bcrypt . BCryptDecrypt ( <EOL> key_handle , <EOL> data , <EOL> len ( data ) , <EOL> null ( ) , <EOL> iv_buffer , <EOL> iv_len , <EOL> buffer , <EOL> buffer_len , <EOL> out_len , <EOL> flags <EOL> ) <EOL> handle_error ( res ) <EOL> return bytes_from_buffer ( buffer , deref ( out_len ) ) <EOL> finally : <EOL> if key_handle : <EOL> bcrypt . BCryptDestroyKey ( key_handle ) </s>
