@@ -32,6 +32,37 @@ pub struct VerifiedDigests {
32
32
pub merkle_tree : MKTree < MKTreeStoreInMemory > ,
33
33
}
34
34
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
+
35
66
pub struct InternalArtifactProver {
36
67
http_file_downloader : Arc < dyn FileDownloader > ,
37
68
logger : slog:: Logger ,
@@ -211,6 +242,92 @@ mod tests {
211
242
212
243
use super :: * ;
213
244
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
+
214
331
mod download_and_verify_digests {
215
332
use mithril_common:: {
216
333
StdResult ,
0 commit comments