@@ -6,16 +6,16 @@ use std::io;
6
6
use std:: io:: { Error , ErrorKind } ;
7
7
8
8
/// [`StorableBuilder`] is a utility to build and deconstruct [`Storable`] objects.
9
+ ///
9
10
/// It provides client-side Encrypt-then-MAC using ChaCha20-Poly1305.
10
11
pub struct StorableBuilder < T : EntropySource > {
11
- data_encryption_key : [ u8 ; 32 ] ,
12
12
entropy_source : T ,
13
13
}
14
14
15
15
impl < T : EntropySource > StorableBuilder < T > {
16
16
/// 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 }
19
19
}
20
20
}
21
21
@@ -40,13 +40,13 @@ impl<T: EntropySource> StorableBuilder<T> {
40
40
/// Refer to docs on [`Storable`] for more information.
41
41
///
42
42
/// [`PutObjectRequest`]: crate::types::PutObjectRequest
43
- pub fn build ( & self , input : Vec < u8 > , version : i64 , aad : & [ u8 ] ) -> Storable {
43
+ pub fn build ( & self , input : Vec < u8 > , version : i64 , data_encryption_key : & [ u8 ; 32 ] , aad : & [ u8 ] ) -> Storable {
44
44
let mut nonce = vec ! [ 0u8 ; 12 ] ;
45
45
self . entropy_source . fill_bytes ( & mut nonce[ 4 ..] ) ;
46
46
47
47
let mut data_blob = PlaintextBlob { value : input, version } . encode_to_vec ( ) ;
48
48
49
- let mut cipher = ChaCha20Poly1305 :: new ( & self . data_encryption_key , & nonce, aad) ;
49
+ let mut cipher = ChaCha20Poly1305 :: new ( data_encryption_key, & nonce, aad) ;
50
50
let mut tag = vec ! [ 0u8 ; 16 ] ;
51
51
cipher. encrypt_inplace ( & mut data_blob, & mut tag) ;
52
52
Storable {
@@ -63,12 +63,12 @@ impl<T: EntropySource> StorableBuilder<T> {
63
63
/// corresponding version as stored at the time of [`PutObjectRequest`].
64
64
///
65
65
/// [`PutObjectRequest`]: crate::types::PutObjectRequest
66
- pub fn deconstruct ( & self , mut storable : Storable , aad : & [ u8 ] ) -> io:: Result < ( Vec < u8 > , i64 ) > {
66
+ pub fn deconstruct ( & self , mut storable : Storable , data_encryption_key : & [ u8 ; 32 ] , aad : & [ u8 ] ) -> io:: Result < ( Vec < u8 > , i64 ) > {
67
67
let encryption_metadata = storable
68
68
. encryption_metadata
69
69
. ok_or_else ( || Error :: new ( ErrorKind :: InvalidData , "Invalid Metadata" ) ) ?;
70
70
let mut cipher =
71
- ChaCha20Poly1305 :: new ( & self . data_encryption_key , & encryption_metadata. nonce , aad) ;
71
+ ChaCha20Poly1305 :: new ( data_encryption_key, & encryption_metadata. nonce , aad) ;
72
72
73
73
cipher
74
74
. decrypt_inplace ( & mut storable. data , encryption_metadata. tag . borrow ( ) )
@@ -100,16 +100,13 @@ mod tests {
100
100
let test_entropy_provider = TestEntropyProvider ;
101
101
let mut data_key = [ 0u8 ; 32 ] ;
102
102
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
- } ;
103
+ let storable_builder = StorableBuilder :: new ( test_entropy_provider) ;
107
104
let expected_data = b"secret" . to_vec ( ) ;
108
105
let expected_version = 8 ;
109
106
let aad = b"A" ;
110
- let storable = storable_builder. build ( expected_data. clone ( ) , expected_version, aad) ;
107
+ let storable = storable_builder. build ( expected_data. clone ( ) , expected_version, & data_key , aad) ;
111
108
112
- let ( actual_data, actual_version) = storable_builder. deconstruct ( storable, aad) . unwrap ( ) ;
109
+ let ( actual_data, actual_version) = storable_builder. deconstruct ( storable, & data_key , aad) . unwrap ( ) ;
113
110
assert_eq ! ( actual_data, expected_data) ;
114
111
assert_eq ! ( actual_version, expected_version) ;
115
112
}
@@ -119,25 +116,22 @@ mod tests {
119
116
let test_entropy_provider = TestEntropyProvider ;
120
117
let mut data_key = [ 0u8 ; 32 ] ;
121
118
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
- } ;
119
+ let storable_builder = StorableBuilder :: new ( test_entropy_provider) ;
126
120
127
121
let expected_data_a = b"secret_a" . to_vec ( ) ;
128
122
let expected_version_a = 8 ;
129
123
let aad_a = b"A" ;
130
- let storable_a = storable_builder. build ( expected_data_a. clone ( ) , expected_version_a, aad_a) ;
124
+ let storable_a = storable_builder. build ( expected_data_a. clone ( ) , expected_version_a, & data_key , aad_a) ;
131
125
132
126
let expected_data_b = b"secret_b" . to_vec ( ) ;
133
127
let expected_version_b = 8 ;
134
128
let aad_b = b"B" ;
135
- let storable_b = storable_builder. build ( expected_data_b. clone ( ) , expected_version_b, aad_b) ;
129
+ let storable_b = storable_builder. build ( expected_data_b. clone ( ) , expected_version_b, & data_key , aad_b) ;
136
130
137
131
let ( actual_data, actual_version) =
138
- storable_builder. deconstruct ( storable_a, aad_a) . unwrap ( ) ;
132
+ storable_builder. deconstruct ( storable_a, & data_key , aad_a) . unwrap ( ) ;
139
133
assert_eq ! ( actual_data, expected_data_a) ;
140
134
assert_eq ! ( actual_version, expected_version_a) ;
141
- assert ! ( storable_builder. deconstruct( storable_b, aad_a) . is_err( ) ) ;
135
+ assert ! ( storable_builder. deconstruct( storable_b, & data_key , aad_a) . is_err( ) ) ;
142
136
}
143
137
}
0 commit comments