Import a parameter to the given parameter area.
(
parameter_areas: &mut HashMap<u32, ParameterAreaState>,
info: &IGVM_VHS_PARAMETER,
parameter: &[u8],
)
| 206 | |
| 207 | // Import a parameter to the given parameter area. |
| 208 | fn import_parameter( |
| 209 | parameter_areas: &mut HashMap<u32, ParameterAreaState>, |
| 210 | info: &IGVM_VHS_PARAMETER, |
| 211 | parameter: &[u8], |
| 212 | ) -> Result<(), Error> { |
| 213 | let (parameter_area, max_size) = match parameter_areas |
| 214 | .get_mut(&info.parameter_area_index) |
| 215 | .expect("parameter area should be present") |
| 216 | { |
| 217 | ParameterAreaState::Allocated { data, max_size } => (data, max_size), |
| 218 | ParameterAreaState::Inserted => panic!("igvmfile is not valid"), |
| 219 | }; |
| 220 | let offset = info.byte_offset as usize; |
| 221 | let end_of_parameter = offset + parameter.len(); |
| 222 | |
| 223 | if end_of_parameter > *max_size as usize { |
| 224 | // TODO: tracing for which parameter was too big? |
| 225 | return Err(Error::ParameterTooLarge); |
| 226 | } |
| 227 | |
| 228 | if parameter_area.len() < end_of_parameter { |
| 229 | parameter_area.resize(end_of_parameter, 0); |
| 230 | } |
| 231 | |
| 232 | parameter_area[offset..end_of_parameter].copy_from_slice(parameter); |
| 233 | Ok(()) |
| 234 | } |
| 235 | |
| 236 | /// |
| 237 | /// Extract guest policy from the IGVM initialization headers. |