#![forbid(unsafe_code)]
#[cfg(feature = "archive")]
pub mod archive;
#[cfg(feature = "cli")]
pub mod cli;
#[cfg(feature = "create")]
pub mod create;
pub mod dsse;
#[cfg(feature = "linkage")]
pub mod linkage;
#[cfg(feature = "manifest")]
pub mod manifest;
pub mod minisign;
pub mod model;
pub mod sigstore;
pub mod verify;
#[cfg(feature = "manifest")]
pub use manifest::Manifest;
pub use model::{
Artifact, Attestor, Bin, Evidence, Host, Identity, Predicate, ReleaseList,
ReleaseListStatement, ReleaseRef, ReleaseStatus, Requires, Resource, ResourceIdentity,
ResourceSource, Scheme, Selection, Source, Statement, Subject, command_name, github_list_path,
list_url, select_artifact, select_resources, tag_version,
};
#[cfg(feature = "sign")]
pub use sigstore::Signer;
pub use sigstore::{Policy, Trust};
pub use verify::{Options, Verified, VerifiedList, verify, verify_release_list};
pub fn digest_file(path: &std::path::Path) -> std::io::Result<(String, u64)> {
let all = digest_file_all(path)?;
Ok((all.sha256, all.size))
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Digests {
pub sha256: String,
pub sha512: String,
pub size: u64,
}
pub fn digest_file_all(path: &std::path::Path) -> std::io::Result<Digests> {
use sha2::Digest as _;
use std::io::Read as _;
let mut file = std::fs::File::open(path)?;
let mut sha256 = sha2::Sha256::new();
let mut sha512 = sha2::Sha512::new();
let mut size = 0u64;
let mut buf = vec![0u8; 1 << 16];
loop {
let n = file.read(&mut buf)?;
if n == 0 {
break;
}
sha256.update(&buf[..n]);
sha512.update(&buf[..n]);
size += n as u64;
}
Ok(Digests {
sha256: format!("{:x}", sha256.finalize()),
sha512: format!("{:x}", sha512.finalize()),
size,
})
}