blob: 8eb67f4cc3f913c040d034052b71b69ffed77992 [file] [log] [blame]
Alice Wang28cbcf12022-12-01 07:58:28 +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
15//! This module regroups methods related to AvbOps.
16
17#![warn(unsafe_op_in_unsafe_fn)]
18// TODO(b/256148034): Remove this when the feature is code complete.
19#![allow(dead_code)]
20#![allow(unused_imports)]
21
Alice Wang28cbcf12022-12-01 07:58:28 +000022use alloc::ffi::CString;
Alice Wangdc63fe02022-12-15 08:49:57 +000023use avb_bindgen::{avb_slot_verify, AvbHashtreeErrorMode, AvbSlotVerifyFlags, AvbSlotVerifyResult};
Alice Wang28cbcf12022-12-01 07:58:28 +000024use core::fmt;
25use log::debug;
26
27/// Error code from AVB image verification.
28#[derive(Clone, Copy, Debug)]
29pub enum AvbImageVerifyError {
Alice Wangdc63fe02022-12-15 08:49:57 +000030 /// AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_ARGUMENT
Alice Wang28cbcf12022-12-01 07:58:28 +000031 InvalidArgument,
Alice Wangdc63fe02022-12-15 08:49:57 +000032 /// AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_METADATA
Alice Wang28cbcf12022-12-01 07:58:28 +000033 InvalidMetadata,
Alice Wangdc63fe02022-12-15 08:49:57 +000034 /// AVB_SLOT_VERIFY_RESULT_ERROR_IO
Alice Wang28cbcf12022-12-01 07:58:28 +000035 Io,
Alice Wangdc63fe02022-12-15 08:49:57 +000036 /// AVB_SLOT_VERIFY_RESULT_ERROR_OOM
Alice Wang28cbcf12022-12-01 07:58:28 +000037 Oom,
Alice Wangdc63fe02022-12-15 08:49:57 +000038 /// AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED
Alice Wang28cbcf12022-12-01 07:58:28 +000039 PublicKeyRejected,
Alice Wangdc63fe02022-12-15 08:49:57 +000040 /// AVB_SLOT_VERIFY_RESULT_ERROR_ROLLBACK_INDEX
Alice Wang28cbcf12022-12-01 07:58:28 +000041 RollbackIndex,
Alice Wangdc63fe02022-12-15 08:49:57 +000042 /// AVB_SLOT_VERIFY_RESULT_ERROR_UNSUPPORTED_VERSION
Alice Wang28cbcf12022-12-01 07:58:28 +000043 UnsupportedVersion,
Alice Wangdc63fe02022-12-15 08:49:57 +000044 /// AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION
Alice Wang28cbcf12022-12-01 07:58:28 +000045 Verification,
Alice Wang28cbcf12022-12-01 07:58:28 +000046}
47
Alice Wangdc63fe02022-12-15 08:49:57 +000048fn to_avb_verify_result(result: AvbSlotVerifyResult) -> Result<(), AvbImageVerifyError> {
Alice Wang28cbcf12022-12-01 07:58:28 +000049 match result {
Alice Wangdc63fe02022-12-15 08:49:57 +000050 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_OK => Ok(()),
51 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_ARGUMENT => {
Alice Wang28cbcf12022-12-01 07:58:28 +000052 Err(AvbImageVerifyError::InvalidArgument)
53 }
Alice Wangdc63fe02022-12-15 08:49:57 +000054 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_METADATA => {
Alice Wang28cbcf12022-12-01 07:58:28 +000055 Err(AvbImageVerifyError::InvalidMetadata)
56 }
Alice Wangdc63fe02022-12-15 08:49:57 +000057 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_IO => Err(AvbImageVerifyError::Io),
58 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_OOM => Err(AvbImageVerifyError::Oom),
59 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED => {
Alice Wang28cbcf12022-12-01 07:58:28 +000060 Err(AvbImageVerifyError::PublicKeyRejected)
61 }
Alice Wangdc63fe02022-12-15 08:49:57 +000062 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_ROLLBACK_INDEX => {
Alice Wang28cbcf12022-12-01 07:58:28 +000063 Err(AvbImageVerifyError::RollbackIndex)
64 }
Alice Wangdc63fe02022-12-15 08:49:57 +000065 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_UNSUPPORTED_VERSION => {
Alice Wang28cbcf12022-12-01 07:58:28 +000066 Err(AvbImageVerifyError::UnsupportedVersion)
67 }
Alice Wangdc63fe02022-12-15 08:49:57 +000068 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION => {
Alice Wang28cbcf12022-12-01 07:58:28 +000069 Err(AvbImageVerifyError::Verification)
70 }
Alice Wang28cbcf12022-12-01 07:58:28 +000071 }
72}
73
74impl fmt::Display for AvbImageVerifyError {
75 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
76 match self {
77 Self::InvalidArgument => write!(f, "Invalid parameters."),
78 Self::InvalidMetadata => write!(f, "Invalid metadata."),
79 Self::Io => write!(f, "I/O error while trying to load data or get a rollback index."),
80 Self::Oom => write!(f, "Unable to allocate memory."),
81 Self::PublicKeyRejected => write!(
82 f,
83 "Everything is verified correctly out but the public key is not accepted. \
84 This includes the case where integrity data is not signed."
85 ),
86 Self::RollbackIndex => write!(f, "Rollback index is less than its stored value."),
87 Self::UnsupportedVersion => write!(
88 f,
89 "Some of the metadata requires a newer version of libavb than what is in use."
90 ),
91 Self::Verification => write!(f, "Data does not verify."),
Alice Wang28cbcf12022-12-01 07:58:28 +000092 }
93 }
94}
95
96/// Verifies that for the given image:
97/// - The given public key is acceptable.
98/// - The VBMeta struct is valid.
99/// - The partitions of the image match the descriptors of the verified VBMeta struct.
100/// Returns Ok if everything is verified correctly and the public key is accepted.
Alice Wangdc63fe02022-12-15 08:49:57 +0000101pub fn verify_image(_image: &[u8], _public_key: &[u8]) -> Result<(), AvbImageVerifyError> {
102 // TODO(b/256148034): Call verify_slot() from pvmfw.
103 AvbOps::new().verify_slot()
Alice Wang28cbcf12022-12-01 07:58:28 +0000104}
105
106/// TODO(b/256148034): Make AvbOps a rust wrapper of avb_bindgen::AvbOps using foreign_types.
107struct AvbOps {}
108
109impl AvbOps {
110 fn new() -> Self {
111 AvbOps {}
112 }
113
Alice Wangdc63fe02022-12-15 08:49:57 +0000114 fn verify_slot(&mut self) -> Result<(), AvbImageVerifyError> {
115 let flags = AvbSlotVerifyFlags::AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION;
116 let hashtree_error_mode = AvbHashtreeErrorMode::AVB_HASHTREE_ERROR_MODE_EIO;
117 debug!("flags: {:?}", flags);
118 debug!("hashtree_error_mode: {:?}", hashtree_error_mode);
Alice Wang28cbcf12022-12-01 07:58:28 +0000119 // TODO(b/256148034): Verify the kernel image with avb_slot_verify()
120 // let result = unsafe {
121 // avb_slot_verify(
122 // self.as_ptr(),
123 // requested_partitions.as_ptr(),
124 // ab_suffix.as_ptr(),
Alice Wangdc63fe02022-12-15 08:49:57 +0000125 // flags,
126 // hashtree_error_mode,
Alice Wang28cbcf12022-12-01 07:58:28 +0000127 // &image.as_ptr(),
128 // )
129 // };
Alice Wangdc63fe02022-12-15 08:49:57 +0000130 let result = AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_OK;
Alice Wang28cbcf12022-12-01 07:58:28 +0000131 to_avb_verify_result(result)
132 }
133}