Skip to content

Commit 329f6c9

Browse files
authored
Allow retrieving Parquet decryption keys using the key metadata (#7286)
* Allow retrieving decryption keys from key metadata * Refactor to disallow setting keys and a key retriever * Remove unnecessary clone * Implement PartialEq explicitly for DecryptionKeys rather than FileDecryptionProperties * Add key retrieval methods to FileDecryptionProperties * Get column path from ColumnCryptoMetaData * Tidy up * Revert rename of parameter
1 parent 3b90fc9 commit 329f6c9

File tree

10 files changed

+546
-130
lines changed

10 files changed

+546
-130
lines changed

parquet/src/arrow/arrow_reader/mod.rs

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -700,36 +700,19 @@ impl<T: ChunkReader + 'static> Iterator for ReaderPageIterator<T> {
700700

701701
#[cfg(feature = "encryption")]
702702
let crypto_context = if let Some(file_decryptor) = self.metadata.file_decryptor() {
703-
let column_name = self
704-
.metadata
705-
.file_metadata()
706-
.schema_descr()
707-
.column(self.column_idx);
708-
709-
if file_decryptor.is_column_encrypted(column_name.name()) {
710-
let data_decryptor = file_decryptor.get_column_data_decryptor(column_name.name());
711-
let data_decryptor = match data_decryptor {
712-
Ok(data_decryptor) => data_decryptor,
713-
Err(err) => return Some(Err(err)),
714-
};
715-
716-
let metadata_decryptor =
717-
file_decryptor.get_column_metadata_decryptor(column_name.name());
718-
let metadata_decryptor = match metadata_decryptor {
719-
Ok(metadata_decryptor) => metadata_decryptor,
720-
Err(err) => return Some(Err(err)),
721-
};
722-
723-
let crypto_context = CryptoContext::new(
724-
rg_idx,
725-
self.column_idx,
726-
data_decryptor,
727-
metadata_decryptor,
728-
file_decryptor.file_aad().clone(),
729-
);
730-
Some(Arc::new(crypto_context))
731-
} else {
732-
None
703+
match meta.crypto_metadata() {
704+
Some(crypto_metadata) => {
705+
match CryptoContext::for_column(
706+
file_decryptor,
707+
crypto_metadata,
708+
rg_idx,
709+
self.column_idx,
710+
) {
711+
Ok(context) => Some(Arc::new(context)),
712+
Err(err) => return Some(Err(err)),
713+
}
714+
}
715+
None => None,
733716
}
734717
} else {
735718
None

parquet/src/arrow/async_reader/mod.rs

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,36 +1027,6 @@ impl RowGroups for InMemoryRowGroup<'_> {
10271027
}
10281028

10291029
fn column_chunks(&self, i: usize) -> Result<Box<dyn PageIterator>> {
1030-
#[cfg(feature = "encryption")]
1031-
let crypto_context = if let Some(file_decryptor) = self.metadata.clone().file_decryptor() {
1032-
let column_name = &self
1033-
.metadata
1034-
.clone()
1035-
.file_metadata()
1036-
.schema_descr()
1037-
.column(i);
1038-
1039-
if file_decryptor.is_column_encrypted(column_name.name()) {
1040-
let data_decryptor =
1041-
file_decryptor.get_column_data_decryptor(column_name.name())?;
1042-
let metadata_decryptor =
1043-
file_decryptor.get_column_metadata_decryptor(column_name.name())?;
1044-
1045-
let crypto_context = CryptoContext::new(
1046-
self.row_group_idx,
1047-
i,
1048-
data_decryptor,
1049-
metadata_decryptor,
1050-
file_decryptor.file_aad().clone(),
1051-
);
1052-
Some(Arc::new(crypto_context))
1053-
} else {
1054-
None
1055-
}
1056-
} else {
1057-
None
1058-
};
1059-
10601030
match &self.column_chunks[i] {
10611031
None => Err(ParquetError::General(format!(
10621032
"Invalid column index {i}, column was not fetched"
@@ -1067,14 +1037,29 @@ impl RowGroups for InMemoryRowGroup<'_> {
10671037
// filter out empty offset indexes (old versions specified Some(vec![]) when no present)
10681038
.filter(|index| !index.is_empty())
10691039
.map(|index| index[i].page_locations.clone());
1070-
let metadata = self.metadata.row_group(self.row_group_idx);
1040+
let column_metadata = self.metadata.row_group(self.row_group_idx).column(i);
10711041
let page_reader = SerializedPageReader::new(
10721042
data.clone(),
1073-
metadata.column(i),
1043+
column_metadata,
10741044
self.row_count,
10751045
page_locations,
10761046
)?;
10771047

1048+
#[cfg(feature = "encryption")]
1049+
let crypto_context = if let Some(file_decryptor) = self.metadata.file_decryptor() {
1050+
match column_metadata.crypto_metadata() {
1051+
Some(crypto_metadata) => Some(Arc::new(CryptoContext::for_column(
1052+
file_decryptor,
1053+
crypto_metadata,
1054+
self.row_group_idx,
1055+
i,
1056+
)?)),
1057+
None => None,
1058+
}
1059+
} else {
1060+
None
1061+
};
1062+
10781063
#[cfg(feature = "encryption")]
10791064
let page_reader = page_reader.with_crypto_context(crypto_context);
10801065

0 commit comments

Comments
 (0)