pvmfw: update libavb error handling
Minor modifications to error handling to match new libavb_rs code; the
Verification error can now contain verification data, but we don't use
this feature so we can just drop this data to keep lifetime handling
simple.
Bug: b/290110273
Test: atest
Change-Id: Iffedf0efc9da8598352de4e0b60bd606d15b4336
diff --git a/pvmfw/avb/src/error.rs b/pvmfw/avb/src/error.rs
index af38c54..0f052e8 100644
--- a/pvmfw/avb/src/error.rs
+++ b/pvmfw/avb/src/error.rs
@@ -19,21 +19,20 @@
/// Wrapper around `avb::SlotVerifyError` to add custom pvmfw errors.
/// It is the error thrown by the payload verification API `verify_payload()`.
-#[derive(Clone, Debug, PartialEq, Eq)]
+#[derive(Debug, PartialEq, Eq)]
pub enum PvmfwVerifyError {
- /// Passthrough avb::SlotVerifyError.
- AvbError(avb::SlotVerifyError),
+ /// Passthrough `avb::SlotVerifyError` with no `SlotVerifyData`.
+ AvbError(avb::SlotVerifyError<'static>),
/// VBMeta has invalid descriptors.
InvalidDescriptors(avb::IoError),
/// Unknown vbmeta property.
UnknownVbmetaProperty,
}
-/// It's always possible to convert from an `avb::SlotVerifyError` since we are
-/// a superset.
-impl From<avb::SlotVerifyError> for PvmfwVerifyError {
+impl From<avb::SlotVerifyError<'_>> for PvmfwVerifyError {
fn from(error: avb::SlotVerifyError) -> Self {
- Self::AvbError(error)
+ // We don't use verification data on failure, drop it to get a `'static` lifetime.
+ Self::AvbError(error.without_verify_data())
}
}
diff --git a/pvmfw/avb/src/ops.rs b/pvmfw/avb/src/ops.rs
index c7b8b01..aee93c8 100644
--- a/pvmfw/avb/src/ops.rs
+++ b/pvmfw/avb/src/ops.rs
@@ -94,7 +94,7 @@
pub(crate) fn verify_partition(
&mut self,
partition_name: &CStr,
- ) -> Result<AvbSlotVerifyDataWrap, avb::SlotVerifyError> {
+ ) -> Result<AvbSlotVerifyDataWrap, avb::SlotVerifyError<'static>> {
let requested_partitions = [partition_name.as_ptr(), ptr::null()];
let ab_suffix = CStr::from_bytes_with_nul(NULL_BYTE).unwrap();
let mut out_data = MaybeUninit::uninit();
@@ -292,7 +292,7 @@
pub(crate) struct AvbSlotVerifyDataWrap(*mut AvbSlotVerifyData);
impl TryFrom<*mut AvbSlotVerifyData> for AvbSlotVerifyDataWrap {
- type Error = avb::SlotVerifyError;
+ type Error = avb::SlotVerifyError<'static>;
fn try_from(data: *mut AvbSlotVerifyData) -> Result<Self, Self::Error> {
is_not_null(data).map_err(|_| avb::SlotVerifyError::Io)?;
diff --git a/pvmfw/avb/src/verify.rs b/pvmfw/avb/src/verify.rs
index 492d387..3274033 100644
--- a/pvmfw/avb/src/verify.rs
+++ b/pvmfw/avb/src/verify.rs
@@ -94,7 +94,7 @@
fn verify_only_one_vbmeta_exists(
vbmeta_images: &[AvbVBMetaData],
-) -> Result<(), avb::SlotVerifyError> {
+) -> Result<(), avb::SlotVerifyError<'static>> {
if vbmeta_images.len() == 1 {
Ok(())
} else {
@@ -104,7 +104,7 @@
fn verify_vbmeta_is_from_kernel_partition(
vbmeta_image: &AvbVBMetaData,
-) -> Result<(), avb::SlotVerifyError> {
+) -> Result<(), avb::SlotVerifyError<'static>> {
match (vbmeta_image.partition_name as *const c_char).try_into() {
Ok(PartitionName::Kernel) => Ok(()),
_ => Err(avb::SlotVerifyError::InvalidMetadata),
@@ -113,7 +113,7 @@
fn verify_vbmeta_has_only_one_hash_descriptor(
descriptors: &Descriptors,
-) -> Result<(), avb::SlotVerifyError> {
+) -> Result<(), avb::SlotVerifyError<'static>> {
if descriptors.num_hash_descriptor() == 1 {
Ok(())
} else {
@@ -125,7 +125,7 @@
loaded_partitions: &[AvbPartitionData],
partition_name: PartitionName,
expected_len: usize,
-) -> Result<(), avb::SlotVerifyError> {
+) -> Result<(), avb::SlotVerifyError<'static>> {
if loaded_partitions.len() != 1 {
// Only one partition should be loaded in each verify result.
return Err(avb::SlotVerifyError::Io);
@@ -140,7 +140,7 @@
if loaded_partition.data_size == expected_len {
Ok(())
} else {
- Err(avb::SlotVerifyError::Verification)
+ Err(avb::SlotVerifyError::Verification(None))
}
}
@@ -202,7 +202,7 @@
} else if let Ok(result) = ops.verify_partition(PartitionName::InitrdDebug.as_cstr()) {
(DebugLevel::Full, result, PartitionName::InitrdDebug)
} else {
- return Err(avb::SlotVerifyError::Verification.into());
+ return Err(avb::SlotVerifyError::Verification(None).into());
};
let loaded_partitions = initrd_verify_result.loaded_partitions()?;
verify_loaded_partition_has_expected_length(
diff --git a/pvmfw/avb/tests/api_test.rs b/pvmfw/avb/tests/api_test.rs
index 6344433..84f83c2 100644
--- a/pvmfw/avb/tests/api_test.rs
+++ b/pvmfw/avb/tests/api_test.rs
@@ -211,7 +211,7 @@
&load_latest_signed_kernel()?,
/* initrd= */ &fs::read(UNSIGNED_TEST_IMG_PATH)?,
&load_trusted_public_key()?,
- avb::SlotVerifyError::Verification.into(),
+ avb::SlotVerifyError::Verification(None).into(),
)
}
@@ -234,7 +234,7 @@
&kernel,
&load_latest_initrd_normal()?,
&load_trusted_public_key()?,
- avb::SlotVerifyError::Verification.into(),
+ avb::SlotVerifyError::Verification(None).into(),
)
}
@@ -301,7 +301,7 @@
&load_latest_signed_kernel()?,
&initrd,
&load_trusted_public_key()?,
- avb::SlotVerifyError::Verification.into(),
+ avb::SlotVerifyError::Verification(None).into(),
)
}
@@ -340,13 +340,13 @@
&kernel,
&load_latest_initrd_normal()?,
&empty_public_key,
- avb::SlotVerifyError::Verification.into(),
+ avb::SlotVerifyError::Verification(None).into(),
)?;
assert_payload_verification_with_initrd_fails(
&kernel,
&load_latest_initrd_normal()?,
&load_trusted_public_key()?,
- avb::SlotVerifyError::Verification.into(),
+ avb::SlotVerifyError::Verification(None).into(),
)
}
@@ -384,7 +384,7 @@
&kernel,
&load_latest_initrd_normal()?,
&load_trusted_public_key()?,
- avb::SlotVerifyError::Verification.into(),
+ avb::SlotVerifyError::Verification(None).into(),
)
}