Snap for 8730993 from ab50f0a22c4a770bb914d18483a6cc1dd930182b to mainline-tzdata3-release

Change-Id: I23d5d80dd9244ec01bf7bdfb5dbbf9439037232a
diff --git a/Android.bp b/Android.bp
index b218132..09cddbf 100644
--- a/Android.bp
+++ b/Android.bp
@@ -39,11 +39,6 @@
         "src/main/java/**/*.java",
     ],
     java_version: "1.8",
-    target: {
-        windows: {
-            enabled: true,
-        },
-    },
 }
 
 // apksigner command-line tool for signing APKs and verifying their signatures
@@ -58,14 +53,6 @@
         "apksig",
         "conscrypt-unbundled",
     ],
+    jni_libs: ["libconscrypt_openjdk_jni"],
     java_version: "1.8",
-    target: {
-        not_windows: {
-            jni_libs: ["libconscrypt_openjdk_jni"],
-        },
-        windows: {
-            enabled: true,
-            wrapper: "etc/apksigner.bat",
-        },
-    },
 }
diff --git a/build.gradle b/build.gradle
index fe75e9a..4c05a77 100644
--- a/build.gradle
+++ b/build.gradle
@@ -22,7 +22,6 @@
     implementation 'com.google.protobuf:protobuf-javalite:3.8.0'
     testImplementation 'junit:junit:4.13'
     testImplementation 'org.bouncycastle:bcprov-jdk15on:1.68'
-    testImplementation 'org.conscrypt:conscrypt-openjdk-uber:2.5.1'
 }
 
 protobuf {
diff --git a/src/apksigner/java/com/android/apksigner/ApkSignerTool.java b/src/apksigner/java/com/android/apksigner/ApkSignerTool.java
index 742a966..9fd0c34 100644
--- a/src/apksigner/java/com/android/apksigner/ApkSignerTool.java
+++ b/src/apksigner/java/com/android/apksigner/ApkSignerTool.java
@@ -22,7 +22,6 @@
 import com.android.apksig.SigningCertificateLineage.SignerCapabilities;
 import com.android.apksig.apk.ApkFormatException;
 import com.android.apksig.apk.MinSdkVersionException;
-import com.android.apksig.internal.apk.v3.V3SchemeConstants;
 import com.android.apksig.util.DataSource;
 import com.android.apksig.util.DataSources;
 
@@ -49,7 +48,6 @@
 import java.security.interfaces.RSAKey;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Base64;
 import java.util.List;
 
 /**
@@ -64,8 +62,6 @@
     private static final String HELP_PAGE_VERIFY = "help_verify.txt";
     private static final String HELP_PAGE_ROTATE = "help_rotate.txt";
     private static final String HELP_PAGE_LINEAGE = "help_lineage.txt";
-    private static final String BEGIN_CERTIFICATE = "-----BEGIN CERTIFICATE-----";
-    private static final String END_CERTIFICATE = "-----END CERTIFICATE-----";
 
     private static MessageDigest sha256 = null;
     private static MessageDigest sha1 = null;
@@ -151,8 +147,6 @@
         int minSdkVersion = 1;
         boolean minSdkVersionSpecified = false;
         int maxSdkVersion = Integer.MAX_VALUE;
-        int rotationMinSdkVersion = V3SchemeConstants.DEFAULT_ROTATION_MIN_SDK_VERSION;
-        boolean rotationTargetsDevRelease = false;
         List<SignerParams> signers = new ArrayList<>(1);
         SignerParams signerParams = new SignerParams();
         SigningCertificateLineage lineage = null;
@@ -181,13 +175,7 @@
                 minSdkVersionSpecified = true;
             } else if ("max-sdk-version".equals(optionName)) {
                 maxSdkVersion = optionsParser.getRequiredIntValue("Maximum API Level");
-            } else if ("rotation-min-sdk-version".equals(optionName)) {
-                rotationMinSdkVersion = optionsParser.getRequiredIntValue(
-                        "Minimum API Level for Rotation");
-            } else if ("rotation-targets-dev-release".equals(optionName)) {
-                rotationTargetsDevRelease = optionsParser.getOptionalBooleanValue(true);
-            }
-            else if ("v1-signing-enabled".equals(optionName)) {
+            } else if ("v1-signing-enabled".equals(optionName)) {
                 v1SigningEnabled = optionsParser.getOptionalBooleanValue(true);
             } else if ("v2-signing-enabled".equals(optionName)) {
                 v2SigningEnabled = optionsParser.getOptionalBooleanValue(true);
@@ -374,9 +362,7 @@
                         .setVerityEnabled(verityEnabled)
                         .setV4ErrorReportingEnabled(v4SigningEnabled && v4SigningFlagFound)
                         .setDebuggableApkPermitted(debuggableApkPermitted)
-                        .setSigningCertificateLineage(lineage)
-                        .setMinSdkVersionForRotation(rotationMinSdkVersion)
-                        .setRotationTargetsDevRelease(rotationTargetsDevRelease);
+                        .setSigningCertificateLineage(lineage);
         if (minSdkVersionSpecified) {
             apkSignerBuilder.setMinSdkVersion(minSdkVersion);
         }
@@ -464,7 +450,6 @@
         int maxSdkVersion = Integer.MAX_VALUE;
         boolean maxSdkVersionSpecified = false;
         boolean printCerts = false;
-        boolean printCertsPem = false;
         boolean verbose = false;
         boolean warningsTreatedAsErrors = false;
         boolean verifySourceStamp = false;
@@ -483,13 +468,6 @@
                 maxSdkVersionSpecified = true;
             } else if ("print-certs".equals(optionName)) {
                 printCerts = optionsParser.getOptionalBooleanValue(true);
-            } else if ("print-certs-pem".equals(optionName)) {
-                printCertsPem = optionsParser.getOptionalBooleanValue(true);
-                // If the PEM output of the certs is requested, this implicitly implies the
-                // cert details should be printed.
-                if (printCertsPem && !printCerts) {
-                    printCerts = true;
-                }
             } else if (("v".equals(optionName)) || ("verbose".equals(optionName))) {
                 verbose = optionsParser.getOptionalBooleanValue(true);
             } else if ("Werr".equals(optionName)) {
@@ -590,9 +568,6 @@
                         "Verified using v3 scheme (APK Signature Scheme v3): "
                                 + result.isVerifiedUsingV3Scheme());
                 System.out.println(
-                        "Verified using v3.1 scheme (APK Signature Scheme v3.1): "
-                                + result.isVerifiedUsingV31Scheme());
-                System.out.println(
                         "Verified using v4 scheme (APK Signature Scheme v4): "
                                 + result.isVerifiedUsingV4Scheme());
                 System.out.println("Verified for SourceStamp: " + result.isSourceStampVerified());
@@ -601,37 +576,14 @@
                 }
             }
             if (printCerts) {
-                // The v3.1 signature scheme allows key rotation to target T+ while the original
-                // signing key can still be used with v3.0; if a v3.1 block is present then also
-                // include the target SDK versions for both rotation and the original signing key.
-                if (result.isVerifiedUsingV31Scheme()) {
-                    for (ApkVerifier.Result.V3SchemeSignerInfo signer :
-                            result.getV31SchemeSigners()) {
-
-                        printCertificate(signer.getCertificate(),
-                                "Signer (minSdkVersion=" + signer.getMinSdkVersion()
-                                        + (signer.getRotationTargetsDevRelease()
-                                        ? " (dev release=true)" : "")
-                                        + ", maxSdkVersion=" + signer.getMaxSdkVersion() + ")",
-                                verbose, printCertsPem);
-                    }
-                    for (ApkVerifier.Result.V3SchemeSignerInfo signer : result.getV3SchemeSigners()) {
-                        printCertificate(signer.getCertificate(),
-                                "Signer (minSdkVersion=" + signer.getMinSdkVersion()
-                                        + ", maxSdkVersion=" + signer.getMaxSdkVersion() + ")",
-                                verbose, printCertsPem);
-                    }
-                } else {
-                    int signerNumber = 0;
-                    for (X509Certificate signerCert : signerCerts) {
-                        signerNumber++;
-                        printCertificate(signerCert, "Signer #" + signerNumber, verbose,
-                                printCertsPem);
-                    }
+                int signerNumber = 0;
+                for (X509Certificate signerCert : signerCerts) {
+                    signerNumber++;
+                    printCertificate(signerCert, "Signer #" + signerNumber, verbose);
                 }
                 if (sourceStampInfo != null) {
                     printCertificate(sourceStampInfo.getCertificate(), "Source Stamp Signer",
-                            verbose, printCertsPem);
+                            verbose);
                 }
             }
         } else {
@@ -682,20 +634,6 @@
                         "WARNING: APK Signature Scheme v3 " + signerName + ": " + warning);
             }
         }
-        for (ApkVerifier.Result.V3SchemeSignerInfo signer : result.getV31SchemeSigners()) {
-            String signerName = "signer #" + (signer.getIndex() + 1) + "(minSdkVersion="
-                    + signer.getMinSdkVersion() + ", maxSdkVersion=" + signer.getMaxSdkVersion()
-                    + ")";
-            for (ApkVerifier.IssueWithParams error : signer.getErrors()) {
-                System.err.println(
-                        "ERROR: APK Signature Scheme v3.1 " + signerName + ": " + error);
-            }
-            for (ApkVerifier.IssueWithParams warning : signer.getWarnings()) {
-                warningsEncountered = true;
-                warningsOut.println(
-                        "WARNING: APK Signature Scheme v3.1 " + signerName + ": " + warning);
-            }
-        }
 
         if (sourceStampInfo != null) {
             for (ApkVerifier.IssueWithParams error : sourceStampInfo.getErrors()) {
@@ -856,7 +794,6 @@
 
         boolean verbose = false;
         boolean printCerts = false;
-        boolean printCertsPem = false;
         boolean lineageUpdated = false;
         File inputKeyLineage = null;
         File outputKeyLineage = null;
@@ -878,13 +815,6 @@
                 verbose = optionsParser.getOptionalBooleanValue(true);
             } else if ("print-certs".equals(optionName)) {
                 printCerts = optionsParser.getOptionalBooleanValue(true);
-            } else if ("print-certs-pem".equals(optionName)) {
-                printCertsPem = optionsParser.getOptionalBooleanValue(true);
-                // If the PEM output of the certs is requested, this implicitly implies the
-                // cert details should be printed.
-                if (printCertsPem && !printCerts) {
-                    printCerts = true;
-                }
             } else {
                 throw new ParameterException(
                         "Unsupported option: " + optionsParser.getOptionOriginalForm()
@@ -945,8 +875,7 @@
             for (int i = 0; i < signingCerts.size(); i++) {
                 X509Certificate signerCert = signingCerts.get(i);
                 SignerCapabilities signerCapabilities = lineage.getSignerCapabilities(signerCert);
-                printCertificate(signerCert, "Signer #" + (i + 1) + " in lineage", verbose,
-                        printCertsPem);
+                printCertificate(signerCert, "Signer #" + (i + 1) + " in lineage", verbose);
                 printCapabilities(signerCapabilities);
             }
         }
@@ -1078,29 +1007,19 @@
     }
 
     /**
-     * @see #printCertificate(X509Certificate, String, boolean, boolean)
-     */
-    public static void printCertificate(X509Certificate cert, String name, boolean verbose)
-            throws NoSuchAlgorithmException, CertificateEncodingException {
-        printCertificate(cert, name, verbose, false);
-    }
-
-    /**
      * Prints details from the provided certificate to stdout.
      *
      * @param cert    the certificate to be displayed.
      * @param name    the name to be used to identify the certificate.
      * @param verbose boolean indicating whether public key details from the certificate should be
      *                displayed.
-     * @param pemOutput boolean indicating whether the PEM encoding of the certificate should be
-     *                  displayed.
      * @throws NoSuchAlgorithmException     if an instance of MD5, SHA-1, or SHA-256 cannot be
      *                                      obtained.
      * @throws CertificateEncodingException if an error is encountered when encoding the
      *                                      certificate.
      */
-    public static void printCertificate(X509Certificate cert, String name, boolean verbose,
-            boolean pemOutput) throws NoSuchAlgorithmException, CertificateEncodingException {
+    public static void printCertificate(X509Certificate cert, String name, boolean verbose)
+            throws NoSuchAlgorithmException, CertificateEncodingException {
         if (cert == null) {
             throw new NullPointerException("cert == null");
         }
@@ -1145,18 +1064,6 @@
             System.out.println(
                     name + " public key MD5 digest: " + HexEncoding.encode(md5.digest(encodedKey)));
         }
-
-        if (pemOutput) {
-            System.out.println(BEGIN_CERTIFICATE);
-            final int lineWidth = 64;
-            String pemEncodedCert = Base64.getEncoder().encodeToString(cert.getEncoded());
-            for (int i = 0; i < pemEncodedCert.length(); i += lineWidth) {
-                System.out.println(pemEncodedCert.substring(i, i + lineWidth > pemEncodedCert.length()
-                        ? pemEncodedCert.length()
-                        : i + lineWidth));
-            }
-            System.out.println(END_CERTIFICATE);
-        }
     }
 
     /**
diff --git a/src/apksigner/java/com/android/apksigner/help_lineage.txt b/src/apksigner/java/com/android/apksigner/help_lineage.txt
index 8fe410b..3f4922d 100644
--- a/src/apksigner/java/com/android/apksigner/help_lineage.txt
+++ b/src/apksigner/java/com/android/apksigner/help_lineage.txt
@@ -19,10 +19,6 @@
 --print-certs         Show information about the signing certificates and their capabilities
                       in the SigningCertificateLineage.
 
---print-certs-pem     Show information about the signing certificates and their capabilities
-                      in the SigningCertificateLineage; prints the PEM encoding of each signing
-                      certificate to stdout.
-
 -v, --verbose         Verbose output mode.
 
 -h, --help            Show help about this command and exit.
diff --git a/src/apksigner/java/com/android/apksigner/help_rotate.txt b/src/apksigner/java/com/android/apksigner/help_rotate.txt
index d19136b..ff58372 100644
--- a/src/apksigner/java/com/android/apksigner/help_rotate.txt
+++ b/src/apksigner/java/com/android/apksigner/help_rotate.txt
@@ -43,17 +43,10 @@
 by a newer signing certificate. By default, the new signer will have all
 capabilities, but the capability options can be specified for the new signer
 during rotation to act as a default level of trust when moving to a newer
-signing certificate. The capability options accept an optional boolean value of
+signing certificate.The capability options accept an optional boolean value of
 true or false; if this value is not specified then the option will default to
 true.
 
-Prior to Android 12, if multiple apps shared a common signer in their signing lineage
-with distinct capabilities assigned, a bug in the platform would cause the capabilities
-declared for this signer in one of the app's signing lineage to be assigned to this same
-common signer in the lineage of the rest of the apps. Apps that use the default capabilities,
-or that assign the same capabilities to a common signer in their lineage, are not impacted
-by this bug.
-
 
 --ks                  Load private key and certificate chain from the Java
                       KeyStore initialized from the specified file. NONE means
diff --git a/src/apksigner/java/com/android/apksigner/help_sign.txt b/src/apksigner/java/com/android/apksigner/help_sign.txt
index 66aec29..d66b7a3 100644
--- a/src/apksigner/java/com/android/apksigner/help_sign.txt
+++ b/src/apksigner/java/com/android/apksigner/help_sign.txt
@@ -61,24 +61,6 @@
 --max-sdk-version     Highest API Level on which this APK's signatures will be
                       verified. By default, the highest possible value is used.
 
---rotation-min-sdk-version  Lowest API Level for which an APK's rotated signing
-                      key should be used to produce the APK's signature. The
-                      original signing key for the APK will be used for all
-                      previous platform versions. Specifying a value <= 32
-                      (Android Sv2) will result in the original V3 signing block
-                      being used without platform targeting. By default,
-                      rotated signing keys will be used with the V3.1 signing
-                      block which supports Android T+.
-
---rotation-targets-dev-release  The specified rotation-min-sdk-version is intended
-                      for a platform release under development. During development
-                      of a new platform, the API Level of the previously released
-                      platform is used as the API Level of the development
-                      platform until the SDK is finalized. This flag allows
-                      targeting signing key rotation to a development platform
-                      with API Level X while preventing the rotated key from being
-                      used on the latest release platform with API Level X.
-
 --debuggable-apk-permitted  Whether to permit signing android:debuggable="true"
                       APKs. Android disables some of its security protections
                       for such apps. For example, anybody with ADB shell access
diff --git a/src/apksigner/java/com/android/apksigner/help_verify.txt b/src/apksigner/java/com/android/apksigner/help_verify.txt
index bc70924..c5cf663 100644
--- a/src/apksigner/java/com/android/apksigner/help_verify.txt
+++ b/src/apksigner/java/com/android/apksigner/help_verify.txt
@@ -11,9 +11,6 @@
 
 --print-certs         Show information about the APK's signing certificates
 
---print-certs-pem     Show information about the APK's signing certificates and prints the PEM
-                      encoding of each signing certificate to stdout.
-
 -v, --verbose         Verbose output mode
 
 --min-sdk-version     Lowest API Level on which this APK's signatures will be
diff --git a/src/main/java/com/android/apksig/ApkSigner.java b/src/main/java/com/android/apksig/ApkSigner.java
index 365fdbf..ca792c4 100644
--- a/src/main/java/com/android/apksig/ApkSigner.java
+++ b/src/main/java/com/android/apksig/ApkSigner.java
@@ -17,14 +17,11 @@
 package com.android.apksig;
 
 import static com.android.apksig.apk.ApkUtils.SOURCE_STAMP_CERTIFICATE_HASH_ZIP_ENTRY_NAME;
-import static com.android.apksig.internal.apk.v3.V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT;
-import static com.android.apksig.internal.apk.v3.V3SchemeConstants.MIN_SDK_WITH_V3_SUPPORT;
 
 import com.android.apksig.apk.ApkFormatException;
 import com.android.apksig.apk.ApkSigningBlockNotFoundException;
 import com.android.apksig.apk.ApkUtils;
 import com.android.apksig.apk.MinSdkVersionException;
-import com.android.apksig.internal.apk.v3.V3SchemeConstants;
 import com.android.apksig.internal.util.ByteBufferDataSource;
 import com.android.apksig.internal.zip.CentralDirectoryRecord;
 import com.android.apksig.internal.zip.EocdRecord;
@@ -92,8 +89,6 @@
     private final SigningCertificateLineage mSourceStampSigningCertificateLineage;
     private final boolean mForceSourceStampOverwrite;
     private final Integer mMinSdkVersion;
-    private final int mRotationMinSdkVersion;
-    private final boolean mRotationTargetsDevRelease;
     private final boolean mV1SigningEnabled;
     private final boolean mV2SigningEnabled;
     private final boolean mV3SigningEnabled;
@@ -123,8 +118,6 @@
             SigningCertificateLineage sourceStampSigningCertificateLineage,
             boolean forceSourceStampOverwrite,
             Integer minSdkVersion,
-            int rotationMinSdkVersion,
-            boolean rotationTargetsDevRelease,
             boolean v1SigningEnabled,
             boolean v2SigningEnabled,
             boolean v3SigningEnabled,
@@ -148,8 +141,6 @@
         mSourceStampSigningCertificateLineage = sourceStampSigningCertificateLineage;
         mForceSourceStampOverwrite = forceSourceStampOverwrite;
         mMinSdkVersion = minSdkVersion;
-        mRotationMinSdkVersion = rotationMinSdkVersion;
-        mRotationTargetsDevRelease = rotationTargetsDevRelease;
         mV1SigningEnabled = v1SigningEnabled;
         mV2SigningEnabled = v2SigningEnabled;
         mV3SigningEnabled = v3SigningEnabled;
@@ -305,9 +296,7 @@
                             .setVerityEnabled(mVerityEnabled)
                             .setDebuggableApkPermitted(mDebuggableApkPermitted)
                             .setOtherSignersSignaturesPreserved(mOtherSignersSignaturesPreserved)
-                            .setSigningCertificateLineage(mSigningCertificateLineage)
-                            .setMinSdkVersionForRotation(mRotationMinSdkVersion)
-                            .setRotationTargetsDevRelease(mRotationTargetsDevRelease);
+                            .setSigningCertificateLineage(mSigningCertificateLineage);
             if (mCreatedBy != null) {
                 signerEngineBuilder.setCreatedBy(mCreatedBy);
             }
@@ -1104,8 +1093,6 @@
         private boolean mOtherSignersSignaturesPreserved;
         private String mCreatedBy;
         private Integer mMinSdkVersion;
-        private int mRotationMinSdkVersion = V3SchemeConstants.DEFAULT_ROTATION_MIN_SDK_VERSION;
-        private boolean mRotationTargetsDevRelease = false;
 
         private final ApkSignerEngine mSignerEngine;
 
@@ -1314,58 +1301,6 @@
         }
 
         /**
-         * Sets the minimum Android platform version (API Level) for which an APK's rotated signing
-         * key should be used to produce the APK's signature. The original signing key for the APK
-         * will be used for all previous platform versions. If a rotated key with signing lineage is
-         * not provided then this method is a noop. This method is useful for overriding the
-         * default behavior where Android T is set as the minimum API level for rotation.
-         *
-         * <p><em>Note:</em>Specifying a {@code minSdkVersion} value <= 32 (Android Sv2) will result
-         * in the original V3 signing block being used without platform targeting.
-         *
-         * <p><em>Note:</em> This method may only be invoked when this builder is not initialized
-         * with an {@link ApkSignerEngine}.
-         *
-         * @throws IllegalStateException if this builder was initialized with an {@link
-         *     ApkSignerEngine}
-         */
-        public Builder setMinSdkVersionForRotation(int minSdkVersion) {
-            checkInitializedWithoutEngine();
-            // If the provided SDK version does not support v3.1, then use the default SDK version
-            // with rotation support.
-            if (minSdkVersion < MIN_SDK_WITH_V31_SUPPORT) {
-                mRotationMinSdkVersion = MIN_SDK_WITH_V3_SUPPORT;
-            } else {
-                mRotationMinSdkVersion = minSdkVersion;
-            }
-            return this;
-        }
-
-        /**
-         * Sets whether the rotation-min-sdk-version is intended to target a development release;
-         * this is primarily required after the T SDK is finalized, and an APK needs to target U
-         * during its development cycle for rotation.
-         *
-         * <p>This is only required after the T SDK is finalized since S and earlier releases do
-         * not know about the V3.1 block ID, but once T is released and work begins on U, U will
-         * use the SDK version of T during development. Specifying a rotation-min-sdk-version of T's
-         * SDK version along with setting {@code enabled} to true will allow an APK to use the
-         * rotated key on a device running U while causing this to be bypassed for T.
-         *
-         * <p><em>Note:</em>If the rotation-min-sdk-version is less than or equal to 32 (Android
-         * Sv2), then the rotated signing key will be used in the v3.0 signing block and this call
-         * will be a noop.
-         *
-         * <p><em>Note:</em> This method may only be invoked when this builder is not initialized
-         * with an {@link ApkSignerEngine}.
-         */
-        public Builder setRotationTargetsDevRelease(boolean enabled) {
-            checkInitializedWithoutEngine();
-            mRotationTargetsDevRelease = enabled;
-            return this;
-        }
-
-        /**
          * Sets whether the APK should be signed using JAR signing (aka v1 signature scheme).
          *
          * <p>By default, whether APK is signed using JAR signing is determined by {@code
@@ -1603,8 +1538,6 @@
                     mSourceStampSigningCertificateLineage,
                     mForceSourceStampOverwrite,
                     mMinSdkVersion,
-                    mRotationMinSdkVersion,
-                    mRotationTargetsDevRelease,
                     mV1SigningEnabled,
                     mV2SigningEnabled,
                     mV3SigningEnabled,
diff --git a/src/main/java/com/android/apksig/ApkVerificationIssue.java b/src/main/java/com/android/apksig/ApkVerificationIssue.java
index fa2b7aa..2aa9d0b 100644
--- a/src/main/java/com/android/apksig/ApkVerificationIssue.java
+++ b/src/main/java/com/android/apksig/ApkVerificationIssue.java
@@ -116,8 +116,6 @@
     public static final int JAR_SIG_NO_SIGNATURES = 36;
     /** An exception was encountered when parsing the V1 / jar signer in the signature block. */
     public static final int JAR_SIG_PARSE_EXCEPTION = 37;
-    /** The source stamp timestamp attribute has an invalid value. */
-    public static final int SOURCE_STAMP_INVALID_TIMESTAMP = 38;
 
     private final int mIssueId;
     private final String mFormat;
diff --git a/src/main/java/com/android/apksig/ApkVerifier.java b/src/main/java/com/android/apksig/ApkVerifier.java
index fc28864..354dfbd 100644
--- a/src/main/java/com/android/apksig/ApkVerifier.java
+++ b/src/main/java/com/android/apksig/ApkVerifier.java
@@ -24,7 +24,6 @@
 import static com.android.apksig.internal.apk.ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V3;
 import static com.android.apksig.internal.apk.ApkSigningBlockUtils.VERSION_JAR_SIGNATURE_SCHEME;
 import static com.android.apksig.internal.apk.v1.V1SchemeConstants.MANIFEST_ENTRY_NAME;
-import static com.android.apksig.internal.apk.v3.V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT;
 
 import com.android.apksig.apk.ApkFormatException;
 import com.android.apksig.apk.ApkUtils;
@@ -202,58 +201,23 @@
         Set<Integer> foundApkSigSchemeIds = new HashSet<>(2);
         if (maxSdkVersion >= AndroidSdkVersion.N) {
             RunnablesExecutor executor = RunnablesExecutor.SINGLE_THREADED;
-            // Android T and newer attempts to verify APKs using APK Signature Scheme V3.1. v3.0
-            // also includes stripping protection for the minimum SDK version on which the rotated
-            // signing key should be used.
-            int rotationMinSdkVersion = 0;
-            if (maxSdkVersion >= MIN_SDK_WITH_V31_SUPPORT) {
-                try {
-                    ApkSigningBlockUtils.Result v31Result = new V3SchemeVerifier.Builder(apk,
-                            zipSections, Math.max(minSdkVersion, MIN_SDK_WITH_V31_SUPPORT),
-                            maxSdkVersion)
-                            .setRunnablesExecutor(executor)
-                            .setBlockId(V3SchemeConstants.APK_SIGNATURE_SCHEME_V31_BLOCK_ID)
-                            .build()
-                            .verify();
-                    foundApkSigSchemeIds.add(ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V31);
-                    rotationMinSdkVersion = v31Result.signers.stream().mapToInt(
-                            signer -> signer.minSdkVersion).min().orElse(0);
-                    result.mergeFrom(v31Result);
-                    signatureSchemeApkContentDigests.put(
-                            ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V31,
-                            getApkContentDigestsFromSigningSchemeResult(v31Result));
-                } catch (ApkSigningBlockUtils.SignatureNotFoundException ignored) {
-                    // v3.1 signature not required
-                }
-                if (result.containsErrors()) {
-                    return result;
-                }
-            }
             // Android P and newer attempts to verify APKs using APK Signature Scheme v3
-            if (minSdkVersion < MIN_SDK_WITH_V31_SUPPORT || foundApkSigSchemeIds.isEmpty()) {
+            if (maxSdkVersion >= AndroidSdkVersion.P) {
                 try {
-                    V3SchemeVerifier.Builder builder = new V3SchemeVerifier.Builder(apk,
-                            zipSections, Math.max(minSdkVersion, AndroidSdkVersion.P),
-                            maxSdkVersion)
-                            .setRunnablesExecutor(executor)
-                            .setBlockId(V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID);
-                    if (rotationMinSdkVersion > 0) {
-                        builder.setRotationMinSdkVersion(rotationMinSdkVersion);
-                    }
-                    ApkSigningBlockUtils.Result v3Result = builder.build().verify();
+                    ApkSigningBlockUtils.Result v3Result =
+                            V3SchemeVerifier.verify(
+                                    executor,
+                                    apk,
+                                    zipSections,
+                                    Math.max(minSdkVersion, AndroidSdkVersion.P),
+                                    maxSdkVersion);
                     foundApkSigSchemeIds.add(ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V3);
                     result.mergeFrom(v3Result);
                     signatureSchemeApkContentDigests.put(
                             ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V3,
                             getApkContentDigestsFromSigningSchemeResult(v3Result));
                 } catch (ApkSigningBlockUtils.SignatureNotFoundException ignored) {
-                    // v3 signature not required unless a v3.1 signature was found as a v3.1
-                    // signature is intended to support key rotation on T+ with the v3 signature
-                    // containing the original signing key.
-                    if (foundApkSigSchemeIds.contains(
-                            ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V31)) {
-                        result.addError(Issue.V31_BLOCK_FOUND_WITHOUT_V3_BLOCK);
-                    }
+                    // v3 signature not required
                 }
                 if (result.containsErrors()) {
                     return result;
@@ -490,6 +454,9 @@
         // The apkDigest field in the v4 signature should match the selected v2/v3.
         if (result.isVerifiedUsingV4Scheme()) {
             List<Result.V4SchemeSignerInfo> v4Signers = result.getV4SchemeSigners();
+            if (v4Signers.size() != 1) {
+                result.addError(Issue.V4_SIG_MULTIPLE_SIGNERS);
+            }
 
             List<ApkSigningBlockUtils.Result.SignerInfo.ContentDigest> digestsFromV4 =
                     v4Signers.get(0).getContentDigests();
@@ -499,22 +466,21 @@
             final byte[] digestFromV4 = digestsFromV4.get(0).getValue();
 
             if (result.isVerifiedUsingV3Scheme()) {
-                int expectedSize = result.isVerifiedUsingV31Scheme() ? 2 : 1;
-                if (v4Signers.size() != expectedSize) {
+                List<Result.V3SchemeSignerInfo> v3Signers = result.getV3SchemeSigners();
+                if (v3Signers.size() != 1) {
                     result.addError(Issue.V4_SIG_MULTIPLE_SIGNERS);
                 }
 
-                checkV4Signer(result.getV3SchemeSigners(), v4Signers.get(0).mCerts, digestFromV4,
-                        result);
-                if (result.isVerifiedUsingV31Scheme()) {
-                    checkV4Signer(result.getV31SchemeSigners(), v4Signers.get(1).mCerts,
-                            digestFromV4, result);
+                // Compare certificates.
+                checkV4Certificate(v4Signers.get(0).mCerts, v3Signers.get(0).mCerts, result);
+
+                // Compare digests.
+                final byte[] digestFromV3 = pickBestDigestForV4(
+                        v3Signers.get(0).getContentDigests());
+                if (!Arrays.equals(digestFromV4, digestFromV3)) {
+                    result.addError(Issue.V4_SIG_V2_V3_DIGESTS_MISMATCH);
                 }
             } else if (result.isVerifiedUsingV2Scheme()) {
-                if (v4Signers.size() != 1) {
-                    result.addError(Issue.V4_SIG_MULTIPLE_SIGNERS);
-                }
-
                 List<Result.V2SchemeSignerInfo> v2Signers = result.getV2SchemeSigners();
                 if (v2Signers.size() != 1) {
                     result.addError(Issue.V4_SIG_MULTIPLE_SIGNERS);
@@ -561,7 +527,7 @@
                         // Allow this case to fall through to the next as a signature satisfying a
                         // later scheme version will also satisfy this requirement.
                     case VERSION_APK_SIGNATURE_SCHEME_V3:
-                        if (result.isVerifiedUsingV3Scheme() || result.isVerifiedUsingV31Scheme()) {
+                        if (result.isVerifiedUsingV3Scheme()) {
                             break;
                         }
                         result.addError(Issue.MIN_SIG_SCHEME_FOR_TARGET_SDK_NOT_MET,
@@ -577,10 +543,7 @@
 
         // Verified
         result.setVerified();
-        if (result.isVerifiedUsingV31Scheme()) {
-            List<Result.V3SchemeSignerInfo> v31Signers = result.getV31SchemeSigners();
-            result.addSignerCertificate(v31Signers.get(v31Signers.size() - 1).getCertificate());
-        } else if (result.isVerifiedUsingV3Scheme()) {
+        if (result.isVerifiedUsingV3Scheme()) {
             List<Result.V3SchemeSignerInfo> v3Signers = result.getV3SchemeSigners();
             result.addSignerCertificate(v3Signers.get(v3Signers.size() - 1).getCertificate());
         } else if (result.isVerifiedUsingV2Scheme()) {
@@ -932,22 +895,6 @@
         return result;
     }
 
-    private static void checkV4Signer(List<Result.V3SchemeSignerInfo> v3Signers,
-            List<X509Certificate> v4Certs, byte[] digestFromV4, Result result) {
-        if (v3Signers.size() != 1) {
-            result.addError(Issue.V4_SIG_MULTIPLE_SIGNERS);
-        }
-
-        // Compare certificates.
-        checkV4Certificate(v4Certs, v3Signers.get(0).mCerts, result);
-
-        // Compare digests.
-        final byte[] digestFromV3 = pickBestDigestForV4(v3Signers.get(0).getContentDigests());
-        if (!Arrays.equals(digestFromV4, digestFromV3)) {
-            result.addError(Issue.V4_SIG_V2_V3_DIGESTS_MISMATCH);
-        }
-    }
-
     private static void checkV4Certificate(List<X509Certificate> v4Certs,
             List<X509Certificate> v2v3Certs, Result result) {
         try {
@@ -1058,7 +1005,6 @@
         private final List<V1SchemeSignerInfo> mV1SchemeIgnoredSigners = new ArrayList<>();
         private final List<V2SchemeSignerInfo> mV2SchemeSigners = new ArrayList<>();
         private final List<V3SchemeSignerInfo> mV3SchemeSigners = new ArrayList<>();
-        private final List<V3SchemeSignerInfo> mV31SchemeSigners = new ArrayList<>();
         private final List<V4SchemeSignerInfo> mV4SchemeSigners = new ArrayList<>();
         private SourceStampInfo mSourceStampInfo;
 
@@ -1066,7 +1012,6 @@
         private boolean mVerifiedUsingV1Scheme;
         private boolean mVerifiedUsingV2Scheme;
         private boolean mVerifiedUsingV3Scheme;
-        private boolean mVerifiedUsingV31Scheme;
         private boolean mVerifiedUsingV4Scheme;
         private boolean mSourceStampVerified;
         private boolean mWarningsAsErrors;
@@ -1105,13 +1050,6 @@
         }
 
         /**
-         * Returns {@code true} if the APK's APK Signature Scheme v3.1 signature verified.
-         */
-        public boolean isVerifiedUsingV31Scheme() {
-            return mVerifiedUsingV31Scheme;
-        }
-
-        /**
          * Returns {@code true} if the APK's APK Signature Scheme v4 signature verified.
          */
         public boolean isVerifiedUsingV4Scheme() {
@@ -1177,23 +1115,7 @@
             return mV3SchemeSigners;
         }
 
-        /**
-         * Returns information about APK Signature Scheme v3.1 signers associated with the APK's
-         * signature.
-         *
-         * <note> Multiple signers represent different targeted platform versions, not
-         * a signing identity of multiple signers.  APK Signature Scheme v3.1 only supports single
-         * signer identities.</note>
-         */
-        public List<V3SchemeSignerInfo> getV31SchemeSigners() {
-            return mV31SchemeSigners;
-        }
-
-        /**
-         * Returns information about APK Signature Scheme v4 signers associated with the APK's
-         * signature.
-         */
-        public List<V4SchemeSignerInfo> getV4SchemeSigners() {
+        private List<V4SchemeSignerInfo> getV4SchemeSigners() {
             return mV4SchemeSigners;
         }
 
@@ -1288,16 +1210,6 @@
                     for (ApkSigningBlockUtils.Result.SignerInfo signer : source.signers) {
                         mV3SchemeSigners.add(new V3SchemeSignerInfo(signer));
                     }
-                    // Do not overwrite a previously set lineage from a v3.1 signing block.
-                    if (mSigningCertificateLineage == null) {
-                        mSigningCertificateLineage = source.signingCertificateLineage;
-                    }
-                    break;
-                case ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V31:
-                    mVerifiedUsingV31Scheme = source.verified;
-                    for (ApkSigningBlockUtils.Result.SignerInfo signer : source.signers) {
-                        mV31SchemeSigners.add(new V3SchemeSignerInfo(signer));
-                    }
                     mSigningCertificateLineage = source.signingCertificateLineage;
                     break;
                 case ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V4:
@@ -1585,9 +1497,6 @@
             private final List<IssueWithParams> mWarnings;
             private final List<ApkSigningBlockUtils.Result.SignerInfo.ContentDigest>
                     mContentDigests;
-            private final int mMinSdkVersion;
-            private final int mMaxSdkVersion;
-            private final boolean mRotationTargetsDevRelease;
 
             private V3SchemeSignerInfo(ApkSigningBlockUtils.Result.SignerInfo result) {
                 mIndex = result.index;
@@ -1595,11 +1504,6 @@
                 mErrors = result.getErrors();
                 mWarnings = result.getWarnings();
                 mContentDigests = result.contentDigests;
-                mMinSdkVersion = result.minSdkVersion;
-                mMaxSdkVersion = result.maxSdkVersion;
-                mRotationTargetsDevRelease = result.additionalAttributes.stream().mapToInt(
-                        attribute -> attribute.getId()).anyMatch(
-                        attrId -> attrId == V3SchemeConstants.ROTATION_ON_DEV_RELEASE_ATTR_ID);
             }
 
             /**
@@ -1645,33 +1549,6 @@
             public List<ApkSigningBlockUtils.Result.SignerInfo.ContentDigest> getContentDigests() {
                 return mContentDigests;
             }
-
-            /**
-             * Returns the minimum SDK version on which this signer should be verified.
-             */
-            public int getMinSdkVersion() {
-                return mMinSdkVersion;
-            }
-
-            /**
-             * Returns the maximum SDK version on which this signer should be verified.
-             */
-            public int getMaxSdkVersion() {
-                return mMaxSdkVersion;
-            }
-
-            /**
-             * Returns whether rotation is targeting a development release.
-             *
-             * <p>A development release uses the SDK version of the previously released platform
-             * until the SDK of the development release is finalized. To allow rotation to target
-             * a development release after T, this attribute must be set to ensure rotation is
-             * used on the development release but ignored on the released platform with the same
-             * API level.
-             */
-            public boolean getRotationTargetsDevRelease() {
-                return mRotationTargetsDevRelease;
-            }
         }
 
         /**
@@ -1767,8 +1644,6 @@
 
             private final SourceStampVerificationStatus mSourceStampVerificationStatus;
 
-            private final long mTimestamp;
-
             private SourceStampInfo(ApkSignerInfo result) {
                 mCertificates = result.certs;
                 mCertificateLineage = result.certificateLineage;
@@ -1782,7 +1657,6 @@
                     mSourceStampVerificationStatus =
                             SourceStampVerificationStatus.STAMP_VERIFICATION_FAILED;
                 }
-                mTimestamp = result.timestamp;
             }
 
             SourceStampInfo(SourceStampVerificationStatus sourceStampVerificationStatus) {
@@ -1791,7 +1665,6 @@
                 mErrors = Collections.emptyList();
                 mWarnings = Collections.emptyList();
                 mSourceStampVerificationStatus = sourceStampVerificationStatus;
-                mTimestamp = 0;
             }
 
             /**
@@ -1831,14 +1704,6 @@
             public SourceStampVerificationStatus getSourceStampVerificationStatus() {
                 return mSourceStampVerificationStatus;
             }
-
-            /**
-             * Returns the epoch timestamp in seconds representing the time this source stamp block
-             * was signed, or 0 if the timestamp is not available.
-             */
-            public long getTimestampEpochSeconds() {
-                return mTimestamp;
-            }
         }
     }
 
@@ -2662,61 +2527,6 @@
                 + " using APK Signature Scheme v3 are not all a part of the same overall lineage."),
 
         /**
-         * The v3 stripping protection attribute for rotation is present, but a v3.1 signing block
-         * was not found.
-         *
-         * <ul>
-         * <li>Parameter 1: min SDK version supporting rotation from attribute ({@code Integer})
-         * </ul>
-         */
-        V31_BLOCK_MISSING(
-                "The v3 signer indicates key rotation should be supported starting from SDK "
-                        + "version %1$s, but a v3.1 block was not found"),
-
-        /**
-         * The v3 stripping protection attribute for rotation does not match the minimum SDK version
-         * targeting rotation in the v3.1 signer block.
-         *
-         * <ul>
-         * <li>Parameter 1: min SDK version supporting rotation from attribute ({@code Integer})
-         * <li>Parameter 2: min SDK version supporting rotation from v3.1 block ({@code Integer})
-         * </ul>
-         */
-        V31_ROTATION_MIN_SDK_MISMATCH(
-                "The v3 signer indicates key rotation should be supported starting from SDK "
-                        + "version %1$s, but the v3.1 block targets %2$s for rotation"),
-
-        /**
-         * The APK supports key rotation with SDK version targeting using v3.1, but the rotation min
-         * SDK version stripping protection attribute was not written to the v3 signer.
-         *
-         * <ul>
-         * <li>Parameter 1: min SDK version supporting rotation from v3.1 block ({@code Integer})
-         * </ul>
-         */
-        V31_ROTATION_MIN_SDK_ATTR_MISSING(
-                "APK supports key rotation starting from SDK version %1$s, but the v3 signer does"
-                        + " not contain the attribute to detect if this signature is stripped"),
-
-        /**
-         * The APK contains a v3.1 signing block without a v3.0 block. The v3.1 block should only
-         * be used for targeting rotation for a later SDK version; if an APK's minSdkVersion is the
-         * same as the SDK version for rotation then this should be written to a v3.0 block.
-         */
-        V31_BLOCK_FOUND_WITHOUT_V3_BLOCK(
-                "The APK contains a v3.1 signing block without a v3.0 base block"),
-
-        /**
-         * The APK contains a v3.0 signing block with a rotation-targets-dev-release attribute in
-         * the signer; this attribute is only intended for v3.1 signers to indicate they should be
-         * targeting the next development release that is using the SDK version of the previously
-         * released platform SDK version.
-         */
-        V31_ROTATION_TARGETS_DEV_RELEASE_ATTR_ON_V3_SIGNER(
-                "The rotation-targets-dev-release attribute is only supported on v3.1 signers; "
-                        + "this attribute will be ignored by the platform in a v3.0 signer"),
-
-        /**
          * APK Signing Block contains an unknown entry.
          *
          * <ul>
@@ -3012,16 +2822,6 @@
                 + "contains a proof-of-rotation record with signature(s) that did not verify."),
 
         /**
-         * The source stamp timestamp attribute has an invalid value (<= 0).
-         * <ul>
-         *     <li>Parameter 1: The invalid timestamp value.
-         * </ul>
-         */
-        SOURCE_STAMP_INVALID_TIMESTAMP(
-                "The source stamp"
-                        + " timestamp attribute has an invalid value: %1$d"),
-
-        /**
          * The APK could not be properly parsed due to a ZIP or APK format exception.
          * <ul>
          *     <li>Parameter 1: The {@code Exception} caught when attempting to parse the APK.
@@ -3317,8 +3117,6 @@
                     Issue.JAR_SIG_NO_SIGNATURES);
             sVerificationIssueIdToIssue.put(ApkVerificationIssue.JAR_SIG_PARSE_EXCEPTION,
                     Issue.JAR_SIG_PARSE_EXCEPTION);
-            sVerificationIssueIdToIssue.put(ApkVerificationIssue.SOURCE_STAMP_INVALID_TIMESTAMP,
-                    Issue.SOURCE_STAMP_INVALID_TIMESTAMP);
         }
 
         /**
diff --git a/src/main/java/com/android/apksig/Constants.java b/src/main/java/com/android/apksig/Constants.java
index f64064c..680c5c3 100644
--- a/src/main/java/com/android/apksig/Constants.java
+++ b/src/main/java/com/android/apksig/Constants.java
@@ -32,7 +32,6 @@
     public static final int VERSION_JAR_SIGNATURE_SCHEME = 1;
     public static final int VERSION_APK_SIGNATURE_SCHEME_V2 = 2;
     public static final int VERSION_APK_SIGNATURE_SCHEME_V3 = 3;
-    public static final int VERSION_APK_SIGNATURE_SCHEME_V31 = 31;
     public static final int VERSION_APK_SIGNATURE_SCHEME_V4 = 4;
 
     public static final String MANIFEST_ENTRY_NAME = V1SchemeConstants.MANIFEST_ENTRY_NAME;
@@ -42,14 +41,10 @@
 
     public static final int APK_SIGNATURE_SCHEME_V3_BLOCK_ID =
             V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID;
-    public static final int APK_SIGNATURE_SCHEME_V31_BLOCK_ID =
-            V3SchemeConstants.APK_SIGNATURE_SCHEME_V31_BLOCK_ID;
     public static final int PROOF_OF_ROTATION_ATTR_ID = V3SchemeConstants.PROOF_OF_ROTATION_ATTR_ID;
 
     public static final int V1_SOURCE_STAMP_BLOCK_ID =
             SourceStampConstants.V1_SOURCE_STAMP_BLOCK_ID;
     public static final int V2_SOURCE_STAMP_BLOCK_ID =
             SourceStampConstants.V2_SOURCE_STAMP_BLOCK_ID;
-
-    public static final String OID_RSA_ENCRYPTION = "1.2.840.113549.1.1.1";
 }
diff --git a/src/main/java/com/android/apksig/DefaultApkSignerEngine.java b/src/main/java/com/android/apksig/DefaultApkSignerEngine.java
index f25bc59..e2256da 100644
--- a/src/main/java/com/android/apksig/DefaultApkSignerEngine.java
+++ b/src/main/java/com/android/apksig/DefaultApkSignerEngine.java
@@ -22,8 +22,6 @@
 import static com.android.apksig.internal.apk.ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V2;
 import static com.android.apksig.internal.apk.ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V3;
 import static com.android.apksig.internal.apk.ApkSigningBlockUtils.VERSION_JAR_SIGNATURE_SCHEME;
-import static com.android.apksig.internal.apk.v3.V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT;
-import static com.android.apksig.internal.apk.v3.V3SchemeConstants.MIN_SDK_WITH_V3_SUPPORT;
 
 import com.android.apksig.apk.ApkFormatException;
 import com.android.apksig.apk.ApkUtils;
@@ -36,7 +34,6 @@
 import com.android.apksig.internal.apk.v1.V1SchemeSigner;
 import com.android.apksig.internal.apk.v1.V1SchemeVerifier;
 import com.android.apksig.internal.apk.v2.V2SchemeSigner;
-import com.android.apksig.internal.apk.v3.V3SchemeConstants;
 import com.android.apksig.internal.apk.v3.V3SchemeSigner;
 import com.android.apksig.internal.apk.v4.V4SchemeSigner;
 import com.android.apksig.internal.apk.v4.V4Signature;
@@ -69,7 +66,6 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -106,8 +102,6 @@
     private final List<SignerConfig> mSignerConfigs;
     private final SignerConfig mSourceStampSignerConfig;
     private final SigningCertificateLineage mSourceStampSigningCertificateLineage;
-    private final int mRotationMinSdkVersion;
-    private final boolean mRotationTargetsDevRelease;
     private final int mMinSdkVersion;
     private final SigningCertificateLineage mSigningCertificateLineage;
 
@@ -190,8 +184,6 @@
             SignerConfig sourceStampSignerConfig,
             SigningCertificateLineage sourceStampSigningCertificateLineage,
             int minSdkVersion,
-            int rotationMinSdkVersion,
-            boolean rotationTargetsDevRelease,
             boolean v1SigningEnabled,
             boolean v2SigningEnabled,
             boolean v3SigningEnabled,
@@ -219,8 +211,6 @@
         mSourceStampSignerConfig = sourceStampSignerConfig;
         mSourceStampSigningCertificateLineage = sourceStampSigningCertificateLineage;
         mMinSdkVersion = minSdkVersion;
-        mRotationMinSdkVersion = rotationMinSdkVersion;
-        mRotationTargetsDevRelease = rotationTargetsDevRelease;
         mSigningCertificateLineage = signingCertificateLineage;
 
         if (v1SigningEnabled) {
@@ -338,29 +328,8 @@
         }
     }
 
-    private boolean signingLineageHas31Support() {
-        return mSigningCertificateLineage != null
-                && mRotationMinSdkVersion >= MIN_SDK_WITH_V31_SUPPORT
-                && mMinSdkVersion < mRotationMinSdkVersion;
-    }
-
     private List<ApkSigningBlockUtils.SignerConfig> processV3Configs(
             List<ApkSigningBlockUtils.SignerConfig> rawConfigs) throws InvalidKeyException {
-        // While the V3 signature scheme supports rotation, it is possible for a caller to specify
-        // a minimum SDK version for rotation that is >= the first SDK version that supports V3.1;
-        // in this case the V3.1 signing block will contain the rotated key, and the V3.0 block
-        // will use the original signing key.
-        if (signingLineageHas31Support()) {
-            SigningCertificateLineage subLineage = mSigningCertificateLineage
-                    .getSubLineage(mSignerConfigs.get(0).mCertificates.get(0));
-            if (subLineage.size() != 1) {
-                throw new IllegalArgumentException(
-                        "v3.1 signing enabled but the oldest signer in the SigningCertificateLineage"
-                                + " for the v3.0 signing block is missing.  Please provide"
-                                + " the oldest signer to enable v3.1 signing.");
-            }
-        }
-
         List<ApkSigningBlockUtils.SignerConfig> processedConfigs = new ArrayList<>();
 
         // we have our configs, now touch them up to appropriately cover all SDK levels since APK
@@ -384,43 +353,20 @@
                 // this needs to change
                 config.maxSdkVersion = Integer.MAX_VALUE;
             } else {
-                if (mRotationTargetsDevRelease && currentMinSdk == mRotationMinSdkVersion) {
-                    // The currentMinSdk is both the SDK version for the active development release
-                    // as well as the most recent released platform. To ensure the v3.0 signer will
-                    // target the released platform, overlap the maxSdkVersion for the v3.0 signer
-                    // with the minSdkVersion of the rotated signer in the v3.1 block
-                    config.maxSdkVersion = currentMinSdk;
-                } else {
-                    // otherwise, we only want to use this signer up to the minimum platform version
-                    // on which a newer one is acceptable
-                    config.maxSdkVersion = currentMinSdk - 1;
-                }
+                // otherwise, we only want to use this signer up to the minimum platform version
+                // on which a newer one is acceptable
+                config.maxSdkVersion = currentMinSdk - 1;
             }
             config.minSdkVersion = getMinSdkFromV3SignatureAlgorithms(config.signatureAlgorithms);
-            // Only use a rotated key and signing lineage if the config's max SDK version is greater
-            // than that requested to support rotation.
-            if (mSigningCertificateLineage != null
-                    && ((mRotationTargetsDevRelease
-                        ? config.maxSdkVersion > mRotationMinSdkVersion
-                        : config.maxSdkVersion >= mRotationMinSdkVersion))) {
+            if (mSigningCertificateLineage != null) {
                 config.mSigningCertificateLineage =
                         mSigningCertificateLineage.getSubLineage(config.certificates.get(0));
-                if (config.minSdkVersion < mRotationMinSdkVersion) {
-                    config.minSdkVersion = mRotationMinSdkVersion;
-                }
             }
             // we know that this config will be used, so add it to our result, order doesn't matter
             // at this point (and likely only one will be needed
             processedConfigs.add(config);
             currentMinSdk = config.minSdkVersion;
-            // If the rotation is targeting a development release and this is the v3.1 signer, then
-            // the minSdkVersion of this signer should equal the maxSdkVersion of the next signer;
-            // this ensures a package with the minSdkVersion set to the mRotationMinSdkVersion has
-            // a v3.0 block with the min / max SDK version set to this same minSdkVersion from the
-            // v3.1 block.
-            if ((mRotationTargetsDevRelease && currentMinSdk < mMinSdkVersion)
-                    || (!mRotationTargetsDevRelease && currentMinSdk <= mMinSdkVersion)
-                    || currentMinSdk <= AndroidSdkVersion.P) {
+            if (currentMinSdk <= mMinSdkVersion || currentMinSdk <= AndroidSdkVersion.P) {
                 // this satisfies all we need, stop here
                 break;
             }
@@ -441,42 +387,17 @@
                 ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V3));
     }
 
-    private List<ApkSigningBlockUtils.SignerConfig> processV31SignerConfigs(
-            List<ApkSigningBlockUtils.SignerConfig> v3SignerConfigs) {
-        // If the signing key has been rotated, the caller has requested to use the rotated
-        // signing key starting from an SDK version where v3.1 is supported, and the minimum
-        // SDK version for the APK is less than the requested rotation minimum, then the APK
-        // should be signed with both the v3.1 signing scheme with the rotated key, and the v3.0
-        // scheme with the original signing key. If the APK's minSdkVersion is >= the requested
-        // SDK version for rotation then just use the v3.0 signing block for this.
-        if (!signingLineageHas31Support()) {
-            return null;
-        }
-
-        List<ApkSigningBlockUtils.SignerConfig> v31SignerConfigs = new ArrayList<>();
-        Iterator<ApkSigningBlockUtils.SignerConfig> v3SignerIterator =
-                v3SignerConfigs.iterator();
-        while (v3SignerIterator.hasNext()) {
-            ApkSigningBlockUtils.SignerConfig signerConfig = v3SignerIterator.next();
-            // All signing configs with a min SDK version that supports v3.1 should be used
-            // in the v3.1 signing block and removed from the v3.0 block.
-            if (signerConfig.minSdkVersion >= mRotationMinSdkVersion) {
-                v31SignerConfigs.add(signerConfig);
-                v3SignerIterator.remove();
-            }
-        }
-        return v31SignerConfigs;
-    }
-
-    private V4SchemeSigner.SignerConfig createV4SignerConfig() throws InvalidKeyException {
-        List<ApkSigningBlockUtils.SignerConfig> v4Configs = createSigningBlockSignerConfigs(true,
+    private ApkSigningBlockUtils.SignerConfig createV4SignerConfig() throws InvalidKeyException {
+        List<ApkSigningBlockUtils.SignerConfig> configs = createSigningBlockSignerConfigs(true,
                 ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V4);
-        if (v4Configs.size() != 1) {
-            // V4 uses signer config to connect back to v3. Use the same filtering logic.
-            v4Configs = processV3Configs(v4Configs);
+        if (configs.size() != 1) {
+            // V4 only uses signer config to connect back to v3. Use the same filtering logic.
+            configs = processV3Configs(configs);
         }
-        List<ApkSigningBlockUtils.SignerConfig> v41configs = processV31SignerConfigs(v4Configs);
-        return new V4SchemeSigner.SignerConfig(v4Configs, v41configs);
+        if (configs.size() != 1) {
+            throw new InvalidKeyException("Only accepting one signer config for V4 Signature.");
+        }
+        return configs.get(0);
     }
 
     private ApkSigningBlockUtils.SignerConfig createSourceStampSignerConfig()
@@ -1072,29 +993,13 @@
             invalidateV3Signature();
             List<ApkSigningBlockUtils.SignerConfig> v3SignerConfigs =
                     createV3SignerConfigs(apkSigningBlockPaddingSupported);
-            List<ApkSigningBlockUtils.SignerConfig> v31SignerConfigs = processV31SignerConfigs(
-                    v3SignerConfigs);
-            if (v31SignerConfigs != null && v31SignerConfigs.size() > 0) {
-                ApkSigningBlockUtils.SigningSchemeBlockAndDigests
-                        v31SigningSchemeBlockAndDigests =
-                        new V3SchemeSigner.Builder(beforeCentralDir, zipCentralDirectory, eocd,
-                                v31SignerConfigs)
-                                .setRunnablesExecutor(mExecutor)
-                                .setBlockId(V3SchemeConstants.APK_SIGNATURE_SCHEME_V31_BLOCK_ID)
-                                .setRotationTargetsDevRelease(mRotationTargetsDevRelease)
-                                .build()
-                                .generateApkSignatureSchemeV3BlockAndDigests();
-                signingSchemeBlocks.add(v31SigningSchemeBlockAndDigests.signingSchemeBlock);
-            }
-            V3SchemeSigner.Builder builder = new V3SchemeSigner.Builder(beforeCentralDir,
-                zipCentralDirectory, eocd, v3SignerConfigs)
-                .setRunnablesExecutor(mExecutor)
-                .setBlockId(V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID);
-            if (signingLineageHas31Support()) {
-                builder.setRotationMinSdkVersion(mRotationMinSdkVersion);
-            }
             v3SigningSchemeBlockAndDigests =
-                builder.build().generateApkSignatureSchemeV3BlockAndDigests();
+                    V3SchemeSigner.generateApkSignatureSchemeV3Block(
+                            mExecutor,
+                            beforeCentralDir,
+                            zipCentralDirectory,
+                            eocd,
+                            v3SignerConfigs);
             signingSchemeBlocks.add(v3SigningSchemeBlockAndDigests.signingSchemeBlock);
         }
         if (isEligibleForSourceStamp()) {
@@ -1166,7 +1071,7 @@
             throw new SignatureException("Missing V4 output file.");
         }
         try {
-            V4SchemeSigner.SignerConfig v4SignerConfig = createV4SignerConfig();
+            ApkSigningBlockUtils.SignerConfig v4SignerConfig = createV4SignerConfig();
             V4SchemeSigner.generateV4Signature(dataSource, v4SignerConfig, outputFile);
         } catch (InvalidKeyException | IOException | NoSuchAlgorithmException e) {
             if (ignoreFailures) {
@@ -1183,7 +1088,7 @@
             throw new SignatureException("Missing V4 output streams.");
         }
         try {
-            V4SchemeSigner.SignerConfig v4SignerConfig = createV4SignerConfig();
+            ApkSigningBlockUtils.SignerConfig v4SignerConfig = createV4SignerConfig();
             Pair<V4Signature, byte[]> pair =
                     V4SchemeSigner.generateV4Signature(dataSource, v4SignerConfig);
             pair.getFirst().writeTo(sigOutput);
@@ -1725,8 +1630,6 @@
         private boolean mV1SigningEnabled = true;
         private boolean mV2SigningEnabled = true;
         private boolean mV3SigningEnabled = true;
-        private int mRotationMinSdkVersion = V3SchemeConstants.DEFAULT_ROTATION_MIN_SDK_VERSION;
-        private boolean mRotationTargetsDevRelease = false;
         private boolean mVerityEnabled = false;
         private boolean mDebuggableApkPermitted = true;
         private boolean mOtherSignersSignaturesPreserved;
@@ -1815,8 +1718,6 @@
                     mStampSignerConfig,
                     mSourceStampSigningCertificateLineage,
                     mMinSdkVersion,
-                    mRotationMinSdkVersion,
-                    mRotationTargetsDevRelease,
                     mV1SigningEnabled,
                     mV2SigningEnabled,
                     mV3SigningEnabled,
@@ -1939,49 +1840,5 @@
             }
             return this;
         }
-
-        /**
-         * Sets the minimum Android platform version (API Level) for which an APK's rotated signing
-         * key should be used to produce the APK's signature. The original signing key for the APK
-         * will be used for all previous platform versions. If a rotated key with signing lineage is
-         * not provided then this method is a noop.
-         *
-         * <p>By default, if a signing lineage is specified with {@link
-         * #setSigningCertificateLineage(SigningCertificateLineage)}, then the APK Signature Scheme
-         * V3.1 will be used to only apply the rotation on devices running Android T+.
-         *
-         * <p><em>Note:</em>Specifying a {@code minSdkVersion} value <= 32 (Android Sv2) will result
-         * in the original V3 signing block being used without platform targeting.
-         */
-        public Builder setMinSdkVersionForRotation(int minSdkVersion) {
-            // If the provided SDK version does not support v3.1, then use the default SDK version
-            // with rotation support.
-            if (minSdkVersion < MIN_SDK_WITH_V31_SUPPORT) {
-                mRotationMinSdkVersion = MIN_SDK_WITH_V3_SUPPORT;
-            } else {
-                mRotationMinSdkVersion = minSdkVersion;
-            }
-            return this;
-        }
-
-        /**
-         * Sets whether the rotation-min-sdk-version is intended to target a development release;
-         * this is primarily required after the T SDK is finalized, and an APK needs to target U
-         * during its development cycle for rotation.
-         *
-         * <p>This is only required after the T SDK is finalized since S and earlier releases do
-         * not know about the V3.1 block ID, but once T is released and work begins on U, U will
-         * use the SDK version of T during development. Specifying a rotation-min-sdk-version of T's
-         * SDK version along with setting {@code enabled} to true will allow an APK to use the
-         * rotated key on a device running U while causing this to be bypassed for T.
-         *
-         * <p><em>Note:</em>If the rotation-min-sdk-version is less than or equal to 32 (Android
-         * Sv2), then the rotated signing key will be used in the v3.0 signing block and this call
-         * will be a noop.
-         */
-        public Builder setRotationTargetsDevRelease(boolean enabled) {
-            mRotationTargetsDevRelease = enabled;
-            return this;
-        }
     }
 }
diff --git a/src/main/java/com/android/apksig/SigningCertificateLineage.java b/src/main/java/com/android/apksig/SigningCertificateLineage.java
index 43b7f5e..6c505be 100644
--- a/src/main/java/com/android/apksig/SigningCertificateLineage.java
+++ b/src/main/java/com/android/apksig/SigningCertificateLineage.java
@@ -191,62 +191,41 @@
      */
     public static SigningCertificateLineage readFromApkDataSource(DataSource apk)
             throws IOException, ApkFormatException {
-        ApkUtils.ZipSections zipSections;
+        SignatureInfo signatureInfo;
         try {
-            zipSections = ApkUtils.findZipSections(apk);
-        } catch (ZipFormatException e) {
-            throw new ApkFormatException(e.getMessage());
-        }
-
-        List<SignatureInfo> signatureInfoList = new ArrayList<>();
-        try {
-            ApkSigningBlockUtils.Result result = new ApkSigningBlockUtils.Result(
-                    ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V31);
-            signatureInfoList.add(
-                    ApkSigningBlockUtils.findSignature(apk, zipSections,
-                            V3SchemeConstants.APK_SIGNATURE_SCHEME_V31_BLOCK_ID, result));
-        }
-        catch (ApkSigningBlockUtils.SignatureNotFoundException ignored) {
-            // This could be expected if there's only a V3 signature block.
-        }
-        try {
+            ApkUtils.ZipSections zipSections = ApkUtils.findZipSections(apk);
             ApkSigningBlockUtils.Result result = new ApkSigningBlockUtils.Result(
                     ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V3);
-            signatureInfoList.add(
+            signatureInfo =
                     ApkSigningBlockUtils.findSignature(apk, zipSections,
-                            V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID, result));
-        }
-        catch (ApkSigningBlockUtils.SignatureNotFoundException ignored) {
-            // This could be expected if the provided APK is not signed with the v3 signature scheme
-        }
-        if (signatureInfoList.isEmpty()) {
+                            V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID, result);
+        } catch (ZipFormatException e) {
+            throw new ApkFormatException(e.getMessage());
+        } catch (ApkSigningBlockUtils.SignatureNotFoundException e) {
             throw new IllegalArgumentException(
                     "The provided APK does not contain a valid V3 signature block.");
         }
 
+        // FORMAT:
+        // * length-prefixed sequence of length-prefixed signers:
+        //   * length-prefixed signed data
+        //   * minSDK
+        //   * maxSDK
+        //   * length-prefixed sequence of length-prefixed signatures
+        //   * length-prefixed public key
+        ByteBuffer signers = getLengthPrefixedSlice(signatureInfo.signatureBlock);
         List<SigningCertificateLineage> lineages = new ArrayList<>(1);
-        for (SignatureInfo signatureInfo : signatureInfoList) {
-            // FORMAT:
-            // * length-prefixed sequence of length-prefixed signers:
-            //   * length-prefixed signed data
-            //   * minSDK
-            //   * maxSDK
-            //   * length-prefixed sequence of length-prefixed signatures
-            //   * length-prefixed public key
-            ByteBuffer signers = getLengthPrefixedSlice(signatureInfo.signatureBlock);
-            while (signers.hasRemaining()) {
-                ByteBuffer signer = getLengthPrefixedSlice(signers);
-                ByteBuffer signedData = getLengthPrefixedSlice(signer);
-                try {
-                    SigningCertificateLineage lineage = readFromSignedData(signedData);
-                    lineages.add(lineage);
-                } catch (IllegalArgumentException ignored) {
-                    // The current signer block does not contain a valid lineage, but it is possible
-                    // another block will.
-                }
+        while (signers.hasRemaining()) {
+            ByteBuffer signer = getLengthPrefixedSlice(signers);
+            ByteBuffer signedData = getLengthPrefixedSlice(signer);
+            try {
+                SigningCertificateLineage lineage = readFromSignedData(signedData);
+                lineages.add(lineage);
+            } catch (IllegalArgumentException ignored) {
+                // The current signer block does not contain a valid lineage, but it is possible
+                // another block will.
             }
         }
-
         SigningCertificateLineage result;
         if (lineages.isEmpty()) {
             throw new IllegalArgumentException(
diff --git a/src/main/java/com/android/apksig/SourceStampVerifier.java b/src/main/java/com/android/apksig/SourceStampVerifier.java
index b155341..587cbd3 100644
--- a/src/main/java/com/android/apksig/SourceStampVerifier.java
+++ b/src/main/java/com/android/apksig/SourceStampVerifier.java
@@ -730,8 +730,6 @@
             private final List<ApkVerificationIssue> mErrors = new ArrayList<>();
             private final List<ApkVerificationIssue> mWarnings = new ArrayList<>();
 
-            private final long mTimestamp;
-
             /*
              * Since this utility is intended just to verify the source stamp, and the source stamp
              * currently only logs warnings to prevent failing the APK signature verification, treat
@@ -746,7 +744,6 @@
                 mCertificateLineage = result.certificateLineage;
                 mErrors.addAll(result.getErrors());
                 mWarnings.addAll(result.getWarnings());
-                mTimestamp = result.timestamp;
             }
 
             /**
@@ -797,14 +794,6 @@
             public List<ApkVerificationIssue> getWarnings() {
                 return mWarnings;
             }
-
-            /**
-             * Returns the epoch timestamp in seconds representing the time this source stamp block
-             * was signed, or 0 if the timestamp is not available.
-             */
-            public long getTimestampEpochSeconds() {
-                return mTimestamp;
-            }
         }
     }
 
diff --git a/src/main/java/com/android/apksig/apk/ApkUtils.java b/src/main/java/com/android/apksig/apk/ApkUtils.java
index 156ea17..426f0be 100644
--- a/src/main/java/com/android/apksig/apk/ApkUtils.java
+++ b/src/main/java/com/android/apksig/apk/ApkUtils.java
@@ -97,17 +97,6 @@
     }
 
     /**
-     * Updates the length of EOCD comment.
-     *
-     * @param zipEndOfCentralDirectory APK's ZIP End of Central Directory record
-     */
-    public static void updateZipEocdCommentLen(ByteBuffer zipEndOfCentralDirectory) {
-        ByteBuffer eocd = zipEndOfCentralDirectory.slice();
-        eocd.order(ByteOrder.LITTLE_ENDIAN);
-        ZipUtils.updateZipEocdCommentLen(eocd);
-    }
-
-    /**
      * Returns the APK Signing Block of the provided {@code apk}.
      *
      * @throws ApkFormatException if the APK is not a valid ZIP archive
diff --git a/src/main/java/com/android/apksig/internal/apk/ApkSignerInfo.java b/src/main/java/com/android/apksig/internal/apk/ApkSignerInfo.java
index 12e54d0..e0ea365 100644
--- a/src/main/java/com/android/apksig/internal/apk/ApkSignerInfo.java
+++ b/src/main/java/com/android/apksig/internal/apk/ApkSignerInfo.java
@@ -27,7 +27,6 @@
  */
 public class ApkSignerInfo {
     public int index;
-    public long timestamp;
     public List<X509Certificate> certs = new ArrayList<>();
     public List<X509Certificate> certificateLineage = new ArrayList<>();
 
diff --git a/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java b/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java
index 44dcc79..61b7b00 100644
--- a/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java
+++ b/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java
@@ -16,7 +16,6 @@
 
 package com.android.apksig.internal.apk;
 
-import static com.android.apksig.Constants.OID_RSA_ENCRYPTION;
 import static com.android.apksig.internal.apk.ContentDigestAlgorithm.CHUNKED_SHA256;
 import static com.android.apksig.internal.apk.ContentDigestAlgorithm.CHUNKED_SHA512;
 import static com.android.apksig.internal.apk.ContentDigestAlgorithm.VERITY_CHUNKED_SHA256;
@@ -104,7 +103,6 @@
     public static final int VERSION_JAR_SIGNATURE_SCHEME = 1;
     public static final int VERSION_APK_SIGNATURE_SCHEME_V2 = 2;
     public static final int VERSION_APK_SIGNATURE_SCHEME_V3 = 3;
-    public static final int VERSION_APK_SIGNATURE_SCHEME_V31 = 31;
     public static final int VERSION_APK_SIGNATURE_SCHEME_V4 = 4;
 
     /**
@@ -668,8 +666,7 @@
         if ("X.509".equals(publicKey.getFormat())) {
             encodedPublicKey = publicKey.getEncoded();
             // if the key is an RSA key check for a negative modulus
-            String keyAlgorithm = publicKey.getAlgorithm();
-            if ("RSA".equals(keyAlgorithm) || OID_RSA_ENCRYPTION.equals(keyAlgorithm)) {
+            if ("RSA".equals(publicKey.getAlgorithm())) {
                 try {
                     // Parse the encoded public key into the separate elements of the
                     // SubjectPublicKeyInfo to obtain the SubjectPublicKey.
diff --git a/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampConstants.java b/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampConstants.java
index 2a949ad..465fbb0 100644
--- a/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampConstants.java
+++ b/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampConstants.java
@@ -24,11 +24,4 @@
     public static final int V2_SOURCE_STAMP_BLOCK_ID = 0x6dff800d;
     public static final String SOURCE_STAMP_CERTIFICATE_HASH_ZIP_ENTRY_NAME = "stamp-cert-sha256";
     public static final int PROOF_OF_ROTATION_ATTR_ID = 0x9d6303f7;
-    /**
-     * The source stamp timestamp attribute value is an 8-byte little-endian encoded long
-     * representing the epoch time in seconds when the stamp block was signed. The first 8 bytes
-     * of the attribute value buffer will be used to read the timestamp, and any additional buffer
-     * space will be ignored.
-     */
-    public static final int STAMP_TIME_ATTR_ID = 0xe43c5946;
 }
diff --git a/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampVerifier.java b/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampVerifier.java
index aace413..9cd7b1f 100644
--- a/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampVerifier.java
+++ b/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampVerifier.java
@@ -21,7 +21,6 @@
 import static com.android.apksig.internal.apk.ApkSigningBlockUtilsLite.toHex;
 
 import com.android.apksig.ApkVerificationIssue;
-import com.android.apksig.Constants;
 import com.android.apksig.apk.ApkFormatException;
 import com.android.apksig.internal.apk.ApkSignerInfo;
 import com.android.apksig.internal.apk.ApkSupportedSignature;
@@ -138,13 +137,6 @@
 
         for (Map.Entry<Integer, byte[]> signatureSchemeApkDigest :
                 signatureSchemeApkDigests.entrySet()) {
-            // TODO(b/192301300): Should the new v3.1 be included in the source stamp, or since a
-            // v3.0 block must always be present with a v3.1 block is it sufficient to just use the
-            // v3.0 block?
-            if (signatureSchemeApkDigest.getKey()
-                    == Constants.VERSION_APK_SIGNATURE_SCHEME_V31) {
-                continue;
-            }
             if (!signedSignatureSchemeData.containsKey(signatureSchemeApkDigest.getKey())) {
                 result.addWarning(ApkVerificationIssue.SOURCE_STAMP_NO_SIGNATURE);
                 return;
@@ -318,15 +310,6 @@
                 byte[] value = ByteBufferUtils.toByteArray(attribute);
                 if (id == SourceStampConstants.PROOF_OF_ROTATION_ATTR_ID) {
                     readStampCertificateLineage(value, sourceStampCertificate, result);
-                } else if (id == SourceStampConstants.STAMP_TIME_ATTR_ID) {
-                    long timestamp = ByteBuffer.wrap(value).order(
-                            ByteOrder.LITTLE_ENDIAN).getLong();
-                    if (timestamp > 0) {
-                        result.timestamp = timestamp;
-                    } else {
-                        result.addWarning(ApkVerificationIssue.SOURCE_STAMP_INVALID_TIMESTAMP,
-                                timestamp);
-                    }
                 } else {
                     result.addWarning(ApkVerificationIssue.SOURCE_STAMP_UNKNOWN_ATTRIBUTE, id);
                 }
diff --git a/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampSigner.java b/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampSigner.java
index 9c00a88..1c1570a 100644
--- a/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampSigner.java
+++ b/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampSigner.java
@@ -35,7 +35,6 @@
 import java.security.NoSuchAlgorithmException;
 import java.security.SignatureException;
 import java.security.cert.CertificateEncodingException;
-import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -203,22 +202,6 @@
 
     private static Map<Integer, byte[]> generateStampAttributes(SigningCertificateLineage lineage) {
         HashMap<Integer, byte[]> stampAttributes = new HashMap<>();
-
-        // Write the current epoch time as the timestamp for the source stamp.
-        long timestamp = Instant.now().getEpochSecond();
-        if (timestamp > 0) {
-            ByteBuffer attributeBuffer = ByteBuffer.allocate(8);
-            attributeBuffer.order(ByteOrder.LITTLE_ENDIAN);
-            attributeBuffer.putLong(timestamp);
-            stampAttributes.put(SourceStampConstants.STAMP_TIME_ATTR_ID, attributeBuffer.array());
-        } else {
-            // The epoch time should never be <= 0, and since security decisions can potentially
-            // be made based on the value in the timestamp, throw an Exception to ensure the issues
-            // with the environment are resolved before allowing the signing.
-            throw new IllegalStateException(
-                    "Received an invalid value from Instant#getTimestamp: " + timestamp);
-        }
-
         if (lineage != null) {
             stampAttributes.put(SourceStampConstants.PROOF_OF_ROTATION_ATTR_ID,
                     lineage.encodeSigningCertificateLineage());
diff --git a/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java b/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java
index ee3c9d8..85301ca 100644
--- a/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java
+++ b/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java
@@ -16,7 +16,6 @@
 
 package com.android.apksig.internal.apk.v1;
 
-import static com.android.apksig.Constants.OID_RSA_ENCRYPTION;
 import static com.android.apksig.internal.pkcs7.AlgorithmIdentifier.getSignerInfoDigestAlgorithmOid;
 import static com.android.apksig.internal.pkcs7.AlgorithmIdentifier.getSignerInfoSignatureAlgorithm;
 
@@ -112,7 +111,7 @@
     public static DigestAlgorithm getSuggestedSignatureDigestAlgorithm(
             PublicKey signingKey, int minSdkVersion) throws InvalidKeyException {
         String keyAlgorithm = signingKey.getAlgorithm();
-        if ("RSA".equalsIgnoreCase(keyAlgorithm) || OID_RSA_ENCRYPTION.equals((keyAlgorithm))) {
+        if ("RSA".equalsIgnoreCase(keyAlgorithm)) {
             // Prior to API Level 18, only SHA-1 can be used with RSA.
             if (minSdkVersion < 18) {
                 return DigestAlgorithm.SHA1;
diff --git a/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java b/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java
index 0ebef0e..6d7e997 100644
--- a/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java
+++ b/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java
@@ -26,7 +26,6 @@
 import com.android.apksig.ApkVerifier.IssueWithParams;
 import com.android.apksig.apk.ApkFormatException;
 import com.android.apksig.apk.ApkUtils;
-import com.android.apksig.internal.apk.ApkSigningBlockUtils;
 import com.android.apksig.internal.asn1.Asn1BerParser;
 import com.android.apksig.internal.asn1.Asn1Class;
 import com.android.apksig.internal.asn1.Asn1DecodingException;
@@ -55,17 +54,13 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.security.InvalidKeyException;
-import java.security.KeyFactory;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.Principal;
-import java.security.PublicKey;
 import java.security.Signature;
 import java.security.SignatureException;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.X509EncodedKeySpec;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Base64;
@@ -682,27 +677,7 @@
             String jcaSignatureAlgorithm =
                     getJcaSignatureAlgorithm(digestAlgorithmOid, signatureAlgorithmOid);
             Signature s = Signature.getInstance(jcaSignatureAlgorithm);
-            PublicKey publicKey = signingCertificate.getPublicKey();
-            try {
-                s.initVerify(publicKey);
-            } catch (InvalidKeyException e) {
-                // An InvalidKeyException could be caught if the PublicKey in the certificate is not
-                // properly encoded; attempt to resolve any encoding errors, generate a new public
-                // key, and reattempt the initVerify with the newly encoded key.
-                try {
-                    byte[] encodedPublicKey = ApkSigningBlockUtils.encodePublicKey(publicKey);
-                    publicKey = KeyFactory.getInstance(publicKey.getAlgorithm()).generatePublic(
-                            new X509EncodedKeySpec(encodedPublicKey));
-                } catch (InvalidKeySpecException ikse) {
-                    // If an InvalidKeySpecException is caught then throw the original Exception
-                    // since the key couldn't be properly re-encoded, and the original Exception
-                    // will have more useful debugging info.
-                    throw e;
-                }
-                s = Signature.getInstance(jcaSignatureAlgorithm);
-                s.initVerify(publicKey);
-            }
-
+            s.initVerify(signingCertificate.getPublicKey());
             if (signerInfo.signedAttrs != null) {
                 // Signed attributes present -- verify signature against the ASN.1 DER encoded form
                 // of signed attributes. This verifies integrity of the signature file because
diff --git a/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeConstants.java b/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeConstants.java
index 6963dd3..3b70aa0 100644
--- a/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeConstants.java
+++ b/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeConstants.java
@@ -16,40 +16,10 @@
 
 package com.android.apksig.internal.apk.v3;
 
-import com.android.apksig.internal.util.AndroidSdkVersion;
-
 /** Constants used by the V3 Signature Scheme signing and verification. */
 public class V3SchemeConstants {
     private V3SchemeConstants() {}
 
     public static final int APK_SIGNATURE_SCHEME_V3_BLOCK_ID = 0xf05368c0;
-    public static final int APK_SIGNATURE_SCHEME_V31_BLOCK_ID = 0x1b93ad61;
     public static final int PROOF_OF_ROTATION_ATTR_ID = 0x3ba06f8c;
-
-    public static final int MIN_SDK_WITH_V3_SUPPORT = AndroidSdkVersion.P;
-    public static final int MIN_SDK_WITH_V31_SUPPORT = AndroidSdkVersion.T;
-    /**
-     * By default, APK signing key rotation will target T, but packages that have previously
-     * rotated can continue rotating on pre-T by specifying an SDK version <= 32 as the
-     * --rotation-min-sdk-version parameter when using apksigner or when invoking
-     * {@link com.android.apksig.ApkSigner.Builder#setMinSdkVersionForRotation(int)}.
-     */
-    public static final int DEFAULT_ROTATION_MIN_SDK_VERSION  = AndroidSdkVersion.T;
-
-    /**
-     * This attribute is intended to be written to the V3.0 signer block as an additional attribute
-     * whose value is the minimum SDK version supported for rotation by the V3.1 signing block. If
-     * this value is set to X and a v3.1 signing block does not exist, or the minimum SDK version
-     * for rotation in the v3.1 signing block is not X, then the APK should be rejected.
-     */
-    public static final int ROTATION_MIN_SDK_VERSION_ATTR_ID = 0x559f8b02;
-
-    /**
-     * This attribute is written to the V3.1 signer block as an additional attribute to signify that
-     * the rotation-min-sdk-version is targeting a development release. This is required to support
-     * testing rotation on new development releases as the previous platform release SDK version
-     * is used as the development release SDK version until the development release SDK is
-     * finalized.
-     */
-    public static final int ROTATION_ON_DEV_RELEASE_ATTR_ID = 0xc2a6b3ba;
 }
diff --git a/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java b/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java
index ee5d3b4..04260d5 100644
--- a/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java
+++ b/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java
@@ -24,14 +24,12 @@
 
 import com.android.apksig.SigningCertificateLineage;
 import com.android.apksig.internal.apk.ApkSigningBlockUtils;
-import com.android.apksig.internal.apk.ApkSigningBlockUtils.SigningSchemeBlockAndDigests;
 import com.android.apksig.internal.apk.ApkSigningBlockUtils.SignerConfig;
 import com.android.apksig.internal.apk.ContentDigestAlgorithm;
 import com.android.apksig.internal.apk.SignatureAlgorithm;
 import com.android.apksig.internal.util.Pair;
 import com.android.apksig.util.DataSource;
 import com.android.apksig.util.RunnablesExecutor;
-
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -46,7 +44,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.OptionalInt;
 
 /**
  * APK Signature Scheme v3 signer.
@@ -59,37 +56,13 @@
  *     SigningCertificateLineage}, which enables an APK to change its signing certificate as long as
  *     it can prove the new siging certificate was signed by the old.
  */
-public class V3SchemeSigner {
+public abstract class V3SchemeSigner {
     public static final int APK_SIGNATURE_SCHEME_V3_BLOCK_ID =
             V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID;
     public static final int PROOF_OF_ROTATION_ATTR_ID = V3SchemeConstants.PROOF_OF_ROTATION_ATTR_ID;
 
-    private final RunnablesExecutor mExecutor;
-    private final DataSource mBeforeCentralDir;
-    private final DataSource mCentralDir;
-    private final DataSource mEocd;
-    private final List<SignerConfig> mSignerConfigs;
-    private final int mBlockId;
-    private final OptionalInt mOptionalRotationMinSdkVersion;
-    private final boolean mRotationTargetsDevRelease;
-
-    private V3SchemeSigner(DataSource beforeCentralDir,
-            DataSource centralDir,
-            DataSource eocd,
-            List<SignerConfig> signerConfigs,
-            RunnablesExecutor executor,
-            int blockId,
-            OptionalInt optionalRotationMinSdkVersion,
-            boolean rotationTargetsDevRelease) {
-        mBeforeCentralDir = beforeCentralDir;
-        mCentralDir = centralDir;
-        mEocd = eocd;
-        mSignerConfigs = signerConfigs;
-        mExecutor = executor;
-        mBlockId = blockId;
-        mOptionalRotationMinSdkVersion = optionalRotationMinSdkVersion;
-        mRotationTargetsDevRelease = rotationTargetsDevRelease;
-    }
+    /** Hidden constructor to prevent instantiation. */
+    private V3SchemeSigner() {}
 
     /**
      * Gets the APK Signature Scheme v3 signature algorithms to be used for signing an APK using the
@@ -156,18 +129,21 @@
         }
     }
 
-    public static SigningSchemeBlockAndDigests generateApkSignatureSchemeV3Block(
-            RunnablesExecutor executor,
-            DataSource beforeCentralDir,
-            DataSource centralDir,
-            DataSource eocd,
-            List<SignerConfig> signerConfigs)
-            throws IOException, InvalidKeyException, NoSuchAlgorithmException, SignatureException {
-        return new V3SchemeSigner.Builder(beforeCentralDir, centralDir, eocd, signerConfigs)
-                .setRunnablesExecutor(executor)
-                .setBlockId(V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID)
-                .build()
-                .generateApkSignatureSchemeV3BlockAndDigests();
+    public static ApkSigningBlockUtils.SigningSchemeBlockAndDigests
+            generateApkSignatureSchemeV3Block(
+                    RunnablesExecutor executor,
+                    DataSource beforeCentralDir,
+                    DataSource centralDir,
+                    DataSource eocd,
+                    List<SignerConfig> signerConfigs)
+                    throws IOException, InvalidKeyException, NoSuchAlgorithmException,
+                            SignatureException {
+        Pair<List<SignerConfig>, Map<ContentDigestAlgorithm, byte[]>> digestInfo =
+                ApkSigningBlockUtils.computeContentDigests(
+                        executor, beforeCentralDir, centralDir, eocd, signerConfigs);
+        return new ApkSigningBlockUtils.SigningSchemeBlockAndDigests(
+                generateApkSignatureSchemeV3Block(digestInfo.getFirst(), digestInfo.getSecond()),
+                digestInfo.getSecond());
     }
 
     public static byte[] generateV3SignerAttribute(
@@ -186,62 +162,14 @@
         return result.array();
     }
 
-    private static byte[] generateV3RotationMinSdkVersionStrippingProtectionAttribute(
-            int rotationMinSdkVersion) {
-        // FORMAT (little endian):
-        // * length-prefixed bytes: attribute pair
-        //   * uint32: ID
-        //   * bytes: value - int32 representing minimum SDK version for rotation
-        int payloadSize = 4 + 4 + 4;
-        ByteBuffer result = ByteBuffer.allocate(payloadSize);
-        result.order(ByteOrder.LITTLE_ENDIAN);
-        result.putInt(payloadSize - 4);
-        result.putInt(V3SchemeConstants.ROTATION_MIN_SDK_VERSION_ATTR_ID);
-        result.putInt(rotationMinSdkVersion);
-        return result.array();
-    }
-
-    private static byte[] generateV31RotationTargetsDevReleaseAttribute() {
-        // FORMAT (little endian):
-        // * length-prefixed bytes: attribute pair
-        //   * uint32: ID
-        //   * bytes: value - No value is used for this attribute
-        int payloadSize = 4 + 4;
-        ByteBuffer result = ByteBuffer.allocate(payloadSize);
-        result.order(ByteOrder.LITTLE_ENDIAN);
-        result.putInt(payloadSize - 4);
-        result.putInt(V3SchemeConstants.ROTATION_ON_DEV_RELEASE_ATTR_ID);
-        return result.array();
-    }
-
-    /**
-     * Generates and returns a new {@link SigningSchemeBlockAndDigests} containing the V3.x
-     * signing scheme block and digests based on the parameters provided to the {@link Builder}.
-     *
-     * @throws IOException if an I/O error occurs
-     * @throws NoSuchAlgorithmException if a required cryptographic algorithm implementation is
-     *         missing
-     * @throws InvalidKeyException if the X.509 encoded form of the public key cannot be obtained
-     * @throws SignatureException if an error occurs when computing digests or generating
-     *         signatures
-     */
-    public SigningSchemeBlockAndDigests generateApkSignatureSchemeV3BlockAndDigests()
-            throws IOException, InvalidKeyException, NoSuchAlgorithmException, SignatureException {
-        Pair<List<SignerConfig>, Map<ContentDigestAlgorithm, byte[]>> digestInfo =
-                ApkSigningBlockUtils.computeContentDigests(
-                        mExecutor, mBeforeCentralDir, mCentralDir, mEocd, mSignerConfigs);
-        return new SigningSchemeBlockAndDigests(
-                generateApkSignatureSchemeV3Block(digestInfo.getSecond()), digestInfo.getSecond());
-    }
-
-    private Pair<byte[], Integer> generateApkSignatureSchemeV3Block(
-            Map<ContentDigestAlgorithm, byte[]> contentDigests)
+    private static Pair<byte[], Integer> generateApkSignatureSchemeV3Block(
+            List<SignerConfig> signerConfigs, Map<ContentDigestAlgorithm, byte[]> contentDigests)
             throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
         // FORMAT:
         // * length-prefixed sequence of length-prefixed signer blocks.
-        List<byte[]> signerBlocks = new ArrayList<>(mSignerConfigs.size());
+        List<byte[]> signerBlocks = new ArrayList<>(signerConfigs.size());
         int signerNumber = 0;
-        for (SignerConfig signerConfig : mSignerConfigs) {
+        for (SignerConfig signerConfig : signerConfigs) {
             signerNumber++;
             byte[] signerBlock;
             try {
@@ -259,10 +187,10 @@
                         new byte[][] {
                             encodeAsSequenceOfLengthPrefixedElements(signerBlocks),
                         }),
-                mBlockId);
+                V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID);
     }
 
-    private byte[] generateSignerBlock(
+    private static byte[] generateSignerBlock(
             SignerConfig signerConfig, Map<ContentDigestAlgorithm, byte[]> contentDigests)
             throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
         if (signerConfig.certificates.isEmpty()) {
@@ -312,7 +240,7 @@
         return encodeSigner(signer);
     }
 
-    private byte[] encodeSigner(V3SignatureSchemeBlock.Signer signer) {
+    private static byte[] encodeSigner(V3SignatureSchemeBlock.Signer signer) {
         byte[] signedData = encodeAsLengthPrefixedElement(signer.signedData);
         byte[] signatures =
                 encodeAsLengthPrefixedElement(
@@ -341,7 +269,7 @@
         return result.array();
     }
 
-    private byte[] encodeSignedData(V3SignatureSchemeBlock.SignedData signedData) {
+    private static byte[] encodeSignedData(V3SignatureSchemeBlock.SignedData signedData) {
         byte[] digests =
                 encodeAsLengthPrefixedElement(
                         encodeAsSequenceOfLengthPrefixedPairsOfIntAndLengthPrefixedBytes(
@@ -377,26 +305,11 @@
         return result.array();
     }
 
-    private byte[] generateAdditionalAttributes(SignerConfig signerConfig) {
-        if (signerConfig.mSigningCertificateLineage != null) {
-            byte[] lineageAttr = generateV3SignerAttribute(signerConfig.mSigningCertificateLineage);
-            // If this rotation is not targeting a development release, or if this is not a v3.1
-            // signer block then just return the lineage attribute.
-            if (!mRotationTargetsDevRelease
-                    || mBlockId != V3SchemeConstants.APK_SIGNATURE_SCHEME_V31_BLOCK_ID) {
-                return lineageAttr;
-            }
-            byte[] devReleaseRotationAttr = generateV31RotationTargetsDevReleaseAttribute();
-            byte[] attributes = new byte[lineageAttr.length + devReleaseRotationAttr.length];
-            System.arraycopy(lineageAttr, 0, attributes, 0, lineageAttr.length);
-            System.arraycopy(devReleaseRotationAttr, 0, attributes, lineageAttr.length,
-                    devReleaseRotationAttr.length);
-            return attributes;
-        } else if (mOptionalRotationMinSdkVersion.isPresent()) {
-            return generateV3RotationMinSdkVersionStrippingProtectionAttribute(
-                    mOptionalRotationMinSdkVersion.getAsInt());
+    private static byte[] generateAdditionalAttributes(SignerConfig signerConfig) {
+        if (signerConfig.mSigningCertificateLineage == null) {
+            return new byte[0];
         }
-        return new byte[0];
+        return generateV3SignerAttribute(signerConfig.mSigningCertificateLineage);
     }
 
     private static final class V3SignatureSchemeBlock {
@@ -416,97 +329,4 @@
             public byte[] additionalAttributes;
         }
     }
-
-    /** Builder of {@link V3SchemeSigner} instances. */
-    public static class Builder {
-        private final DataSource mBeforeCentralDir;
-        private final DataSource mCentralDir;
-        private final DataSource mEocd;
-        private final List<SignerConfig> mSignerConfigs;
-
-        private RunnablesExecutor mExecutor = RunnablesExecutor.MULTI_THREADED;
-        private int mBlockId = V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID;
-        private OptionalInt mOptionalRotationMinSdkVersion = OptionalInt.empty();
-        private boolean mRotationTargetsDevRelease = false;
-
-        /**
-         * Instantiates a new {@code Builder} with an APK's {@code beforeCentralDir}, {@code
-         * centralDir}, and {@code eocd}, along with a {@link List} of {@code signerConfigs} to
-         * be used to sign the APK.
-         */
-        public Builder(DataSource beforeCentralDir, DataSource centralDir, DataSource eocd,
-                List<SignerConfig> signerConfigs) {
-            mBeforeCentralDir = beforeCentralDir;
-            mCentralDir = centralDir;
-            mEocd = eocd;
-            mSignerConfigs = signerConfigs;
-        }
-
-        /**
-         * Sets the {@link RunnablesExecutor} to be used when computing the APK's content digests.
-         */
-        public Builder setRunnablesExecutor(RunnablesExecutor executor) {
-            mExecutor = executor;
-            return this;
-        }
-
-        /**
-         * Sets the {@code blockId} to be used for the V3 signature block.
-         *
-         * <p>This {@code V3SchemeSigner} currently supports the block IDs for the {@link
-         * V3SchemeConstants#APK_SIGNATURE_SCHEME_V3_BLOCK_ID v3.0} and {@link
-         * V3SchemeConstants#APK_SIGNATURE_SCHEME_V31_BLOCK_ID v3.1} signature schemes.
-         */
-        public Builder setBlockId(int blockId) {
-            mBlockId = blockId;
-            return this;
-        }
-
-        /**
-         * Sets the {@code rotationMinSdkVersion} to be written as an additional attribute in each
-         * signer's block.
-         *
-         * <p>This value provides stripping protection to ensure a v3.1 signing block with rotation
-         * is not modified or removed from the APK's signature block.
-         */
-        public Builder setRotationMinSdkVersion(int rotationMinSdkVersion) {
-            mOptionalRotationMinSdkVersion = OptionalInt.of(rotationMinSdkVersion);
-            return this;
-        }
-
-        /**
-         * Sets whether the minimum SDK version of a signer is intended to target a development
-         * release; this is primarily required after the T SDK is finalized, and an APK needs to
-         * target U during its development cycle for rotation.
-         *
-         * <p>This is only required after the T SDK is finalized since S and earlier releases do
-         * not know about the V3.1 block ID, but once T is released and work begins on U, U will
-         * use the SDK version of T during development. A signer with a minimum SDK version of T's
-         * SDK version along with setting {@code enabled} to true will allow an APK to use the
-         * rotated key on a device running U while causing this to be bypassed for T.
-         *
-         * <p><em>Note:</em>If the rotation-min-sdk-version is less than or equal to 32 (Android
-         * Sv2), then the rotated signing key will be used in the v3.0 signing block and this call
-         * will be a noop.
-         */
-        public Builder setRotationTargetsDevRelease(boolean enabled) {
-            mRotationTargetsDevRelease = enabled;
-            return this;
-        }
-
-        /**
-         * Returns a new {@link V3SchemeSigner} built with the configuration provided to this
-         * {@code Builder}.
-         */
-        public V3SchemeSigner build() {
-            return new V3SchemeSigner(mBeforeCentralDir,
-                    mCentralDir,
-                    mEocd,
-                    mSignerConfigs,
-                    mExecutor,
-                    mBlockId,
-                    mOptionalRotationMinSdkVersion,
-                    mRotationTargetsDevRelease);
-        }
-    }
 }
diff --git a/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java b/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java
index 956027f..ea93194 100644
--- a/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java
+++ b/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java
@@ -28,6 +28,7 @@
 import com.android.apksig.internal.apk.ContentDigestAlgorithm;
 import com.android.apksig.internal.apk.SignatureAlgorithm;
 import com.android.apksig.internal.apk.SignatureInfo;
+import com.android.apksig.internal.util.AndroidSdkVersion;
 import com.android.apksig.internal.util.ByteBufferUtils;
 import com.android.apksig.internal.util.GuaranteedEncodedFormX509Certificate;
 import com.android.apksig.internal.util.X509CertificateUtils;
@@ -37,7 +38,6 @@
 import java.io.IOException;
 import java.nio.BufferUnderflowException;
 import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
 import java.security.InvalidAlgorithmParameterException;
 import java.security.InvalidKeyException;
 import java.security.KeyFactory;
@@ -54,7 +54,6 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
-import java.util.OptionalInt;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
@@ -68,42 +67,9 @@
  *
  * @see <a href="https://source.android.com/security/apksigning/v2.html">APK Signature Scheme v2</a>
  */
-public class V3SchemeVerifier {
-    private final RunnablesExecutor mExecutor;
-    private final DataSource mApk;
-    private final ApkUtils.ZipSections mZipSections;
-    private final ApkSigningBlockUtils.Result mResult;
-    private final Set<ContentDigestAlgorithm> mContentDigestsToVerify;
-    private final int mMinSdkVersion;
-    private final int mMaxSdkVersion;
-    private final int mBlockId;
-    private final OptionalInt mOptionalRotationMinSdkVersion;
-    private final boolean mFullVerification;
-
-    private ByteBuffer mApkSignatureSchemeV3Block;
-
-    private V3SchemeVerifier(
-            RunnablesExecutor executor,
-            DataSource apk,
-            ApkUtils.ZipSections zipSections,
-            Set<ContentDigestAlgorithm> contentDigestsToVerify,
-            ApkSigningBlockUtils.Result result,
-            int minSdkVersion,
-            int maxSdkVersion,
-            int blockId,
-            OptionalInt optionalRotationMinSdkVersion,
-            boolean fullVerification) {
-        mExecutor = executor;
-        mApk = apk;
-        mZipSections = zipSections;
-        mContentDigestsToVerify = contentDigestsToVerify;
-        mResult = result;
-        mMinSdkVersion = minSdkVersion;
-        mMaxSdkVersion = maxSdkVersion;
-        mBlockId = blockId;
-        mOptionalRotationMinSdkVersion = optionalRotationMinSdkVersion;
-        mFullVerification = fullVerification;
-    }
+public abstract class V3SchemeVerifier {
+    /** Hidden constructor to prevent instantiation. */
+    private V3SchemeVerifier() {}
 
     /**
      * Verifies the provided APK's APK Signature Scheme v3 signatures and returns the result of
@@ -118,10 +84,7 @@
      * this method returns a result with one or more errors and whose
      * {@code Result.verified == false}, or this method throws an exception.
      *
-     * <p>This method only verifies the v3.0 signing block without platform targeted rotation from
-     * a v3.1 signing block. To verify a v3.1 signing block, or a v3.0 signing block in the presence
-     * of a v3.1 block, configure a new {@link V3SchemeVerifier} using the {@code Builder}.
-     *
+     * @throws ApkFormatException if the APK is malformed
      * @throws NoSuchAlgorithmException if the APK's signatures cannot be verified because a
      *         required cryptographic algorithm implementation is missing
      * @throws SignatureNotFoundException if no APK Signature Scheme v3
@@ -135,11 +98,34 @@
             int minSdkVersion,
             int maxSdkVersion)
             throws IOException, NoSuchAlgorithmException, SignatureNotFoundException {
-        return new V3SchemeVerifier.Builder(apk, zipSections, minSdkVersion, maxSdkVersion)
-                .setRunnablesExecutor(executor)
-                .setBlockId(V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID)
-                .build()
-                .verify();
+        ApkSigningBlockUtils.Result result = new ApkSigningBlockUtils.Result(
+                ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V3);
+        SignatureInfo signatureInfo =
+                ApkSigningBlockUtils.findSignature(apk, zipSections,
+                        V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID, result);
+
+        DataSource beforeApkSigningBlock = apk.slice(0, signatureInfo.apkSigningBlockOffset);
+        DataSource centralDir =
+                apk.slice(
+                        signatureInfo.centralDirOffset,
+                        signatureInfo.eocdOffset - signatureInfo.centralDirOffset);
+        ByteBuffer eocd = signatureInfo.eocd;
+
+        // v3 didn't exist prior to P, so make sure that we're only judging v3 on its supported
+        // platforms
+        if (minSdkVersion < AndroidSdkVersion.P) {
+            minSdkVersion = AndroidSdkVersion.P;
+        }
+
+        verify(executor,
+                beforeApkSigningBlock,
+                signatureInfo.signatureBlock,
+                centralDir,
+                eocd,
+                minSdkVersion,
+                maxSdkVersion,
+                result);
+        return result;
     }
 
     /**
@@ -148,40 +134,33 @@
      * {@code result}. See {@link #verify(RunnablesExecutor, DataSource, ApkUtils.ZipSections, int,
      * int)} for more information about the contract of this method.
      *
-     * @return {@link ApkSigningBlockUtils.Result} populated with interesting information about the
-     *        APK, such as information about signers, and verification errors and warnings
+     * @param result result populated by this method with interesting information about the APK,
+     *        such as information about signers, and verification errors and warnings.
      */
-    public ApkSigningBlockUtils.Result verify()
-            throws IOException, NoSuchAlgorithmException, SignatureNotFoundException {
-        if (mApk == null || mZipSections == null) {
-            throw new IllegalStateException(
-                    "A non-null apk and zip sections must be specified to verify an APK's v3 "
-                            + "signatures");
+    private static void verify(
+            RunnablesExecutor executor,
+            DataSource beforeApkSigningBlock,
+            ByteBuffer apkSignatureSchemeV3Block,
+            DataSource centralDir,
+            ByteBuffer eocd,
+            int minSdkVersion,
+            int maxSdkVersion,
+            ApkSigningBlockUtils.Result result)
+            throws IOException, NoSuchAlgorithmException {
+        Set<ContentDigestAlgorithm> contentDigestsToVerify = new HashSet<>(1);
+        parseSigners(apkSignatureSchemeV3Block, contentDigestsToVerify, result);
+
+        if (result.containsErrors()) {
+            return;
         }
-        SignatureInfo signatureInfo =
-                ApkSigningBlockUtils.findSignature(mApk, mZipSections, mBlockId, mResult);
-        mApkSignatureSchemeV3Block = signatureInfo.signatureBlock;
-
-        DataSource beforeApkSigningBlock = mApk.slice(0, signatureInfo.apkSigningBlockOffset);
-        DataSource centralDir =
-                mApk.slice(
-                        signatureInfo.centralDirOffset,
-                        signatureInfo.eocdOffset - signatureInfo.centralDirOffset);
-        ByteBuffer eocd = signatureInfo.eocd;
-
-        parseSigners();
-
-        if (mResult.containsErrors()) {
-            return mResult;
-        }
-        ApkSigningBlockUtils.verifyIntegrity(mExecutor, beforeApkSigningBlock, centralDir, eocd,
-                mContentDigestsToVerify, mResult);
+        ApkSigningBlockUtils.verifyIntegrity(
+                executor, beforeApkSigningBlock, centralDir, eocd, contentDigestsToVerify, result);
 
         // make sure that the v3 signers cover the entire targeted sdk version ranges and that the
         // longest SigningCertificateHistory, if present, corresponds to the newest platform
         // versions
         SortedMap<Integer, ApkSigningBlockUtils.Result.SignerInfo> sortedSigners = new TreeMap<>();
-        for (ApkSigningBlockUtils.Result.SignerInfo signer : mResult.signers) {
+        for (ApkSigningBlockUtils.Result.SignerInfo signer : result.signers) {
             sortedSigners.put(signer.minSdkVersion, signer);
         }
 
@@ -191,7 +170,7 @@
         int lastLineageSize = 0;
 
         // while we're iterating through the signers, build up the list of lineages
-        List<SigningCertificateLineage> lineages = new ArrayList<>(mResult.signers.size());
+        List<SigningCertificateLineage> lineages = new ArrayList<>(result.signers.size());
 
         for (ApkSigningBlockUtils.Result.SignerInfo signer : sortedSigners.values()) {
             int currentMin = signer.minSdkVersion;
@@ -201,7 +180,7 @@
                 firstMin = currentMin;
             } else {
                 if (currentMin != lastMax + 1) {
-                    mResult.addError(Issue.V3_INCONSISTENT_SDK_VERSIONS);
+                    result.addError(Issue.V3_INCONSISTENT_SDK_VERSIONS);
                     break;
                 }
             }
@@ -211,7 +190,7 @@
             if (signer.signingCertificateLineage != null) {
                 int currLineageSize = signer.signingCertificateLineage.size();
                 if (currLineageSize < lastLineageSize) {
-                    mResult.addError(Issue.V3_INCONSISTENT_LINEAGES);
+                    result.addError(Issue.V3_INCONSISTENT_LINEAGES);
                     break;
                 }
                 lastLineageSize = currLineageSize;
@@ -219,24 +198,20 @@
             }
         }
 
-        // make sure we support our desired sdk ranges; if rotation is present in a v3.1 block
-        // then the max level only needs to support up to that sdk version for rotation.
-        if (firstMin > mMinSdkVersion
-                || lastMax < (mOptionalRotationMinSdkVersion.isPresent()
-                    ? mOptionalRotationMinSdkVersion.getAsInt() - 1 : mMaxSdkVersion)) {
-            mResult.addError(Issue.V3_MISSING_SDK_VERSIONS, firstMin, lastMax);
+        // make sure we support our desired sdk ranges
+        if (firstMin > minSdkVersion || lastMax < maxSdkVersion) {
+            result.addError(Issue.V3_MISSING_SDK_VERSIONS, firstMin, lastMax);
         }
 
         try {
-             mResult.signingCertificateLineage =
+             result.signingCertificateLineage =
                      SigningCertificateLineage.consolidateLineages(lineages);
         } catch (IllegalArgumentException e) {
-            mResult.addError(Issue.V3_INCONSISTENT_LINEAGES);
+            result.addError(Issue.V3_INCONSISTENT_LINEAGES);
         }
-        if (!mResult.containsErrors()) {
-            mResult.verified = true;
+        if (!result.containsErrors()) {
+            result.verified = true;
         }
-        return mResult;
     }
 
     /**
@@ -255,49 +230,16 @@
             ByteBuffer apkSignatureSchemeV3Block,
             Set<ContentDigestAlgorithm> contentDigestsToVerify,
             ApkSigningBlockUtils.Result result) throws NoSuchAlgorithmException {
-        try {
-            new V3SchemeVerifier.Builder(apkSignatureSchemeV3Block)
-                    .setResult(result)
-                    .setContentDigestsToVerify(contentDigestsToVerify)
-                    .setFullVerification(false)
-                    .build()
-                    .parseSigners();
-        } catch (IOException | SignatureNotFoundException e) {
-            // This should never occur since the apkSignatureSchemeV3Block was already provided.
-            throw new IllegalStateException("An exception was encountered when attempting to parse"
-                    + " the signers from the provided APK Signature Scheme v3 block", e);
-        }
-    }
-
-    /**
-     * Parses each signer in the APK Signature Scheme v3 block and populates corresponding
-     * {@link ApkSigningBlockUtils.Result.SignerInfo} instances in the
-     * returned {@link ApkSigningBlockUtils.Result}.
-     *
-     * <p>This verifies signatures over {@code signed-data} block contained in each signer block.
-     * However, this does not verify the integrity of the rest of the APK but rather simply reports
-     * the expected digests of the rest of the APK (see {@link Builder#setContentDigestsToVerify}).
-     *
-     * <p>This method adds one or more errors to the returned {@code Result} if a verification error
-     * is encountered when parsing the signers.
-     */
-    public ApkSigningBlockUtils.Result parseSigners()
-            throws IOException, NoSuchAlgorithmException, SignatureNotFoundException {
         ByteBuffer signers;
         try {
-            if (mApkSignatureSchemeV3Block == null) {
-                SignatureInfo signatureInfo =
-                        ApkSigningBlockUtils.findSignature(mApk, mZipSections, mBlockId, mResult);
-                mApkSignatureSchemeV3Block = signatureInfo.signatureBlock;
-            }
-            signers = getLengthPrefixedSlice(mApkSignatureSchemeV3Block);
+            signers = getLengthPrefixedSlice(apkSignatureSchemeV3Block);
         } catch (ApkFormatException e) {
-            mResult.addError(Issue.V3_SIG_MALFORMED_SIGNERS);
-            return mResult;
+            result.addError(Issue.V3_SIG_MALFORMED_SIGNERS);
+            return;
         }
         if (!signers.hasRemaining()) {
-            mResult.addError(Issue.V3_SIG_NO_SIGNERS);
-            return mResult;
+            result.addError(Issue.V3_SIG_NO_SIGNERS);
+            return;
         }
 
         CertificateFactory certFactory;
@@ -313,16 +255,15 @@
             ApkSigningBlockUtils.Result.SignerInfo signerInfo =
                     new ApkSigningBlockUtils.Result.SignerInfo();
             signerInfo.index = signerIndex;
-            mResult.signers.add(signerInfo);
+            result.signers.add(signerInfo);
             try {
                 ByteBuffer signer = getLengthPrefixedSlice(signers);
-                parseSigner(signer, certFactory, signerInfo);
+                parseSigner(signer, certFactory, signerInfo, contentDigestsToVerify);
             } catch (ApkFormatException | BufferUnderflowException e) {
                 signerInfo.addError(Issue.V3_SIG_MALFORMED_SIGNER);
-                return mResult;
+                return;
             }
         }
-        return mResult;
     }
 
     /**
@@ -337,9 +278,12 @@
      * expected to be encountered on an Android platform version in the
      * {@code [minSdkVersion, maxSdkVersion]} range.
      */
-    private void parseSigner(ByteBuffer signerBlock, CertificateFactory certFactory,
-            ApkSigningBlockUtils.Result.SignerInfo result)
-            throws ApkFormatException, NoSuchAlgorithmException {
+    private static void parseSigner(
+            ByteBuffer signerBlock,
+            CertificateFactory certFactory,
+            ApkSigningBlockUtils.Result.SignerInfo result,
+            Set<ContentDigestAlgorithm> contentDigestsToVerify)
+                    throws ApkFormatException, NoSuchAlgorithmException {
         ByteBuffer signedData = getLengthPrefixedSlice(signerBlock);
         byte[] signedDataBytes = new byte[signedData.remaining()];
         signedData.get(signedDataBytes);
@@ -428,7 +372,7 @@
                     return;
                 }
                 result.verifiedSignatures.put(signatureAlgorithm, sigBytes);
-                mContentDigestsToVerify.add(signatureAlgorithm.getContentDigestAlgorithm());
+                contentDigestsToVerify.add(signatureAlgorithm.getContentDigestAlgorithm());
             } catch (InvalidKeyException | InvalidAlgorithmParameterException
                     | SignatureException e) {
                 result.addError(Issue.V3_SIG_VERIFY_EXCEPTION, signatureAlgorithm, e);
@@ -538,7 +482,6 @@
 
         // Parse the additional attributes block.
         int additionalAttributeCount = 0;
-        boolean rotationAttrFound = false;
         while (additionalAttributes.hasRemaining()) {
             additionalAttributeCount++;
             try {
@@ -566,31 +509,6 @@
                     } catch (Exception e) {
                         result.addError(Issue.V3_SIG_MALFORMED_LINEAGE);
                     }
-                } else if (id == V3SchemeConstants.ROTATION_MIN_SDK_VERSION_ATTR_ID) {
-                    rotationAttrFound = true;
-                    // API targeting for rotation was added with V3.1; if the maxSdkVersion
-                    // does not support v3.1 then ignore this attribute.
-                    if (mMaxSdkVersion >= V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT
-                            && mFullVerification) {
-                        int attrRotationMinSdkVersion = ByteBuffer.wrap(value)
-                                .order(ByteOrder.LITTLE_ENDIAN).getInt();
-                        if (mOptionalRotationMinSdkVersion.isPresent()) {
-                            int rotationMinSdkVersion = mOptionalRotationMinSdkVersion.getAsInt();
-                            if (attrRotationMinSdkVersion != rotationMinSdkVersion) {
-                                result.addError(Issue.V31_ROTATION_MIN_SDK_MISMATCH,
-                                    attrRotationMinSdkVersion, rotationMinSdkVersion);
-                            }
-                        } else {
-                            result.addError(Issue.V31_BLOCK_MISSING, attrRotationMinSdkVersion);
-                        }
-                    }
-                } else if (id == V3SchemeConstants.ROTATION_ON_DEV_RELEASE_ATTR_ID) {
-                    // This attribute should only be used by a v3.1 signer to indicate rotation
-                    // is targeting the development release that is using the SDK version of the
-                    // previously released platform version.
-                    if (mBlockId != V3SchemeConstants.APK_SIGNATURE_SCHEME_V31_BLOCK_ID) {
-                        result.addWarning(Issue.V31_ROTATION_TARGETS_DEV_RELEASE_ATTR_ON_V3_SIGNER);
-                    }
                 } else {
                     result.addWarning(Issue.V3_SIG_UNKNOWN_ADDITIONAL_ATTRIBUTE, id);
                 }
@@ -600,168 +518,5 @@
                 return;
             }
         }
-        if (mFullVerification && mOptionalRotationMinSdkVersion.isPresent() && !rotationAttrFound) {
-            result.addWarning(Issue.V31_ROTATION_MIN_SDK_ATTR_MISSING,
-                    mOptionalRotationMinSdkVersion.getAsInt());
-        }
-    }
-
-    /** Builder of {@link V3SchemeVerifier} instances. */
-    public static class Builder {
-        private RunnablesExecutor mExecutor = RunnablesExecutor.SINGLE_THREADED;
-        private DataSource mApk;
-        private ApkUtils.ZipSections mZipSections;
-        private ByteBuffer mApkSignatureSchemeV3Block;
-        private Set<ContentDigestAlgorithm> mContentDigestsToVerify;
-        private ApkSigningBlockUtils.Result mResult;
-        private int mMinSdkVersion;
-        private int mMaxSdkVersion;
-        private int mBlockId = V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID;
-        private boolean mFullVerification = true;
-        private OptionalInt mOptionalRotationMinSdkVersion = OptionalInt.empty();
-
-        /**
-         * Instantiates a new {@code Builder} for a {@code V3SchemeVerifier} that can be used to
-         * verify the V3 signing block of the provided {@code apk} with the specified {@code
-         * zipSections} over the range from {@code minSdkVersion} to {@code maxSdkVersion}.
-         */
-        public Builder(DataSource apk, ApkUtils.ZipSections zipSections, int minSdkVersion,
-                int maxSdkVersion) {
-            mApk = apk;
-            mZipSections = zipSections;
-            mMinSdkVersion = minSdkVersion;
-            mMaxSdkVersion = maxSdkVersion;
-        }
-
-        /**
-         * Instantiates a new {@code Builder} for a {@code V3SchemeVerifier} that can be used to
-         * parse the {@link ApkSigningBlockUtils.Result.SignerInfo} instances from the {@code
-         * apkSignatureSchemeV3Block}.
-         *
-         * <note>Full verification of the v3 signature is not possible when instantiating a new
-         * {@code V3SchemeVerifier} with this method.</note>
-         */
-        public Builder(ByteBuffer apkSignatureSchemeV3Block) {
-            mApkSignatureSchemeV3Block = apkSignatureSchemeV3Block;
-        }
-
-        /**
-         * Sets the {@link RunnablesExecutor} to be used when verifying the APK's content digests.
-         */
-        public Builder setRunnablesExecutor(RunnablesExecutor executor) {
-            mExecutor = executor;
-            return this;
-        }
-
-        /**
-         * Sets the V3 {code blockId} to be verified in the provided APK.
-         *
-         * <p>This {@code V3SchemeVerifier} currently supports the block IDs for the {@link
-         * V3SchemeConstants#APK_SIGNATURE_SCHEME_V3_BLOCK_ID v3.0} and {@link
-         * V3SchemeConstants#APK_SIGNATURE_SCHEME_V31_BLOCK_ID v3.1} signature schemes.
-         */
-        public Builder setBlockId(int blockId) {
-            mBlockId = blockId;
-            return this;
-        }
-
-        /**
-         * Sets the {@code rotationMinSdkVersion} to be verified in the v3.0 signer's additional
-         * attribute.
-         *
-         * <p>This value can be obtained from the signers returned when verifying the v3.1 signing
-         * block of an APK; in the case of multiple signers targeting different SDK versions in the
-         * v3.1 signing block, the minimum SDK version from all the signers should be used.
-         */
-        public Builder setRotationMinSdkVersion(int rotationMinSdkVersion) {
-            mOptionalRotationMinSdkVersion = OptionalInt.of(rotationMinSdkVersion);
-            return this;
-        }
-
-        /**
-         * Sets the {@code result} instance to be used when returning verification results.
-         *
-         * <p>This method can be used when the caller already has a {@link
-         * ApkSigningBlockUtils.Result} and wants to store the verification results in this
-         * instance.
-         */
-        public Builder setResult(ApkSigningBlockUtils.Result result) {
-            mResult = result;
-            return this;
-        }
-
-        /**
-         * Sets the instance to be used to store the {@code contentDigestsToVerify}.
-         *
-         * <p>This method can be used when the caller needs access to the {@code
-         * contentDigestsToVerify} computed by this {@code V3SchemeVerifier}.
-         */
-        public Builder setContentDigestsToVerify(
-                Set<ContentDigestAlgorithm> contentDigestsToVerify) {
-            mContentDigestsToVerify = contentDigestsToVerify;
-            return this;
-        }
-
-        /**
-         * Sets whether full verification should be performed by the {@code V3SchemeVerifier} built
-         * from this instance.
-         *
-         * <note>{@link #verify()} will always verify the content digests for the APK, but this
-         * allows verification of the rotation minimum SDK version stripping attribute to be skipped
-         * for scenarios where this value may not have been parsed from a V3.1 signing block (such
-         * as when only {@link #parseSigners()} will be invoked.</note>
-         */
-        public Builder setFullVerification(boolean fullVerification) {
-            mFullVerification = fullVerification;
-            return this;
-        }
-
-        /**
-         * Returns a new {@link V3SchemeVerifier} built with the configuration provided to this
-         * {@code Builder}.
-         */
-        public V3SchemeVerifier build() {
-            int sigSchemeVersion;
-            switch (mBlockId) {
-                case V3SchemeConstants.APK_SIGNATURE_SCHEME_V3_BLOCK_ID:
-                    sigSchemeVersion = ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V3;
-                    mMinSdkVersion = Math.max(mMinSdkVersion,
-                            V3SchemeConstants.MIN_SDK_WITH_V3_SUPPORT);
-                    break;
-                case V3SchemeConstants.APK_SIGNATURE_SCHEME_V31_BLOCK_ID:
-                    sigSchemeVersion = ApkSigningBlockUtils.VERSION_APK_SIGNATURE_SCHEME_V31;
-                    // V3.1 supports targeting an SDK version later than that of the initial release
-                    // in which it is supported; allow any range for V3.1 as long as V3.0 covers the
-                    // rest of the range.
-                    mMinSdkVersion = mMaxSdkVersion;
-                    break;
-                default:
-                    throw new IllegalArgumentException(
-                            String.format("Unsupported APK Signature Scheme V3 block ID: 0x%08x",
-                                    mBlockId));
-            }
-            if (mResult == null) {
-                mResult = new ApkSigningBlockUtils.Result(sigSchemeVersion);
-            }
-            if (mContentDigestsToVerify == null) {
-                mContentDigestsToVerify = new HashSet<>(1);
-            }
-
-            V3SchemeVerifier verifier = new V3SchemeVerifier(
-                    mExecutor,
-                    mApk,
-                    mZipSections,
-                    mContentDigestsToVerify,
-                    mResult,
-                    mMinSdkVersion,
-                    mMaxSdkVersion,
-                    mBlockId,
-                    mOptionalRotationMinSdkVersion,
-                    mFullVerification);
-            if (mApkSignatureSchemeV3Block != null) {
-                verifier.mApkSignatureSchemeV3Block = mApkSignatureSchemeV3Block;
-            }
-            return verifier;
-        }
     }
 }
diff --git a/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeSigner.java b/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeSigner.java
index 2f9ecb3..74aa629 100644
--- a/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeSigner.java
+++ b/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeSigner.java
@@ -22,11 +22,11 @@
 
 import com.android.apksig.apk.ApkUtils;
 import com.android.apksig.internal.apk.ApkSigningBlockUtils;
+import com.android.apksig.internal.apk.ApkSigningBlockUtils.SignerConfig;
 import com.android.apksig.internal.apk.ContentDigestAlgorithm;
 import com.android.apksig.internal.apk.SignatureAlgorithm;
 import com.android.apksig.internal.apk.SignatureInfo;
 import com.android.apksig.internal.apk.v2.V2SchemeVerifier;
-import com.android.apksig.internal.apk.v3.V3SchemeConstants;
 import com.android.apksig.internal.apk.v3.V3SchemeSigner;
 import com.android.apksig.internal.apk.v3.V3SchemeVerifier;
 import com.android.apksig.internal.util.Pair;
@@ -43,7 +43,6 @@
 import java.security.PublicKey;
 import java.security.SignatureException;
 import java.security.cert.CertificateEncodingException;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -62,6 +61,7 @@
  * </p>
  * (optional) verityTree: integer size prepended bytes of the verity hash tree.
  * <p>
+ * TODO(schfan): Add v4 unit tests
  */
 public abstract class V4SchemeSigner {
     /**
@@ -70,23 +70,6 @@
     private V4SchemeSigner() {
     }
 
-    public static class SignerConfig {
-        final public ApkSigningBlockUtils.SignerConfig v4Config;
-        final public ApkSigningBlockUtils.SignerConfig v41Config;
-
-        public SignerConfig(List<ApkSigningBlockUtils.SignerConfig> v4Configs,
-                List<ApkSigningBlockUtils.SignerConfig> v41Configs) throws InvalidKeyException {
-            if (v4Configs == null || v4Configs.size() != 1) {
-                throw new InvalidKeyException("Only accepting one signer config for V4 Signature.");
-            }
-            if (v41Configs != null && v41Configs.size() != 1) {
-                throw new InvalidKeyException("Only accepting one signer config for V4.1 Signature.");
-            }
-            this.v4Config = v4Configs.get(0);
-            this.v41Config = v41Configs != null ? v41Configs.get(0) : null;
-        }
-    }
-
     /**
      * Based on a public key, return a signing algorithm that supports verity.
      */
@@ -166,10 +149,10 @@
         return Pair.of(signature, tree);
     }
 
-    private static V4Signature.SigningInfo generateSigningInfo(
-            ApkSigningBlockUtils.SignerConfig signerConfig,
+    private static V4Signature generateSignature(
+            SignerConfig signerConfig,
             V4Signature.HashingInfo hashingInfo,
-            byte[] apkDigest, byte[] additionalData, long fileSize)
+            byte[] apkDigest, byte[] additionaData, long fileSize)
             throws NoSuchAlgorithmException, InvalidKeyException, SignatureException,
             CertificateEncodingException {
         if (signerConfig.certificates.isEmpty()) {
@@ -186,7 +169,7 @@
         final byte[] encodedCertificate = encodedCertificates.get(0);
 
         final V4Signature.SigningInfo signingInfoNoSignature = new V4Signature.SigningInfo(apkDigest,
-                encodedCertificate, additionalData, publicKey.getEncoded(), -1, null);
+                encodedCertificate, additionaData, publicKey.getEncoded(), -1, null);
 
         final byte[] data = V4Signature.getSignedData(fileSize, hashingInfo,
                 signingInfoNoSignature);
@@ -201,33 +184,12 @@
         final int signatureAlgorithmId = signatures.get(0).getFirst();
         final byte[] signature = signatures.get(0).getSecond();
 
-        return new V4Signature.SigningInfo(apkDigest,
-                encodedCertificate, additionalData, publicKey.getEncoded(), signatureAlgorithmId,
+        final V4Signature.SigningInfo signingInfo = new V4Signature.SigningInfo(apkDigest,
+                encodedCertificate, additionaData, publicKey.getEncoded(), signatureAlgorithmId,
                 signature);
-    }
-
-    private static V4Signature generateSignature(
-            SignerConfig signerConfig,
-            V4Signature.HashingInfo hashingInfo,
-            byte[] apkDigest, byte[] additionalData, long fileSize)
-            throws NoSuchAlgorithmException, InvalidKeyException, SignatureException,
-            CertificateEncodingException {
-        final V4Signature.SigningInfo signingInfo = generateSigningInfo(signerConfig.v4Config,
-                hashingInfo, apkDigest, additionalData, fileSize);
-
-        final V4Signature.SigningInfos signingInfos;
-        if (signerConfig.v41Config != null) {
-            final V4Signature.SigningInfoBlock extSigningBlock = new V4Signature.SigningInfoBlock(
-                    V3SchemeConstants.APK_SIGNATURE_SCHEME_V31_BLOCK_ID,
-                    generateSigningInfo(signerConfig.v41Config, hashingInfo, apkDigest,
-                            additionalData, fileSize).toByteArray());
-            signingInfos = new V4Signature.SigningInfos(signingInfo, extSigningBlock);
-        } else {
-            signingInfos = new V4Signature.SigningInfos(signingInfo);
-        }
 
         return new V4Signature(V4Signature.CURRENT_VERSION, hashingInfo.toByteArray(),
-                signingInfos.toByteArray());
+                signingInfo.toByteArray());
     }
 
     // Get digest by parsing the V2/V3-signed apk and choosing the first digest of supported type.
diff --git a/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeVerifier.java b/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeVerifier.java
index c0a9013..a6cd9db 100644
--- a/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeVerifier.java
+++ b/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeVerifier.java
@@ -90,37 +90,20 @@
 
         V4Signature.HashingInfo hashingInfo = V4Signature.HashingInfo.fromByteArray(
                 signature.hashingInfo);
+        V4Signature.SigningInfo signingInfo = V4Signature.SigningInfo.fromByteArray(
+                signature.signingInfo);
 
-        V4Signature.SigningInfos signingInfos = V4Signature.SigningInfos.fromByteArray(
-                signature.signingInfos);
+        final byte[] signedData = V4Signature.getSignedData(apk.size(), hashingInfo, signingInfo);
 
-        final ApkSigningBlockUtils.Result.SignerInfo signerInfo;
-
-        // Verify the primary signature over signedData.
-        {
-            V4Signature.SigningInfo signingInfo = signingInfos.signingInfo;
-            final byte[] signedData = V4Signature.getSignedData(apk.size(), hashingInfo,
-                    signingInfo);
-            signerInfo = parseAndVerifySignatureBlock(signingInfo, signedData);
-            result.signers.add(signerInfo);
-            if (result.containsErrors()) {
-                return result;
-            }
+        // First, verify the signature over signedData.
+        ApkSigningBlockUtils.Result.SignerInfo signerInfo = parseAndVerifySignatureBlock(
+                signingInfo, signedData);
+        result.signers.add(signerInfo);
+        if (result.containsErrors()) {
+            return result;
         }
 
-        // Verify all subsequent signatures.
-        for (V4Signature.SigningInfoBlock signingInfoBlock : signingInfos.signingInfoBlocks) {
-            V4Signature.SigningInfo signingInfo = V4Signature.SigningInfo.fromByteArray(
-                    signingInfoBlock.signingInfo);
-            final byte[] signedData = V4Signature.getSignedData(apk.size(), hashingInfo,
-                    signingInfo);
-            result.signers.add(parseAndVerifySignatureBlock(signingInfo, signedData));
-            if (result.containsErrors()) {
-                return result;
-            }
-        }
-
-        // Check if the root hash and the tree are correct.
+        // Second, check if the root hash and the tree are correct.
         verifyRootHashAndTree(apk, signerInfo, hashingInfo.rawRootHash, tree);
         if (!result.containsErrors()) {
             result.verified = true;
diff --git a/src/main/java/com/android/apksig/internal/apk/v4/V4Signature.java b/src/main/java/com/android/apksig/internal/apk/v4/V4Signature.java
index 1eac5a2..deabe12 100644
--- a/src/main/java/com/android/apksig/internal/apk/v4/V4Signature.java
+++ b/src/main/java/com/android/apksig/internal/apk/v4/V4Signature.java
@@ -22,8 +22,6 @@
 import java.io.OutputStream;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.Arrays;
 
 public class V4Signature {
     public static final int CURRENT_VERSION = 2;
@@ -31,8 +29,6 @@
     public static final int HASHING_ALGORITHM_SHA256 = 1;
     public static final byte LOG2_BLOCK_SIZE_4096_BYTES = 12;
 
-    public static final int MAX_SIGNING_INFOS_SIZE = 7168;
-
     public static class HashingInfo {
         public final int hashAlgorithm; // only 1 == SHA256 supported
         public final byte log2BlockSize; // only 12 (block size 4096) supported now
@@ -86,10 +82,7 @@
         }
 
         static SigningInfo fromByteArray(byte[] bytes) throws IOException {
-            return fromByteBuffer(ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN));
-        }
-
-        static SigningInfo fromByteBuffer(ByteBuffer buffer) throws IOException {
+            ByteBuffer buffer = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
             byte[] apkDigest = readBytes(buffer);
             byte[] certificate = readBytes(buffer);
             byte[] additionalData = readBytes(buffer);
@@ -115,93 +108,14 @@
         }
     }
 
-    public static class SigningInfoBlock {
-        public final int blockId;
-        public final byte[] signingInfo;
-
-        public SigningInfoBlock(int blockId, byte[] signingInfo) {
-            this.blockId = blockId;
-            this.signingInfo = signingInfo;
-        }
-
-        static SigningInfoBlock fromByteBuffer(ByteBuffer buffer) throws IOException {
-            int blockId = buffer.getInt();
-            byte[] signingInfo = readBytes(buffer);
-            return new SigningInfoBlock(blockId, signingInfo);
-        }
-
-        byte[] toByteArray() {
-            final int size = 4/*blockId*/ + bytesSize(this.signingInfo);
-            ByteBuffer buffer = ByteBuffer.allocate(size).order(ByteOrder.LITTLE_ENDIAN);
-            buffer.putInt(this.blockId);
-            writeBytes(buffer, this.signingInfo);
-            return buffer.array();
-        }
-    }
-
-    public static class SigningInfos {
-        public final SigningInfo signingInfo;
-        public final SigningInfoBlock[] signingInfoBlocks;
-
-        public SigningInfos(SigningInfo signingInfo) {
-            this.signingInfo = signingInfo;
-            this.signingInfoBlocks = new SigningInfoBlock[0];
-        }
-
-        public SigningInfos(SigningInfo signingInfo, SigningInfoBlock... signingInfoBlocks) {
-            this.signingInfo = signingInfo;
-            this.signingInfoBlocks = signingInfoBlocks;
-        }
-
-        public static SigningInfos fromByteArray(byte[] bytes) throws IOException {
-            ByteBuffer buffer = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
-            SigningInfo signingInfo = SigningInfo.fromByteBuffer(buffer);
-            if (!buffer.hasRemaining()) {
-                return new SigningInfos(signingInfo);
-            }
-            ArrayList<SigningInfoBlock> signingInfoBlocks = new ArrayList<>(1);
-            while (buffer.hasRemaining()) {
-                signingInfoBlocks.add(SigningInfoBlock.fromByteBuffer(buffer));
-            }
-            return new SigningInfos(signingInfo,
-                    signingInfoBlocks.toArray(new SigningInfoBlock[signingInfoBlocks.size()]));
-        }
-
-        byte[] toByteArray() {
-            byte[][] arrays = new byte[1 + this.signingInfoBlocks.length][];
-            arrays[0] = this.signingInfo.toByteArray();
-            int size = arrays[0].length;
-            for (int i = 0, isize = this.signingInfoBlocks.length; i < isize; ++i) {
-                arrays[i + 1] = this.signingInfoBlocks[i].toByteArray();
-                size += arrays[i + 1].length;
-            }
-            if (size > MAX_SIGNING_INFOS_SIZE) {
-                throw new IllegalArgumentException(
-                        "Combined SigningInfos length exceeded limit of 7K: " + size);
-            }
-
-            // Combine all arrays into one.
-            byte[] result = Arrays.copyOf(arrays[0], size);
-            int offset = arrays[0].length;
-            for (int i = 0, isize = this.signingInfoBlocks.length; i < isize; ++i) {
-                System.arraycopy(arrays[i + 1], 0, result, offset, arrays[i + 1].length);
-                offset += arrays[i + 1].length;
-            }
-            return result;
-        }
-    }
-
-    // Always 2 for now.
-    public final int version;
+    public final int version; // Always 2 for now.
     public final byte[] hashingInfo;
-    // Can contain either SigningInfo or SigningInfo + one or multiple SigningInfoBlock.
-    // Passed as-is to the kernel. Can be retrieved later.
-    public final byte[] signingInfos;
+    public final byte[] signingInfo; // Passed as-is to the kernel. Can be retrieved later.
 
-    V4Signature(int version, byte[] hashingInfo, byte[] signingInfos) {
+    V4Signature(int version, byte[] hashingInfo, byte[] signingInfo) {
         this.version = version;
         this.hashingInfo = hashingInfo;
-        this.signingInfos = signingInfos;
+        this.signingInfo = signingInfo;
     }
 
     static V4Signature readFrom(InputStream stream) throws IOException {
@@ -217,7 +131,7 @@
     public void writeTo(OutputStream stream) throws IOException {
         writeIntLE(stream, this.version);
         writeBytes(stream, this.hashingInfo);
-        writeBytes(stream, this.signingInfos);
+        writeBytes(stream, this.signingInfo);
     }
 
     static byte[] getSignedData(long fileSize, HashingInfo hashingInfo, SigningInfo signingInfo) {
diff --git a/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java b/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java
index 9712767..4185dbc 100644
--- a/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java
+++ b/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java
@@ -16,7 +16,6 @@
 
 package com.android.apksig.internal.pkcs7;
 
-import static com.android.apksig.Constants.OID_RSA_ENCRYPTION;
 import static com.android.apksig.internal.asn1.Asn1DerEncoder.ASN1_DER_NULL;
 import static com.android.apksig.internal.oid.OidConstants.OID_DIGEST_SHA1;
 import static com.android.apksig.internal.oid.OidConstants.OID_DIGEST_SHA256;
@@ -93,7 +92,7 @@
                 throw new IllegalArgumentException(
                         "Unexpected digest algorithm: " + digestAlgorithm);
         }
-        if ("RSA".equalsIgnoreCase(keyAlgorithm) || OID_RSA_ENCRYPTION.equals(keyAlgorithm)) {
+        if ("RSA".equalsIgnoreCase(keyAlgorithm)) {
             return Pair.of(
                     jcaDigestPrefixForSigAlg + "withRSA",
                     new AlgorithmIdentifier(OID_SIG_RSA, ASN1_DER_NULL));
diff --git a/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java b/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java
index bbead72..87eae48 100644
--- a/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java
+++ b/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java
@@ -54,18 +54,6 @@
     /** Android P. */
     public static final int P = 28;
 
-    /** Android Q. */
-    public static final int Q = 29;
-
     /** Android R. */
     public static final int R = 30;
-
-    /** Android S. */
-    public static final int S = 31;
-
-    /** Android Sv2. */
-    public static final int Sv2 = 32;
-
-    /** Android T. */
-    public static final int T = 33;
 }
diff --git a/src/main/java/com/android/apksig/internal/zip/ZipUtils.java b/src/main/java/com/android/apksig/internal/zip/ZipUtils.java
index 1c2e82c..9d9da15 100644
--- a/src/main/java/com/android/apksig/internal/zip/ZipUtils.java
+++ b/src/main/java/com/android/apksig/internal/zip/ZipUtils.java
@@ -70,20 +70,6 @@
     }
 
     /**
-     * Sets the length of EOCD comment.
-     *
-     * <p>NOTE: Byte order of {@code zipEndOfCentralDirectory} must be little-endian.
-     */
-    public static void updateZipEocdCommentLen(ByteBuffer zipEndOfCentralDirectory) {
-        assertByteOrderLittleEndian(zipEndOfCentralDirectory);
-        int commentLen = zipEndOfCentralDirectory.remaining() - ZIP_EOCD_REC_MIN_SIZE;
-        setUnsignedInt16(
-                zipEndOfCentralDirectory,
-                zipEndOfCentralDirectory.position() + ZIP_EOCD_COMMENT_LENGTH_FIELD_OFFSET,
-                commentLen);
-    }
-
-    /**
      * Returns the offset of the start of the ZIP Central Directory in the archive.
      *
      * <p>NOTE: Byte order of {@code zipEndOfCentralDirectory} must be little-endian.
diff --git a/src/test/java/com/android/apksig/ApkSignerTest.java b/src/test/java/com/android/apksig/ApkSignerTest.java
index 83e0499..d799201 100644
--- a/src/test/java/com/android/apksig/ApkSignerTest.java
+++ b/src/test/java/com/android/apksig/ApkSignerTest.java
@@ -21,7 +21,6 @@
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
@@ -90,9 +89,9 @@
 
     // All signers with the same prefix and an _X suffix were signed with the private key of the
     // (X-1) signer.
-    static final String FIRST_RSA_2048_SIGNER_RESOURCE_NAME = "rsa-2048";
-    static final String SECOND_RSA_2048_SIGNER_RESOURCE_NAME = "rsa-2048_2";
-    static final String THIRD_RSA_2048_SIGNER_RESOURCE_NAME = "rsa-2048_3";
+    private static final String FIRST_RSA_2048_SIGNER_RESOURCE_NAME = "rsa-2048";
+    private static final String SECOND_RSA_2048_SIGNER_RESOURCE_NAME = "rsa-2048_2";
+    private static final String THIRD_RSA_2048_SIGNER_RESOURCE_NAME = "rsa-2048_3";
 
     private static final String EC_P256_SIGNER_RESOURCE_NAME = "ec-p256";
 
@@ -227,9 +226,7 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(false)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
-
         signGolden(
                 "golden-legacy-aligned-in.apk",
                 new File(outDir, "golden-legacy-aligned-v3-lineage-out.apk"),
@@ -237,7 +234,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(false)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         signGolden(
                 "golden-aligned-in.apk",
@@ -246,7 +242,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(false)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
 
         signGolden(
@@ -299,7 +294,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         signGolden(
                 "golden-legacy-aligned-in.apk",
@@ -308,7 +302,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         signGolden(
                 "golden-aligned-in.apk",
@@ -317,7 +310,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
 
         signGolden(
@@ -348,7 +340,6 @@
                         .setV1SigningEnabled(true)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         signGolden(
                 "golden-legacy-aligned-in.apk",
@@ -357,7 +348,6 @@
                         .setV1SigningEnabled(true)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         signGolden(
                 "golden-aligned-in.apk",
@@ -366,7 +356,6 @@
                         .setV1SigningEnabled(true)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
 
         signGolden(
@@ -471,7 +460,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(false)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         assertGolden(
                 "golden-unaligned-in.apk",
@@ -494,7 +482,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         assertGolden(
                 "golden-unaligned-in.apk",
@@ -510,7 +497,6 @@
                         .setV1SigningEnabled(true)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
 
         // Uncompressed entries in this input file are aligned by zero-padding the "extra" field, as
@@ -550,7 +536,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(false)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         assertGolden(
                 "golden-legacy-aligned-in.apk",
@@ -573,7 +558,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         assertGolden(
                 "golden-legacy-aligned-in.apk",
@@ -589,7 +573,6 @@
                         .setV1SigningEnabled(true)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
 
         // Uncompressed entries in this input file are aligned by padding the "extra" field, as
@@ -628,7 +611,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(false)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         assertGolden(
                 "golden-aligned-in.apk",
@@ -651,7 +633,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
         assertGolden(
                 "golden-aligned-in.apk",
@@ -667,7 +648,6 @@
                         .setV1SigningEnabled(true)
                         .setV2SigningEnabled(true)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
     }
 
@@ -970,7 +950,6 @@
                         .setV1SigningEnabled(false)
                         .setV2SigningEnabled(false)
                         .setV3SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
                         .setSigningCertificateLineage(lineage));
 
         // Verifies that an intermediate signer in the lineage is not sufficient to satisfy the
@@ -1520,469 +1499,6 @@
                 EC_P256_SIGNER_RESOURCE_NAME);
     }
 
-    @Test
-    public void testSetMinSdkVersionForRotation_lessThanT_noV31Block() throws Exception {
-        // The V3.1 signing block is intended to allow APK signing key rotation to target T+, but
-        // a minimum SDK version can be explicitly set for rotation; if it is less than T than
-        // the rotated key will be included in the V3.0 block.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage =
-                Arrays.asList(
-                        getDefaultSignerConfigFromResources(FIRST_RSA_2048_SIGNER_RESOURCE_NAME),
-                        getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-                Resources.toSigningCertificateLineage(
-                        ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        File signedApkMinRotationP = sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(false)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
-                        .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result resultMinRotationP = verify(signedApkMinRotationP, null);
-        // The V3.1 signature scheme was introduced in T; specifying an older SDK version as the
-        // minimum for rotation should cause the APK to still be signed with rotation in the V3.0
-        // signing block.
-        File signedApkMinRotationS = sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(false)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.S)
-                        .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result resultMinRotationS = verify(signedApkMinRotationS, null);
-
-        assertVerified(resultMinRotationP);
-        assertFalse(resultMinRotationP.isVerifiedUsingV31Scheme());
-        assertEquals(1, resultMinRotationP.getV3SchemeSigners().size());
-        assertResultContainsSigners(resultMinRotationP, true, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-                SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-        assertVerified(resultMinRotationS);
-        assertFalse(resultMinRotationS.isVerifiedUsingV31Scheme());
-        // While rotation is targeting S, signer blocks targeting specific SDK versions have not
-        // been tested in previous platform releases; ensure only a single signer block with the
-        // rotated key is in the V3 block.
-        assertEquals(1, resultMinRotationS.getV3SchemeSigners().size());
-        assertResultContainsSigners(resultMinRotationS, true, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-                SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-    }
-
-    @Test
-    public void testSetMinSdkVersionForRotation_TAndLater_v31Block() throws Exception {
-        // When T or later is specified as the minimum SDK version for rotation, then a new V3.1
-        // signing block should be created with the new rotated key, and the V3.0 signing block
-        // should still be signed with the original key.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage =
-            Arrays.asList(
-                getDefaultSignerConfigFromResources(FIRST_RSA_2048_SIGNER_RESOURCE_NAME),
-                getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-            Resources.toSigningCertificateLineage(
-                ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        File signedApkMinRotationT = sign("original.apk",
-            new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                .setV1SigningEnabled(true)
-                .setV2SigningEnabled(true)
-                .setV3SigningEnabled(true)
-                .setV4SigningEnabled(false)
-                .setMinSdkVersionForRotation(AndroidSdkVersion.T)
-                .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result resultMinRotationT = verify(signedApkMinRotationT, null);
-        // The API level for a release after T is not yet defined, so for now treat it as T + 1.
-        File signedApkMinRotationU = sign("original.apk",
-            new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                .setV1SigningEnabled(true)
-                .setV2SigningEnabled(true)
-                .setV3SigningEnabled(true)
-                .setV4SigningEnabled(false)
-                .setMinSdkVersionForRotation(AndroidSdkVersion.T + 1)
-                .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result resultMinRotationU = verify(signedApkMinRotationU, null);
-
-        assertVerified(resultMinRotationT);
-        assertTrue(resultMinRotationT.isVerifiedUsingV31Scheme());
-        assertResultContainsSigners(resultMinRotationT, true, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-            SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-        assertV31SignerTargetsMinApiLevel(resultMinRotationT, SECOND_RSA_2048_SIGNER_RESOURCE_NAME,
-            AndroidSdkVersion.T);
-        assertVerified(resultMinRotationU);
-        assertTrue(resultMinRotationU.isVerifiedUsingV31Scheme());
-        assertResultContainsSigners(resultMinRotationU, true, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-            SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-        assertV31SignerTargetsMinApiLevel(resultMinRotationU, SECOND_RSA_2048_SIGNER_RESOURCE_NAME,
-            AndroidSdkVersion.T + 1);
-    }
-
-    @Test
-    public void testSetMinSdkVersionForRotation_targetTNoOriginalSigner_fails() throws Exception {
-        // Similar to the V1 and V2 signatures schemes, if an app is targeting P or later with
-        // rotation targeting T, the original signer must be provided so that it can be used in the
-        // V3.0 signing block; if it is not provided the signer should throw an Exception.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage = List
-            .of(getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-            Resources.toSigningCertificateLineage(
-                ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        assertThrows(IllegalArgumentException.class, () ->
-            sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                    .setV1SigningEnabled(false)
-                    .setV2SigningEnabled(false)
-                    .setV3SigningEnabled(true)
-                    .setV4SigningEnabled(false)
-                    .setMinSdkVersion(28)
-                    .setMinSdkVersionForRotation(AndroidSdkVersion.T)
-                    .setSigningCertificateLineage(lineage)));
-    }
-
-    @Test
-    public void testSetMinSdkVersionForRotation_targetTAndApkMinSdkT_onlySignsV3Block()
-            throws Exception {
-        // A V3.1 signing block should only exist alongside a V3.0 signing block; if an APK's
-        // min SDK version is greater than or equal to the SDK version for rotation then the
-        // original signer should not be required, and the rotated signing key should be in
-        // a V3.0 signing block.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage = List
-            .of(getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-            Resources.toSigningCertificateLineage(
-                ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        File signedApk = sign("original.apk",
-            new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                .setV1SigningEnabled(false)
-                .setV2SigningEnabled(false)
-                .setV3SigningEnabled(true)
-                .setV4SigningEnabled(false)
-                .setMinSdkVersion(V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT)
-                .setMinSdkVersionForRotation(V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT)
-                .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result result = verifyForMinSdkVersion(signedApk,
-            V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT);
-
-        assertVerified(result);
-        assertFalse(result.isVerifiedUsingV31Scheme());
-        assertResultContainsSigners(result, true, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-            SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-    }
-
-    @Test
-    public void testSetMinSdkVersionForRotation_targetTWithSourceStamp_noWarnings()
-            throws Exception {
-        // Source stamp verification will report a warning if a stamp signature is not found for any
-        // of the APK Signature Schemes used to sign the APK. This test verifies an APK signed with
-        // a rotated key in the v3.1 block and a source stamp successfully verifies, including the
-        // source stamp, without any warnings.
-        ApkSigner.SignerConfig rsa2048OriginalSignerConfig = getDefaultSignerConfigFromResources(
-                FIRST_RSA_2048_SIGNER_RESOURCE_NAME);
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage =
-                Arrays.asList(
-                        rsa2048OriginalSignerConfig,
-                        getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-                Resources.toSigningCertificateLineage(
-                        ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        File signedApk = sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(false)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.T)
-                        .setSigningCertificateLineage(lineage)
-                        .setSourceStampSignerConfig(rsa2048OriginalSignerConfig));
-        ApkVerifier.Result result = verify(signedApk, null);
-
-        assertResultContainsSigners(result, true, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-                SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-        assertV31SignerTargetsMinApiLevel(result, SECOND_RSA_2048_SIGNER_RESOURCE_NAME,
-                AndroidSdkVersion.T);
-        assertSourceStampVerified(signedApk, result);
-    }
-
-    @Test
-    public void testSetRotationTargetsDevRelease_target34_v30SignerTargetsAtLeast34()
-            throws Exception {
-        // During development of a new platform release the new platform will use the SDK version
-        // of the previously released platform, so in order to test rotation on a new platform
-        // release it must target the SDK version of the previous platform. However an APK signed
-        // with the v3.1 signature scheme and targeting rotation on the previous platform release X
-        // would still use rotation if that APK were installed on a device running release version
-        // X. To support targeting rotation on the main branch, the v3.1 signature scheme supports
-        // a rotation-targets-dev-release attribute; this allows the APK to use the v3.1 signer
-        // block on a development platform with SDK version X while a release platform X will
-        // skip this signer block when it sees this additional attribute. To ensure that the APK
-        // will still target the released platform X, the v3.0 signer must have a maxSdkVersion
-        // of at least X for the signer.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage =
-                Arrays.asList(
-                        getDefaultSignerConfigFromResources(FIRST_RSA_2048_SIGNER_RESOURCE_NAME),
-                        getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-                Resources.toSigningCertificateLineage(
-                        ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-        int rotationMinSdkVersion = V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT + 1;
-
-        File signedApk = sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(false)
-                        .setMinSdkVersionForRotation(rotationMinSdkVersion)
-                        .setSigningCertificateLineage(lineage)
-                        .setRotationTargetsDevRelease(true));
-        ApkVerifier.Result result = verify(signedApk, null);
-
-        assertVerified(result);
-        assertTrue(result.isVerifiedUsingV31Scheme());
-        assertTrue(result.getV31SchemeSigners().get(0).getRotationTargetsDevRelease());
-        assertResultContainsSigners(result, true, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-                SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-        assertTrue(result.getV3SchemeSigners().get(0).getMaxSdkVersion() >= rotationMinSdkVersion);
-    }
-
-    @Test
-    public void testV3_rotationMinSdkVersionLessThanTV3Only_origSignerNotRequired()
-            throws Exception {
-        // The v3.1 signature scheme allows a rotation-min-sdk-version be specified to target T+
-        // for rotation; however if this value is less than the expected SDK version of T, then
-        // apksig should just use the rotated signing key in the v3.0 block. An APK that targets
-        // P+ that wants to use rotation in the v3.0 signing block should only need to provide
-        // the rotated signing key and lineage; this test ensures this behavior when the
-        // rotation-min-sdk-version is set to a value > P and < T.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage =
-                Arrays.asList(
-                        getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-                Resources.toSigningCertificateLineage(
-                        ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        File signedApkRotationOnQ = sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                        .setV1SigningEnabled(false)
-                        .setV2SigningEnabled(false)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(false)
-                        .setMinSdkVersion(AndroidSdkVersion.P)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.Q)
-                        .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result resultRotationOnQ = verify(signedApkRotationOnQ, AndroidSdkVersion.P);
-
-        assertVerified(resultRotationOnQ);
-        assertEquals(1, resultRotationOnQ.getV3SchemeSigners().size());
-        assertFalse(resultRotationOnQ.isVerifiedUsingV31Scheme());
-        assertResultContainsSigners(resultRotationOnQ, true, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-                SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-    }
-
-    @Test
-    public void testV31_rotationMinSdkVersionEqualsMinSdkVersion_v3SignerPresent()
-            throws Exception {
-        // The SDK version for Sv2 (32) is used as the minSdkVersion for the V3.1 signature
-        // scheme to allow rotation to target the T development platform; this will be updated
-        // to the real SDK version of T once its SDK is finalized. This test verifies if a
-        // package has Sv2 as its minSdkVersion, the signing can complete as expected with the
-        // v3 block signed by the original signer and targeting just Sv2, and the v3.1 block
-        // signed by the rotated signer and targeting the dev release of Sv2 and all later releases.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage =
-                Arrays.asList(
-                        getDefaultSignerConfigFromResources(FIRST_RSA_2048_SIGNER_RESOURCE_NAME),
-                        getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-                Resources.toSigningCertificateLineage(
-                        ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        File signedApk = sign("original-minSdk32.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(false)
-                        .setMinSdkVersionForRotation(V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT)
-                        .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result result = verify(signedApk, null);
-
-        assertVerified(result);
-        assertEquals(AndroidSdkVersion.Sv2, result.getV3SchemeSigners().get(0).getMaxSdkVersion());
-    }
-
-    @Test
-    public void testV31_rotationMinSdkVersionTWithoutLineage_v30VerificationSucceeds()
-            throws Exception {
-        // apksig allows setting a rotation-min-sdk-version without providing a rotated signing
-        // key / lineage; however in the absence of rotation, the rotation-min-sdk-version should
-        // be a no-op, and the stripping protection attribute should not be written to the v3.0
-        // signer.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfig =
-                Collections.singletonList(
-                        getDefaultSignerConfigFromResources(FIRST_RSA_2048_SIGNER_RESOURCE_NAME));
-
-        File signedApk = sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfig)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(false)
-                        .setMinSdkVersionForRotation(V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT));
-        ApkVerifier.Result result = verify(signedApk, null);
-
-        assertVerified(result);
-        assertFalse(result.isVerifiedUsingV31Scheme());
-        assertTrue(result.isVerifiedUsingV3Scheme());
-    }
-
-    @Test
-    public void testV31_rotationMinSdkVersionDefault_rotationTargetsT() throws Exception {
-        // The v3.1 signature scheme was introduced in T to allow developers to target T+ for
-        // rotation due to known issues with rotation on previous platform releases. This test
-        // verifies an APK signed with a rotated signing key defaults to the original signing
-        // key used in the v3 signing block for pre-T devices, and the rotated signing key used
-        // in the v3.1 signing block for T+ devices.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage =
-                Arrays.asList(
-                        getDefaultSignerConfigFromResources(FIRST_RSA_2048_SIGNER_RESOURCE_NAME),
-                        getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-                Resources.toSigningCertificateLineage(
-                        ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        File signedApk = sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(false)
-                        .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result result = verify(signedApk, null);
-
-        assertVerified(result);
-        assertTrue(result.isVerifiedUsingV3Scheme());
-        assertTrue(result.isVerifiedUsingV31Scheme());
-        assertEquals(AndroidSdkVersion.Sv2, result.getV3SchemeSigners().get(0).getMaxSdkVersion());
-        assertV31SignerTargetsMinApiLevel(result, SECOND_RSA_2048_SIGNER_RESOURCE_NAME,
-                AndroidSdkVersion.T);
-    }
-
-    @Test
-    public void testV31_rotationMinSdkVersionP_rotationTargetsP() throws Exception {
-        // While the V3.1 signature scheme will target T by default, a package that has
-        // previously rotated can provide a rotation-min-sdk-version less than T to continue
-        // using the rotated signing key in the v3.0 block.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage =
-                Arrays.asList(
-                        getDefaultSignerConfigFromResources(FIRST_RSA_2048_SIGNER_RESOURCE_NAME),
-                        getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-                Resources.toSigningCertificateLineage(
-                        ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        File signedApk = sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(false)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
-                        .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result result = verify(signedApk, null);
-
-        assertVerified(result);
-        assertTrue(result.isVerifiedUsingV3Scheme());
-        assertFalse(result.isVerifiedUsingV31Scheme());
-    }
-
-    @Test
-    public void testV4_rotationMinSdkVersionLessThanT_signatureOnlyHasRotatedSigner()
-            throws Exception {
-        // To support SDK version targeting in the v3.1 signature scheme, apksig added a
-        // rotation-min-sdk-version option to allow the caller to specify the level from which
-        // the rotated signer should be used. A value less than T should result in a single
-        // rotated signer in the V3 block (along with the corresponding lineage), and the V4
-        // signature should use this signer.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage =
-                Arrays.asList(
-                        getDefaultSignerConfigFromResources(FIRST_RSA_2048_SIGNER_RESOURCE_NAME),
-                        getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-                Resources.toSigningCertificateLineage(
-                        ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        File signedApk = sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.P)
-                        .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result result = verify(signedApk, null);
-
-        assertResultContainsV4Signers(result, SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-    }
-
-    @Test
-    public void testV4_rotationMinSdkVersionT_signatureHasOrigAndRotatedKey() throws Exception {
-        // When an APK is signed with a rotated key and the rotation-min-sdk-version X is set to T+,
-        // a V3.1 block will be signed with the rotated signing key targeting X and later, and
-        // a V3.0 block will be signed with the original signing key targeting P - X-1. The
-        // V4 signature should contain both the original signing key and the rotated signing
-        // key; this ensures if an APK is installed on a device running an SDK version less than X,
-        // the V4 signature will be verified using the original signing key which will be the only
-        // signing key visible to the platform.
-        List<ApkSigner.SignerConfig> rsa2048SignerConfigWithLineage =
-                Arrays.asList(
-                        getDefaultSignerConfigFromResources(FIRST_RSA_2048_SIGNER_RESOURCE_NAME),
-                        getDefaultSignerConfigFromResources(SECOND_RSA_2048_SIGNER_RESOURCE_NAME));
-        SigningCertificateLineage lineage =
-                Resources.toSigningCertificateLineage(
-                        ApkSignerTest.class, LINEAGE_RSA_2048_2_SIGNERS_RESOURCE_NAME);
-
-        File signedApk = sign("original.apk",
-                new ApkSigner.Builder(rsa2048SignerConfigWithLineage)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(true)
-                        .setMinSdkVersionForRotation(AndroidSdkVersion.T)
-                        .setSigningCertificateLineage(lineage));
-        ApkVerifier.Result result = verify(signedApk, null);
-
-        assertResultContainsV4Signers(result, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-                SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-    }
-
-    @Test
-    public void testSourceStampTimestamp_signWithSourceStamp_validTimestampValue()
-            throws Exception {
-        // Source stamps should include a timestamp attribute with the epoch time the stamp block
-        // was signed. This test verifies a standard signing with a source stamp includes a valid
-        // value for the source stamp timestamp attribute.
-        ApkSigner.SignerConfig rsa2048SignerConfig = getDefaultSignerConfigFromResources(
-                FIRST_RSA_2048_SIGNER_RESOURCE_NAME);
-        List<ApkSigner.SignerConfig> ecP256SignerConfig = Collections.singletonList(
-                getDefaultSignerConfigFromResources(EC_P256_SIGNER_RESOURCE_NAME));
-
-        File signedApk = sign("original.apk",
-                new ApkSigner.Builder(ecP256SignerConfig)
-                        .setV1SigningEnabled(true)
-                        .setV2SigningEnabled(true)
-                        .setV3SigningEnabled(true)
-                        .setV4SigningEnabled(false)
-                        .setSourceStampSignerConfig(rsa2048SignerConfig));
-        ApkVerifier.Result result = verify(signedApk, null);
-
-        assertSourceStampVerified(signedApk, result);
-        long timestamp = result.getSourceStampInfo().getTimestampEpochSeconds();
-        assertTrue("Invalid source stamp timestamp value: " + timestamp, timestamp > 0);
-    }
-
     /**
      * Asserts the provided {@code signedApk} contains a signature block with the expected
      * {@code byte[]} value and block ID as specified in the {@code expectedBlock}.
@@ -2011,20 +1527,8 @@
      * Asserts the provided verification {@code result} contains the expected {@code signers} for
      * each scheme that was used to verify the APK's signature.
      */
-    static void assertResultContainsSigners(ApkVerifier.Result result, String... signers)
+    private static void assertResultContainsSigners(ApkVerifier.Result result, String... signers)
             throws Exception {
-        assertResultContainsSigners(result, false, signers);
-    }
-
-    /**
-     * Asserts the provided verification {@code result} contains the expected {@code signers} for
-     * each scheme that was used to verify the APK's signature; if {@code rotationExpected} is set
-     * to {@code true}, then the first element in {@code signers} is treated as the expected
-     * original signer for any V1, V2, and V3 (where applicable) signatures, and the last element
-     * is the rotated expected signer for V3+.
-     */
-    static void assertResultContainsSigners(ApkVerifier.Result result,
-        boolean rotationExpected, String... signers) throws Exception {
         // A result must be successfully verified before verifying any of the result's signers.
         assertTrue(result.isVerified());
 
@@ -2033,27 +1537,16 @@
             ApkSigner.SignerConfig signerConfig = getDefaultSignerConfigFromResources(signer);
             expectedSigners.addAll(signerConfig.getCertificates());
         }
-        // If rotation is expected then the V1 and V2 signature should only be signed by the
-        // original signer.
-        List<X509Certificate> expectedV1Signers =
-            rotationExpected ? List.of(expectedSigners.get(0)) : expectedSigners;
-        List<X509Certificate> expectedV2Signers =
-            rotationExpected ? List.of(expectedSigners.get(0)) : expectedSigners;
-        // V3 only supports a single signer; if rotation is not expected or the V3.1 block contains
-        // the rotated signing key then the expected V3.0 signer should be the original signer.
-        List<X509Certificate> expectedV3Signers =
-            !rotationExpected || result.isVerifiedUsingV31Scheme()
-                ? List.of(expectedSigners.get(0))
-                : List.of(expectedSigners.get(expectedSigners.size() - 1));
 
         if (result.isVerifiedUsingV1Scheme()) {
             Set<X509Certificate> v1Signers = new HashSet<>();
             for (ApkVerifier.Result.V1SchemeSignerInfo signer : result.getV1SchemeSigners()) {
                 v1Signers.add(signer.getCertificate());
             }
-            assertTrue("Expected V1 signers: " + getAllSubjectNamesFrom(expectedV1Signers)
+            assertEquals(expectedSigners.size(), v1Signers.size());
+            assertTrue("Expected V1 signers: " + getAllSubjectNamesFrom(expectedSigners)
                             + ", actual V1 signers: " + getAllSubjectNamesFrom(v1Signers),
-                    v1Signers.containsAll(expectedV1Signers));
+                    v1Signers.containsAll(expectedSigners));
         }
 
         if (result.isVerifiedUsingV2Scheme()) {
@@ -2061,9 +1554,10 @@
             for (ApkVerifier.Result.V2SchemeSignerInfo signer : result.getV2SchemeSigners()) {
                 v2Signers.add(signer.getCertificate());
             }
-            assertTrue("Expected V2 signers: " + getAllSubjectNamesFrom(expectedV2Signers)
+            assertEquals(expectedSigners.size(), v2Signers.size());
+            assertTrue("Expected V2 signers: " + getAllSubjectNamesFrom(expectedSigners)
                             + ", actual V2 signers: " + getAllSubjectNamesFrom(v2Signers),
-                    v2Signers.containsAll(expectedV2Signers));
+                    v2Signers.containsAll(expectedSigners));
         }
 
         if (result.isVerifiedUsingV3Scheme()) {
@@ -2071,68 +1565,11 @@
             for (ApkVerifier.Result.V3SchemeSignerInfo signer : result.getV3SchemeSigners()) {
                 v3Signers.add(signer.getCertificate());
             }
-            assertTrue("Expected V3 signers: " + getAllSubjectNamesFrom(expectedV3Signers)
+            assertEquals(expectedSigners.size(), v3Signers.size());
+            assertTrue("Expected V3 signers: " + getAllSubjectNamesFrom(expectedSigners)
                             + ", actual V3 signers: " + getAllSubjectNamesFrom(v3Signers),
-                    v3Signers.containsAll(expectedV3Signers));
+                    v3Signers.containsAll(expectedSigners));
         }
-
-        if (result.isVerifiedUsingV31Scheme()) {
-            Set<X509Certificate> v31Signers = new HashSet<>();
-            for (ApkVerifier.Result.V3SchemeSignerInfo signer : result.getV31SchemeSigners()) {
-                v31Signers.add(signer.getCertificate());
-            }
-            // V3.1 only supports specifying signatures with a rotated signing key; if a V3.1
-            // signing block was verified then ensure it contains the expected rotated signer.
-            List<X509Certificate> expectedV31Signers = List
-                .of(expectedSigners.get(expectedSigners.size() - 1));
-            assertTrue("Expected V3.1 signers: " + getAllSubjectNamesFrom(expectedV31Signers)
-                    + ", actual V3.1 signers: " + getAllSubjectNamesFrom(v31Signers),
-                v31Signers.containsAll(expectedV31Signers));
-        }
-    }
-
-    /**
-     * Asserts the provided verification {@code result} contains the expected V4 {@code signers}.
-     */
-    private static void assertResultContainsV4Signers(ApkVerifier.Result result, String... signers)
-            throws Exception {
-        assertTrue(result.isVerified());
-        assertTrue(result.isVerifiedUsingV4Scheme());
-        List<X509Certificate> expectedSigners = new ArrayList<>();
-        for (String signer : signers) {
-            ApkSigner.SignerConfig signerConfig = getDefaultSignerConfigFromResources(signer);
-            expectedSigners.addAll(signerConfig.getCertificates());
-        }
-        List<X509Certificate> v4Signers = new ArrayList<>();
-        for (ApkVerifier.Result.V4SchemeSignerInfo signer : result.getV4SchemeSigners()) {
-            v4Signers.addAll(signer.getCertificates());
-        }
-        assertTrue("Expected V4 signers: " + getAllSubjectNamesFrom(expectedSigners)
-                        + ", actual V4 signers: " + getAllSubjectNamesFrom(v4Signers),
-                v4Signers.containsAll(expectedSigners));
-    }
-
-    /**
-     * Asserts the provided {@code result} contains the expected {@code signer} targeting
-     * {@code minSdkVersion} as the minimum version for rotation.
-     */
-    static void assertV31SignerTargetsMinApiLevel(ApkVerifier.Result result, String signer,
-        int minSdkVersion) throws Exception {
-        assertTrue(result.isVerifiedUsingV31Scheme());
-        ApkSigner.SignerConfig expectedSignerConfig = getDefaultSignerConfigFromResources(signer);
-
-        for (ApkVerifier.Result.V3SchemeSignerInfo signerConfig : result.getV31SchemeSigners()) {
-            if (signerConfig.getCertificates()
-                .containsAll(expectedSignerConfig.getCertificates())) {
-                assertEquals("The signer, " + getAllSubjectNamesFrom(signerConfig.getCertificates())
-                        + ", is expected to target SDK version " + minSdkVersion
-                        + ", instead it is targeting " + signerConfig.getMinSdkVersion(),
-                    minSdkVersion, signerConfig.getMinSdkVersion());
-                return;
-            }
-        }
-        fail("Did not find the expected signer, " + getAllSubjectNamesFrom(
-            expectedSignerConfig.getCertificates()));
     }
 
     /**
diff --git a/src/test/java/com/android/apksig/ApkVerifierTest.java b/src/test/java/com/android/apksig/ApkVerifierTest.java
index 9de2b59..9e1a75e 100644
--- a/src/test/java/com/android/apksig/ApkVerifierTest.java
+++ b/src/test/java/com/android/apksig/ApkVerifierTest.java
@@ -16,12 +16,7 @@
 
 package com.android.apksig;
 
-import static com.android.apksig.ApkSignerTest.FIRST_RSA_2048_SIGNER_RESOURCE_NAME;
-import static com.android.apksig.ApkSignerTest.SECOND_RSA_2048_SIGNER_RESOURCE_NAME;
-import static com.android.apksig.ApkSignerTest.assertResultContainsSigners;
-import static com.android.apksig.ApkSignerTest.assertV31SignerTargetsMinApiLevel;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeNoException;
@@ -30,13 +25,11 @@
 import com.android.apksig.ApkVerifier.IssueWithParams;
 import com.android.apksig.ApkVerifier.Result.SourceStampInfo.SourceStampVerificationStatus;
 import com.android.apksig.apk.ApkFormatException;
-import com.android.apksig.internal.apk.v3.V3SchemeConstants;
 import com.android.apksig.internal.util.AndroidSdkVersion;
 import com.android.apksig.internal.util.HexEncoding;
 import com.android.apksig.internal.util.Resources;
 import com.android.apksig.util.DataSources;
 
-import java.security.Provider;
 import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -1313,123 +1306,6 @@
     }
 
     @Test
-    public void verifySourceStamp_noTimestamp_returnsDefaultValue() throws Exception {
-        // A timestamp attribute was added to the source stamp, but verification of APKs that were
-        // generated prior to the addition of the timestamp should still complete successfully,
-        // returning a default value of 0 for the timestamp.
-        ApkVerifier.Result verificationResult = verifySourceStamp("v3-only-with-stamp.apk");
-
-        assertTrue(verificationResult.isSourceStampVerified());
-        assertEquals(
-                "A value of 0 should be returned for the timestamp when the attribute is not "
-                        + "present",
-                0, verificationResult.getSourceStampInfo().getTimestampEpochSeconds());
-    }
-
-    @Test
-    public void verifySourceStamp_validTimestamp_returnsExpectedValue() throws Exception {
-        // Once an APK is signed with a source stamp that contains a valid value for the timestamp
-        // attribute, verification of the source stamp should result in the same value for the
-        // timestamp returned to the verifier.
-        ApkVerifier.Result verificationResult = verifySourceStamp(
-                "stamp-valid-timestamp-value.apk");
-
-        assertTrue(verificationResult.isSourceStampVerified());
-        assertEquals(1644886584, verificationResult.getSourceStampInfo().getTimestampEpochSeconds());
-    }
-
-    @Test
-    public void verifySourceStamp_validTimestampLargerBuffer_returnsExpectedValue()
-            throws Exception {
-        // The source stamp timestamp attribute value is expected to be written to an 8 byte buffer
-        // as a little-endian long; while a larger buffer will not result in an error, any
-        // additional space after the buffer's initial 8 bytes will be ignored. This test verifies a
-        // valid timestamp value written to the first 8 bytes of a 16 byte buffer can still be read
-        // successfully.
-        ApkVerifier.Result verificationResult = verifySourceStamp(
-                "stamp-valid-timestamp-16-byte-buffer.apk");
-
-        assertTrue(verificationResult.isSourceStampVerified());
-        assertEquals(1645126786,
-                verificationResult.getSourceStampInfo().getTimestampEpochSeconds());
-    }
-
-    @Test
-    public void verifySourceStamp_invalidTimestampValueEqualsZero_verificationFails()
-            throws Exception {
-        // If the source stamp timestamp attribute exists and is <= 0, then a warning should be
-        // reported to notify the caller to the invalid attribute value. This test verifies a
-        // a warning is reported when the timestamp attribute value is 0.
-        ApkVerifier.Result verificationResult = verifySourceStamp(
-                "stamp-invalid-timestamp-value-zero.apk");
-
-        assertSourceStampVerificationStatus(verificationResult,
-                SourceStampVerificationStatus.STAMP_VERIFICATION_FAILED);
-        assertSourceStampVerificationFailure(verificationResult,
-                Issue.SOURCE_STAMP_INVALID_TIMESTAMP);
-    }
-
-    @Test
-    public void verifySourceStamp_invalidTimestampValueLessThanZero_verificationFails()
-            throws Exception {
-        // If the source stamp timestamp attribute exists and is <= 0, then a warning should be
-        // reported to notify the caller to the invalid attribute value. This test verifies a
-        // a warning is reported when the timestamp attribute value is < 0.
-        ApkVerifier.Result verificationResult = verifySourceStamp(
-                "stamp-invalid-timestamp-value-less-than-zero.apk");
-
-        assertSourceStampVerificationStatus(verificationResult,
-                SourceStampVerificationStatus.STAMP_VERIFICATION_FAILED);
-        assertSourceStampVerificationFailure(verificationResult,
-                Issue.SOURCE_STAMP_INVALID_TIMESTAMP);
-    }
-
-    @Test
-    public void verifySourceStamp_invalidTimestampZeroInFirst8BytesOfBuffer_verificationFails()
-            throws Exception {
-        // The source stamp's timestamp attribute value is expected to be written to the first 8
-        // bytes of the attribute's value buffer; if a larger buffer is used and the timestamp
-        // value is not written as a little-endian long to the first 8 bytes of the buffer, then
-        // an error should be reported for the timestamp attribute since the rest of the buffer will
-        // be ignored.
-        ApkVerifier.Result verificationResult = verifySourceStamp(
-                "stamp-timestamp-in-last-8-of-16-byte-buffer.apk");
-
-        assertSourceStampVerificationStatus(verificationResult,
-                SourceStampVerificationStatus.STAMP_VERIFICATION_FAILED);
-        assertSourceStampVerificationFailure(verificationResult,
-                Issue.SOURCE_STAMP_INVALID_TIMESTAMP);
-    }
-
-
-    @Test
-    public void verifySourceStamp_intTimestampValue_verificationFails() throws Exception {
-        // Since the source stamp timestamp attribute value is a long, an attribute value with
-        // insufficient space to hold a long value should result in a warning reported to the user.
-        ApkVerifier.Result verificationResult = verifySourceStamp(
-                "stamp-int-timestamp-value.apk");
-
-        assertSourceStampVerificationStatus(verificationResult,
-                SourceStampVerificationStatus.STAMP_VERIFICATION_FAILED);
-        assertSourceStampVerificationFailure(verificationResult,
-                Issue.SOURCE_STAMP_MALFORMED_ATTRIBUTE);
-    }
-
-    @Test
-    public void verifySourceStamp_modifiedTimestampValue_verificationFails() throws Exception {
-        // The source stamp timestamp attribute is part of the block's signed data; this test
-        // verifies if the value of the timestamp in the stamp block is modified then verification
-        // of the source stamp should fail.
-        ApkVerifier.Result verificationResult = verifySourceStamp(
-                "stamp-valid-timestamp-value-modified.apk");
-
-        assertSourceStampVerificationStatus(verificationResult,
-                SourceStampVerificationStatus.STAMP_VERIFICATION_FAILED);
-        assertSourceStampVerificationFailure(verificationResult,
-                Issue.SOURCE_STAMP_DID_NOT_VERIFY);
-    }
-
-    @Test
     public void apkVerificationIssueAdapter_verifyAllBaseIssuesMapped() throws Exception {
         Field[] fields = ApkVerificationIssue.class.getFields();
         StringBuilder msg = new StringBuilder();
@@ -1454,148 +1330,6 @@
         }
     }
 
-    @Test
-    public void verifySignature_negativeModulusConscryptProvider() throws Exception {
-        Provider conscryptProvider = null;
-        try {
-            conscryptProvider = new org.conscrypt.OpenSSLProvider();
-            Security.insertProviderAt(conscryptProvider, 1);
-            assertVerified(verify("v1v2v3-rsa-2048-negmod-in-cert.apk"));
-        } catch (UnsatisfiedLinkError e) {
-            // If the library for conscrypt is not available then skip this test.
-            return;
-        } finally {
-            if (conscryptProvider != null) {
-                Security.removeProvider(conscryptProvider.getName());
-            }
-        }
-    }
-
-    @Test
-    public void verifyV31_rotationTarget34_containsExpectedSigners() throws Exception {
-        // This test verifies an APK targeting a specific SDK version for rotation properly reports
-        // that version for the rotated signer in the v3.1 block, and all other signing blocks
-        // use the original signing key.
-        ApkVerifier.Result result = verify("v31-rsa-2048_2-tgt-34-1-tgt-28.apk");
-
-        assertVerified(result);
-        assertResultContainsSigners(result, true, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-            SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-        assertV31SignerTargetsMinApiLevel(result, SECOND_RSA_2048_SIGNER_RESOURCE_NAME, 34);
-    }
-
-    @Test
-    public void verifyV31_missingStrippingAttr_warningReported() throws Exception {
-        // The v3.1 signing block supports targeting SDK versions; to protect against these target
-        // versions being modified the v3 signer contains a stripping protection attribute with the
-        // SDK version on which rotation should be applied. This test verifies a warning is reported
-        // when this attribute is not present in the v3 signer.
-        ApkVerifier.Result result = verify("v31-tgt-33-no-v3-attr.apk");
-
-        assertVerificationWarning(result, Issue.V31_ROTATION_MIN_SDK_ATTR_MISSING);
-    }
-
-    @Test
-    public void verifyV31_strippingAttrMismatch_errorReportedOnSupportedVersions()
-            throws Exception {
-        // This test verifies if the stripping protection attribute does not properly match the
-        // minimum SDK version on which rotation is supported then the APK should fail verification.
-        ApkVerifier.Result result = verify("v31-tgt-34-v3-attr-value-33.apk");
-        assertVerificationFailure(result, Issue.V31_ROTATION_MIN_SDK_MISMATCH);
-
-        // SDK versions that do not support v3.1 should ignore the stripping protection attribute
-        // and the v3.1 signing block.
-        result = verifyForMaxSdkVersion("v31-tgt-34-v3-attr-value-33.apk",
-            V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT - 1);
-        assertVerified(result);
-    }
-
-    @Test
-    public void verifyV31_missingV31Block_errorReportedOnSupportedVersions() throws Exception {
-        // This test verifies if the stripping protection attribute contains a value for rotation
-        // but a v3.1 signing block was not found then the APK should fail verification.
-        ApkVerifier.Result result = verify("v31-block-stripped-v3-attr-value-33.apk");
-        assertVerificationFailure(result, Issue.V31_BLOCK_MISSING);
-
-        // SDK versions that do not support v3.1 should ignore the stripping protection attribute
-        // and the v3.1 signing block.
-        result = verifyForMaxSdkVersion("v31-block-stripped-v3-attr-value-33.apk",
-            V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT - 1);
-        assertVerified(result);
-    }
-
-    @Test
-    public void verifyV31_v31BlockWithoutV3Block_reportsError() throws Exception {
-        // A v3.1 block must always exist alongside a v3.0 block; if an APK's minSdkVersion is the
-        // same as the version supporting rotation then it should be written to a v3.0 block.
-        ApkVerifier.Result result = verify("v31-tgt-33-no-v3-block.apk");
-        assertVerificationFailure(result, Issue.V31_BLOCK_FOUND_WITHOUT_V3_BLOCK);
-    }
-
-    @Test
-    public void verifyV31_rotationTargetsDevRelease_resultReportsDevReleaseFlag() throws Exception {
-        // Development releases use the SDK version of the previous release until the SDK is
-        // finalized. In order to only target the development release and later, the v3.1 signature
-        // scheme supports targeting development releases such that the SDK version X will install
-        // on a device running X with the system property ro.build.version.codename set to a new
-        // development codename (eg T); a release platform will have this set to "REL", and the
-        // platform will ignore the v3.1 signer if the minSdkVersion is X and the codename is "REL".
-        ApkVerifier.Result result = verify("v31-rsa-2048_2-tgt-34-dev-release.apk");
-
-        assertVerified(result);
-        assertV31SignerTargetsMinApiLevel(result, SECOND_RSA_2048_SIGNER_RESOURCE_NAME, 34);
-        assertResultContainsSigners(result, true, FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-                SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-    }
-
-    @Test
-    public void verifyV3_v3RotatedSignerTargetsDevRelease_warningReported() throws Exception {
-        // While a v3.1 signer can target a development release, v3.0 does not support the same
-        // attribute since it is only intended for v3.1 with v3.0 using the original signer. This
-        // test verifies a warning is reported if an APK has this flag set on a v3.0 signer since it
-        // will be ignored by the platform.
-        ApkVerifier.Result result = verify("v3-rsa-2048_2-tgt-dev-release.apk");
-
-        assertVerificationWarning(result, Issue.V31_ROTATION_TARGETS_DEV_RELEASE_ATTR_ON_V3_SIGNER);
-    }
-
-    @Test
-    public void verifyV31_rotationTargets34_resultContainsExpectedLineage() throws Exception {
-        // During verification of the v3.1 and v3.0 signing blocks, ApkVerifier will set the
-        // signing certificate lineage in the Result object; this test verifies a null lineage from
-        // a v3.0 signer does not overwrite a valid lineage from a v3.1 signer.
-        ApkVerifier.Result result = verify("v31-rsa-2048_2-tgt-34-1-tgt-28.apk");
-
-        assertNotNull(result.getSigningCertificateLineage());
-        SigningCertificateLineageTest.assertLineageContainsExpectedSigners(
-                result.getSigningCertificateLineage(), FIRST_RSA_2048_SIGNER_RESOURCE_NAME,
-                SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-    }
-
-    @Test
-    public void verify31_minSdkVersionT_resultSuccessfullyVerified() throws Exception {
-        // When a min-sdk-version of 33 is explicitly specified, apksig will behave the same as a
-        // device running this API level and only verify a v3.1 signature if it exists. This test
-        // verifies this v3.1 signature is sufficient to report the APK as verified.
-        ApkVerifier.Result result = verifyForMinSdkVersion("v31-rsa-2048_2-tgt-33-1-tgt-28.apk",
-                33);
-
-        assertVerified(result);
-        assertTrue(result.isVerifiedUsingV31Scheme());
-    }
-
-    @Test
-    public void verify31_minSdkVersionTTargetSdk30_resultSuccessfullyVerified() throws Exception {
-        // This test verifies when a min-sdk-version of 33 is specified and the APK targets API
-        // level 30 or later, the v3.1 signature is sufficient to report the APK meets the
-        // requirement of a minimum v2 signature.
-        ApkVerifier.Result result = verifyForMinSdkVersion(
-                "v31-ec-p256-2-tgt-33-1-tgt-28-targetSdk-30.apk", 33);
-
-        assertVerified(result);
-        assertTrue(result.isVerifiedUsingV31Scheme());
-    }
-
     private ApkVerifier.Result verify(String apkFilenameInResources)
             throws IOException, ApkFormatException, NoSuchAlgorithmException {
         return verify(apkFilenameInResources, null, null);
@@ -1734,27 +1468,13 @@
     }
 
     static void assertVerificationFailure(ApkVerifier.Result result, Issue expectedIssue) {
-        assertVerificationIssue(result, expectedIssue, true);
-    }
-
-    static void assertVerificationWarning(ApkVerifier.Result result, Issue expectedIssue) {
-        assertVerificationIssue(result, expectedIssue, false);
-    }
-
-    /**
-     * Asserts the provided {@code result} contains the {@code expectedIssue}; if {@code
-     * verifyError} is set to {@code true} then the specified {@link Issue} will be expected as an
-     * error, otherwise it will be expected as a warning.
-     */
-    private static void assertVerificationIssue(ApkVerifier.Result result, Issue expectedIssue,
-        boolean verifyError) {
-        if (result.isVerified() && verifyError) {
+        if (result.isVerified()) {
             fail("APK verification succeeded instead of failing with " + expectedIssue);
             return;
         }
 
         StringBuilder msg = new StringBuilder();
-        for (IssueWithParams issue : (verifyError ? result.getErrors() : result.getWarnings())) {
+        for (IssueWithParams issue : result.getErrors()) {
             if (expectedIssue.equals(issue.getIssue())) {
                 return;
             }
@@ -1765,8 +1485,7 @@
         }
         for (ApkVerifier.Result.V1SchemeSignerInfo signer : result.getV1SchemeSigners()) {
             String signerName = signer.getName();
-            for (ApkVerifier.IssueWithParams issue : (verifyError ? signer.getErrors()
-                    : signer.getWarnings())) {
+            for (ApkVerifier.IssueWithParams issue : signer.getErrors()) {
                 if (expectedIssue.equals(issue.getIssue())) {
                     return;
                 }
@@ -1783,8 +1502,7 @@
         }
         for (ApkVerifier.Result.V2SchemeSignerInfo signer : result.getV2SchemeSigners()) {
             String signerName = "signer #" + (signer.getIndex() + 1);
-            for (IssueWithParams issue : (verifyError ? signer.getErrors()
-                    : signer.getWarnings())) {
+            for (IssueWithParams issue : signer.getErrors()) {
                 if (expectedIssue.equals(issue.getIssue())) {
                     return;
                 }
@@ -1799,8 +1517,7 @@
         }
         for (ApkVerifier.Result.V3SchemeSignerInfo signer : result.getV3SchemeSigners()) {
             String signerName = "signer #" + (signer.getIndex() + 1);
-            for (IssueWithParams issue : (verifyError ? signer.getErrors()
-                    : signer.getWarnings())) {
+            for (IssueWithParams issue : signer.getErrors()) {
                 if (expectedIssue.equals(issue.getIssue())) {
                     return;
                 }
@@ -1813,22 +1530,6 @@
                         .append(issue);
             }
         }
-        for (ApkVerifier.Result.V3SchemeSignerInfo signer : result.getV31SchemeSigners()) {
-            String signerName = "signer #" + (signer.getIndex() + 1);
-            for (IssueWithParams issue : (verifyError ? signer.getErrors()
-                : signer.getWarnings())) {
-                if (expectedIssue.equals(issue.getIssue())) {
-                    return;
-                }
-                if (msg.length() > 0) {
-                    msg.append('\n');
-                }
-                msg.append("APK Signature Scheme v3.1 signer ")
-                    .append(signerName)
-                    .append(": ")
-                    .append(issue);
-            }
-        }
 
         fail(
                 "APK failed verification for the wrong reason"
diff --git a/src/test/java/com/android/apksig/SigningCertificateLineageTest.java b/src/test/java/com/android/apksig/SigningCertificateLineageTest.java
index 07a48f1..d5dc71d 100644
--- a/src/test/java/com/android/apksig/SigningCertificateLineageTest.java
+++ b/src/test/java/com/android/apksig/SigningCertificateLineageTest.java
@@ -397,21 +397,6 @@
         assertLineageContainsExpectedSigners(lineageFromApk, expectedSigners);
     }
 
-    @Test
-    public void testLineageFromAPKWithV31BlockContainsExpectedSigners() throws Exception {
-        SignerConfig firstSigner = getSignerConfigFromResources(
-                FIRST_RSA_2048_SIGNER_RESOURCE_NAME);
-        SignerConfig secondSigner = getSignerConfigFromResources(
-                SECOND_RSA_2048_SIGNER_RESOURCE_NAME);
-        List<SignerConfig> expectedSigners = Arrays.asList(firstSigner, secondSigner);
-        DataSource apkDataSource = Resources.toDataSource(getClass(),
-                "v31-rsa-2048_2-tgt-34-1-tgt-28.apk");
-        SigningCertificateLineage lineageFromApk = SigningCertificateLineage.readFromApkDataSource(
-                apkDataSource);
-        assertLineageContainsExpectedSigners(lineageFromApk, expectedSigners);
-
-    }
-
     @Test(expected = ApkFormatException.class)
     public void testLineageFromAPKWithInvalidZipCDSizeFails() throws Exception {
         // This test verifies that attempting to read the lineage from an APK where the zip
@@ -550,20 +535,7 @@
         return lineage.spawnDescendant(oldSignerConfig, newSignerConfig);
     }
 
-    /**
-     * Asserts the provided {@code lineage} contains the {@code expectedSigners} from the test's
-     * resources.
-     */
-    static void assertLineageContainsExpectedSigners(SigningCertificateLineage lineage,
-            String... expectedSigners) throws Exception {
-        List<SignerConfig> signers = new ArrayList<>();
-        for (String expectedSigner : expectedSigners) {
-            signers.add(getSignerConfigFromResources(expectedSigner));
-        }
-        assertLineageContainsExpectedSigners(lineage, signers);
-    }
-
-    private static void assertLineageContainsExpectedSigners(SigningCertificateLineage lineage,
+    private void assertLineageContainsExpectedSigners(SigningCertificateLineage lineage,
             List<SignerConfig> signers) {
         assertEquals("The lineage does not contain the expected number of signers",
                 signers.size(), lineage.size());
diff --git a/src/test/java/com/android/apksig/SourceStampVerifierTest.java b/src/test/java/com/android/apksig/SourceStampVerifierTest.java
index 2e54a8a..f5020cc 100644
--- a/src/test/java/com/android/apksig/SourceStampVerifierTest.java
+++ b/src/test/java/com/android/apksig/SourceStampVerifierTest.java
@@ -21,12 +21,10 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.android.apksig.SourceStampVerifier.Result;
 import com.android.apksig.SourceStampVerifier.Result.SignerInfo;
-import com.android.apksig.internal.util.AndroidSdkVersion;
 import com.android.apksig.internal.util.Resources;
 import com.android.apksig.util.DataSources;
 
@@ -271,110 +269,6 @@
                 ApkVerificationIssue.JAR_SIG_NO_SIGNATURES);
     }
 
-    @Test
-    public void verifySourceStamp_noTimestamp_returnsDefaultValue() throws Exception {
-        // A timestamp attribute was added to the source stamp, but verification of APKs that were
-        // generated prior to the addition of the timestamp should still complete successfully,
-        // returning a default value of 0 for the timestamp.
-        Result verificationResult = verifySourceStamp("v3-only-with-stamp.apk", AndroidSdkVersion.P,
-                AndroidSdkVersion.P);
-
-        assertVerified(verificationResult);
-        assertEquals(
-                "A value of 0 should be returned for the timestamp when the attribute is not "
-                        + "present",
-                0, verificationResult.getSourceStampInfo().getTimestampEpochSeconds());
-    }
-
-    @Test
-    public void verifySourceStamp_validTimestamp_returnsExpectedValue() throws Exception {
-        // Once an APK is signed with a source stamp that contains a valid value for the timestamp
-        // attribute, verification of the source stamp should result in the same value for the
-        // timestamp returned to the verifier.
-        Result verificationResult = verifySourceStamp("stamp-valid-timestamp-value.apk");
-
-        assertVerified(verificationResult);
-        assertEquals(1644886584, verificationResult.getSourceStampInfo().getTimestampEpochSeconds());
-    }
-
-    @Test
-    public void verifySourceStamp_validTimestampLargerBuffer_returnsExpectedValue()
-            throws Exception {
-        // The source stamp timestamp attribute value is expected to be written to an 8 byte buffer
-        // as a little-endian long; while a larger buffer will not result in an error, any
-        // additional space after the buffer's initial 8 bytes will be ignored. This test verifies a
-        // valid timestamp value written to the first 8 bytes of a 16 byte buffer can still be read
-        // successfully.
-        Result verificationResult = verifySourceStamp("stamp-valid-timestamp-16-byte-buffer.apk");
-
-        assertEquals(1645126786,
-                verificationResult.getSourceStampInfo().getTimestampEpochSeconds());
-    }
-
-    @Test
-    public void verifySourceStamp_invalidTimestampValueEqualsZero_verificationFails()
-            throws Exception {
-        // If the source stamp timestamp attribute exists and is <= 0, then a warning should be
-        // reported to notify the caller to the invalid attribute value. This test verifies a
-        // a warning is reported when the timestamp attribute value is 0.
-        Result verificationResult = verifySourceStamp("stamp-invalid-timestamp-value-zero.apk");
-
-        assertSourceStampVerificationFailure(verificationResult,
-                ApkVerificationIssue.SOURCE_STAMP_INVALID_TIMESTAMP);
-    }
-
-    @Test
-    public void verifySourceStamp_invalidTimestampValueLessThanZero_verificationFails()
-            throws Exception {
-        // If the source stamp timestamp attribute exists and is <= 0, then a warning should be
-        // reported to notify the caller to the invalid attribute value. This test verifies a
-        // a warning is reported when the timestamp attribute value is < 0.
-        Result verificationResult = verifySourceStamp(
-                "stamp-invalid-timestamp-value-less-than-zero.apk");
-
-        assertSourceStampVerificationFailure(verificationResult,
-                ApkVerificationIssue.SOURCE_STAMP_INVALID_TIMESTAMP);
-    }
-
-    @Test
-    public void verifySourceStamp_invalidTimestampZeroInFirst8BytesOfBuffer_verificationFails()
-            throws Exception {
-        // The source stamp's timestamp attribute value is expected to be written to the first 8
-        // bytes of the attribute's value buffer; if a larger buffer is used and the timestamp
-        // value is not written as a little-endian long to the first 8 bytes of the buffer, then
-        // an error should be reported for the timestamp attribute since the rest of the buffer will
-        // be ignored.
-        Result verificationResult = verifySourceStamp(
-                "stamp-timestamp-in-last-8-of-16-byte-buffer.apk");
-
-        assertSourceStampVerificationFailure(verificationResult,
-                ApkVerificationIssue.SOURCE_STAMP_INVALID_TIMESTAMP);
-    }
-
-    @Test
-    public void verifySourceStamp_intTimestampValue_verificationFails() throws Exception {
-        // Since the source stamp timestamp attribute value is a long, an attribute value with
-        // insufficient space to hold a long value should result in a warning reported to the user.
-        Result verificationResult = verifySourceStamp(
-                "stamp-int-timestamp-value.apk");
-
-        assertSourceStampVerificationFailure(verificationResult,
-                ApkVerificationIssue.SOURCE_STAMP_MALFORMED_ATTRIBUTE);
-    }
-
-    @Test
-    public void verifySourceStamp_modifiedTimestampValue_verificationFails() throws Exception {
-        // The source stamp timestamp attribute is part of the block's signed data; this test
-        // verifies if the value of the timestamp in the stamp block is modified then verification
-        // of the source stamp should fail.
-        Result verificationResult = verifySourceStamp(
-                "stamp-valid-timestamp-value-modified.apk");
-
-        assertSourceStampVerificationFailure(verificationResult,
-                ApkVerificationIssue.SOURCE_STAMP_DID_NOT_VERIFY);
-    }
-
-
     private Result verifySourceStamp(String apkFilenameInResources)
             throws Exception {
         return verifySourceStamp(apkFilenameInResources, null, null, null);
diff --git a/src/test/resources/com/android/apksig/golden-aligned-v1v2v3-lineage-out.apk b/src/test/resources/com/android/apksig/golden-aligned-v1v2v3-lineage-out.apk
index a273b0c..965f901 100644
--- a/src/test/resources/com/android/apksig/golden-aligned-v1v2v3-lineage-out.apk
+++ b/src/test/resources/com/android/apksig/golden-aligned-v1v2v3-lineage-out.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/golden-aligned-v2v3-lineage-out.apk b/src/test/resources/com/android/apksig/golden-aligned-v2v3-lineage-out.apk
index 2a0d383..13a3bc9 100644
--- a/src/test/resources/com/android/apksig/golden-aligned-v2v3-lineage-out.apk
+++ b/src/test/resources/com/android/apksig/golden-aligned-v2v3-lineage-out.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/golden-aligned-v3-lineage-out.apk b/src/test/resources/com/android/apksig/golden-aligned-v3-lineage-out.apk
index 4a4cda9..36f4825 100644
--- a/src/test/resources/com/android/apksig/golden-aligned-v3-lineage-out.apk
+++ b/src/test/resources/com/android/apksig/golden-aligned-v3-lineage-out.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/golden-legacy-aligned-v1v2v3-lineage-out.apk b/src/test/resources/com/android/apksig/golden-legacy-aligned-v1v2v3-lineage-out.apk
index 376b0e5..f6b60d6 100644
--- a/src/test/resources/com/android/apksig/golden-legacy-aligned-v1v2v3-lineage-out.apk
+++ b/src/test/resources/com/android/apksig/golden-legacy-aligned-v1v2v3-lineage-out.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/golden-legacy-aligned-v2v3-lineage-out.apk b/src/test/resources/com/android/apksig/golden-legacy-aligned-v2v3-lineage-out.apk
index 25ffa5b..b0debf6 100644
--- a/src/test/resources/com/android/apksig/golden-legacy-aligned-v2v3-lineage-out.apk
+++ b/src/test/resources/com/android/apksig/golden-legacy-aligned-v2v3-lineage-out.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/golden-legacy-aligned-v3-lineage-out.apk b/src/test/resources/com/android/apksig/golden-legacy-aligned-v3-lineage-out.apk
index 341d7ba..f8b4171 100644
--- a/src/test/resources/com/android/apksig/golden-legacy-aligned-v3-lineage-out.apk
+++ b/src/test/resources/com/android/apksig/golden-legacy-aligned-v3-lineage-out.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/golden-unaligned-v1v2v3-lineage-out.apk b/src/test/resources/com/android/apksig/golden-unaligned-v1v2v3-lineage-out.apk
index 5636723..02ecee0 100644
--- a/src/test/resources/com/android/apksig/golden-unaligned-v1v2v3-lineage-out.apk
+++ b/src/test/resources/com/android/apksig/golden-unaligned-v1v2v3-lineage-out.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/golden-unaligned-v2v3-lineage-out.apk b/src/test/resources/com/android/apksig/golden-unaligned-v2v3-lineage-out.apk
index 4f21b4c..08538a0 100644
--- a/src/test/resources/com/android/apksig/golden-unaligned-v2v3-lineage-out.apk
+++ b/src/test/resources/com/android/apksig/golden-unaligned-v2v3-lineage-out.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/golden-unaligned-v3-lineage-out.apk b/src/test/resources/com/android/apksig/golden-unaligned-v3-lineage-out.apk
index 7514d20..9bcbc7a 100644
--- a/src/test/resources/com/android/apksig/golden-unaligned-v3-lineage-out.apk
+++ b/src/test/resources/com/android/apksig/golden-unaligned-v3-lineage-out.apk
Binary files differ
diff --git a/src/test/resources/com/android/apksig/original-minSdk32.apk b/src/test/resources/com/android/apksig/original-minSdk32.apk
deleted file mode 100644
index 1d50f27..0000000
--- a/src/test/resources/com/android/apksig/original-minSdk32.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/stamp-int-timestamp-value.apk b/src/test/resources/com/android/apksig/stamp-int-timestamp-value.apk
deleted file mode 100644
index 0cd740c..0000000
--- a/src/test/resources/com/android/apksig/stamp-int-timestamp-value.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/stamp-invalid-timestamp-value-less-than-zero.apk b/src/test/resources/com/android/apksig/stamp-invalid-timestamp-value-less-than-zero.apk
deleted file mode 100644
index f4a189e..0000000
--- a/src/test/resources/com/android/apksig/stamp-invalid-timestamp-value-less-than-zero.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/stamp-invalid-timestamp-value-zero.apk b/src/test/resources/com/android/apksig/stamp-invalid-timestamp-value-zero.apk
deleted file mode 100644
index 6cfd082..0000000
--- a/src/test/resources/com/android/apksig/stamp-invalid-timestamp-value-zero.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/stamp-timestamp-in-last-8-of-16-byte-buffer.apk b/src/test/resources/com/android/apksig/stamp-timestamp-in-last-8-of-16-byte-buffer.apk
deleted file mode 100644
index 260b0ca..0000000
--- a/src/test/resources/com/android/apksig/stamp-timestamp-in-last-8-of-16-byte-buffer.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/stamp-valid-timestamp-16-byte-buffer.apk b/src/test/resources/com/android/apksig/stamp-valid-timestamp-16-byte-buffer.apk
deleted file mode 100644
index da9c34d..0000000
--- a/src/test/resources/com/android/apksig/stamp-valid-timestamp-16-byte-buffer.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/stamp-valid-timestamp-value-modified.apk b/src/test/resources/com/android/apksig/stamp-valid-timestamp-value-modified.apk
deleted file mode 100644
index eefc148..0000000
--- a/src/test/resources/com/android/apksig/stamp-valid-timestamp-value-modified.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/stamp-valid-timestamp-value.apk b/src/test/resources/com/android/apksig/stamp-valid-timestamp-value.apk
deleted file mode 100644
index 3c6a501..0000000
--- a/src/test/resources/com/android/apksig/stamp-valid-timestamp-value.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v1v2v3-rsa-2048-negmod-in-cert.apk b/src/test/resources/com/android/apksig/v1v2v3-rsa-2048-negmod-in-cert.apk
deleted file mode 100644
index 6f73b92..0000000
--- a/src/test/resources/com/android/apksig/v1v2v3-rsa-2048-negmod-in-cert.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v3-rsa-2048_2-tgt-dev-release.apk b/src/test/resources/com/android/apksig/v3-rsa-2048_2-tgt-dev-release.apk
deleted file mode 100644
index d3b2c14..0000000
--- a/src/test/resources/com/android/apksig/v3-rsa-2048_2-tgt-dev-release.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v31-block-stripped-v3-attr-value-33.apk b/src/test/resources/com/android/apksig/v31-block-stripped-v3-attr-value-33.apk
deleted file mode 100644
index d091075..0000000
--- a/src/test/resources/com/android/apksig/v31-block-stripped-v3-attr-value-33.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v31-ec-p256-2-tgt-33-1-tgt-28-targetSdk-30.apk b/src/test/resources/com/android/apksig/v31-ec-p256-2-tgt-33-1-tgt-28-targetSdk-30.apk
deleted file mode 100644
index ad14731..0000000
--- a/src/test/resources/com/android/apksig/v31-ec-p256-2-tgt-33-1-tgt-28-targetSdk-30.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v31-rsa-2048_2-tgt-33-1-tgt-28.apk b/src/test/resources/com/android/apksig/v31-rsa-2048_2-tgt-33-1-tgt-28.apk
deleted file mode 100644
index aeaec33..0000000
--- a/src/test/resources/com/android/apksig/v31-rsa-2048_2-tgt-33-1-tgt-28.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v31-rsa-2048_2-tgt-34-1-tgt-28.apk b/src/test/resources/com/android/apksig/v31-rsa-2048_2-tgt-34-1-tgt-28.apk
deleted file mode 100644
index ccf59d4..0000000
--- a/src/test/resources/com/android/apksig/v31-rsa-2048_2-tgt-34-1-tgt-28.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v31-rsa-2048_2-tgt-34-dev-release.apk b/src/test/resources/com/android/apksig/v31-rsa-2048_2-tgt-34-dev-release.apk
deleted file mode 100644
index 784f47e..0000000
--- a/src/test/resources/com/android/apksig/v31-rsa-2048_2-tgt-34-dev-release.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v31-tgt-33-no-v3-attr.apk b/src/test/resources/com/android/apksig/v31-tgt-33-no-v3-attr.apk
deleted file mode 100644
index 284cd7a..0000000
--- a/src/test/resources/com/android/apksig/v31-tgt-33-no-v3-attr.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v31-tgt-33-no-v3-block.apk b/src/test/resources/com/android/apksig/v31-tgt-33-no-v3-block.apk
deleted file mode 100644
index 1c797a7..0000000
--- a/src/test/resources/com/android/apksig/v31-tgt-33-no-v3-block.apk
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/com/android/apksig/v31-tgt-34-v3-attr-value-33.apk b/src/test/resources/com/android/apksig/v31-tgt-34-v3-attr-value-33.apk
deleted file mode 100644
index ab87fcc..0000000
--- a/src/test/resources/com/android/apksig/v31-tgt-34-v3-attr-value-33.apk
+++ /dev/null
Binary files differ