Skip to content

Commit e684bc3

Browse files
committed
feat: Handle SHA256 & SHA512 hashes
* Replace deprecated SHA-1 crate with SHA1 crate * Add SHA2 crate to handle SHA256 & SHA512
1 parent bf91330 commit e684bc3

File tree

3 files changed

+61
-5
lines changed

3 files changed

+61
-5
lines changed

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ futures = "0.3.30"
1818
hex = "0.4.3"
1919
md-5 = "0.10.6"
2020
procfs = "0.16.0"
21-
sha-1 = "0.10.1"
2221
thiserror = "1.0.60"
2322
rayon = "1.10.0"
2423
deb-version = "0.1.1"
24+
sha1 = "0.10.6"
25+
sha2 = "0.10.9"
2526

2627
[dependencies.tokio]
2728
version = "1.37.0"

src/hash.rs

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
use hex::FromHex;
55
use md5::{digest::generic_array::GenericArray, Digest, Md5};
66
use sha1::Sha1;
7+
use sha2::{Sha256, Sha512};
78
use std::{io, path::Path};
89
use thiserror::Error;
910

@@ -49,6 +50,30 @@ pub fn compare_hash(
4950
}
5051

5152
match expected_hash {
53+
RequestChecksum::Md5(sum) => {
54+
let expected = <[u8; 16]>::from_hex(sum)
55+
.map(GenericArray::from)
56+
.map_err(|_| ChecksumError::InvalidInput(format!("MD5 {}", sum)))?;
57+
58+
let mut buffer = vec![0u8; 8 * 1024];
59+
let mut hasher = Md5::new();
60+
61+
loop {
62+
match file.read(&mut buffer) {
63+
Ok(0) => break,
64+
Ok(bytes) => hasher.update(&buffer[..bytes]),
65+
Err(why) => return Err(ChecksumError::FileRead(why)),
66+
}
67+
}
68+
69+
let hash = &*hasher.finalize();
70+
71+
if &*expected == hash {
72+
Ok(())
73+
} else {
74+
Err(ChecksumError::Mismatch)
75+
}
76+
}
5277
RequestChecksum::Sha1(sum) => {
5378
let expected = <[u8; 20]>::from_hex(sum)
5479
.map(GenericArray::from)
@@ -73,13 +98,37 @@ pub fn compare_hash(
7398
Err(ChecksumError::Mismatch)
7499
}
75100
}
76-
RequestChecksum::Md5(sum) => {
77-
let expected = <[u8; 16]>::from_hex(sum)
101+
RequestChecksum::Sha256(sum) => {
102+
let expected = <[u8; 32]>::from_hex(sum)
78103
.map(GenericArray::from)
79-
.map_err(|_| ChecksumError::InvalidInput(format!("MD5 {}", sum)))?;
104+
.map_err(|_| ChecksumError::InvalidInput(format!("SHA256 {}", sum)))?;
80105

81106
let mut buffer = vec![0u8; 8 * 1024];
82-
let mut hasher = Md5::new();
107+
let mut hasher = Sha256::new();
108+
109+
loop {
110+
match file.read(&mut buffer) {
111+
Ok(0) => break,
112+
Ok(bytes) => hasher.update(&buffer[..bytes]),
113+
Err(why) => return Err(ChecksumError::FileRead(why)),
114+
}
115+
}
116+
117+
let hash = &*hasher.finalize();
118+
119+
if &*expected == hash {
120+
Ok(())
121+
} else {
122+
Err(ChecksumError::Mismatch)
123+
}
124+
}
125+
RequestChecksum::Sha512(sum) => {
126+
let expected = <[u8; 64]>::from_hex(sum)
127+
.map(GenericArray::from)
128+
.map_err(|_| ChecksumError::InvalidInput(format!("SHA512 {}", sum)))?;
129+
130+
let mut buffer = vec![0u8; 8 * 1024];
131+
let mut hasher = Sha512::new();
83132

84133
loop {
85134
match file.read(&mut buffer) {

src/request.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ pub enum RequestError {
3232
pub enum RequestChecksum {
3333
Md5(String),
3434
Sha1(String),
35+
Sha256(String),
36+
Sha512(String),
3537
}
3638

3739
#[derive(Debug, Clone, Eq)]
@@ -89,6 +91,10 @@ impl FromStr for Request {
8991
RequestChecksum::Md5(value.to_owned())
9092
} else if let Some(value) = checksum_string.strip_prefix("SHA1:") {
9193
RequestChecksum::Sha1(value.to_owned())
94+
} else if let Some(value) = checksum_string.strip_prefix("SHA256:") {
95+
RequestChecksum::Sha256(value.to_owned())
96+
} else if let Some(value) = checksum_string.strip_prefix("SHA512:") {
97+
RequestChecksum::Sha512(value.to_owned())
9298
} else {
9399
return Err(RequestError::UnknownChecksum(checksum_string.into()));
94100
};

0 commit comments

Comments
 (0)