Parse APK manifest to extract version etc
Add libapkmanifest to encapsulate the parsing, with a small C++
library on top of libandroidfw.
Extract the zip-handling code from libapkverify into a separate
libapkzip, and fix up a bunch of tests tests, to keep the build happy.
We don't do anything with the manifest information except log it; more
to come in another CL.
Bug: 299591171
Test: atest libapkzip.test libapkverify.integration_test
libapkverify.test
Test: Manual - run VM, inspect logs.
Change-Id: I56d3bb7309d43ecb598a33320705d31948710f83
diff --git a/libs/apkverify/tests/apkverify_test.rs b/libs/apkverify/tests/apkverify_test.rs
index 52e1da4..680c81e 100644
--- a/libs/apkverify/tests/apkverify_test.rs
+++ b/libs/apkverify/tests/apkverify_test.rs
@@ -17,7 +17,10 @@
use apkverify::{
get_apk_digest, get_public_key_der, testing::assert_contains, verify, SignatureAlgorithmID,
};
+use apkzip::zip_sections;
+use byteorder::{LittleEndian, ReadBytesExt};
use log::info;
+use std::io::{Seek, SeekFrom};
use std::{fs, matches, path::Path};
const KEY_NAMES_DSA: &[&str] = &["1024", "2048", "3072"];
@@ -37,6 +40,28 @@
}
#[test]
+fn test_zip_sections_with_apk() {
+ let mut reader = fs::File::open("tests/data/v3-only-with-stamp.apk").unwrap();
+ let sections = zip_sections(&mut reader).unwrap();
+
+ // Checks Central directory.
+ assert_eq!(
+ sections.central_directory_offset + sections.central_directory_size,
+ sections.eocd_offset
+ );
+
+ // Checks EOCD.
+ const EOCD_SIGNATURE: u32 = 0x06054b50;
+
+ reader.seek(SeekFrom::Start(sections.eocd_offset as u64)).unwrap();
+ assert_eq!(reader.read_u32::<LittleEndian>().unwrap(), EOCD_SIGNATURE);
+ assert_eq!(
+ reader.metadata().unwrap().len(),
+ (sections.eocd_offset + sections.eocd_size) as u64
+ );
+}
+
+#[test]
fn test_verify_truncated_cd() {
setup();
use zip::result::ZipError;
@@ -284,7 +309,7 @@
let apk = fs::File::open(&apk_path).expect("Unabled to open apk file");
let (verified_algorithm_id, verified_digest) =
- get_apk_digest(&apk, SDK_INT, /*verify=*/ true)
+ get_apk_digest(&apk, SDK_INT, /* verify= */ true)
.expect("Error when extracting apk digest with verification.");
assert_eq!(expected_algorithm_id, verified_algorithm_id);
@@ -292,7 +317,7 @@
assert_bytes_eq_to_data_in_file(&verified_digest, expected_digest_path);
let (unverified_algorithm_id, unverified_digest) =
- get_apk_digest(&apk, SDK_INT, /*verify=*/ false)
+ get_apk_digest(&apk, SDK_INT, /* verify= */ false)
.expect("Error when extracting apk digest without verification.");
assert_eq!(expected_algorithm_id, unverified_algorithm_id);
assert_eq!(verified_digest, unverified_digest);