blob: 46f5228513b9d5437d7ddf4108db7d5fdbff81f8 [file] [log] [blame]
Alice Wangbf7fadd2023-01-13 12:18:24 +00001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Alice Wang2925b0a2023-01-19 10:44:24 +000017mod utils;
Alice Wangbf7fadd2023-01-13 12:18:24 +000018
Alice Wang1f0add02023-01-23 16:22:53 +000019use anyhow::{anyhow, Result};
Alice Wang2925b0a2023-01-19 10:44:24 +000020use avb_bindgen::{AvbFooter, AvbVBMetaImageHeader};
David Pursella7c727b2023-08-14 16:24:40 -070021use pvmfw_avb::{verify_payload, Capability, DebugLevel, PvmfwVerifyError, VerifiedBootData};
Alice Wang2925b0a2023-01-19 10:44:24 +000022use std::{fs, mem::size_of, ptr};
23use utils::*;
24
Alice Wangbf7fadd2023-01-13 12:18:24 +000025const TEST_IMG_WITH_ONE_HASHDESC_PATH: &str = "test_image_with_one_hashdesc.img";
Shikha Panwara26f16a2023-09-27 09:39:00 +000026const TEST_IMG_WITH_ROLLBACK_INDEX_5: &str = "test_image_with_rollback_index_5.img";
Alice Wang86383df2023-01-11 10:03:56 +000027const TEST_IMG_WITH_PROP_DESC_PATH: &str = "test_image_with_prop_desc.img";
Alice Wangab0d0202023-05-17 08:07:41 +000028const TEST_IMG_WITH_SERVICE_VM_PROP_PATH: &str = "test_image_with_service_vm_prop.img";
29const TEST_IMG_WITH_UNKNOWN_VM_TYPE_PROP_PATH: &str = "test_image_with_unknown_vm_type_prop.img";
30const TEST_IMG_WITH_MULTIPLE_PROPS_PATH: &str = "test_image_with_multiple_props.img";
31const TEST_IMG_WITH_DUPLICATED_CAP_PATH: &str = "test_image_with_duplicated_capability.img";
Alice Wang86383df2023-01-11 10:03:56 +000032const TEST_IMG_WITH_NON_INITRD_HASHDESC_PATH: &str = "test_image_with_non_initrd_hashdesc.img";
Alice Wangf2752862023-01-18 11:51:25 +000033const TEST_IMG_WITH_INITRD_AND_NON_INITRD_DESC_PATH: &str =
34 "test_image_with_initrd_and_non_initrd_desc.img";
Alice Wangbf7fadd2023-01-13 12:18:24 +000035const UNSIGNED_TEST_IMG_PATH: &str = "unsigned_test.img";
36
Alice Wangbf7fadd2023-01-13 12:18:24 +000037const RANDOM_FOOTER_POS: usize = 30;
38
39/// This test uses the Microdroid payload compiled on the fly to check that
40/// the latest payload can be verified successfully.
41#[test]
Alice Wang4e55dd92023-01-11 10:17:01 +000042fn latest_normal_payload_passes_verification() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +000043 assert_latest_payload_verification_passes(
Alice Wang4e55dd92023-01-11 10:17:01 +000044 &load_latest_initrd_normal()?,
Alice Wang1f0add02023-01-23 16:22:53 +000045 b"initrd_normal",
46 DebugLevel::None,
Alice Wang4e55dd92023-01-11 10:17:01 +000047 )
48}
Alice Wangbf7fadd2023-01-13 12:18:24 +000049
Alice Wang4e55dd92023-01-11 10:17:01 +000050#[test]
51fn latest_debug_payload_passes_verification() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +000052 assert_latest_payload_verification_passes(
Alice Wang4e55dd92023-01-11 10:17:01 +000053 &load_latest_initrd_debug()?,
Alice Wang1f0add02023-01-23 16:22:53 +000054 b"initrd_debug",
55 DebugLevel::Full,
Alice Wang4e55dd92023-01-11 10:17:01 +000056 )
Alice Wangbf7fadd2023-01-13 12:18:24 +000057}
58
59#[test]
60fn payload_expecting_no_initrd_passes_verification_with_no_initrd() -> Result<()> {
Pierre-Clément Tosif58f3a32023-02-02 16:24:23 +000061 let public_key = load_trusted_public_key()?;
Alice Wang1f0add02023-01-23 16:22:53 +000062 let verified_boot_data = verify_payload(
Alice Wang86383df2023-01-11 10:03:56 +000063 &fs::read(TEST_IMG_WITH_ONE_HASHDESC_PATH)?,
Shikha Panwara26f16a2023-09-27 09:39:00 +000064 /* initrd= */ None,
Pierre-Clément Tosif58f3a32023-02-02 16:24:23 +000065 &public_key,
Alice Wang86383df2023-01-11 10:03:56 +000066 )
Alice Wang1f0add02023-01-23 16:22:53 +000067 .map_err(|e| anyhow!("Verification failed. Error: {}", e))?;
68
Pierre-Clément Tosi81ca0802023-02-14 10:41:38 +000069 let kernel_digest = hash(&[&hex::decode("1111")?, &fs::read(UNSIGNED_TEST_IMG_PATH)?]);
Pierre-Clément Tosif58f3a32023-02-02 16:24:23 +000070 let expected_boot_data = VerifiedBootData {
71 debug_level: DebugLevel::None,
72 kernel_digest,
73 initrd_digest: None,
74 public_key: &public_key,
Alice Wangab0d0202023-05-17 08:07:41 +000075 capabilities: vec![],
Shikha Panwara26f16a2023-09-27 09:39:00 +000076 rollback_index: 0,
Pierre-Clément Tosif58f3a32023-02-02 16:24:23 +000077 };
Pierre-Clément Tosi81ca0802023-02-14 10:41:38 +000078 assert_eq!(expected_boot_data, verified_boot_data);
79
Alice Wang1f0add02023-01-23 16:22:53 +000080 Ok(())
Alice Wangbf7fadd2023-01-13 12:18:24 +000081}
82
Alice Wang86383df2023-01-11 10:03:56 +000083#[test]
Alice Wangf2752862023-01-18 11:51:25 +000084fn payload_with_non_initrd_descriptor_fails_verification_with_no_initrd() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +000085 assert_payload_verification_fails(
Alice Wang86383df2023-01-11 10:03:56 +000086 &fs::read(TEST_IMG_WITH_NON_INITRD_HASHDESC_PATH)?,
Shikha Panwara26f16a2023-09-27 09:39:00 +000087 /* initrd= */ None,
Alice Wang86383df2023-01-11 10:03:56 +000088 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -070089 PvmfwVerifyError::InvalidDescriptors(avb::IoError::NoSuchPartition),
Alice Wangf2752862023-01-18 11:51:25 +000090 )
91}
92
93#[test]
94fn payload_with_non_initrd_descriptor_fails_verification_with_initrd() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +000095 assert_payload_verification_with_initrd_fails(
Alice Wangf2752862023-01-18 11:51:25 +000096 &fs::read(TEST_IMG_WITH_INITRD_AND_NON_INITRD_DESC_PATH)?,
97 &load_latest_initrd_normal()?,
98 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -070099 PvmfwVerifyError::InvalidDescriptors(avb::IoError::NoSuchPartition),
Alice Wang86383df2023-01-11 10:03:56 +0000100 )
101}
102
103#[test]
Alice Wangab0d0202023-05-17 08:07:41 +0000104fn payload_expecting_no_initrd_passes_verification_with_service_vm_prop() -> Result<()> {
105 let public_key = load_trusted_public_key()?;
106 let verified_boot_data = verify_payload(
107 &fs::read(TEST_IMG_WITH_SERVICE_VM_PROP_PATH)?,
Shikha Panwara26f16a2023-09-27 09:39:00 +0000108 /* initrd= */ None,
Alice Wangab0d0202023-05-17 08:07:41 +0000109 &public_key,
110 )
111 .map_err(|e| anyhow!("Verification failed. Error: {}", e))?;
112
113 let kernel_digest = hash(&[&hex::decode("2131")?, &fs::read(UNSIGNED_TEST_IMG_PATH)?]);
114 let expected_boot_data = VerifiedBootData {
115 debug_level: DebugLevel::None,
116 kernel_digest,
117 initrd_digest: None,
118 public_key: &public_key,
119 capabilities: vec![Capability::RemoteAttest],
Shikha Panwara26f16a2023-09-27 09:39:00 +0000120 rollback_index: 0,
Alice Wangab0d0202023-05-17 08:07:41 +0000121 };
122 assert_eq!(expected_boot_data, verified_boot_data);
123
124 Ok(())
125}
126
127#[test]
128fn payload_with_unknown_vm_type_fails_verification_with_no_initrd() -> Result<()> {
129 assert_payload_verification_fails(
130 &fs::read(TEST_IMG_WITH_UNKNOWN_VM_TYPE_PROP_PATH)?,
Shikha Panwara26f16a2023-09-27 09:39:00 +0000131 /* initrd= */ None,
Alice Wangab0d0202023-05-17 08:07:41 +0000132 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700133 PvmfwVerifyError::UnknownVbmetaProperty,
Alice Wangab0d0202023-05-17 08:07:41 +0000134 )
135}
136
137#[test]
138fn payload_with_multiple_props_fails_verification_with_no_initrd() -> Result<()> {
139 assert_payload_verification_fails(
140 &fs::read(TEST_IMG_WITH_MULTIPLE_PROPS_PATH)?,
Shikha Panwara26f16a2023-09-27 09:39:00 +0000141 /* initrd= */ None,
Alice Wangab0d0202023-05-17 08:07:41 +0000142 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700143 PvmfwVerifyError::InvalidDescriptors(avb::IoError::Io),
Alice Wangab0d0202023-05-17 08:07:41 +0000144 )
145}
146
147#[test]
148fn payload_with_duplicated_capability_fails_verification_with_no_initrd() -> Result<()> {
149 assert_payload_verification_fails(
150 &fs::read(TEST_IMG_WITH_DUPLICATED_CAP_PATH)?,
Shikha Panwara26f16a2023-09-27 09:39:00 +0000151 /* initrd= */ None,
Alice Wangab0d0202023-05-17 08:07:41 +0000152 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700153 avb::SlotVerifyError::InvalidMetadata.into(),
Alice Wangab0d0202023-05-17 08:07:41 +0000154 )
155}
156
157#[test]
Alice Wang86383df2023-01-11 10:03:56 +0000158fn payload_with_prop_descriptor_fails_verification_with_no_initrd() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +0000159 assert_payload_verification_fails(
Alice Wang86383df2023-01-11 10:03:56 +0000160 &fs::read(TEST_IMG_WITH_PROP_DESC_PATH)?,
Shikha Panwara26f16a2023-09-27 09:39:00 +0000161 /* initrd= */ None,
Alice Wang86383df2023-01-11 10:03:56 +0000162 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700163 PvmfwVerifyError::UnknownVbmetaProperty,
Alice Wang86383df2023-01-11 10:03:56 +0000164 )
165}
166
167#[test]
168fn payload_expecting_initrd_fails_verification_with_no_initrd() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +0000169 assert_payload_verification_fails(
Alice Wang86383df2023-01-11 10:03:56 +0000170 &load_latest_signed_kernel()?,
Shikha Panwara26f16a2023-09-27 09:39:00 +0000171 /* initrd= */ None,
Alice Wang86383df2023-01-11 10:03:56 +0000172 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700173 avb::SlotVerifyError::InvalidMetadata.into(),
Alice Wang86383df2023-01-11 10:03:56 +0000174 )
175}
Alice Wangbf7fadd2023-01-13 12:18:24 +0000176
177#[test]
178fn payload_with_empty_public_key_fails_verification() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +0000179 assert_payload_verification_with_initrd_fails(
Alice Wangbf7fadd2023-01-13 12:18:24 +0000180 &load_latest_signed_kernel()?,
181 &load_latest_initrd_normal()?,
Shikha Panwara26f16a2023-09-27 09:39:00 +0000182 /* trusted_public_key= */ &[0u8; 0],
David Pursella7c727b2023-08-14 16:24:40 -0700183 avb::SlotVerifyError::PublicKeyRejected.into(),
Alice Wangbf7fadd2023-01-13 12:18:24 +0000184 )
185}
186
187#[test]
188fn payload_with_an_invalid_public_key_fails_verification() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +0000189 assert_payload_verification_with_initrd_fails(
Alice Wangbf7fadd2023-01-13 12:18:24 +0000190 &load_latest_signed_kernel()?,
191 &load_latest_initrd_normal()?,
Shikha Panwara26f16a2023-09-27 09:39:00 +0000192 /* trusted_public_key= */ &[0u8; 512],
David Pursella7c727b2023-08-14 16:24:40 -0700193 avb::SlotVerifyError::PublicKeyRejected.into(),
Alice Wangbf7fadd2023-01-13 12:18:24 +0000194 )
195}
196
197#[test]
198fn payload_with_a_different_valid_public_key_fails_verification() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +0000199 assert_payload_verification_with_initrd_fails(
Alice Wangbf7fadd2023-01-13 12:18:24 +0000200 &load_latest_signed_kernel()?,
201 &load_latest_initrd_normal()?,
202 &fs::read(PUBLIC_KEY_RSA2048_PATH)?,
David Pursella7c727b2023-08-14 16:24:40 -0700203 avb::SlotVerifyError::PublicKeyRejected.into(),
Alice Wangbf7fadd2023-01-13 12:18:24 +0000204 )
205}
206
207#[test]
Alice Wang5c1a7562023-01-13 17:19:57 +0000208fn payload_with_an_invalid_initrd_fails_verification() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +0000209 assert_payload_verification_with_initrd_fails(
Alice Wang5c1a7562023-01-13 17:19:57 +0000210 &load_latest_signed_kernel()?,
Shikha Panwara26f16a2023-09-27 09:39:00 +0000211 /* initrd= */ &fs::read(UNSIGNED_TEST_IMG_PATH)?,
Alice Wang5c1a7562023-01-13 17:19:57 +0000212 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700213 avb::SlotVerifyError::Verification.into(),
Alice Wang5c1a7562023-01-13 17:19:57 +0000214 )
215}
216
217#[test]
Alice Wangbf7fadd2023-01-13 12:18:24 +0000218fn unsigned_kernel_fails_verification() -> Result<()> {
Alice Wang1f0add02023-01-23 16:22:53 +0000219 assert_payload_verification_with_initrd_fails(
Alice Wangbf7fadd2023-01-13 12:18:24 +0000220 &fs::read(UNSIGNED_TEST_IMG_PATH)?,
221 &load_latest_initrd_normal()?,
Alice Wang4e55dd92023-01-11 10:17:01 +0000222 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700223 avb::SlotVerifyError::Io.into(),
Alice Wangbf7fadd2023-01-13 12:18:24 +0000224 )
225}
226
227#[test]
228fn tampered_kernel_fails_verification() -> Result<()> {
229 let mut kernel = load_latest_signed_kernel()?;
230 kernel[1] = !kernel[1]; // Flip the bits
231
Alice Wang1f0add02023-01-23 16:22:53 +0000232 assert_payload_verification_with_initrd_fails(
Alice Wangbf7fadd2023-01-13 12:18:24 +0000233 &kernel,
234 &load_latest_initrd_normal()?,
Alice Wang4e55dd92023-01-11 10:17:01 +0000235 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700236 avb::SlotVerifyError::Verification.into(),
Alice Wangbf7fadd2023-01-13 12:18:24 +0000237 )
238}
239
240#[test]
Alice Wangfaceff42023-01-19 09:54:38 +0000241fn kernel_footer_with_vbmeta_offset_overwritten_fails_verification() -> Result<()> {
242 // Arrange.
243 let mut kernel = load_latest_signed_kernel()?;
244 let total_len = kernel.len() as u64;
245 let footer = extract_avb_footer(&kernel)?;
246 assert!(footer.vbmeta_offset < total_len);
Alan Stokes196192b2023-07-24 11:44:08 +0100247 // TODO: use core::mem::offset_of once stable.
248 let footer_addr = ptr::addr_of!(footer) as *const u8;
Alice Wangfaceff42023-01-19 09:54:38 +0000249 let vbmeta_offset_addr = ptr::addr_of!(footer.vbmeta_offset) as *const u8;
Alice Wangfaceff42023-01-19 09:54:38 +0000250 let vbmeta_offset_start =
Alan Stokes196192b2023-07-24 11:44:08 +0100251 // SAFETY:
252 // - both raw pointers `vbmeta_offset_addr` and `footer_addr` are not null;
253 // - they are both derived from the `footer` object;
254 // - the offset is known from the struct definition to be a small positive number of bytes.
255 unsafe { vbmeta_offset_addr.offset_from(footer_addr) };
Alice Wangfaceff42023-01-19 09:54:38 +0000256 let footer_start = kernel.len() - size_of::<AvbFooter>();
257 let vbmeta_offset_start = footer_start + usize::try_from(vbmeta_offset_start)?;
258
259 let wrong_offsets = [total_len, u64::MAX];
260 for &wrong_offset in wrong_offsets.iter() {
261 // Act.
262 kernel[vbmeta_offset_start..(vbmeta_offset_start + size_of::<u64>())]
263 .copy_from_slice(&wrong_offset.to_be_bytes());
264
265 // Assert.
Inseob Kim8ebf1da2023-01-27 18:12:57 +0900266 let footer = extract_avb_footer(&kernel)?;
267 // footer is unaligned; copy vbmeta_offset to local variable
268 let vbmeta_offset = footer.vbmeta_offset;
269 assert_eq!(wrong_offset, vbmeta_offset);
Alice Wang1f0add02023-01-23 16:22:53 +0000270 assert_payload_verification_with_initrd_fails(
Alice Wangfaceff42023-01-19 09:54:38 +0000271 &kernel,
272 &load_latest_initrd_normal()?,
273 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700274 avb::SlotVerifyError::Io.into(),
Alice Wangfaceff42023-01-19 09:54:38 +0000275 )?;
276 }
277 Ok(())
278}
279
280#[test]
Alice Wangbf7fadd2023-01-13 12:18:24 +0000281fn tampered_kernel_footer_fails_verification() -> Result<()> {
282 let mut kernel = load_latest_signed_kernel()?;
283 let avb_footer_index = kernel.len() - size_of::<AvbFooter>() + RANDOM_FOOTER_POS;
284 kernel[avb_footer_index] = !kernel[avb_footer_index];
285
Alice Wang1f0add02023-01-23 16:22:53 +0000286 assert_payload_verification_with_initrd_fails(
Alice Wangbf7fadd2023-01-13 12:18:24 +0000287 &kernel,
288 &load_latest_initrd_normal()?,
Alice Wang4e55dd92023-01-11 10:17:01 +0000289 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700290 avb::SlotVerifyError::InvalidMetadata.into(),
Alice Wangbf7fadd2023-01-13 12:18:24 +0000291 )
292}
293
Alice Wang58dac082023-01-13 13:03:59 +0000294#[test]
Alice Wang75d05632023-01-25 13:31:18 +0000295fn extended_initrd_fails_verification() -> Result<()> {
296 let mut initrd = load_latest_initrd_normal()?;
297 initrd.extend(b"androidboot.vbmeta.digest=1111");
298
Alice Wang1f0add02023-01-23 16:22:53 +0000299 assert_payload_verification_with_initrd_fails(
Alice Wang75d05632023-01-25 13:31:18 +0000300 &load_latest_signed_kernel()?,
301 &initrd,
302 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700303 avb::SlotVerifyError::Verification.into(),
Alice Wang75d05632023-01-25 13:31:18 +0000304 )
305}
306
307#[test]
Alice Wang58dac082023-01-13 13:03:59 +0000308fn tampered_vbmeta_fails_verification() -> Result<()> {
309 let mut kernel = load_latest_signed_kernel()?;
310 let footer = extract_avb_footer(&kernel)?;
311 let vbmeta_index: usize = (footer.vbmeta_offset + 1).try_into()?;
312
313 kernel[vbmeta_index] = !kernel[vbmeta_index]; // Flip the bits
314
Alice Wang1f0add02023-01-23 16:22:53 +0000315 assert_payload_verification_with_initrd_fails(
Alice Wang58dac082023-01-13 13:03:59 +0000316 &kernel,
317 &load_latest_initrd_normal()?,
318 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700319 avb::SlotVerifyError::InvalidMetadata.into(),
Alice Wang58dac082023-01-13 13:03:59 +0000320 )
321}
322
323#[test]
324fn vbmeta_with_public_key_overwritten_fails_verification() -> Result<()> {
325 let mut kernel = load_latest_signed_kernel()?;
326 let footer = extract_avb_footer(&kernel)?;
327 let vbmeta_header = extract_vbmeta_header(&kernel, &footer)?;
328 let public_key_offset = footer.vbmeta_offset as usize
329 + size_of::<AvbVBMetaImageHeader>()
330 + vbmeta_header.authentication_data_block_size as usize
331 + vbmeta_header.public_key_offset as usize;
332 let public_key_size: usize = vbmeta_header.public_key_size.try_into()?;
333 let empty_public_key = vec![0u8; public_key_size];
334
335 kernel[public_key_offset..(public_key_offset + public_key_size)]
336 .copy_from_slice(&empty_public_key);
337
Alice Wang1f0add02023-01-23 16:22:53 +0000338 assert_payload_verification_with_initrd_fails(
Alice Wang58dac082023-01-13 13:03:59 +0000339 &kernel,
340 &load_latest_initrd_normal()?,
341 &empty_public_key,
David Pursella7c727b2023-08-14 16:24:40 -0700342 avb::SlotVerifyError::Verification.into(),
Alice Wang58dac082023-01-13 13:03:59 +0000343 )?;
Alice Wang1f0add02023-01-23 16:22:53 +0000344 assert_payload_verification_with_initrd_fails(
Alice Wang58dac082023-01-13 13:03:59 +0000345 &kernel,
346 &load_latest_initrd_normal()?,
347 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700348 avb::SlotVerifyError::Verification.into(),
Alice Wang58dac082023-01-13 13:03:59 +0000349 )
350}
351
Alice Wangf06bfd72023-01-19 09:24:21 +0000352#[test]
353fn vbmeta_with_verification_flag_disabled_fails_verification() -> Result<()> {
354 // From external/avb/libavb/avb_vbmeta_image.h
355 const AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED: u32 = 2;
356
357 // Arrange.
358 let mut kernel = load_latest_signed_kernel()?;
359 let footer = extract_avb_footer(&kernel)?;
360 let vbmeta_header = extract_vbmeta_header(&kernel, &footer)?;
Inseob Kim8ebf1da2023-01-27 18:12:57 +0900361
362 // vbmeta_header is unaligned; copy flags to local variable
363 let vbmeta_header_flags = vbmeta_header.flags;
364 assert_eq!(0, vbmeta_header_flags, "The disable flag should not be set in the latest kernel.");
Alice Wangf06bfd72023-01-19 09:24:21 +0000365 let flags_addr = ptr::addr_of!(vbmeta_header.flags) as *const u8;
366 // SAFETY: It is safe as both raw pointers `flags_addr` and `vbmeta_header` are not null.
367 let flags_offset = unsafe { flags_addr.offset_from(ptr::addr_of!(vbmeta_header) as *const u8) };
368 let flags_offset = usize::try_from(footer.vbmeta_offset)? + usize::try_from(flags_offset)?;
369
370 // Act.
371 kernel[flags_offset..(flags_offset + size_of::<u32>())]
372 .copy_from_slice(&AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED.to_be_bytes());
373
374 // Assert.
Inseob Kim8ebf1da2023-01-27 18:12:57 +0900375 let vbmeta_header = extract_vbmeta_header(&kernel, &footer)?;
376 // vbmeta_header is unaligned; copy flags to local variable
377 let vbmeta_header_flags = vbmeta_header.flags;
378 assert_eq!(
379 AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED, vbmeta_header_flags,
380 "VBMeta verification flag should be disabled now."
381 );
Alice Wang1f0add02023-01-23 16:22:53 +0000382 assert_payload_verification_with_initrd_fails(
Alice Wangf06bfd72023-01-19 09:24:21 +0000383 &kernel,
384 &load_latest_initrd_normal()?,
385 &load_trusted_public_key()?,
David Pursella7c727b2023-08-14 16:24:40 -0700386 avb::SlotVerifyError::Verification.into(),
Alice Wangf06bfd72023-01-19 09:24:21 +0000387 )
388}
Shikha Panwara26f16a2023-09-27 09:39:00 +0000389
390#[test]
391fn payload_with_rollback_index() -> Result<()> {
392 let public_key = load_trusted_public_key()?;
393 let verified_boot_data = verify_payload(
394 &fs::read(TEST_IMG_WITH_ROLLBACK_INDEX_5)?,
395 /* initrd= */ None,
396 &public_key,
397 )
398 .map_err(|e| anyhow!("Verification failed. Error: {}", e))?;
399
400 let kernel_digest = hash(&[&hex::decode("1211")?, &fs::read(UNSIGNED_TEST_IMG_PATH)?]);
401 let expected_boot_data = VerifiedBootData {
402 debug_level: DebugLevel::None,
403 kernel_digest,
404 initrd_digest: None,
405 public_key: &public_key,
406 capabilities: vec![],
407 rollback_index: 5,
408 };
409 assert_eq!(expected_boot_data, verified_boot_data);
410 Ok(())
411}