release-request-d8901a87-7dd0-4cc8-a44e-d04982e429da-for-git_oc-mr1-release-4198291 snap-temp-L50900000084068812

Change-Id: I19aff53d1dee20843225ad4f08e1c2df8f544e71
diff --git a/src/test/java/com/android/apksig/ApkVerifierTest.java b/src/test/java/com/android/apksig/ApkVerifierTest.java
index 2bb3487..05ffafb 100644
--- a/src/test/java/com/android/apksig/ApkVerifierTest.java
+++ b/src/test/java/com/android/apksig/ApkVerifierTest.java
@@ -714,6 +714,57 @@
         assertVerified(verify("mismatched-compression-method.apk"));
     }
 
+    @Test
+    public void testV1SignedAttrs() throws Exception {
+        assertVerified(verify("v1-only-with-signed-attrs.apk"));
+    }
+
+    @Test
+    public void testV1SignedAttrsNotInDerOrder() throws Exception {
+        // Android does not re-order SignedAttributes despite it being a SET OF. Pre-N, Android
+        // treated them as SEQUENCE OF, meaning no re-ordering is necessary. From N onwards, it
+        // treats them as SET OF, but does not re-encode into SET OF during verification if all
+        // attributes parsed fine.
+        assertVerified(verify("v1-only-with-signed-attrs-wrong-order.apk"));
+    }
+
+    @Test
+    public void testV1SignedAttrsMissingContentType() throws Exception {
+        // SignedAttributes must contain ContentType
+        assertVerificationFailure(
+                verify("v1-only-with-signed-attrs-missing-content-type.apk"),
+                Issue.JAR_SIG_VERIFY_EXCEPTION);
+    }
+
+    @Test
+    public void testV1SignedAttrsWrongContentType() throws Exception {
+        assertVerificationFailure(
+                verify("v1-only-with-signed-attrs-wrong-content-type.apk"),
+                Issue.JAR_SIG_DID_NOT_VERIFY);
+    }
+
+    @Test
+    public void testV1SignedAttrsMultipleGoodDigests() throws Exception {
+        // Only one digest must be present SignedAttributes
+        assertVerificationFailure(
+                verify("v1-only-with-signed-attrs-multiple-good-digests.apk"),
+                Issue.JAR_SIG_PARSE_EXCEPTION);
+    }
+
+    @Test
+    public void testV1SignedAttrsWrongDigest() throws Exception {
+        assertVerificationFailure(
+                verify("v1-only-with-signed-attrs-wrong-digest.apk"),
+                Issue.JAR_SIG_DID_NOT_VERIFY);
+    }
+
+    @Test
+    public void testV1SignedAttrsWrongSignature() throws Exception {
+        assertVerificationFailure(
+                verify("v1-only-with-signed-attrs-wrong-signature.apk"),
+                Issue.JAR_SIG_DID_NOT_VERIFY);
+    }
+
     private ApkVerifier.Result verify(String apkFilenameInResources)
             throws IOException, ApkFormatException, NoSuchAlgorithmException {
         return verify(apkFilenameInResources, null, null);
@@ -817,7 +868,8 @@
                 if (msg.length() > 0) {
                     msg.append('\n');
                 }
-                msg.append("JAR signer ").append(signerName).append(": ").append(issue);
+                msg.append("JAR signer ").append(signerName).append(": ")
+                        .append(issue.getIssue()).append(" ").append(issue);
             }
         }
         for (ApkVerifier.Result.V2SchemeSignerInfo signer : result.getV2SchemeSigners()) {
diff --git a/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-missing-content-type.apk b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-missing-content-type.apk
new file mode 100644
index 0000000..0a3ae81
--- /dev/null
+++ b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-missing-content-type.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-multiple-good-digests.apk b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-multiple-good-digests.apk
new file mode 100644
index 0000000..e207261
--- /dev/null
+++ b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-multiple-good-digests.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-content-type.apk b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-content-type.apk
new file mode 100644
index 0000000..37b8560
--- /dev/null
+++ b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-content-type.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-digest.apk b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-digest.apk
new file mode 100644
index 0000000..9968555
--- /dev/null
+++ b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-digest.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-order.apk b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-order.apk
new file mode 100644
index 0000000..8a7c53e
--- /dev/null
+++ b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-order.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-signature.apk b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-signature.apk
new file mode 100644
index 0000000..a686fbf
--- /dev/null
+++ b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs-wrong-signature.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v1-only-with-signed-attrs.apk b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs.apk
new file mode 100644
index 0000000..49b1d83
--- /dev/null
+++ b/src/test/resources/com/android/apksig/v1-only-with-signed-attrs.apk
Binary files differ