Skip to content

Commit 68aa549

Browse files
committed
Add decrypt_secret for reference
1 parent 89b75b5 commit 68aa549

File tree

2 files changed

+51
-49
lines changed

2 files changed

+51
-49
lines changed

_test_unstructured_client/unit/test_encryption.py

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -33,53 +33,6 @@ def rsa_key_pair():
3333

3434
return private_key_pem, public_key_pem
3535

36-
37-
def decrypt_secret(
38-
private_key_pem: str,
39-
encrypted_value: str,
40-
type: str,
41-
encrypted_aes_key: str,
42-
aes_iv: str,
43-
) -> str:
44-
private_key = serialization.load_pem_private_key(
45-
private_key_pem.encode('utf-8'),
46-
password=None,
47-
backend=default_backend()
48-
)
49-
50-
if type == 'rsa':
51-
ciphertext = base64.b64decode(encrypted_value)
52-
plaintext = private_key.decrypt(
53-
ciphertext,
54-
padding.OAEP(
55-
mgf=padding.MGF1(algorithm=hashes.SHA256()),
56-
algorithm=hashes.SHA256(),
57-
label=None
58-
)
59-
)
60-
return plaintext.decode('utf-8')
61-
else:
62-
encrypted_aes_key = base64.b64decode(encrypted_aes_key)
63-
iv = base64.b64decode(aes_iv)
64-
ciphertext = base64.b64decode(encrypted_value)
65-
66-
aes_key = private_key.decrypt(
67-
encrypted_aes_key,
68-
padding.OAEP(
69-
mgf=padding.MGF1(algorithm=hashes.SHA256()),
70-
algorithm=hashes.SHA256(),
71-
label=None
72-
)
73-
)
74-
cipher = Cipher(
75-
algorithms.AES(aes_key),
76-
modes.CFB(iv),
77-
)
78-
decryptor = cipher.decryptor()
79-
plaintext = decryptor.update(ciphertext) + decryptor.finalize()
80-
return plaintext.decode('utf-8')
81-
82-
8336
def test_encrypt_rsa(rsa_key_pair):
8437
private_key_pem, public_key_pem = rsa_key_pair
8538

@@ -92,7 +45,7 @@ def test_encrypt_rsa(rsa_key_pair):
9245
# A short payload should use direct RSA encryption
9346
assert secret_obj["type"] == 'rsa'
9447

95-
decrypted_text = decrypt_secret(
48+
decrypted_text = client.users.decrypt_secret(
9649
private_key_pem,
9750
secret_obj["encrypted_value"],
9851
secret_obj["type"],
@@ -114,7 +67,7 @@ def test_encrypt_rsa_aes(rsa_key_pair):
11467
# A longer payload uses hybrid RSA-AES encryption
11568
assert secret_obj["type"] == 'rsa_aes'
11669

117-
decrypted_text = decrypt_secret(
70+
decrypted_text = client.users.decrypt_secret(
11871
private_key_pem,
11972
secret_obj["encrypted_value"],
12073
secret_obj["type"],

src/unstructured_client/users.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,55 @@ def _encrypt_rsa(
526526
'aes_iv': "",
527527
}
528528

529+
def decrypt_secret(
530+
self,
531+
private_key_pem: str,
532+
encrypted_value: str,
533+
secret_type: str,
534+
encrypted_aes_key: str,
535+
aes_iv: str,
536+
) -> str:
537+
private_key = serialization.load_pem_private_key(
538+
private_key_pem.encode('utf-8'),
539+
password=None,
540+
backend=default_backend()
541+
)
542+
543+
if not isinstance(private_key, rsa.RSAPrivateKey):
544+
raise TypeError("Private key must be a RSA private key for decryption.")
545+
546+
if secret_type == 'rsa':
547+
ciphertext = base64.b64decode(encrypted_value)
548+
plaintext = private_key.decrypt(
549+
ciphertext,
550+
padding.OAEP(
551+
mgf=padding.MGF1(algorithm=hashes.SHA256()),
552+
algorithm=hashes.SHA256(),
553+
label=None
554+
)
555+
)
556+
return plaintext.decode('utf-8')
557+
558+
# aes_rsa
559+
encrypted_aes_key_decoded = base64.b64decode(encrypted_aes_key)
560+
iv = base64.b64decode(aes_iv)
561+
ciphertext = base64.b64decode(encrypted_value)
562+
563+
aes_key = private_key.decrypt(
564+
encrypted_aes_key_decoded,
565+
padding.OAEP(
566+
mgf=padding.MGF1(algorithm=hashes.SHA256()),
567+
algorithm=hashes.SHA256(),
568+
label=None
569+
)
570+
)
571+
cipher = Cipher(
572+
algorithms.AES(aes_key),
573+
modes.CFB(iv),
574+
)
575+
decryptor = cipher.decryptor()
576+
plaintext = decryptor.update(ciphertext) + decryptor.finalize()
577+
return plaintext.decode('utf-8')
529578

530579
def encrypt_secret(
531580
self,

0 commit comments

Comments
 (0)