@@ -710,7 +710,11 @@ impl ParquetMetaDataReader {
710710 ) ) ;
711711 }
712712
713- Ok ( ( self . decode_footer_metadata ( & meta, & footer) ?, None ) )
713+ Ok ( (
714+ // need to slice off the footer or decryption fails
715+ self . decode_footer_metadata ( & meta. slice ( 0 ..length) , & footer) ?,
716+ None ,
717+ ) )
714718 } else {
715719 let metadata_start = suffix_len - metadata_offset;
716720 let slice = & suffix[ metadata_start..suffix_len - FOOTER_SIZE ] ;
@@ -1209,7 +1213,6 @@ mod async_tests {
12091213 use std:: ops:: Range ;
12101214 use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
12111215
1212- use crate :: arrow:: async_reader:: MetadataFetch ;
12131216 use crate :: file:: reader:: Length ;
12141217 use crate :: util:: test_common:: file_util:: get_test_file;
12151218
@@ -1435,6 +1438,31 @@ mod async_tests {
14351438 assert_eq ! ( suffix_fetch_count. load( Ordering :: SeqCst ) , 1 ) ;
14361439 }
14371440
1441+ #[ cfg( feature = "encryption" ) ]
1442+ #[ tokio:: test]
1443+ async fn test_suffix_with_encryption ( ) {
1444+ let mut file = get_test_file ( "uniform_encryption.parquet.encrypted" ) ;
1445+ let mut file2 = file. try_clone ( ) . unwrap ( ) ;
1446+
1447+ let mut fetch = |range| futures:: future:: ready ( read_range ( & mut file, range) ) ;
1448+ let mut suffix_fetch = |suffix| futures:: future:: ready ( read_suffix ( & mut file2, suffix) ) ;
1449+
1450+ let input = MetadataSuffixFetchFn ( & mut fetch, & mut suffix_fetch) ;
1451+
1452+ let key_code: & [ u8 ] = "0123456789012345" . as_bytes ( ) ;
1453+ let decryption_properties = FileDecryptionProperties :: builder ( key_code. to_vec ( ) )
1454+ . build ( )
1455+ . unwrap ( ) ;
1456+
1457+ // just make sure the metadata is properly decrypted and read
1458+ let expected = ParquetMetaDataReader :: new ( )
1459+ . with_decryption_properties ( Some ( & decryption_properties) )
1460+ . load_via_suffix_and_finish ( input)
1461+ . await
1462+ . unwrap ( ) ;
1463+ assert_eq ! ( expected. num_row_groups( ) , 1 ) ;
1464+ }
1465+
14381466 #[ tokio:: test]
14391467 async fn test_page_index ( ) {
14401468 let mut file = get_test_file ( "alltypes_tiny_pages.parquet" ) ;
0 commit comments