blob: 7f3ba3db95bf6a6815e0e73d82eaf9f1bfff905b [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
Alice Wangf3d96b12022-12-15 13:10:47 +000015//! This module handles the pvmfw payload verification.
Alice Wang28cbcf12022-12-01 07:58:28 +000016
Alice Wangf3d96b12022-12-15 13:10:47 +000017use avb_bindgen::AvbSlotVerifyResult;
Alice Wang28cbcf12022-12-01 07:58:28 +000018use core::fmt;
Alice Wang28cbcf12022-12-01 07:58:28 +000019
20/// Error code from AVB image verification.
Alice Wangf3d96b12022-12-15 13:10:47 +000021#[derive(Clone, Debug)]
Alice Wang28cbcf12022-12-01 07:58:28 +000022pub enum AvbImageVerifyError {
Alice Wangdc63fe02022-12-15 08:49:57 +000023 /// AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_ARGUMENT
Alice Wang28cbcf12022-12-01 07:58:28 +000024 InvalidArgument,
Alice Wangdc63fe02022-12-15 08:49:57 +000025 /// AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_METADATA
Alice Wang28cbcf12022-12-01 07:58:28 +000026 InvalidMetadata,
Alice Wangdc63fe02022-12-15 08:49:57 +000027 /// AVB_SLOT_VERIFY_RESULT_ERROR_IO
Alice Wang28cbcf12022-12-01 07:58:28 +000028 Io,
Alice Wangdc63fe02022-12-15 08:49:57 +000029 /// AVB_SLOT_VERIFY_RESULT_ERROR_OOM
Alice Wang28cbcf12022-12-01 07:58:28 +000030 Oom,
Alice Wangdc63fe02022-12-15 08:49:57 +000031 /// AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED
Alice Wang28cbcf12022-12-01 07:58:28 +000032 PublicKeyRejected,
Alice Wangdc63fe02022-12-15 08:49:57 +000033 /// AVB_SLOT_VERIFY_RESULT_ERROR_ROLLBACK_INDEX
Alice Wang28cbcf12022-12-01 07:58:28 +000034 RollbackIndex,
Alice Wangdc63fe02022-12-15 08:49:57 +000035 /// AVB_SLOT_VERIFY_RESULT_ERROR_UNSUPPORTED_VERSION
Alice Wang28cbcf12022-12-01 07:58:28 +000036 UnsupportedVersion,
Alice Wangdc63fe02022-12-15 08:49:57 +000037 /// AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION
Alice Wang28cbcf12022-12-01 07:58:28 +000038 Verification,
Alice Wang28cbcf12022-12-01 07:58:28 +000039}
40
Alice Wangf3d96b12022-12-15 13:10:47 +000041impl fmt::Display for AvbImageVerifyError {
42 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
43 match self {
44 Self::InvalidArgument => write!(f, "Invalid parameters."),
45 Self::InvalidMetadata => write!(f, "Invalid metadata."),
46 Self::Io => write!(f, "I/O error while trying to load data or get a rollback index."),
47 Self::Oom => write!(f, "Unable to allocate memory."),
48 Self::PublicKeyRejected => write!(f, "Public key rejected or data not signed."),
49 Self::RollbackIndex => write!(f, "Rollback index is less than its stored value."),
50 Self::UnsupportedVersion => write!(
51 f,
52 "Some of the metadata requires a newer version of libavb than what is in use."
53 ),
54 Self::Verification => write!(f, "Data does not verify."),
55 }
56 }
57}
58
Alice Wangdc63fe02022-12-15 08:49:57 +000059fn to_avb_verify_result(result: AvbSlotVerifyResult) -> Result<(), AvbImageVerifyError> {
Alice Wang28cbcf12022-12-01 07:58:28 +000060 match result {
Alice Wangdc63fe02022-12-15 08:49:57 +000061 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_OK => Ok(()),
62 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_ARGUMENT => {
Alice Wang28cbcf12022-12-01 07:58:28 +000063 Err(AvbImageVerifyError::InvalidArgument)
64 }
Alice Wangdc63fe02022-12-15 08:49:57 +000065 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_METADATA => {
Alice Wang28cbcf12022-12-01 07:58:28 +000066 Err(AvbImageVerifyError::InvalidMetadata)
67 }
Alice Wangdc63fe02022-12-15 08:49:57 +000068 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_IO => Err(AvbImageVerifyError::Io),
69 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_OOM => Err(AvbImageVerifyError::Oom),
70 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED => {
Alice Wang28cbcf12022-12-01 07:58:28 +000071 Err(AvbImageVerifyError::PublicKeyRejected)
72 }
Alice Wangdc63fe02022-12-15 08:49:57 +000073 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_ROLLBACK_INDEX => {
Alice Wang28cbcf12022-12-01 07:58:28 +000074 Err(AvbImageVerifyError::RollbackIndex)
75 }
Alice Wangdc63fe02022-12-15 08:49:57 +000076 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_UNSUPPORTED_VERSION => {
Alice Wang28cbcf12022-12-01 07:58:28 +000077 Err(AvbImageVerifyError::UnsupportedVersion)
78 }
Alice Wangdc63fe02022-12-15 08:49:57 +000079 AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION => {
Alice Wang28cbcf12022-12-01 07:58:28 +000080 Err(AvbImageVerifyError::Verification)
81 }
Alice Wang28cbcf12022-12-01 07:58:28 +000082 }
83}
84
Alice Wangf3d96b12022-12-15 13:10:47 +000085/// Verifies the payload (signed kernel + initrd) against the trusted public key.
86pub fn verify_payload(_public_key: &[u8]) -> Result<(), AvbImageVerifyError> {
87 // TODO(b/256148034): Verify the kernel image with avb_slot_verify()
88 // let result = unsafe {
89 // avb_slot_verify(
90 // &mut avb_ops,
91 // requested_partitions.as_ptr(),
92 // ab_suffix.as_ptr(),
93 // flags,
94 // hashtree_error_mode,
95 // null_mut(),
96 // )
97 // };
98 let result = AvbSlotVerifyResult::AVB_SLOT_VERIFY_RESULT_OK;
99 to_avb_verify_result(result)
Alice Wang28cbcf12022-12-01 07:58:28 +0000100}
101
Alice Wangf3d96b12022-12-15 13:10:47 +0000102#[cfg(test)]
103mod tests {
104 use super::*;
Alice Wang28cbcf12022-12-01 07:58:28 +0000105
Alice Wangf3d96b12022-12-15 13:10:47 +0000106 // TODO(b/256148034): Test verification succeeds with valid payload later.
107 #[test]
108 fn verification_succeeds_with_placeholder_input() {
109 let fake_public_key = [0u8; 2];
110 assert!(verify_payload(&fake_public_key).is_ok());
Alice Wang28cbcf12022-12-01 07:58:28 +0000111 }
112}