[apk_digest][test] Check v4 apk_digest is valid

This CL checks that the v4 apk_digest is valid for apks signed
with different v3 signature algorithms.

Bug: 247689066
Bug: 246254355
Test: libapkverify.integration_test
Change-Id: I9fdb3d547755e050bd241b0be1431b827da7ed5f
diff --git a/libs/apkverify/src/v3.rs b/libs/apkverify/src/v3.rs
index 875fec8..0fe2f2b 100644
--- a/libs/apkverify/src/v3.rs
+++ b/libs/apkverify/src/v3.rs
@@ -290,40 +290,3 @@
 pub(crate) fn to_hex_string(buf: &[u8]) -> String {
     buf.iter().map(|b| format!("{:02X}", b)).collect()
 }
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    use std::fs::File;
-
-    #[test]
-    fn test_pick_v4_apk_digest_only_with_v3_dsa_sha256() {
-        check_v4_apk_digest(
-            "tests/data/v3-only-with-dsa-sha256-1024.apk",
-            SignatureAlgorithmID::DsaWithSha256,
-            "0DF2426EA33AEDAF495D88E5BE0C6A1663FF0A81C5ED12D5B2929AE4B4300F2F",
-        );
-    }
-
-    #[test]
-    fn test_pick_v4_apk_digest_only_with_v3_pkcs1_sha512() {
-        check_v4_apk_digest(
-            "tests/data/v3-only-with-rsa-pkcs1-sha512-1024.apk",
-            SignatureAlgorithmID::RsaPkcs1V15WithSha512,
-            "9B9AE02DA60B18999BF541790F00D380006FDF0655C3C482AA0BB0AF17CF7A42\
-             ECF56B973518546C9080B2FEF83027E895ED2882BFC88EA19790BBAB29AF53B3",
-        );
-    }
-
-    fn check_v4_apk_digest(
-        apk_filename: &str,
-        expected_algorithm: SignatureAlgorithmID,
-        expected_digest: &str,
-    ) {
-        let apk_file = File::open(apk_filename).unwrap();
-        let (signature_algorithm_id, apk_digest) = pick_v4_apk_digest(apk_file).unwrap();
-
-        assert_eq!(expected_algorithm, signature_algorithm_id);
-        assert_eq!(expected_digest, to_hex_string(apk_digest.as_ref()));
-    }
-}
diff --git a/libs/apkverify/tests/apkverify_test.rs b/libs/apkverify/tests/apkverify_test.rs
index 03cb4bb..5bd901d 100644
--- a/libs/apkverify/tests/apkverify_test.rs
+++ b/libs/apkverify/tests/apkverify_test.rs
@@ -14,7 +14,9 @@
  * limitations under the License.
  */
 
-use apkverify::{get_public_key_der, testing::assert_contains, verify};
+use apkverify::{
+    get_public_key_der, pick_v4_apk_digest, testing::assert_contains, verify, SignatureAlgorithmID,
+};
 use std::{fs, matches, path::Path};
 
 const KEY_NAMES_DSA: &[&str] = &["1024", "2048", "3072"];
@@ -33,8 +35,8 @@
 }
 
 #[test]
-fn test_verify_v3() {
-    validate_apk_public_key("tests/data/test.apex");
+fn apex_signed_with_v3_rsa_pkcs1_sha512_is_valid() {
+    validate_apk("tests/data/test.apex", SignatureAlgorithmID::RsaPkcs1V15WithSha512);
 }
 
 #[test]
@@ -46,37 +48,54 @@
     }
 }
 
+/// TODO(b/197052981): DSA algorithm is not yet supported.
 #[test]
-fn test_verify_v3_ecdsa_sha256() {
+fn apks_signed_with_v3_dsa_sha256_have_valid_apk_digest() {
+    for key_name in KEY_NAMES_DSA.iter() {
+        validate_apk_digest(
+            format!("tests/data/v3-only-with-dsa-sha256-{}.apk", key_name),
+            SignatureAlgorithmID::DsaWithSha256,
+        );
+    }
+}
+
+#[test]
+fn apks_signed_with_v3_ecdsa_sha256_are_valid() {
     for key_name in KEY_NAMES_ECDSA.iter() {
-        validate_apk_public_key(format!("tests/data/v3-only-with-ecdsa-sha256-{}.apk", key_name));
+        validate_apk(
+            format!("tests/data/v3-only-with-ecdsa-sha256-{}.apk", key_name),
+            SignatureAlgorithmID::EcdsaWithSha256,
+        );
     }
 }
 
 #[test]
-fn test_verify_v3_ecdsa_sha512() {
+fn apks_signed_with_v3_ecdsa_sha512_are_valid() {
     for key_name in KEY_NAMES_ECDSA.iter() {
-        validate_apk_public_key(format!("tests/data/v3-only-with-ecdsa-sha512-{}.apk", key_name));
+        validate_apk(
+            format!("tests/data/v3-only-with-ecdsa-sha512-{}.apk", key_name),
+            SignatureAlgorithmID::EcdsaWithSha512,
+        );
     }
 }
 
 #[test]
-fn test_verify_v3_rsa_sha256() {
+fn apks_signed_with_v3_rsa_pkcs1_sha256_are_valid() {
     for key_name in KEY_NAMES_RSA.iter() {
-        validate_apk_public_key(format!(
-            "tests/data/v3-only-with-rsa-pkcs1-sha256-{}.apk",
-            key_name
-        ));
+        validate_apk(
+            format!("tests/data/v3-only-with-rsa-pkcs1-sha256-{}.apk", key_name),
+            SignatureAlgorithmID::RsaPkcs1V15WithSha256,
+        );
     }
 }
 
 #[test]
-fn test_verify_v3_rsa_sha512() {
+fn apks_signed_with_v3_rsa_pkcs1_sha512_are_valid() {
     for key_name in KEY_NAMES_RSA.iter() {
-        validate_apk_public_key(format!(
-            "tests/data/v3-only-with-rsa-pkcs1-sha512-{}.apk",
-            key_name
-        ));
+        validate_apk(
+            format!("tests/data/v3-only-with-rsa-pkcs1-sha512-{}.apk", key_name),
+            SignatureAlgorithmID::RsaPkcs1V15WithSha512,
+        );
     }
 }
 
@@ -168,50 +187,88 @@
 }
 
 #[test]
-fn test_verify_v3_unknown_additional_attr() {
-    validate_apk_public_key("tests/data/v3-only-unknown-additional-attr.apk");
+fn apk_signed_with_v3_unknown_additional_attr_is_valid() {
+    validate_apk(
+        "tests/data/v3-only-unknown-additional-attr.apk",
+        SignatureAlgorithmID::RsaPkcs1V15WithSha256,
+    );
 }
 
 #[test]
-fn test_verify_v3_unknown_pair_in_apk_sig_block() {
-    validate_apk_public_key("tests/data/v3-only-unknown-pair-in-apk-sig-block.apk");
+fn apk_signed_with_v3_unknown_pair_in_apk_sig_block_is_valid() {
+    validate_apk(
+        "tests/data/v3-only-unknown-pair-in-apk-sig-block.apk",
+        SignatureAlgorithmID::RsaPkcs1V15WithSha256,
+    );
 }
 
 #[test]
-fn test_verify_v3_ignorable_unsupported_sig_algs() {
-    validate_apk_public_key("tests/data/v3-only-with-ignorable-unsupported-sig-algs.apk");
+fn apk_signed_with_v3_ignorable_unsupported_sig_algs_is_valid() {
+    validate_apk(
+        "tests/data/v3-only-with-ignorable-unsupported-sig-algs.apk",
+        SignatureAlgorithmID::RsaPkcs1V15WithSha256,
+    );
 }
 
 #[test]
-fn test_verify_v3_stamp() {
-    validate_apk_public_key("tests/data/v3-only-with-stamp.apk");
+fn apk_signed_with_v3_stamp_is_valid() {
+    validate_apk("tests/data/v3-only-with-stamp.apk", SignatureAlgorithmID::EcdsaWithSha256);
 }
 
+fn validate_apk<P: AsRef<Path>>(apk_path: P, expected_algorithm_id: SignatureAlgorithmID) {
+    validate_apk_public_key(&apk_path);
+    validate_apk_digest(&apk_path, expected_algorithm_id);
+}
+
+/// Validates that the following public keys are equal:
+/// * public key from verification
+/// * public key extracted from apk without verification
+/// * expected public key from the corresponding .der file
 fn validate_apk_public_key<P: AsRef<Path>>(apk_path: P) {
-    // Validates public key from verification == expected public key.
-    let public_key_from_verification = verify(apk_path.as_ref());
+    let public_key_from_verification = verify(&apk_path);
     let public_key_from_verification =
         public_key_from_verification.expect("Error in verification result");
 
     let expected_public_key_path = format!("{}.der", apk_path.as_ref().to_str().unwrap());
-    assert!(
-        fs::metadata(&expected_public_key_path).is_ok(),
-        "File does not exist. You can re-create it with:\n$ echo -en {} > {}\n",
-        public_key_from_verification.iter().map(|b| format!("\\\\x{:02x}", b)).collect::<String>(),
-        expected_public_key_path
-    );
-    let expected_public_key = fs::read(&expected_public_key_path).unwrap();
-    assert_eq!(
-        expected_public_key,
-        public_key_from_verification.as_ref(),
-        "{}",
-        expected_public_key_path
-    );
+    assert_bytes_eq_to_data_in_file(&public_key_from_verification, expected_public_key_path);
 
-    // Validates public key extracted directly from apk
-    // (without verification) == expected public key.
-    let public_key_from_apk = get_public_key_der(apk_path.as_ref());
+    let public_key_from_apk = get_public_key_der(&apk_path);
     let public_key_from_apk =
         public_key_from_apk.expect("Error when extracting public key from apk");
-    assert_eq!(expected_public_key, public_key_from_apk.as_ref(), "{}", expected_public_key_path);
+    assert_eq!(
+        public_key_from_verification, public_key_from_apk,
+        "Public key extracted directly from apk does not match the public key from verification."
+    );
+}
+
+/// Validates that the following apk_digest are equal:
+/// * apk_digest directly extracted from apk without computation
+/// * expected apk digest from the corresponding .apk_digest file
+fn validate_apk_digest<P: AsRef<Path>>(apk_path: P, expected_algorithm_id: SignatureAlgorithmID) {
+    let apk = fs::File::open(&apk_path).expect("Unabled to open apk file");
+
+    let (signature_algorithm_id, digest_from_apk) =
+        pick_v4_apk_digest(apk).expect("Error when extracting apk digest.");
+
+    assert_eq!(expected_algorithm_id, signature_algorithm_id);
+    let expected_digest_path = format!("{}.apk_digest", apk_path.as_ref().to_str().unwrap());
+    assert_bytes_eq_to_data_in_file(&digest_from_apk, expected_digest_path);
+}
+
+fn assert_bytes_eq_to_data_in_file<P: AsRef<Path> + std::fmt::Display>(
+    bytes_data: &[u8],
+    expected_data_path: P,
+) {
+    assert!(
+        fs::metadata(&expected_data_path).is_ok(),
+        "File does not exist. You can re-create it with:\n$ echo -en {} > {}\n",
+        bytes_data.iter().map(|b| format!("\\\\x{:02x}", b)).collect::<String>(),
+        expected_data_path
+    );
+    let expected_data = fs::read(&expected_data_path).unwrap();
+    assert_eq!(
+        expected_data, bytes_data,
+        "Actual data does not match the data from: {}",
+        expected_data_path
+    );
 }
diff --git a/libs/apkverify/tests/data/README.md b/libs/apkverify/tests/data/README.md
index 7556921..7ba5d8e 100644
--- a/libs/apkverify/tests/data/README.md
+++ b/libs/apkverify/tests/data/README.md
@@ -1,6 +1,10 @@
+# About test data
+
+## .apk
+
 test.apex is copied from ADBD apex built in AOSP.
 
-```sh
+```bash
 $ apksigner verify -v test.apex
 Verifies
 Verified using v1 scheme (JAR signing): false
@@ -11,4 +15,20 @@
 Number of signers: 1
 ```
 
-APK files are copied from tools/apksig/src/test/resources/com/android/apksig/.
+APK files are copied from [tools/apksig/src/test/resources/com/android/apksig/](https://cs.android.com/android/platform/superproject/+/master:tools/apksig/src/test/resources/com/android/apksig/;l=1;drc=c2a8da1913d7fb359b023bf200e31d75ff22a5c3).
+
+## .der
+
+`.der` files contain the expected public keys. When validating the public keys in tests, if the corresponding `.der` file is missing, there will be some text as follows in the failure message:
+
+```bash
+$ echo -en \\x30\\x59\\x30\\x13\\x06\\x07\\x2a\\x86\\x48\\xce\\x3d\\x02\\x01\\x06\\x08\\x2a\\x86\\x48\\xce\\x3d\\x03\\x01\\x07\\x03\\x42\\x00\\x04\\xa6\\x5f\\x11\\x3d\\x22\\xcb\\x49\\x13\\x90\\x83\\x07\\xac\\x31\\xee\\x2b\\xa0\\xe9\\x13\\x8b\\x78\\x5f\\xac\\x65\\x36\\xd1\\x4e\\xa2\\xce\\x90\\xd2\\xb4\\xbf\\xe1\\x94\\xb5\\x0c\\xdc\\x8e\\x16\\x9f\\x54\\xa7\\x3a\\x99\\x1e\\xf0\\xfa\\x76\\x32\\x98\\x25\\xbe\\x07\\x8c\\xc7\\x82\\x74\\x07\\x03\\xda\\x44\\xb4\\xd7\\xeb > tests/data/v3-only-with-stamp.apk.der
+```
+
+You just need to execute this command in the folder `libs/apkverify` to generate the corresponding `.der` file. After it, you can run the test again, and the test will pass.
+
+Otherwise, you can also use the command `apksigner verify --min-sdk-version 24 --print-certs-pem tests/data/v3-only-with-stamp.apk` to get the public key in `.pem` format and then convert it to `.der` with openssl.
+
+## .apk_digest
+
+`.apk_digest` files contain the expected [apk_digest](https://source.android.com/docs/security/features/apksigning/v4#apk-digest). They are generated the same way as `.der` when validating the apk_digest.
\ No newline at end of file
diff --git a/libs/apkverify/tests/data/test.apex.apk_digest b/libs/apkverify/tests/data/test.apex.apk_digest
new file mode 100644
index 0000000..09a7340
--- /dev/null
+++ b/libs/apkverify/tests/data/test.apex.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-unknown-additional-attr.apk.apk_digest b/libs/apkverify/tests/data/v3-only-unknown-additional-attr.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-unknown-additional-attr.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-unknown-pair-in-apk-sig-block.apk.apk_digest b/libs/apkverify/tests/data/v3-only-unknown-pair-in-apk-sig-block.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-unknown-pair-in-apk-sig-block.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-dsa-sha256-1024.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-dsa-sha256-1024.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-dsa-sha256-1024.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-dsa-sha256-2048.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-dsa-sha256-2048.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-dsa-sha256-2048.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-dsa-sha256-3072.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-dsa-sha256-3072.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-dsa-sha256-3072.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-ecdsa-sha256-p256.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha256-p256.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha256-p256.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-ecdsa-sha256-p384.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha256-p384.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha256-p384.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-ecdsa-sha256-p521.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha256-p521.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha256-p521.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-ecdsa-sha512-p256.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha512-p256.apk.apk_digest
new file mode 100644
index 0000000..4fe1b65
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha512-p256.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-ecdsa-sha512-p384.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha512-p384.apk.apk_digest
new file mode 100644
index 0000000..4fe1b65
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha512-p384.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-ecdsa-sha512-p521.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha512-p521.apk.apk_digest
new file mode 100644
index 0000000..4fe1b65
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-ecdsa-sha512-p521.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-ignorable-unsupported-sig-algs.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-ignorable-unsupported-sig-algs.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-ignorable-unsupported-sig-algs.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-1024.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-1024.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-1024.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-16384.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-16384.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-16384.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-2048.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-2048.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-2048.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-3072.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-3072.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-3072.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-4096.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-4096.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-4096.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-8192.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-8192.apk.apk_digest
new file mode 100644
index 0000000..c5aec18
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha256-8192.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-1024.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-1024.apk.apk_digest
new file mode 100644
index 0000000..4fe1b65
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-1024.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-16384.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-16384.apk.apk_digest
new file mode 100644
index 0000000..4fe1b65
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-16384.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-2048.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-2048.apk.apk_digest
new file mode 100644
index 0000000..4fe1b65
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-2048.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-3072.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-3072.apk.apk_digest
new file mode 100644
index 0000000..4fe1b65
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-3072.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-4096.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-4096.apk.apk_digest
new file mode 100644
index 0000000..4fe1b65
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-4096.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-8192.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-8192.apk.apk_digest
new file mode 100644
index 0000000..4fe1b65
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-rsa-pkcs1-sha512-8192.apk.apk_digest
Binary files differ
diff --git a/libs/apkverify/tests/data/v3-only-with-stamp.apk.apk_digest b/libs/apkverify/tests/data/v3-only-with-stamp.apk.apk_digest
new file mode 100644
index 0000000..a29c2a9
--- /dev/null
+++ b/libs/apkverify/tests/data/v3-only-with-stamp.apk.apk_digest
@@ -0,0 +1 @@
+bk¶GÀ—§ÿ¥/ØèEù@=^'÷¥¨u.G³4_¸/\
\ No newline at end of file