
| Current Path : /var/www/wsgi/www/api/venv/lib64/python3.12/site-packages/pyhanko/pdf_utils/crypt/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/wsgi/www/api/venv/lib64/python3.12/site-packages/pyhanko/pdf_utils/crypt/_util.py |
import secrets
from cryptography.hazmat.decrepit.ciphers.algorithms import ARC4, RC2, TripleDES
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
def _maybe_unpad(plaintext, *, use_padding):
# we tolerate empty messages that don't have padding
if use_padding and len(plaintext) > 0:
unpadder = padding.PKCS7(128).unpadder()
return unpadder.update(plaintext) + unpadder.finalize()
else:
return plaintext
def aes_cbc_decrypt(key, data, iv, use_padding=True):
cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
decryptor = cipher.decryptor()
plaintext = decryptor.update(data) + decryptor.finalize()
return _maybe_unpad(plaintext, use_padding=use_padding)
def aes_cbc_encrypt(key, data, iv, use_padding=True):
if iv is None:
iv = secrets.token_bytes(16)
cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
encryptor = cipher.encryptor()
if use_padding:
padder = padding.PKCS7(128).padder()
data = padder.update(data) + padder.finalize()
return iv, encryptor.update(data) + encryptor.finalize()
def tripledes_decrypt(key, data, iv):
cipher = Cipher(TripleDES(key), mode=modes.CBC(iv))
decryptor = cipher.decryptor()
plaintext = decryptor.update(data) + decryptor.finalize()
return _maybe_unpad(plaintext, use_padding=True)
def rc2_decrypt(key, data, iv):
cipher = Cipher(RC2(key), mode=modes.CBC(iv))
decryptor = cipher.decryptor()
plaintext = decryptor.update(data) + decryptor.finalize()
return _maybe_unpad(plaintext, use_padding=True)
def rc4_encrypt(key, data):
cipher = Cipher(ARC4(key), mode=None)
encryptor = cipher.encryptor()
# NOTE: Suppress LGTM warning here, we have to do what the spec says
return encryptor.update(data) + encryptor.finalize() # lgtm