@ -30,12 +30,18 @@ import hashlib
import hmac
import hmac
from typing import Union
from typing import Union
import pyaes
from . util import assert_bytes , InvalidPassword , to_bytes , to_string , WalletFileException
from . util import assert_bytes , InvalidPassword , to_bytes , to_string , WalletFileException
from . i18n import _
from . i18n import _
HAS_PYAES = False
try :
import pyaes
except :
pass
else :
HAS_PYAES = True
HAS_CRYPTODOME = False
HAS_CRYPTODOME = False
try :
try :
from Cryptodome . Cipher import ChaCha20_Poly1305 as CD_ChaCha20_Poly1305
from Cryptodome . Cipher import ChaCha20_Poly1305 as CD_ChaCha20_Poly1305
@ -97,10 +103,12 @@ def aes_encrypt_with_iv(key: bytes, iv: bytes, data: bytes) -> bytes:
cipher = CG_Cipher ( CG_algorithms . AES ( key ) , CG_modes . CBC ( iv ) , backend = CG_default_backend ( ) )
cipher = CG_Cipher ( CG_algorithms . AES ( key ) , CG_modes . CBC ( iv ) , backend = CG_default_backend ( ) )
encryptor = cipher . encryptor ( )
encryptor = cipher . encryptor ( )
e = encryptor . update ( data ) + encryptor . finalize ( )
e = encryptor . update ( data ) + encryptor . finalize ( )
else :
elif HAS_PYAES :
aes_cbc = pyaes . AESModeOfOperationCBC ( key , iv = iv )
aes_cbc = pyaes . AESModeOfOperationCBC ( key , iv = iv )
aes = pyaes . Encrypter ( aes_cbc , padding = pyaes . PADDING_NONE )
aes = pyaes . Encrypter ( aes_cbc , padding = pyaes . PADDING_NONE )
e = aes . feed ( data ) + aes . feed ( ) # empty aes.feed() flushes buffer
e = aes . feed ( data ) + aes . feed ( ) # empty aes.feed() flushes buffer
else :
raise Exception ( " no AES backend found " )
return e
return e
@ -113,10 +121,12 @@ def aes_decrypt_with_iv(key: bytes, iv: bytes, data: bytes) -> bytes:
cipher = CG_Cipher ( CG_algorithms . AES ( key ) , CG_modes . CBC ( iv ) , backend = CG_default_backend ( ) )
cipher = CG_Cipher ( CG_algorithms . AES ( key ) , CG_modes . CBC ( iv ) , backend = CG_default_backend ( ) )
decryptor = cipher . decryptor ( )
decryptor = cipher . decryptor ( )
data = decryptor . update ( data ) + decryptor . finalize ( )
data = decryptor . update ( data ) + decryptor . finalize ( )
else :
elif HAS_PYAES :
aes_cbc = pyaes . AESModeOfOperationCBC ( key , iv = iv )
aes_cbc = pyaes . AESModeOfOperationCBC ( key , iv = iv )
aes = pyaes . Decrypter ( aes_cbc , padding = pyaes . PADDING_NONE )
aes = pyaes . Decrypter ( aes_cbc , padding = pyaes . PADDING_NONE )
data = aes . feed ( data ) + aes . feed ( ) # empty aes.feed() flushes buffer
data = aes . feed ( data ) + aes . feed ( ) # empty aes.feed() flushes buffer
else :
raise Exception ( " no AES backend found " )
try :
try :
return strip_PKCS7_padding ( data )
return strip_PKCS7_padding ( data )
except InvalidPadding :
except InvalidPadding :