def _decrypt_via_rsa_oaep(cipherdict: dict, key: RSA.RsaKey) -> bytes: """Decrypt a bytestring with PKCS#1 RSA OAEP (asymmetric algo). :param cipherdict: list of ciphertext chunks :param key: private RSA key :return: the decrypted bytestring""" _check_asymmetric_key_length_bits(key.size_in_bits()) decipher = PKCS1_OAEP.new(key, hashAlgo=RSA_OAEP_HASHER) encrypted_chunks = cipherdict["digest_list"] decrypted_chunks = [] for encrypted_chunk in encrypted_chunks: decrypted_chunk = decipher.decrypt(encrypted_chunk) decrypted_chunks.append(decrypted_chunk) return b"".join(decrypted_chunks)
def _encrypt_via_rsa_oaep(plaintext: bytes, key: RSA.RsaKey) -> dict: """Encrypt a bytestring with PKCS#1 RSA OAEP (asymmetric algo). :param plaintext: the bytes to cipher :param key: public RSA key :return: a dict with field `digest_list`, containing bytestring chunks of variable width.""" _check_asymmetric_key_length_bits(key.size_in_bits()) cipher = PKCS1_OAEP.new(key=key, hashAlgo=RSA_OAEP_HASHER) chunks = split_as_chunks(plaintext, chunk_size=RSA_OAEP_CHUNKS_SIZE, must_pad=False, accept_incomplete_chunk=True) encrypted_chunks = [] for chunk in chunks: encrypted_chunk = cipher.encrypt(chunk) encrypted_chunks.append(encrypted_chunk) return dict(digest_list=encrypted_chunks)