Skip to content

Commit 8d91cc7

Browse files
committed
feature(client-cli): add function in VerifiedDigests to list tampered immutables files
1 parent 088891d commit 8d91cc7

File tree

1 file changed

+117
-0
lines changed
  • mithril-client/src/cardano_database_client

1 file changed

+117
-0
lines changed

mithril-client/src/cardano_database_client/proving.rs

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,37 @@ pub struct VerifiedDigests {
3232
pub merkle_tree: MKTree<MKTreeStoreInMemory>,
3333
}
3434

35+
#[derive(PartialEq, Debug)]
36+
pub(crate) struct InvalidImmutableFiles {
37+
pub tampered_files: Vec<ImmutableFileName>,
38+
pub non_verifiable_files: Vec<ImmutableFileName>,
39+
}
40+
41+
impl VerifiedDigests {
42+
pub(crate) fn list_tampered_immutable_files(
43+
&self,
44+
computed_digests: &BTreeMap<ImmutableFileName, HexEncodedDigest>,
45+
) -> MithrilResult<InvalidImmutableFiles> {
46+
let mut tampered_files = vec![];
47+
let mut non_verifiable_files = vec![];
48+
49+
computed_digests.iter().for_each(|(immutable_file_name, digest)| {
50+
if let Some(verified_digest) = self.digests.get(immutable_file_name) {
51+
if verified_digest != digest {
52+
tampered_files.push(immutable_file_name.clone());
53+
}
54+
} else {
55+
non_verifiable_files.push(immutable_file_name.clone());
56+
}
57+
});
58+
59+
Ok(InvalidImmutableFiles {
60+
tampered_files,
61+
non_verifiable_files,
62+
})
63+
}
64+
}
65+
3566
pub struct InternalArtifactProver {
3667
http_file_downloader: Arc<dyn FileDownloader>,
3768
logger: slog::Logger,
@@ -211,6 +242,92 @@ mod tests {
211242

212243
use super::*;
213244

245+
mod list_tampered_immutable_files {
246+
247+
use super::*;
248+
249+
#[test]
250+
fn should_return_empty_list_when_no_tampered_files() {
251+
let digests_to_verify = BTreeMap::from([
252+
("00001.chunk".to_string(), "digest-1".to_string()),
253+
("00002.chunk".to_string(), "digest-2".to_string()),
254+
]);
255+
256+
let verified_digests = VerifiedDigests {
257+
digests: BTreeMap::from([
258+
("00001.chunk".to_string(), "digest-1".to_string()),
259+
("00002.chunk".to_string(), "digest-2".to_string()),
260+
]),
261+
merkle_tree: MKTree::new(&["whatever"]).unwrap(),
262+
};
263+
264+
let invalid_files = verified_digests
265+
.list_tampered_immutable_files(&digests_to_verify)
266+
.unwrap();
267+
268+
assert_eq!(
269+
invalid_files,
270+
InvalidImmutableFiles {
271+
tampered_files: vec![],
272+
non_verifiable_files: vec![],
273+
}
274+
);
275+
}
276+
277+
#[test]
278+
fn should_return_list_with_tampered_files() {
279+
let digests_to_verify = BTreeMap::from([
280+
("00001.chunk".to_string(), "digest-1".to_string()),
281+
("00002.chunk".to_string(), "digest-2".to_string()),
282+
]);
283+
284+
let verified_digests = VerifiedDigests {
285+
digests: BTreeMap::from([
286+
("00001.chunk".to_string(), "digest-1".to_string()),
287+
("00002.chunk".to_string(), "INVALID".to_string()),
288+
]),
289+
merkle_tree: MKTree::new(&["whatever"]).unwrap(),
290+
};
291+
292+
let invalid_files = verified_digests
293+
.list_tampered_immutable_files(&digests_to_verify)
294+
.unwrap();
295+
296+
assert_eq!(
297+
invalid_files,
298+
InvalidImmutableFiles {
299+
tampered_files: vec!["00002.chunk".to_string()],
300+
non_verifiable_files: vec![],
301+
}
302+
);
303+
}
304+
305+
#[test]
306+
fn should_return_list_with_non_verifiable() {
307+
let digests_to_verify = BTreeMap::from([
308+
("00001.chunk".to_string(), "digest-1".to_string()),
309+
("00002.not.verifiable".to_string(), "digest-2".to_string()),
310+
]);
311+
312+
let verified_digests = VerifiedDigests {
313+
digests: BTreeMap::from([("00001.chunk".to_string(), "digest-1".to_string())]),
314+
merkle_tree: MKTree::new(&["whatever"]).unwrap(),
315+
};
316+
317+
let invalid_files = verified_digests
318+
.list_tampered_immutable_files(&digests_to_verify)
319+
.unwrap();
320+
321+
assert_eq!(
322+
invalid_files,
323+
InvalidImmutableFiles {
324+
tampered_files: vec![],
325+
non_verifiable_files: vec!["00002.not.verifiable".to_string()],
326+
}
327+
);
328+
}
329+
}
330+
214331
mod download_and_verify_digests {
215332
use mithril_common::{
216333
StdResult,

0 commit comments

Comments
 (0)