if (result.isVerified()) { builder.escape(NLS.str("apkSignature.verificationSuccess")); } else { final String sigFail = NLS.str("apkSignature.signatureFailed"); writeIssues(builder, err, result.getErrors()); writeIssues(builder, warn, result.getWarnings()); if (!result.getV1SchemeSigners().isEmpty()) { builder.append("<h2>"); builder.escape(String.format(result.isVerifiedUsingV1Scheme() ? sigSucc : sigFail, 1)); builder.append("</h2>\n"); for (ApkVerifier.Result.V1SchemeSignerInfo signer : result.getV1SchemeSigners()) { builder.append("<h3>"); builder.escape(NLS.str("apkSignature.signer")); if (!result.getV2SchemeSigners().isEmpty()) { builder.append("<h2>"); builder.escape(String.format(result.isVerifiedUsingV2Scheme() ? sigSucc : sigFail, 2)); builder.append("</h2>\n"); for (ApkVerifier.Result.V2SchemeSignerInfo signer : result.getV2SchemeSigners()) { builder.append("<h3>"); builder.escape(NLS.str("apkSignature.signer"));
Result result = new Result(); result.mergeFrom(v2Result); } catch (V2SchemeVerifier.SignatureNotFoundException ignored) {} if (result.containsErrors()) { return result; if (result.containsErrors()) { return result; if ((result.isVerifiedUsingV1Scheme()) && (result.isVerifiedUsingV2Scheme())) { ArrayList<Result.V1SchemeSignerInfo> v1Signers = new ArrayList<>(result.getV1SchemeSigners()); ArrayList<Result.V2SchemeSignerInfo> v2Signers = new ArrayList<>(result.getV2SchemeSigners()); ArrayList<ByteArray> v1SignerCerts = new ArrayList<>(); ArrayList<ByteArray> v2SignerCerts = new ArrayList<>(); if (result.containsErrors()) { return result; if (result.isVerifiedUsingV2Scheme()) { for (Result.V2SchemeSignerInfo signerInfo : result.getV2SchemeSigners()) { result.addSignerCertificate(signerInfo.getCertificate()); } else if (result.isVerifiedUsingV1Scheme()) { for (Result.V1SchemeSignerInfo signerInfo : result.getV1SchemeSigners()) { result.addSignerCertificate(signerInfo.getCertificate());
boolean verified = apkVerifierResult.isVerified(); Iterator iter; if (verified) { List signerCertificates = apkVerifierResult.getSignerCertificates(); logMsg.append("Verifies\n"); logMsg.append("Verified using v1 scheme (JAR signing): ").append(apkVerifierResult.isVerifiedUsingV1Scheme()); logMsg.append("Verified using v2 scheme (APK Signature Scheme v2): ").append(apkVerifierResult.isVerifiedUsingV2Scheme()); logMsg.append("Number of signers: ").append(signerCertificates.size()); errors.addAll(apkVerifierResult.getErrors().stream().map(error -> "ERROR: " + error).collect(Collectors.toList())); Iterator warningIter = apkVerifierResult.getWarnings().iterator(); warningIter = apkVerifierResult.getV1SchemeSigners().iterator(); warningIter = apkVerifierResult.getV2SchemeSigners().iterator(); return new Result(false, warnings, errors, logMsg.toString(), apkVerifierResult.isVerifiedUsingV1Scheme(), apkVerifierResult.isVerifiedUsingV2Scheme(), certInfoList); return new Result(true, warnings, errors, logMsg.toString(), apkVerifierResult.isVerifiedUsingV1Scheme(), apkVerifierResult.isVerifiedUsingV2Scheme(), certInfoList);
private void assertThatApksAreSigned( BuildApksResult result, ZipFile apkSetFile, X509Certificate expectedCertificate) throws Exception { for (Variant variant : result.getVariantList()) { for (ApkSet apkSet : variant.getApkSetList()) { for (ApkDescription apkDescription : apkSet.getApkDescriptionList()) { File apk = extractFromApkSetFile(apkSetFile, apkDescription.getPath(), outputDir); ApkVerifier.Result verifierResult = new ApkVerifier.Builder(apk).build().verify(); assertThat(verifierResult.isVerified()).isTrue(); assertThat(verifierResult.getSignerCertificates()).containsExactly(expectedCertificate); } } } }
public void testOverrideSignature() throws IOException, ApkFormatException, NoSuchAlgorithmException { File f = newTestFile(); // don't write with APK Signature Scheme v2 Block ID 0x7109871a PackerCommon.writeString(f, "OverrideSignatureSchemeBlock", 0x7109871a); assertEquals("OverrideSignatureSchemeBlock", PackerCommon.readString(f, 0x7109871a)); ApkVerifier verifier = new Builder(f).build(); Result result = verifier.verify(); final List<IssueWithParams> errors = result.getErrors(); if (errors != null && errors.size() > 0) { for (IssueWithParams error : errors) { System.out.println("testOverrideSignature " + error); } } assertTrue(result.containsErrors()); assertFalse(result.isVerified()); assertFalse(result.isVerifiedUsingV1Scheme()); assertFalse(result.isVerifiedUsingV2Scheme()); }
public static boolean verifyApk(File file) throws IOException { ApkVerifier verifier = new Builder(file).build(); try { Result result = verifier.verify(); return result.isVerified() && result.isVerifiedUsingV1Scheme() && result.isVerifiedUsingV2Scheme(); } catch (ApkFormatException e) { throw new IOException(e); } catch (NoSuchAlgorithmException e) { throw new IOException(e); } }
public static boolean apkVerified(File f) throws ApkFormatException, NoSuchAlgorithmException, IOException { ApkVerifier verifier = new Builder(f).build(); Result result = verifier.verify(); return result.isVerified() && result.isVerifiedUsingV1Scheme() && result.isVerifiedUsingV2Scheme() && !result.containsErrors(); } }