parquet/src/encryption/modules.rs (72 lines of code) (raw):
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
use crate::errors::ParquetError;
#[derive(PartialEq)]
pub(crate) enum ModuleType {
Footer = 0,
ColumnMetaData = 1,
DataPage = 2,
DictionaryPage = 3,
DataPageHeader = 4,
DictionaryPageHeader = 5,
ColumnIndex = 6,
OffsetIndex = 7,
_BloomFilterHeader = 8,
_BloomFilterBitset = 9,
}
pub fn create_footer_aad(file_aad: &[u8]) -> crate::errors::Result<Vec<u8>> {
create_module_aad(file_aad, ModuleType::Footer, 0, 0, None)
}
pub(crate) fn create_module_aad(
file_aad: &[u8],
module_type: ModuleType,
row_group_idx: usize,
column_ordinal: usize,
page_ordinal: Option<usize>,
) -> crate::errors::Result<Vec<u8>> {
let module_buf = [module_type as u8];
if module_buf[0] == (ModuleType::Footer as u8) {
let mut aad = Vec::with_capacity(file_aad.len() + 1);
aad.extend_from_slice(file_aad);
aad.extend_from_slice(module_buf.as_ref());
return Ok(aad);
}
if row_group_idx > i16::MAX as usize {
return Err(general_err!(
"Encrypted parquet files can't have more than {} row groups: {}",
i16::MAX,
row_group_idx
));
}
if column_ordinal > i16::MAX as usize {
return Err(general_err!(
"Encrypted parquet files can't have more than {} columns: {}",
i16::MAX,
column_ordinal
));
}
if module_buf[0] != (ModuleType::DataPageHeader as u8)
&& module_buf[0] != (ModuleType::DataPage as u8)
{
let mut aad = Vec::with_capacity(file_aad.len() + 5);
aad.extend_from_slice(file_aad);
aad.extend_from_slice(module_buf.as_ref());
aad.extend_from_slice((row_group_idx as i16).to_le_bytes().as_ref());
aad.extend_from_slice((column_ordinal as i16).to_le_bytes().as_ref());
return Ok(aad);
}
let page_ordinal =
page_ordinal.ok_or_else(|| general_err!("Page ordinal must be set for data pages"))?;
if page_ordinal > i16::MAX as usize {
return Err(general_err!(
"Encrypted parquet files can't have more than {} pages per column chunk: {}",
i16::MAX,
page_ordinal
));
}
let mut aad = Vec::with_capacity(file_aad.len() + 7);
aad.extend_from_slice(file_aad);
aad.extend_from_slice(module_buf.as_ref());
aad.extend_from_slice((row_group_idx as i16).to_le_bytes().as_ref());
aad.extend_from_slice((column_ordinal as i16).to_le_bytes().as_ref());
aad.extend_from_slice((page_ordinal as i16).to_le_bytes().as_ref());
Ok(aad)
}