Skip to content

Commit b4cb100

Browse files
matias-lasdlaver
andauthored
Check that signatureMask isn't an empty array (#26)
* Check that signatureMask isn't an empty array If for some reason signatureMask turned out to be an empty array, verify() would always return true and the verification logic could be bypassed. This change ensures that the code throws an exception in the unlikely case that signatureMask is an empty array. * Update digitalassetlinks/src/test/java/com/solana/digitalassetlinks/AndroidAppPackageVerifierUnitTests.java Co-authored-by: sdlaver <103003665+sdlaver@users.noreply.github.com>
1 parent bdd156c commit b4cb100

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

digitalassetlinks/src/main/java/com/solana/digitalassetlinks/AndroidAppPackageVerifier.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ public boolean verify(@NonNull String packageName, @NonNull URI uri)
9595
requireAllSignatures = true;
9696
}
9797

98+
if (signatureMask.length == 0) {
99+
throw new CouldNotVerifyPackageException("Failed reading signatures for package " + packageName);
100+
}
101+
98102
// Create and configure an AssetLinksJSONParser object
99103
final StatementMatcher androidAppMatcher = StatementMatcher
100104
.createAndroidAppStatementMatcher(

digitalassetlinks/src/test/java/com/solana/digitalassetlinks/AndroidAppPackageVerifierUnitTests.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,24 @@ public void testAppPackageVerificationSuccess()
6969
assertTrue(verified);
7070
}
7171

72+
@Test
73+
public void testAppPackageVerificationNoCertificates() {
74+
ArrayList<MockWebContentServer.Content> mockWebContent = new ArrayList<>();
75+
mockWebContent.add(new MockWebContentServer.Content(
76+
URI.create("https://www.test.com/.well-known/assetlinks.json"),
77+
HttpURLConnection.HTTP_OK,
78+
"application/json",
79+
ANDROID_APP_STATEMENT_LIST_CERTS_2_3));
80+
81+
final PackageManager pm = mockPackageManagerFactory(
82+
"com.test.sample", new byte[][] {}, true);
83+
84+
final AndroidAppPackageVerifierHarness verifier =
85+
new AndroidAppPackageVerifierHarness(pm, mockWebContent);
86+
assertThrows(AndroidAppPackageVerifier.CouldNotVerifyPackageException.class,
87+
() ->verifier.verify("com.test.sample", URI.create("https://www.test.com")));
88+
}
89+
7290
@Test
7391
public void testAppPackageVerificationNoAssetLinks() {
7492
ArrayList<MockWebContentServer.Content> mockWebContent = new ArrayList<>();
@@ -205,11 +223,8 @@ public void testAppPackageVerificationNoMatchingPackageInPackageManager() {
205223
private static PackageManager mockPackageManagerFactory(@NonNull String packageName,
206224
@NonNull byte[][] certificates,
207225
boolean multipleSigners) {
208-
if (certificates.length == 0) {
209-
throw new IllegalArgumentException("at least 1 certificate required");
210-
} else if (multipleSigners && certificates.length == 1) {
211-
throw new IllegalArgumentException("multipleSigners requires at least 2 certificates");
212-
}
226+
// NOTE: empty certificates would normally be an error, but we want to exercise unit tests
227+
// for this case, so allow it when constructing a mock PackageManager
213228

214229
final PackageInfo pi = new PackageInfo();
215230
final int piFlags;

0 commit comments

Comments
 (0)