@@ -92,8 +92,15 @@ impl Measurements {
9292 let measurements_map: HashMap < u32 , String > = serde_json:: from_str ( input) ?;
9393 let measurements_map: HashMap < u32 , [ u8 ; 48 ] > = measurements_map
9494 . into_iter ( )
95- . map ( |( k, v) | ( k, hex:: decode ( v) . unwrap ( ) . try_into ( ) . unwrap ( ) ) )
96- . collect ( ) ;
95+ . map ( |( k, v) | {
96+ Ok ( (
97+ k,
98+ hex:: decode ( v) ?
99+ . try_into ( )
100+ . map_err ( |_| MeasurementFormatError :: BadLength ) ?,
101+ ) )
102+ } )
103+ . collect :: < Result < _ , MeasurementFormatError > > ( ) ?;
97104
98105 Ok ( Self {
99106 platform : PlatformMeasurements {
@@ -127,6 +134,14 @@ pub enum MeasurementFormatError {
127134 MissingValue ( String ) ,
128135 #[ error( "Invalid header value: {0}" ) ]
129136 BadHeaderValue ( #[ from] InvalidHeaderValue ) ,
137+ #[ error( "IO: {0}" ) ]
138+ Io ( #[ from] std:: io:: Error ) ,
139+ #[ error( "Attestation type not valid" ) ]
140+ AttestationTypeNotValid ,
141+ #[ error( "Hex: {0}" ) ]
142+ Hex ( #[ from] hex:: FromHexError ) ,
143+ #[ error( "Expected 48 byte value" ) ]
144+ BadLength ,
130145}
131146
132147#[ derive( Clone , Debug ) ]
@@ -137,7 +152,9 @@ pub struct MeasurementRecord {
137152}
138153
139154/// Given the path to a JSON file containing measurements, return a [Vec<MeasurementRecord>]
140- pub async fn get_measurements_from_file ( measurement_file : PathBuf ) -> AttestationVerifier {
155+ pub async fn get_measurements_from_file (
156+ measurement_file : PathBuf ,
157+ ) -> Result < AttestationVerifier , MeasurementFormatError > {
141158 #[ derive( Debug , Deserialize ) ]
142159 struct MeasurementRecordSimple {
143160 measurement_id : String ,
@@ -150,47 +167,42 @@ pub async fn get_measurements_from_file(measurement_file: PathBuf) -> Attestatio
150167 expected : String ,
151168 }
152169
153- let measurements_json = tokio:: fs:: read ( measurement_file) . await . unwrap ( ) ;
170+ let measurements_json = tokio:: fs:: read ( measurement_file) . await ? ;
154171 let measurements_simple: Vec < MeasurementRecordSimple > =
155- serde_json:: from_slice ( & measurements_json) . unwrap ( ) ;
172+ serde_json:: from_slice ( & measurements_json) ? ;
156173 let mut measurements = Vec :: new ( ) ;
157174 for measurement in measurements_simple {
158175 measurements. push ( MeasurementRecord {
159176 measurement_id : measurement. measurement_id ,
160177 attestation_type : AttestationType :: parse_from_str ( & measurement. attestation_type )
161- . unwrap ( ) ,
178+ . map_err ( |_| MeasurementFormatError :: AttestationTypeNotValid ) ? ,
162179 measurements : Measurements {
163180 platform : PlatformMeasurements {
164- mrtd : hex:: decode ( & measurement. measurements [ "0" ] . expected )
165- . unwrap ( )
181+ mrtd : hex:: decode ( & measurement. measurements [ "0" ] . expected ) ?
166182 . try_into ( )
167- . unwrap ( ) ,
168- rtmr0 : hex:: decode ( & measurement. measurements [ "1" ] . expected )
169- . unwrap ( )
183+ . map_err ( |_| MeasurementFormatError :: BadLength ) ?,
184+ rtmr0 : hex:: decode ( & measurement. measurements [ "1" ] . expected ) ?
170185 . try_into ( )
171- . unwrap ( ) ,
186+ . map_err ( |_| MeasurementFormatError :: BadLength ) ? ,
172187 } ,
173188 cvm_image : CvmImageMeasurements {
174- rtmr1 : hex:: decode ( & measurement. measurements [ "2" ] . expected )
175- . unwrap ( )
189+ rtmr1 : hex:: decode ( & measurement. measurements [ "2" ] . expected ) ?
176190 . try_into ( )
177- . unwrap ( ) ,
178- rtmr2 : hex:: decode ( & measurement. measurements [ "3" ] . expected )
179- . unwrap ( )
191+ . map_err ( |_| MeasurementFormatError :: BadLength ) ?,
192+ rtmr2 : hex:: decode ( & measurement. measurements [ "3" ] . expected ) ?
180193 . try_into ( )
181- . unwrap ( ) ,
182- rtmr3 : hex:: decode ( & measurement. measurements [ "4" ] . expected )
183- . unwrap ( )
194+ . map_err ( |_| MeasurementFormatError :: BadLength ) ?,
195+ rtmr3 : hex:: decode ( & measurement. measurements [ "4" ] . expected ) ?
184196 . try_into ( )
185- . unwrap ( ) ,
197+ . map_err ( |_| MeasurementFormatError :: BadLength ) ? ,
186198 } ,
187199 } ,
188200 } ) ;
189201 }
190202
191- AttestationVerifier {
203+ Ok ( AttestationVerifier {
192204 accepted_measurements : measurements,
193- }
205+ } )
194206}
195207
196208#[ cfg( test) ]
@@ -199,6 +211,8 @@ mod tests {
199211
200212 #[ tokio:: test]
201213 async fn test_read_measurements_file ( ) {
202- get_measurements_from_file ( "test-assets/measurements.json" . into ( ) ) . await ;
214+ get_measurements_from_file ( "test-assets/measurements.json" . into ( ) )
215+ . await
216+ . unwrap ( ) ;
203217 }
204218}
0 commit comments