From a508aefbafb5d614e7e814eb0ff2386a702d7812 Mon Sep 17 00:00:00 2001 From: Suzanna Jiwani Date: Fri, 25 Sep 2026 12:06:30 -0700 Subject: [PATCH] Additional malformed extension testing Assert unparseableExtension fails validation while invalidKeySize succeeds. PiperOrigin-RevId: 988417393 --- src/main/kotlin/testing/Certs.kt | 13 +++++++++++++ src/test/kotlin/VerifierTest.kt | 27 ++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/testing/Certs.kt b/src/main/kotlin/testing/Certs.kt index 0292fef..ffb9e4a 100644 --- a/src/main/kotlin/testing/Certs.kt +++ b/src/main/kotlin/testing/Certs.kt @@ -229,6 +229,19 @@ object CertLists { ) } + /* A chain that has a malformed key size (OCTET STRING instead of INTEGER). */ + val invalidKeySize by lazy { + listOf( + generateValidLeafCertWithAppendedTag( + KeyMintTag.KEY_SIZE.value, + DEROctetString("not an int".toByteArray()), + ), + certFactory.factoryAttestation, + certFactory.factoryIntermediate, + certFactory.root, + ) + } + /* A chain where the key tags are out of order. */ val unorderedTags by lazy { listOf( diff --git a/src/test/kotlin/VerifierTest.kt b/src/test/kotlin/VerifierTest.kt index 39fd223..8bc506e 100644 --- a/src/test/kotlin/VerifierTest.kt +++ b/src/test/kotlin/VerifierTest.kt @@ -217,6 +217,12 @@ class VerifierTest { assertThat(result.cause.reason).isEqualTo(KeyAttestationReason.UNKNOWN_TAG_NUMBER) } + @Test + fun unparseableExtension_extensionParsingFailure() { + val result = assertIs(verifier.verify(CertLists.unparseableExtension)) + assertThat(result.cause.reason).isNull() + } + @Test fun targetMissingAttestationExtension_givesTargetMissingAttestationExtensionReason() { val result = assertIs(verifier.verify(CertLists.missingExtension)) @@ -413,7 +419,7 @@ class VerifierTest { } @Test - fun verifyAsync_failure_inputChainLogged() = runBlocking { + fun verifyAsync_failure_inputChainLogged(): Unit = runBlocking { val logHook = FakeLogHook() assertIs( verifier @@ -430,7 +436,7 @@ class VerifierTest { } @Test - fun verifyAsync_success_keyDescriptionLogged() = runBlocking { + fun verifyAsync_success_keyDescriptionLogged(): Unit = runBlocking { val logHook = FakeLogHook() val chain = readCertList("blueline/sdk28/TEE_EC_NONE.pem") assertIs(verifier.verifyAsync(this, chain, log = logHook).await()) @@ -439,7 +445,7 @@ class VerifierTest { } @Test - fun verifyAsync_malformedPatchLevel_logsInfo() = runBlocking { + fun verifyAsync_malformedPatchLevel_logsInfo(): Unit = runBlocking { val verifierWithTestRoot = Verifier( { setOf(TrustAnchor(Certs.root, null)) }, @@ -464,6 +470,21 @@ class VerifierTest { .contains("Non-DER encoded boolean in RootOfTrust.deviceLocked: 1") } + @Test + fun verifyAsync_invalidKeySize_logsInfo(): Unit = runBlocking { + val verifierWithTestRoot = + Verifier( + { setOf(TrustAnchor(Certs.root, null)) }, + { setOf() }, + { FakeCalendar.DEFAULT.now() }, + ) + val logHook = FakeLogHook() + assertIs( + verifierWithTestRoot.verifyAsync(this, CertLists.invalidKeySize, log = logHook).await() + ) + assertThat(logHook.fakeVerifyRequestLog.infoMessages).isNotEmpty() + } + @Test fun verifyAsync_longDelay_successfullyAwaitsChallengeCheck(): Unit = runBlocking { val chain = readCertList("blueline/sdk28/TEE_EC_NONE.pem")