libc = "0.2"
nix = "0.19.1"
nom = "5.1"
+openssl = "0.10"
regex = "1.2"
serde = "1.0"
serde_json = "1.0"
pub mod nom;
pub mod process_locker;
pub mod str;
+pub mod sha;
mod command;
pub use command::{command_output, command_output_as_string, run_command};
--- /dev/null
+//! 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))
+}
use pbs_datastore::fixed_index::FixedIndexReader;
use pbs_datastore::index::IndexFile;
use pbs_datastore::manifest::MANIFEST_BLOB_NAME;
-
-use crate::tools::compute_file_csum;
+use pbs_tools::sha::sha256;
use super::{HttpClient, H2Client};
self.download(name, &mut tmpfile).await?;
- let (csum, size) = compute_file_csum(&mut tmpfile)?;
+ tmpfile.seek(SeekFrom::Start(0))?;
+ let (csum, size) = sha256(&mut tmpfile)?;
manifest.verify_file(name, &csum, size)?;
tmpfile.seek(SeekFrom::Start(0))?;
use proxmox::api::error::{HttpError, StatusCode};
use pbs_datastore::task_log;
+use pbs_tools::sha::sha256;
use crate::{
api2::types::*,
backup::*,
client::*,
server::WorkerTask,
- tools::{compute_file_csum, ParallelHandler},
+ tools::ParallelHandler,
};
// fixme: implement filters
.await?;
}
ArchiveType::Blob => {
- let (csum, size) = compute_file_csum(&mut tmpfile)?;
+ tmpfile.seek(SeekFrom::Start(0))?;
+ let (csum, size) = sha256(&mut tmpfile)?;
verify_archive(archive_info, &csum, size)?;
}
}
}
ArchiveType::Blob => {
let mut tmpfile = std::fs::File::open(&path)?;
- let (csum, size) = compute_file_csum(&mut tmpfile)?;
+ let (csum, size) = sha256(&mut tmpfile)?;
match manifest.verify_file(&item.filename, &csum, size) {
Ok(_) => continue,
Err(err) => {
use std::collections::HashMap;
use std::hash::BuildHasher;
use std::fs::File;
-use std::io::{self, BufRead, Read, Seek, SeekFrom};
+use std::io::{self, BufRead};
use std::os::unix::io::RawFd;
use std::path::Path;
}
}
-/// Seeks to start of file and computes the SHA256 hash
-pub fn compute_file_csum(file: &mut File) -> Result<([u8; 32], u64), Error> {
-
- file.seek(SeekFrom::Start(0))?;
-
- 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))
-}
-
/// Create the base run-directory.
///
/// This exists to fixate the permissions for the run *base* directory while allowing intermediate