blob: 5e3822f46222b0bcaeaf3d4d66f99861db75abad [file] [log] [blame]
Alice Wang45d98fa2023-01-11 09:39:45 +00001// Copyright 2022, The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Alice Wang18655632023-01-18 09:11:34 +000015//! This module contains the error thrown by the payload verification API
16//! and other errors used in the library.
Alice Wang45d98fa2023-01-11 09:39:45 +000017
Alice Wang18655632023-01-18 09:11:34 +000018use avb_bindgen::{AvbIOResult, AvbSlotVerifyResult};
Alice Wang45d98fa2023-01-11 09:39:45 +000019
20use core::fmt;
21
22/// This error is the error part of `AvbSlotVerifyResult`.
23/// It is the error thrown by the payload verification API `verify_payload()`.
24#[derive(Clone, Debug, PartialEq, Eq)]
25pub enum AvbSlotVerifyError {
26 /// AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_ARGUMENT
27 InvalidArgument,
28 /// AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_METADATA
29 InvalidMetadata,
30 /// AVB_SLOT_VERIFY_RESULT_ERROR_IO
31 Io,
32 /// AVB_SLOT_VERIFY_RESULT_ERROR_OOM
33 Oom,
34 /// AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED
35 PublicKeyRejected,
36 /// AVB_SLOT_VERIFY_RESULT_ERROR_ROLLBACK_INDEX
37 RollbackIndex,
38 /// AVB_SLOT_VERIFY_RESULT_ERROR_UNSUPPORTED_VERSION
39 UnsupportedVersion,
40 /// AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION
41 Verification,
Alice Wang14973b22023-05-22 14:54:16 +000042 /// VBMeta has invalid descriptors.
43 InvalidDescriptors(AvbIOError),
Alice Wangab0d0202023-05-17 08:07:41 +000044 /// Unknown vbmeta property
45 UnknownVbmetaProperty,
Alice Wang45d98fa2023-01-11 09:39:45 +000046}
47
48impl fmt::Display for AvbSlotVerifyError {
49 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
50 match self {
51 Self::InvalidArgument => write!(f, "Invalid parameters."),
52 Self::InvalidMetadata => write!(f, "Invalid metadata."),
53 Self::Io => write!(f, "I/O error while trying to load data or get a rollback index."),
54 Self::Oom => write!(f, "Unable to allocate memory."),
55 Self::PublicKeyRejected => write!(f, "Public key rejected or data not signed."),
56 Self::RollbackIndex => write!(f, "Rollback index is less than its stored value."),
57 Self::UnsupportedVersion => write!(
58 f,
59 "Some of the metadata requires a newer version of libavb than what is in use."
60 ),
61 Self::Verification => write!(f, "Data does not verify."),
Alice Wang14973b22023-05-22 14:54:16 +000062 Self::InvalidDescriptors(e) => {
63 write!(f, "VBMeta has invalid descriptors. Error: {:?}", e)
64 }
Alice Wangab0d0202023-05-17 08:07:41 +000065 Self::UnknownVbmetaProperty => write!(f, "Unknown vbmeta property"),
Alice Wang45d98fa2023-01-11 09:39:45 +000066 }
67 }
68}
69
70pub(crate) fn slot_verify_result_to_verify_payload_result(
71 result: AvbSlotVerifyResult,
72) -> Result<(), AvbSlotVerifyError> {
73 match result {
74 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_OK => Ok(()),
75 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_ARGUMENT => {
76 Err(AvbSlotVerifyError::InvalidArgument)
77 }
78 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_METADATA => {
79 Err(AvbSlotVerifyError::InvalidMetadata)
80 }
81 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_IO => Err(AvbSlotVerifyError::Io),
82 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_OOM => Err(AvbSlotVerifyError::Oom),
83 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED => {
84 Err(AvbSlotVerifyError::PublicKeyRejected)
85 }
86 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_ROLLBACK_INDEX => {
87 Err(AvbSlotVerifyError::RollbackIndex)
88 }
89 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_UNSUPPORTED_VERSION => {
90 Err(AvbSlotVerifyError::UnsupportedVersion)
91 }
92 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION => {
93 Err(AvbSlotVerifyError::Verification)
94 }
95 }
96}
Alice Wang18655632023-01-18 09:11:34 +000097
Alice Wang14973b22023-05-22 14:54:16 +000098/// AVB IO Error.
99#[derive(Clone, Debug, PartialEq, Eq)]
100pub enum AvbIOError {
Alice Wang18655632023-01-18 09:11:34 +0000101 /// AVB_IO_RESULT_ERROR_OOM,
102 #[allow(dead_code)]
103 Oom,
104 /// AVB_IO_RESULT_ERROR_IO,
Alice Wang18655632023-01-18 09:11:34 +0000105 Io,
106 /// AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION,
107 NoSuchPartition,
108 /// AVB_IO_RESULT_ERROR_RANGE_OUTSIDE_PARTITION,
109 RangeOutsidePartition,
110 /// AVB_IO_RESULT_ERROR_NO_SUCH_VALUE,
111 NoSuchValue,
112 /// AVB_IO_RESULT_ERROR_INVALID_VALUE_SIZE,
113 InvalidValueSize,
114 /// AVB_IO_RESULT_ERROR_INSUFFICIENT_SPACE,
115 #[allow(dead_code)]
116 InsufficientSpace,
117}
118
119impl From<AvbIOError> for AvbIOResult {
120 fn from(error: AvbIOError) -> Self {
121 match error {
122 AvbIOError::Oom => AvbIOResult::AVB_IO_RESULT_ERROR_OOM,
123 AvbIOError::Io => AvbIOResult::AVB_IO_RESULT_ERROR_IO,
124 AvbIOError::NoSuchPartition => AvbIOResult::AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION,
125 AvbIOError::RangeOutsidePartition => {
126 AvbIOResult::AVB_IO_RESULT_ERROR_RANGE_OUTSIDE_PARTITION
127 }
128 AvbIOError::NoSuchValue => AvbIOResult::AVB_IO_RESULT_ERROR_NO_SUCH_VALUE,
129 AvbIOError::InvalidValueSize => AvbIOResult::AVB_IO_RESULT_ERROR_INVALID_VALUE_SIZE,
130 AvbIOError::InsufficientSpace => AvbIOResult::AVB_IO_RESULT_ERROR_INSUFFICIENT_SPACE,
131 }
132 }
133}
134
135pub(crate) fn to_avb_io_result(result: Result<(), AvbIOError>) -> AvbIOResult {
136 result.map_or_else(|e| e.into(), |_| AvbIOResult::AVB_IO_RESULT_OK)
137}