#数据管理 #对象存储 #元数据 #格式 #加密 #索引 #pithos

pithos_lib

用于加密/压缩pithos (.pto)文件的库和组件,包括规范

3个不稳定版本

0.6.0 2024年7月17日
0.5.1 2024年4月11日
0.5.0 2024年3月15日

599密码学 中排名

Download history • Rust 包仓库 58/week @ 2024-04-13 • Rust 包仓库 74/week @ 2024-04-20 • Rust 包仓库 5/week @ 2024-04-27 • Rust 包仓库 18/week @ 2024-05-04 • Rust 包仓库 36/week @ 2024-05-11 • Rust 包仓库 19/week @ 2024-05-18 • Rust 包仓库 2/week @ 2024-05-25 • Rust 包仓库 26/week @ 2024-06-15 • Rust 包仓库 10/week @ 2024-06-22 • Rust 包仓库 15/week @ 2024-07-06 • Rust 包仓库 136/week @ 2024-07-13 • Rust 包仓库 14/week @ 2024-07-20 • Rust 包仓库 16/week @ 2024-07-27 • Rust 包仓库

每月181次下载
用于 pithos

MIT/Apache

1.5MB
6.5K SLoC

Rust License CI Codecov Dependency status


Pithos库

用于创建、处理和转换Pithos文件(Pithos文件是一种针对研究数据管理(RDM)优化的对象存储文件格式)的库。

描述

该库包含一个自定义的读写组件,允许在多种输入和输出格式中动态转换数据。虽然最初专注于作为ArunaObjectStorage的后端格式使用,但其范围已经显著扩大,现在支持从/到Pithos文件的各种转换,包括

  • 加密(ChaCha20-Poly1305)
  • 压缩(Zstandard)
  • 索引
  • 元数据处理
  • 将多个.pto文件打包成.tar.gz存档

指导

关于使用自定义组件GenericReadWriter和类似组件的简短指导。对于正式的文件规范,请点击此处

针对Pithos文件格式及其相关转换逻辑的自定义数据转换组件的通用版本。思路很简单,您通过实现这些简单的基特征和您自定义的数据转换逻辑来使用这些特征

#[async_trait::async_trait]
pub trait Transformer {
    async fn process_bytes(&mut self, buf: &mut bytes::BytesMut, finished: bool) -> Result<bool>;
}

之后,实现Transformer的结构可以在GenericReadWriter中注册,以便在ReadWriter的读取和写入部分之间进行插拔。

示例

        let file = b"This is a very very important test".to_vec();
        let mut file2 = Vec::new();

        // Create a new GenericReadWriter
        GenericReadWriter::new_with_writer(file.as_ref(), &mut file2)
            .add_transformer(ZstdEnc::new(1, false))
            .add_transformer(ZstdEnc::new(2, false)) // Double compression because we can
            .add_transformer(
                ChaCha20Enc::new(false, b"wvwj3485nxgyq5ub9zd3e7jsrq7a92ea".to_vec()).unwrap(),
            )
            .add_transformer(
                ChaCha20Enc::new(false, b"99wj3485nxgyq5ub9zd3e7jsrq7a92ea".to_vec()).unwrap(),
            )
            .add_transformer(
                ChaCha20Dec::new(Some(b"99wj3485nxgyq5ub9zd3e7jsrq7a92ea".to_vec())).unwrap(),
            )
            .add_transformer(
                ChaCha20Dec::new(Some(b"wvwj3485nxgyq5ub9zd3e7jsrq7a92ea".to_vec())).unwrap(),
            )
            .add_transformer(ZstdDec::new())
            .add_transformer(ZstdDec::new())
            .add_transformer(Filter::new(Range { from: 0, to: 3 }))
            .process()
            .await
            .unwrap();
        assert_eq!(file2, b"Thi".to_vec());

此示例从字节数组(实现AsyncRead)创建一个Vec<u8>并将它放入另一个Vec<u8>(实现AsynWrite)中。在这之间,可以进行自定义数据转换。

示例使用自定义填充的Zstandard压缩组件将向量压缩两次,然后使用ChaCha20-Poly1305加密结果两次。之后,所有步骤都反向进行,得到原始数据。

关于自定义实现的通知

主要逻辑围绕process_bytes函数构建。

async fn process_bytes(&mut self, buf: &mut bytes::Bytes, finished: bool, should_flush: bool) -> Result<bool>;

该想法是您的Transformer接收一个可变缓冲区,其中包含您必须转换的字节。如果您已转换(全部或通过内部缓冲区)数据,则将其放回缓冲区,以便下一个Transformer的process_bytes方法处理。如果should_flushtrue,则应立即刷新和清除所有内部缓冲区。

依赖关系

~16-28MB
~432K SLoC