16
16
// under the License.
17
17
18
18
#[ cfg( feature = "encryption" ) ]
19
- use crate :: encryption:: encrypt:: { encrypt_object, encrypt_object_to_vec, sign_and_write_object, FileEncryptor } ;
20
- #[ cfg( feature = "encryption" ) ]
21
- use crate :: encryption:: modules:: { create_footer_aad, create_module_aad, ModuleType } ;
19
+ use crate :: encryption:: {
20
+ encrypt:: { encrypt_object, encrypt_object_to_vec, sign_and_write_object, FileEncryptor } ,
21
+ modules:: { create_footer_aad, create_module_aad, ModuleType } ,
22
+ } ;
22
23
#[ cfg( feature = "encryption" ) ]
23
24
use crate :: errors:: ParquetError ;
24
25
use crate :: errors:: Result ;
@@ -141,6 +142,25 @@ impl<'a, W: Write> ThriftMetadataWriter<'a, W> {
141
142
. object_writer
142
143
. apply_row_group_encryption ( self . row_groups ) ?;
143
144
145
+ let mut encryption_algorithm = None ;
146
+ if let Some ( file_encryptor) = self . object_writer . file_encryptor . clone ( ) {
147
+ let properties = file_encryptor. properties ( ) ;
148
+ if !properties. encrypt_footer ( ) {
149
+ let supply_aad_prefix = properties
150
+ . aad_prefix ( )
151
+ . map ( |_| !properties. store_aad_prefix ( ) ) ;
152
+ encryption_algorithm = Some ( EncryptionAlgorithm :: AESGCMV1 ( AesGcmV1 {
153
+ aad_prefix : if properties. store_aad_prefix ( ) {
154
+ properties. aad_prefix ( ) . cloned ( )
155
+ } else {
156
+ None
157
+ } ,
158
+ aad_file_unique : Some ( file_encryptor. aad_file_unique ( ) . clone ( ) ) ,
159
+ supply_aad_prefix,
160
+ } ) ) ;
161
+ }
162
+ } ;
163
+
144
164
let mut file_metadata = FileMetaData {
145
165
num_rows,
146
166
row_groups,
@@ -149,7 +169,7 @@ impl<'a, W: Write> ThriftMetadataWriter<'a, W> {
149
169
schema : types:: to_thrift ( self . schema . as_ref ( ) ) ?,
150
170
created_by : self . created_by . clone ( ) ,
151
171
column_orders,
152
- encryption_algorithm : None ,
172
+ encryption_algorithm,
153
173
footer_signing_key_metadata : None ,
154
174
} ;
155
175
@@ -503,8 +523,7 @@ impl MetadataObjectWriter {
503
523
let mut encryptor = file_encryptor. get_footer_encryptor ( ) ?;
504
524
encrypt_object ( file_metadata, & mut encryptor, & mut sink, & aad)
505
525
}
506
- Some ( file_encryptor) if !file_encryptor. properties ( ) . encrypt_footer ( ) => {
507
- // todo: should we also check for file_metadata.encryption_algorithm.is_some() ?
526
+ Some ( file_encryptor) if file_metadata. encryption_algorithm . is_some ( ) => {
508
527
let aad = create_footer_aad ( file_encryptor. file_aad ( ) ) ?;
509
528
let mut encryptor = file_encryptor. get_footer_encryptor ( ) ?;
510
529
sign_and_write_object ( file_metadata, & mut encryptor, & mut sink, & aad)
0 commit comments