30 lines
758 B
Rust
30 lines
758 B
Rust
|
//! SHA helpers.
|
||
|
|
||
|
use std::io::Read;
|
||
|
|
||
|
use anyhow::Error;
|
||
|
|
||
|
/// Calculate the sha256sum from a readable object.
|
||
|
pub fn sha256(file: &mut dyn Read) -> Result<([u8; 32], u64), Error> {
|
||
|
let mut hasher = openssl::sha::Sha256::new();
|
||
|
let mut buffer = proxmox::tools::vec::undefined(256 * 1024);
|
||
|
let mut size: u64 = 0;
|
||
|
|
||
|
loop {
|
||
|
let count = match file.read(&mut buffer) {
|
||
|
Ok(0) => break,
|
||
|
Ok(count) => count,
|
||
|
Err(ref err) if err.kind() == std::io::ErrorKind::Interrupted => {
|
||
|
continue;
|
||
|
}
|
||
|
Err(err) => return Err(err.into()),
|
||
|
};
|
||
|
size += count as u64;
|
||
|
hasher.update(&buffer[..count]);
|
||
|
}
|
||
|
|
||
|
let csum = hasher.finish();
|
||
|
|
||
|
Ok((csum, size))
|
||
|
}
|