11// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22// SPDX-License-Identifier: MIT-0
33
4- use std:: collections:: BTreeMap ;
5-
6- use anyhow:: { Error , Result , anyhow} ;
4+ use anyhow:: { Result , anyhow} ;
75use rustls:: crypto:: hpke:: { EncapsulatedSecret , Hpke , HpkePrivateKey } ;
86use serde_json:: Value ;
97
10- use crate :: models:: { EncryptedData , Suite } ;
8+ use crate :: models:: EncryptedData ;
119
12- fn decrypt_value (
10+ pub fn decrypt_value (
1311 suite : & dyn Hpke ,
14- secret_key : & HpkePrivateKey ,
12+ private_key : & HpkePrivateKey ,
1513 info : & [ u8 ] ,
1614 field : & str ,
17- hex_encrypted_value : & str ,
15+ encrypted_data : EncryptedData ,
1816) -> Result < Value > {
1917 let aad = field. to_lowercase ( ) ;
2018
21- let encrypted_data: EncryptedData = hex_encrypted_value
22- . try_into ( )
23- . map_err ( |err| anyhow ! ( "[{}] unable to convert to encrypted_data: {:?}" , aad, err) ) ?;
24-
2519 let enc = EncapsulatedSecret ( encrypted_data. encapped_key ) ;
2620
2721 let plaintext_value = suite
@@ -30,7 +24,7 @@ fn decrypt_value(
3024 info,
3125 aad. as_bytes ( ) ,
3226 & encrypted_data. ciphertext ,
33- secret_key ,
27+ private_key ,
3428 )
3529 . map_err ( |err| anyhow ! ( "[{}] unable to decrypt data: {:?}" , aad, err) ) ?;
3630
@@ -48,44 +42,15 @@ fn decrypt_value(
4842 Ok ( value)
4943}
5044
51- pub fn decrypt_values (
52- vault_id : & str ,
53- suite : & Suite ,
54- secret_key : & HpkePrivateKey ,
55- fields : & BTreeMap < String , String > ,
56- ) -> Result < ( BTreeMap < String , Value > , Vec < Error > ) > {
57- let suite = suite. get_suite ( ) ?;
58- let info = vault_id. as_bytes ( ) ;
59-
60- let mut errors: Vec < Error > = Vec :: new ( ) ;
61-
62- let decrypted_fields: BTreeMap < String , Value > = {
63- let mut decrypted_fields = BTreeMap :: new ( ) ;
64-
65- for ( field, hex_encrypted_value) in fields {
66- let value = decrypt_value ( suite, secret_key, info, field, hex_encrypted_value)
67- . unwrap_or_else ( |error| {
68- errors. push ( error) ;
69- Value :: Null
70- } ) ;
71- decrypted_fields. insert ( field. to_string ( ) , value) ;
72- }
73-
74- decrypted_fields
75- } ;
76-
77- Ok ( ( decrypted_fields, errors) )
78- }
79-
8045#[ cfg( test) ]
8146mod tests {
8247 use super :: * ;
83- use crate :: utils:: base64_decode;
48+ use crate :: { models :: Suite , utils:: base64_decode} ;
8449 use aws_lc_rs:: { encoding:: AsBigEndian , signature:: EcdsaKeyPair } ;
8550 use serde_json:: json;
8651
8752 #[ test]
88- fn test_decrypt_values ( ) {
53+ fn test_decrypt_value ( ) {
8954 let vault_id = "v_2hRK9u2DOzmAPMhdVNt9qlJ3UvL" ;
9055 let b64_suite_id: String = "SFBLRQARAAIAAg==" . to_string ( ) ;
9156 let suite: Suite = b64_suite_id. try_into ( ) . unwrap ( ) ;
@@ -99,14 +64,18 @@ mod tests {
9964 let sk_ref = sk_bytes. as_ref ( ) ;
10065 let secret_key: HpkePrivateKey = sk_ref. to_vec ( ) . into ( ) ;
10166
102- let fields = BTreeMap :: from ( [
103- ( "first_name" . to_string ( ) , "04cebfe3667db3305777774f14a7ed4f26ce90b2d68935a30f9b086dc915e6ede23e6dfdde7aaf34dc34cd964c76f94bc91ba99edb3707281862c990c54782eace8c687770d72d4c714d4edd239e010facfb7c3d5c168b14d9040194059529f5e6#80c10441ae55442775bc5d1b0b8465eaaaa33b" . to_string ( ) ) ,
104- ] ) ;
67+ let hex_encrypted_value: String = "04cebfe3667db3305777774f14a7ed4f26ce90b2d68935a30f9b086dc915e6ede23e6dfdde7aaf34dc34cd964c76f94bc91ba99edb3707281862c990c54782eace8c687770d72d4c714d4edd239e010facfb7c3d5c168b14d9040194059529f5e6#80c10441ae55442775bc5d1b0b8465eaaaa33b" . to_string ( ) ;
68+ let encrypted_data: EncryptedData =
69+ EncryptedData :: from_hex ( hex_encrypted_value. as_str ( ) ) . unwrap ( ) ;
70+
71+ let suite = suite. get_suite ( ) . unwrap ( ) ;
72+ let info = vault_id. as_bytes ( ) ;
73+ let field = "first_name" ;
10574
106- let expected = BTreeMap :: from ( [ ( "first_name" . to_string ( ) , json ! ( "Bob" ) ) ] ) ;
75+ let expected = json ! ( "Bob" ) ;
10776
108- let actual = decrypt_values ( vault_id , & suite, & secret_key, & fields ) . unwrap ( ) ;
77+ let actual = decrypt_value ( suite, & secret_key, info , field , encrypted_data ) . unwrap ( ) ;
10978
110- assert_eq ! ( actual. 0 , expected) ;
79+ assert_eq ! ( actual, expected) ;
11180 }
11281}
0 commit comments