@@ -65,6 +65,7 @@ use async_recursion::async_recursion;
65
65
pub use async_trait:: async_trait;
66
66
pub use bytes:: Bytes ;
67
67
use chrono:: { DateTime , Utc } ;
68
+ use error:: SnapshotTargetsMetaMissingSnafu ;
68
69
use futures:: StreamExt ;
69
70
use futures_core:: Stream ;
70
71
use log:: warn;
@@ -1060,6 +1061,13 @@ async fn load_snapshot(
1060
1061
role : RoleType :: Snapshot ,
1061
1062
} ) ?;
1062
1063
1064
+ // 4.4 Check that snapshot.meta contains at least targets.json
1065
+ ensure ! (
1066
+ snapshot. signed. meta. contains_key( "targets.json" ) ,
1067
+ SnapshotTargetsMetaMissingSnafu {
1068
+ version: snapshot. signed. version,
1069
+ }
1070
+ ) ;
1063
1071
// 3.3. Check for a rollback attack.
1064
1072
//
1065
1073
// 3.3.1. Note that the trusted snapshot metadata file may be checked for authenticity, but its
@@ -1090,6 +1098,35 @@ async fn load_snapshot(
1090
1098
// metadata file, if any, MUST continue to be listed in the new snapshot metadata
1091
1099
// file. If any of these conditions are not met, discard the new snapshot metadata
1092
1100
// file, abort the update cycle, and report the failure.
1101
+
1102
+ // Ensure that the trusted snapshot has at least targets.json
1103
+ ensure ! (
1104
+ old_snapshot. signed. meta. contains_key( "targets.json" ) ,
1105
+ error:: SnapshotTargetsMetaMissingSnafu {
1106
+ version: old_snapshot. signed. version,
1107
+ }
1108
+ ) ;
1109
+ for ( name, meta) in & old_snapshot. signed . meta {
1110
+ ensure ! (
1111
+ snapshot. signed. meta. contains_key( name) ,
1112
+ error:: SnapshotRoleMissingSnafu {
1113
+ role: name,
1114
+ old_version: old_snapshot. signed. version,
1115
+ new_version: snapshot. signed. version,
1116
+ }
1117
+ ) ;
1118
+ let new_meta = snapshot. signed . meta . get ( name) . unwrap ( ) ;
1119
+ ensure ! (
1120
+ meta. version <= new_meta. version,
1121
+ error:: SnapshotRoleRollbackSnafu {
1122
+ role: name,
1123
+ old_role_version: meta. version,
1124
+ old_snapshot_version: old_snapshot. signed. version,
1125
+ new_role_version: new_meta. version,
1126
+ new_snapshot_version: snapshot. signed. version,
1127
+ }
1128
+ ) ;
1129
+ }
1093
1130
if let Some ( old_targets_meta) = old_snapshot. signed . meta . get ( "targets.json" ) {
1094
1131
let targets_meta =
1095
1132
snapshot
0 commit comments