Skip to content

Commit e33c19a

Browse files
committed
feature(client-lib): compute cardano database message verify tampered files
1 parent 4f90742 commit e33c19a

File tree

2 files changed

+194
-70
lines changed

2 files changed

+194
-70
lines changed

mithril-client/src/cardano_database_client/proving.rs

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -33,33 +33,34 @@ pub struct VerifiedDigests {
3333
}
3434

3535
#[derive(PartialEq, Debug)]
36-
pub(crate) struct InvalidImmutableFiles {
36+
pub(crate) struct ImmutableFilesNotVerified {
3737
pub tampered_files: Vec<ImmutableFileName>,
3838
pub non_verifiable_files: Vec<ImmutableFileName>,
3939
}
4040

4141
impl VerifiedDigests {
42-
pub(crate) fn list_tampered_immutable_files(
42+
pub(crate) fn list_immutable_files_not_verified(
4343
&self,
44-
computed_digests: &BTreeMap<ImmutableFileName, HexEncodedDigest>,
45-
) -> MithrilResult<InvalidImmutableFiles> {
44+
computed_digests: &BTreeMap<ImmutableFile, HexEncodedDigest>,
45+
) -> ImmutableFilesNotVerified {
4646
let mut tampered_files = vec![];
4747
let mut non_verifiable_files = vec![];
4848

49-
computed_digests.iter().for_each(|(immutable_file_name, digest)| {
50-
if let Some(verified_digest) = self.digests.get(immutable_file_name) {
49+
computed_digests.iter().for_each(|(immutable_file, digest)| {
50+
let immutable_file_name_to_verify = immutable_file.filename.clone();
51+
if let Some(verified_digest) = self.digests.get(&immutable_file_name_to_verify) {
5152
if verified_digest != digest {
52-
tampered_files.push(immutable_file_name.clone());
53+
tampered_files.push(immutable_file_name_to_verify);
5354
}
5455
} else {
55-
non_verifiable_files.push(immutable_file_name.clone());
56+
non_verifiable_files.push(immutable_file_name_to_verify);
5657
}
5758
});
5859

59-
Ok(InvalidImmutableFiles {
60+
ImmutableFilesNotVerified {
6061
tampered_files,
6162
non_verifiable_files,
62-
})
63+
}
6364
}
6465
}
6566

@@ -242,15 +243,23 @@ mod tests {
242243

243244
use super::*;
244245

245-
mod list_tampered_immutable_files {
246+
mod list_immutable_files_not_verified {
246247

247248
use super::*;
248249

250+
fn fake_immutable(filename: &str) -> ImmutableFile {
251+
ImmutableFile {
252+
path: PathBuf::from("whatever"),
253+
number: 1,
254+
filename: filename.to_string(),
255+
}
256+
}
257+
249258
#[test]
250259
fn should_return_empty_list_when_no_tampered_files() {
251260
let digests_to_verify = BTreeMap::from([
252-
("00001.chunk".to_string(), "digest-1".to_string()),
253-
("00002.chunk".to_string(), "digest-2".to_string()),
261+
(fake_immutable("00001.chunk"), "digest-1".to_string()),
262+
(fake_immutable("00002.chunk"), "digest-2".to_string()),
254263
]);
255264

256265
let verified_digests = VerifiedDigests {
@@ -261,13 +270,12 @@ mod tests {
261270
merkle_tree: MKTree::new(&["whatever"]).unwrap(),
262271
};
263272

264-
let invalid_files = verified_digests
265-
.list_tampered_immutable_files(&digests_to_verify)
266-
.unwrap();
273+
let invalid_files =
274+
verified_digests.list_immutable_files_not_verified(&digests_to_verify);
267275

268276
assert_eq!(
269277
invalid_files,
270-
InvalidImmutableFiles {
278+
ImmutableFilesNotVerified {
271279
tampered_files: vec![],
272280
non_verifiable_files: vec![],
273281
}
@@ -277,8 +285,8 @@ mod tests {
277285
#[test]
278286
fn should_return_list_with_tampered_files() {
279287
let digests_to_verify = BTreeMap::from([
280-
("00001.chunk".to_string(), "digest-1".to_string()),
281-
("00002.chunk".to_string(), "digest-2".to_string()),
288+
(fake_immutable("00001.chunk"), "digest-1".to_string()),
289+
(fake_immutable("00002.chunk"), "digest-2".to_string()),
282290
]);
283291

284292
let verified_digests = VerifiedDigests {
@@ -289,13 +297,12 @@ mod tests {
289297
merkle_tree: MKTree::new(&["whatever"]).unwrap(),
290298
};
291299

292-
let invalid_files = verified_digests
293-
.list_tampered_immutable_files(&digests_to_verify)
294-
.unwrap();
300+
let invalid_files =
301+
verified_digests.list_immutable_files_not_verified(&digests_to_verify);
295302

296303
assert_eq!(
297304
invalid_files,
298-
InvalidImmutableFiles {
305+
ImmutableFilesNotVerified {
299306
tampered_files: vec!["00002.chunk".to_string()],
300307
non_verifiable_files: vec![],
301308
}
@@ -305,22 +312,24 @@ mod tests {
305312
#[test]
306313
fn should_return_list_with_non_verifiable() {
307314
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()),
315+
(fake_immutable("00001.chunk"), "digest-1".to_string()),
316+
(
317+
fake_immutable("00002.not.verifiable"),
318+
"digest-2".to_string(),
319+
),
310320
]);
311321

312322
let verified_digests = VerifiedDigests {
313323
digests: BTreeMap::from([("00001.chunk".to_string(), "digest-1".to_string())]),
314324
merkle_tree: MKTree::new(&["whatever"]).unwrap(),
315325
};
316326

317-
let invalid_files = verified_digests
318-
.list_tampered_immutable_files(&digests_to_verify)
319-
.unwrap();
327+
let invalid_files =
328+
verified_digests.list_immutable_files_not_verified(&digests_to_verify);
320329

321330
assert_eq!(
322331
invalid_files,
323-
InvalidImmutableFiles {
332+
ImmutableFilesNotVerified {
324333
tampered_files: vec![],
325334
non_verifiable_files: vec!["00002.not.verifiable".to_string()],
326335
}

0 commit comments

Comments
 (0)