2 use anyhow
::{bail, Error}
;
3 pub use release_file
::{CompressionType, FileReference, FileReferenceType, ReleaseFile}
;
6 pub use packages_file
::PackagesFile
;
8 #[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
10 pub md5
: Option
<[u8; 16]>,
11 pub sha1
: Option
<[u8; 20]>,
12 pub sha256
: Option
<[u8; 32]>,
13 pub sha512
: Option
<[u8; 64]>,
17 pub fn is_secure(&self) -> bool
{
18 self.sha256
.is_some() || self.sha512
.is_some()
21 pub fn verify(&self, input
: &[u8]) -> Result
<(), Error
> {
22 if !self.is_secure() {
23 bail
!("No SHA256/SHA512 checksum specified.");
26 if let Some(expected
) = self.sha512
{
27 let digest
= openssl
::sha
::sha512(input
);
28 if digest
!= expected
{
30 "Hashsum mismatch: {} != {}",
31 hex
::encode(expected
),
37 } else if let Some(expected
) = self.sha256
{
38 let digest
= openssl
::sha
::sha256(input
);
39 if digest
!= expected
{
41 "Hashsum mismatch: {} != {}",
42 hex
::encode(expected
),
49 bail
!("No trusted checksum found - verification not possible.");
53 /// Merge two instances of `CheckSums`.
54 pub fn merge(&mut self, rhs
: &CheckSums
) -> Result
<(), Error
> {
55 match (self.sha512
, rhs
.sha512
) {
57 (None
, Some(sha512
)) => self.sha512
= Some(sha512
),
58 (Some(left
), Some(right
)) => {
61 "sha512 mismatch: {} != {}",
68 match (self.sha256
, rhs
.sha256
) {
70 (None
, Some(sha256
)) => self.sha256
= Some(sha256
),
71 (Some(left
), Some(right
)) => {
74 "sha256 mismatch: {} != {}",
81 match (self.sha1
, rhs
.sha1
) {
83 (None
, Some(sha1
)) => self.sha1
= Some(sha1
),
84 (Some(left
), Some(right
)) => {
87 "sha1 mismatch: {} != {}",
94 match (self.md5
, rhs
.md5
) {
96 (None
, Some(md5
)) => self.md5
= Some(md5
),
97 (Some(left
), Some(right
)) => {
100 "md5 mismatch: {} != {}",