]> git.proxmox.com Git - proxmox-apt.git/blob - src/deb822/mod.rs
deb822: source index support
[proxmox-apt.git] / src / deb822 / mod.rs
1 mod release_file;
2 use anyhow::{bail, Error};
3 pub use release_file::{CompressionType, FileReference, FileReferenceType, ReleaseFile};
4
5 mod packages_file;
6 pub use packages_file::PackagesFile;
7
8 mod sources_file;
9 pub use sources_file::SourcesFile;
10
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]>,
17 }
18
19 macro_rules! assert_hash_equality {
20 ($l:expr, $r:expr) => {{
21 if $l != $r {
22 bail!("hash mismatch: {} != {}", hex::encode($l), hex::encode($r));
23 }
24 }};
25 }
26
27 impl CheckSums {
28 pub fn is_secure(&self) -> bool {
29 self.sha256.is_some() || self.sha512.is_some()
30 }
31
32 pub fn verify(&self, input: &[u8]) -> Result<(), Error> {
33 if !self.is_secure() {
34 bail!("No SHA256/SHA512 checksum specified.");
35 }
36
37 if let Some(expected) = self.sha512 {
38 let digest = openssl::sha::sha512(input);
39 assert_hash_equality!(digest, expected);
40 Ok(())
41 } else if let Some(expected) = self.sha256 {
42 let digest = openssl::sha::sha256(input);
43 assert_hash_equality!(digest, expected);
44 Ok(())
45 } else {
46 bail!("No trusted checksum found - verification not possible.");
47 }
48 }
49
50 /// Merge two instances of `CheckSums`.
51 pub fn merge(&mut self, rhs: &CheckSums) -> Result<(), Error> {
52 match (self.sha512, rhs.sha512) {
53 (_, None) => {}
54 (None, Some(sha512)) => self.sha512 = Some(sha512),
55 (Some(left), Some(right)) => assert_hash_equality!(left, right),
56 };
57 match (self.sha256, rhs.sha256) {
58 (_, None) => {}
59 (None, Some(sha256)) => self.sha256 = Some(sha256),
60 (Some(left), Some(right)) => assert_hash_equality!(left, right),
61 };
62 match (self.sha1, rhs.sha1) {
63 (_, None) => {}
64 (None, Some(sha1)) => self.sha1 = Some(sha1),
65 (Some(left), Some(right)) => assert_hash_equality!(left, right),
66 };
67 match (self.md5, rhs.md5) {
68 (_, None) => {}
69 (None, Some(md5)) => self.md5 = Some(md5),
70 (Some(left), Some(right)) => assert_hash_equality!(left, right),
71 };
72
73 Ok(())
74 }
75 }