2 use anyhow
::{bail, Error}
;
3 pub use release_file
::{CompressionType, FileReference, FileReferenceType, ReleaseFile}
;
6 pub use packages_file
::PackagesFile
;
9 pub use sources_file
::SourcesFile
;
11 #[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
12 pub struct CheckSums
{
13 pub md5
: Option
<[u8; 16]>,
14 pub sha1
: Option
<[u8; 20]>,
15 pub sha256
: Option
<[u8; 32]>,
16 pub sha512
: Option
<[u8; 64]>,
19 macro_rules
! assert_hash_equality
{
20 ($l
:expr
, $r
:expr
) => {{
22 bail
!("hash mismatch: {} != {}", hex
::encode($l
), hex
::encode($r
));
28 pub fn is_secure(&self) -> bool
{
29 self.sha256
.is_some() || self.sha512
.is_some()
32 pub fn verify(&self, input
: &[u8]) -> Result
<(), Error
> {
33 if !self.is_secure() {
34 bail
!("No SHA256/SHA512 checksum specified.");
37 if let Some(expected
) = self.sha512
{
38 let digest
= openssl
::sha
::sha512(input
);
39 assert_hash_equality
!(digest
, expected
);
41 } else if let Some(expected
) = self.sha256
{
42 let digest
= openssl
::sha
::sha256(input
);
43 assert_hash_equality
!(digest
, expected
);
46 bail
!("No trusted checksum found - verification not possible.");
50 /// Merge two instances of `CheckSums`.
51 pub fn merge(&mut self, rhs
: &CheckSums
) -> Result
<(), Error
> {
52 match (self.sha512
, rhs
.sha512
) {
54 (None
, Some(sha512
)) => self.sha512
= Some(sha512
),
55 (Some(left
), Some(right
)) => assert_hash_equality
!(left
, right
),
57 match (self.sha256
, rhs
.sha256
) {
59 (None
, Some(sha256
)) => self.sha256
= Some(sha256
),
60 (Some(left
), Some(right
)) => assert_hash_equality
!(left
, right
),
62 match (self.sha1
, rhs
.sha1
) {
64 (None
, Some(sha1
)) => self.sha1
= Some(sha1
),
65 (Some(left
), Some(right
)) => assert_hash_equality
!(left
, right
),
67 match (self.md5
, rhs
.md5
) {
69 (None
, Some(md5
)) => self.md5
= Some(md5
),
70 (Some(left
), Some(right
)) => assert_hash_equality
!(left
, right
),