diff options
-rw-r--r-- | remote_provisioning/hwtrust/src/cbor/rkp/device_info.rs | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/remote_provisioning/hwtrust/src/cbor/rkp/device_info.rs b/remote_provisioning/hwtrust/src/cbor/rkp/device_info.rs index 09b2eca..ec1fc74 100644 --- a/remote_provisioning/hwtrust/src/cbor/rkp/device_info.rs +++ b/remote_provisioning/hwtrust/src/cbor/rkp/device_info.rs @@ -81,11 +81,18 @@ impl DeviceInfo { fused: fused.into_bool()?, version: version.try_into()?, }; - info.validate_avf_fields()?; + info.validate()?; Ok(info) } - fn validate_avf_fields(&self) -> Result<()> { + fn validate(&self) -> Result<()> { + ensure!(!self.vbmeta_digest.is_empty(), "vbmeta_digest must not be empty"); + ensure!( + !self.vbmeta_digest.iter().all(|b| *b == 0u8), + "vbmeta_digest must not be all zeros. Got {:?}", + self.vbmeta_digest + ); + if Some(DeviceInfoSecurityLevel::Avf) == self.security_level { ensure!( self.bootloader_state == DeviceInfoBootloaderState::Avf @@ -225,6 +232,26 @@ mod tests { } #[test] + fn device_info_from_cbor_empty_vbmeta_digest() { + let mut values: Vec<(Value, Value)> = get_valid_values_filtered(|v| v != "vbmeta_digest"); + values.push(("vbmeta_digest".into(), vec![0u8; 0].into())); + + let err = DeviceInfo::from_cbor_values(values, None).unwrap_err(); + println!("{err:?}"); + assert!(err.to_string().contains("vbmeta_digest must not be empty"), "{err:?}"); + } + + #[test] + fn device_info_from_cbor_all_zero_vbmeta_digest() { + let mut values: Vec<(Value, Value)> = get_valid_values_filtered(|v| v != "vbmeta_digest"); + values.push(("vbmeta_digest".into(), vec![0u8; 16].into())); + + let err = DeviceInfo::from_cbor_values(values, None).unwrap_err(); + println!("{err:?}"); + assert!(err.to_string().contains("vbmeta_digest must not be all zeros"), "{err:?}"); + } + + #[test] fn device_info_from_cbor_values_non_avf_security_level_has_avf_vb_state() { let mut values = get_valid_values_filtered(|x| x != "vb_state"); values.push(("vb_state".into(), "avf".into())); |