@@ -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+
3566pub 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