#read-write #read #write #checksum #digest #hash

checkpipe

对通过某些结构体的一些字节进行计算

2 个版本

0.1.1 2023年6月14日
0.1.0 2023年6月14日

#1816 in 加密学

MIT 许可证

8KB
75

checkpipe

一个用于计算字节在管道中流动时属性的 Rust 库。

其动机用例是对通过读取器或写入器的所有字节进行校验和计算。

示例

use checkpipe::{Check, Checker};
use std::io::{Read, Write};
use std::fs::{File, remove_file};

const DATA: [u8; 13] = *b"Hello, world!";
const PATH: &'static str = "foo.txt";

pub fn write_checksummed() -> std::io::Result<()> {
    let outfile = File::create(PATH)?;
    let mut outpipe = Checker::new_default_hasher(outfile);

    outpipe.write_all(DATA.as_slice())?;
    let checksum = outpipe.output();
    outpipe.write(&mut checksum.to_le_bytes()[..])?;
    Ok(())
}

pub fn read_checksummed() -> std::io::Result<()> {
    let infile = File::open(PATH)?;
    let mut inpipe = Checker::new_default_hasher(infile);

    let mut buf = [0u8; DATA.len()];
    inpipe.read(&mut buf)?;
    let checksum = inpipe.output();

    let mut checksum_buf = [0u8; 8];
    inpipe.read(&mut checksum_buf)?;
    assert_eq!(checksum, u64::from_le_bytes(checksum_buf));
    Ok(())
}

pub fn main() -> std::io::Result<()> {
    write_checksummed()?;
    read_checksummed()?;
    remove_file(PATH)
}

实现自己的校验

在一个结构体上实现 Check trait,该 trait 提供了获取字节块并最终返回其计算结果的方法。然后使用 Checker 将该结构体和一些字节通过的结构体包装起来。

Check 已经为所有实现 Hasher 的类型实现了,如果你想使用 Rust 的默认哈希器,有一些便利的方法可供使用。如果 Checker 中的包装类型是 ReadWrite,那么 Checker 也是。

无运行时依赖