@@ -6,16 +6,16 @@ use std::io;
66use std:: io:: { Error , ErrorKind } ;
77
88/// [`StorableBuilder`] is a utility to build and deconstruct [`Storable`] objects.
9+ ///
910/// It provides client-side Encrypt-then-MAC using ChaCha20-Poly1305.
1011pub struct StorableBuilder < T : EntropySource > {
11- data_encryption_key : [ u8 ; 32 ] ,
1212 entropy_source : T ,
1313}
1414
1515impl < T : EntropySource > StorableBuilder < T > {
1616 /// Constructs a new instance.
17- pub fn new ( data_encryption_key : [ u8 ; 32 ] , entropy_source : T ) -> StorableBuilder < T > {
18- Self { data_encryption_key , entropy_source }
17+ pub fn new ( entropy_source : T ) -> StorableBuilder < T > {
18+ Self { entropy_source }
1919 }
2020}
2121
@@ -40,13 +40,15 @@ impl<T: EntropySource> StorableBuilder<T> {
4040 /// Refer to docs on [`Storable`] for more information.
4141 ///
4242 /// [`PutObjectRequest`]: crate::types::PutObjectRequest
43- pub fn build ( & self , input : Vec < u8 > , version : i64 , aad : & [ u8 ] ) -> Storable {
43+ pub fn build (
44+ & self , input : Vec < u8 > , version : i64 , data_encryption_key : & [ u8 ; 32 ] , aad : & [ u8 ] ,
45+ ) -> Storable {
4446 let mut nonce = vec ! [ 0u8 ; 12 ] ;
4547 self . entropy_source . fill_bytes ( & mut nonce[ 4 ..] ) ;
4648
4749 let mut data_blob = PlaintextBlob { value : input, version } . encode_to_vec ( ) ;
4850
49- let mut cipher = ChaCha20Poly1305 :: new ( & self . data_encryption_key , & nonce, aad) ;
51+ let mut cipher = ChaCha20Poly1305 :: new ( data_encryption_key, & nonce, aad) ;
5052 let mut tag = vec ! [ 0u8 ; 16 ] ;
5153 cipher. encrypt_inplace ( & mut data_blob, & mut tag) ;
5254 Storable {
@@ -63,12 +65,14 @@ impl<T: EntropySource> StorableBuilder<T> {
6365 /// corresponding version as stored at the time of [`PutObjectRequest`].
6466 ///
6567 /// [`PutObjectRequest`]: crate::types::PutObjectRequest
66- pub fn deconstruct ( & self , mut storable : Storable , aad : & [ u8 ] ) -> io:: Result < ( Vec < u8 > , i64 ) > {
68+ pub fn deconstruct (
69+ & self , mut storable : Storable , data_encryption_key : & [ u8 ; 32 ] , aad : & [ u8 ] ,
70+ ) -> io:: Result < ( Vec < u8 > , i64 ) > {
6771 let encryption_metadata = storable
6872 . encryption_metadata
6973 . ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "Invalid Metadata" ) ) ?;
7074 let mut cipher =
71- ChaCha20Poly1305 :: new ( & self . data_encryption_key , & encryption_metadata. nonce , aad) ;
75+ ChaCha20Poly1305 :: new ( data_encryption_key, & encryption_metadata. nonce , aad) ;
7276
7377 cipher
7478 . decrypt_inplace ( & mut storable. data , encryption_metadata. tag . borrow ( ) )
@@ -100,16 +104,15 @@ mod tests {
100104 let test_entropy_provider = TestEntropyProvider ;
101105 let mut data_key = [ 0u8 ; 32 ] ;
102106 test_entropy_provider. fill_bytes ( & mut data_key) ;
103- let storable_builder = StorableBuilder {
104- data_encryption_key : data_key,
105- entropy_source : test_entropy_provider,
106- } ;
107+ let storable_builder = StorableBuilder :: new ( test_entropy_provider) ;
107108 let expected_data = b"secret" . to_vec ( ) ;
108109 let expected_version = 8 ;
109110 let aad = b"A" ;
110- let storable = storable_builder. build ( expected_data. clone ( ) , expected_version, aad) ;
111+ let storable =
112+ storable_builder. build ( expected_data. clone ( ) , expected_version, & data_key, aad) ;
111113
112- let ( actual_data, actual_version) = storable_builder. deconstruct ( storable, aad) . unwrap ( ) ;
114+ let ( actual_data, actual_version) =
115+ storable_builder. deconstruct ( storable, & data_key, aad) . unwrap ( ) ;
113116 assert_eq ! ( actual_data, expected_data) ;
114117 assert_eq ! ( actual_version, expected_version) ;
115118 }
@@ -119,25 +122,24 @@ mod tests {
119122 let test_entropy_provider = TestEntropyProvider ;
120123 let mut data_key = [ 0u8 ; 32 ] ;
121124 test_entropy_provider. fill_bytes ( & mut data_key) ;
122- let storable_builder = StorableBuilder {
123- data_encryption_key : data_key,
124- entropy_source : test_entropy_provider,
125- } ;
125+ let storable_builder = StorableBuilder :: new ( test_entropy_provider) ;
126126
127127 let expected_data_a = b"secret_a" . to_vec ( ) ;
128128 let expected_version_a = 8 ;
129129 let aad_a = b"A" ;
130- let storable_a = storable_builder. build ( expected_data_a. clone ( ) , expected_version_a, aad_a) ;
130+ let storable_a =
131+ storable_builder. build ( expected_data_a. clone ( ) , expected_version_a, & data_key, aad_a) ;
131132
132133 let expected_data_b = b"secret_b" . to_vec ( ) ;
133134 let expected_version_b = 8 ;
134135 let aad_b = b"B" ;
135- let storable_b = storable_builder. build ( expected_data_b. clone ( ) , expected_version_b, aad_b) ;
136+ let storable_b =
137+ storable_builder. build ( expected_data_b. clone ( ) , expected_version_b, & data_key, aad_b) ;
136138
137139 let ( actual_data, actual_version) =
138- storable_builder. deconstruct ( storable_a, aad_a) . unwrap ( ) ;
140+ storable_builder. deconstruct ( storable_a, & data_key , aad_a) . unwrap ( ) ;
139141 assert_eq ! ( actual_data, expected_data_a) ;
140142 assert_eq ! ( actual_version, expected_version_a) ;
141- assert ! ( storable_builder. deconstruct( storable_b, aad_a) . is_err( ) ) ;
143+ assert ! ( storable_builder. deconstruct( storable_b, & data_key , aad_a) . is_err( ) ) ;
142144 }
143145}
0 commit comments