From 6f1492f4094b1e779e659ce7e83981531fdc1e44 Mon Sep 17 00:00:00 2001 From: Adam Reeve Date: Tue, 5 May 2026 17:02:14 +1200 Subject: [PATCH 1/3] Add uses_key_retrieve method to FileDecryptionProperties --- parquet/src/encryption/decrypt.rs | 6 ++++++ parquet/tests/encryption/encryption.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/parquet/src/encryption/decrypt.rs b/parquet/src/encryption/decrypt.rs index 0066523419de..ba0000bbdf0d 100644 --- a/parquet/src/encryption/decrypt.rs +++ b/parquet/src/encryption/decrypt.rs @@ -432,6 +432,12 @@ impl FileDecryptionProperties { } (column_names, column_keys) } + + /// Whether these decryption properties use a key retriever. + /// When false, keys can be retrieved without providing key metadata. + pub fn uses_key_retriever(&self) -> bool { + matches!(self.keys, DecryptionKeys::ViaRetriever(_)) + } } impl std::fmt::Debug for FileDecryptionProperties { diff --git a/parquet/tests/encryption/encryption.rs b/parquet/tests/encryption/encryption.rs index edd26f29619c..9be48a728eda 100644 --- a/parquet/tests/encryption/encryption.rs +++ b/parquet/tests/encryption/encryption.rs @@ -1474,3 +1474,29 @@ fn test_decrypt_page_index( Ok(()) } + +#[test] +fn test_decryption_properties_uses_key_retriever() { + let key_retriever = TestKeyRetriever::new() + .with_key("kf".to_owned(), "0123456789012345".as_bytes().to_vec()) + .with_key("kc1".to_owned(), "1234567890123450".as_bytes().to_vec()); + + let properties_with_retriever = + FileDecryptionProperties::with_key_retriever(Arc::new(key_retriever)) + .build() + .unwrap(); + + assert!(properties_with_retriever.uses_key_retriever()); + + let footer_key = "0123456789012345".as_bytes(); + let column_1_key = "1234567890123450".as_bytes(); + let column_2_key = "1234567890123451".as_bytes(); + + let properties_with_keys = FileDecryptionProperties::builder(footer_key.to_vec()) + .with_column_key("double_field", column_1_key.to_vec()) + .with_column_key("float_field", column_2_key.to_vec()) + .build() + .unwrap(); + + assert!(!properties_with_keys.uses_key_retriever()); +} From 3991f628607368a162314acb772130a72fb3e920 Mon Sep 17 00:00:00 2001 From: Adam Reeve Date: Wed, 3 Jun 2026 09:57:17 +1200 Subject: [PATCH 2/3] Update doc comment --- parquet/src/encryption/decrypt.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/parquet/src/encryption/decrypt.rs b/parquet/src/encryption/decrypt.rs index ba0000bbdf0d..bfa587277908 100644 --- a/parquet/src/encryption/decrypt.rs +++ b/parquet/src/encryption/decrypt.rs @@ -434,7 +434,9 @@ impl FileDecryptionProperties { } /// Whether these decryption properties use a key retriever. - /// When false, keys can be retrieved without providing key metadata. + /// When false, explicit keys were provided up front and can + /// be retrieved without providing key metadata, rather than + /// resolved on demand. pub fn uses_key_retriever(&self) -> bool { matches!(self.keys, DecryptionKeys::ViaRetriever(_)) } From 89de5cf0f5bd5341003c79f0b2a5094b1766ee8b Mon Sep 17 00:00:00 2001 From: Adam Reeve Date: Wed, 3 Jun 2026 09:58:16 +1200 Subject: [PATCH 3/3] Tidy up tests and add uniform case --- parquet/tests/encryption/encryption.rs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/parquet/tests/encryption/encryption.rs b/parquet/tests/encryption/encryption.rs index 9be48a728eda..2ac94b8c3786 100644 --- a/parquet/tests/encryption/encryption.rs +++ b/parquet/tests/encryption/encryption.rs @@ -1478,8 +1478,14 @@ fn test_decrypt_page_index( #[test] fn test_decryption_properties_uses_key_retriever() { let key_retriever = TestKeyRetriever::new() - .with_key("kf".to_owned(), "0123456789012345".as_bytes().to_vec()) - .with_key("kc1".to_owned(), "1234567890123450".as_bytes().to_vec()); + .with_key( + AES_128_FOOTER_KEY_NAME.to_owned(), + AES_128_FOOTER_KEY.to_vec(), + ) + .with_key( + AES_128_KEY_NAMES[0].to_owned(), + AES_128_COLUMN_KEYS[0].to_vec(), + ); let properties_with_retriever = FileDecryptionProperties::with_key_retriever(Arc::new(key_retriever)) @@ -1488,15 +1494,16 @@ fn test_decryption_properties_uses_key_retriever() { assert!(properties_with_retriever.uses_key_retriever()); - let footer_key = "0123456789012345".as_bytes(); - let column_1_key = "1234567890123450".as_bytes(); - let column_2_key = "1234567890123451".as_bytes(); - - let properties_with_keys = FileDecryptionProperties::builder(footer_key.to_vec()) - .with_column_key("double_field", column_1_key.to_vec()) - .with_column_key("float_field", column_2_key.to_vec()) + let properties_with_keys = FileDecryptionProperties::builder(AES_128_FOOTER_KEY.to_vec()) + .with_column_key(AES_128_COLUMN_NAMES[0], AES_128_COLUMN_KEYS[0].to_vec()) .build() .unwrap(); assert!(!properties_with_keys.uses_key_retriever()); + + let uniform_properties = FileDecryptionProperties::builder(AES_128_FOOTER_KEY.to_vec()) + .build() + .unwrap(); + + assert!(!uniform_properties.uses_key_retriever()); }