Skip to content

Commit 5aeabcb

Browse files
committed
feature(client-lib): compute cardano database message verify tampered files
1 parent d34d6be commit 5aeabcb

File tree

2 files changed

+203
-74
lines changed

2 files changed

+203
-74
lines changed

mithril-client/src/cardano_database_client/proving.rs

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -32,34 +32,40 @@ pub struct VerifiedDigests {
3232
pub merkle_tree: MKTree<MKTreeStoreInMemory>,
3333
}
3434

35+
/// Represents the immutable files that were not verified during the digest verification process.
3536
#[derive(PartialEq, Debug)]
36-
pub(crate) struct InvalidImmutableFiles {
37+
pub(crate) struct ImmutableFilesNotVerified {
38+
/// List of immutable files that were tampered (i.e. their digest does not match the verified digest)
3739
pub tampered_files: Vec<ImmutableFileName>,
40+
/// List of immutable files that could not be verified (i.e., not present in the digests)
3841
pub non_verifiable_files: Vec<ImmutableFileName>,
3942
}
4043

4144
impl VerifiedDigests {
42-
pub(crate) fn list_tampered_immutable_files(
45+
pub(crate) fn list_immutable_files_not_verified(
4346
&self,
44-
computed_digests: &BTreeMap<ImmutableFileName, HexEncodedDigest>,
45-
) -> MithrilResult<InvalidImmutableFiles> {
47+
computed_digests: &BTreeMap<ImmutableFile, HexEncodedDigest>,
48+
) -> ImmutableFilesNotVerified {
4649
let mut tampered_files = vec![];
4750
let mut non_verifiable_files = vec![];
4851

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());
52+
for (immutable_file, digest) in computed_digests.iter() {
53+
let immutable_file_name_to_verify = immutable_file.filename.clone();
54+
match self.digests.get(&immutable_file_name_to_verify) {
55+
Some(verified_digest) if verified_digest != digest => {
56+
tampered_files.push(immutable_file_name_to_verify);
5357
}
54-
} else {
55-
non_verifiable_files.push(immutable_file_name.clone());
58+
None => {
59+
non_verifiable_files.push(immutable_file_name_to_verify);
60+
}
61+
_ => {}
5662
}
57-
});
63+
}
5864

59-
Ok(InvalidImmutableFiles {
65+
ImmutableFilesNotVerified {
6066
tampered_files,
6167
non_verifiable_files,
62-
})
68+
}
6369
}
6470
}
6571

@@ -97,7 +103,7 @@ impl InternalArtifactProver {
97103
Ok(())
98104
}
99105

100-
///Download digests and verify its authenticity against the certificate.
106+
/// Download digests and verify its authenticity against the certificate.
101107
pub async fn download_and_verify_digests(
102108
&self,
103109
certificate: &CertificateMessage,
@@ -242,15 +248,23 @@ mod tests {
242248

243249
use super::*;
244250

245-
mod list_tampered_immutable_files {
251+
mod list_immutable_files_not_verified {
246252

247253
use super::*;
248254

255+
fn fake_immutable(filename: &str) -> ImmutableFile {
256+
ImmutableFile {
257+
path: PathBuf::from("whatever"),
258+
number: 1,
259+
filename: filename.to_string(),
260+
}
261+
}
262+
249263
#[test]
250264
fn should_return_empty_list_when_no_tampered_files() {
251265
let digests_to_verify = BTreeMap::from([
252-
("00001.chunk".to_string(), "digest-1".to_string()),
253-
("00002.chunk".to_string(), "digest-2".to_string()),
266+
(fake_immutable("00001.chunk"), "digest-1".to_string()),
267+
(fake_immutable("00002.chunk"), "digest-2".to_string()),
254268
]);
255269

256270
let verified_digests = VerifiedDigests {
@@ -261,13 +275,12 @@ mod tests {
261275
merkle_tree: MKTree::new(&["whatever"]).unwrap(),
262276
};
263277

264-
let invalid_files = verified_digests
265-
.list_tampered_immutable_files(&digests_to_verify)
266-
.unwrap();
278+
let invalid_files =
279+
verified_digests.list_immutable_files_not_verified(&digests_to_verify);
267280

268281
assert_eq!(
269282
invalid_files,
270-
InvalidImmutableFiles {
283+
ImmutableFilesNotVerified {
271284
tampered_files: vec![],
272285
non_verifiable_files: vec![],
273286
}
@@ -277,8 +290,8 @@ mod tests {
277290
#[test]
278291
fn should_return_list_with_tampered_files() {
279292
let digests_to_verify = BTreeMap::from([
280-
("00001.chunk".to_string(), "digest-1".to_string()),
281-
("00002.chunk".to_string(), "digest-2".to_string()),
293+
(fake_immutable("00001.chunk"), "digest-1".to_string()),
294+
(fake_immutable("00002.chunk"), "digest-2".to_string()),
282295
]);
283296

284297
let verified_digests = VerifiedDigests {
@@ -289,13 +302,12 @@ mod tests {
289302
merkle_tree: MKTree::new(&["whatever"]).unwrap(),
290303
};
291304

292-
let invalid_files = verified_digests
293-
.list_tampered_immutable_files(&digests_to_verify)
294-
.unwrap();
305+
let invalid_files =
306+
verified_digests.list_immutable_files_not_verified(&digests_to_verify);
295307

296308
assert_eq!(
297309
invalid_files,
298-
InvalidImmutableFiles {
310+
ImmutableFilesNotVerified {
299311
tampered_files: vec!["00002.chunk".to_string()],
300312
non_verifiable_files: vec![],
301313
}
@@ -305,22 +317,24 @@ mod tests {
305317
#[test]
306318
fn should_return_list_with_non_verifiable() {
307319
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()),
320+
(fake_immutable("00001.chunk"), "digest-1".to_string()),
321+
(
322+
fake_immutable("00002.not.verifiable"),
323+
"digest-2".to_string(),
324+
),
310325
]);
311326

312327
let verified_digests = VerifiedDigests {
313328
digests: BTreeMap::from([("00001.chunk".to_string(), "digest-1".to_string())]),
314329
merkle_tree: MKTree::new(&["whatever"]).unwrap(),
315330
};
316331

317-
let invalid_files = verified_digests
318-
.list_tampered_immutable_files(&digests_to_verify)
319-
.unwrap();
332+
let invalid_files =
333+
verified_digests.list_immutable_files_not_verified(&digests_to_verify);
320334

321335
assert_eq!(
322336
invalid_files,
323-
InvalidImmutableFiles {
337+
ImmutableFilesNotVerified {
324338
tampered_files: vec![],
325339
non_verifiable_files: vec!["00002.not.verifiable".to_string()],
326340
}

0 commit comments

Comments
 (0)