Skip to content

Commit 823cd01

Browse files
committed
Test that RelyingParty trusts MDS results in integration test
1 parent 59fc44f commit 823cd01

File tree

2 files changed

+68
-30
lines changed

2 files changed

+68
-30
lines changed

webauthn-server-attestation/src/integrationTest/scala/com/yubico/fido/metadata/FidoMetadataServiceIntegrationTest.scala

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@ import com.yubico.fido.metadata.AttachmentHint.ATTACHMENT_HINT_NFC
66
import com.yubico.fido.metadata.AttachmentHint.ATTACHMENT_HINT_WIRED
77
import com.yubico.fido.metadata.AttachmentHint.ATTACHMENT_HINT_WIRELESS
88
import com.yubico.internal.util.CertificateParser
9+
import com.yubico.webauthn.FinishRegistrationOptions
10+
import com.yubico.webauthn.RelyingParty
11+
import com.yubico.webauthn.TestWithEachProvider
912
import com.yubico.webauthn.data.AttestationObject
13+
import com.yubico.webauthn.test.Helpers
1014
import com.yubico.webauthn.test.RealExamples
15+
import org.bouncycastle.jce.provider.BouncyCastleProvider
1116
import org.junit.runner.RunWith
1217
import org.scalatest.BeforeAndAfter
1318
import org.scalatest.funspec.AnyFunSpec
@@ -18,11 +23,13 @@ import org.scalatestplus.junit.JUnitRunner
1823

1924
import java.io.IOException
2025
import java.security.cert.X509Certificate
26+
import java.time.Clock
27+
import java.time.ZoneOffset
2128
import java.util
2229
import java.util.Optional
2330
import scala.jdk.CollectionConverters.IteratorHasAsScala
31+
import scala.jdk.CollectionConverters.SetHasAsJava
2432
import scala.jdk.CollectionConverters.SetHasAsScala
25-
import scala.jdk.OptionConverters.RichOption
2633
import scala.jdk.OptionConverters.RichOptional
2734
import scala.util.Try
2835

@@ -32,7 +39,8 @@ import scala.util.Try
3239
class FidoMetadataServiceIntegrationTest
3340
extends AnyFunSpec
3441
with Matchers
35-
with BeforeAndAfter {
42+
with BeforeAndAfter
43+
with TestWithEachProvider {
3644

3745
describe("FidoMetadataService") {
3846

@@ -60,7 +68,7 @@ class FidoMetadataServiceIntegrationTest
6068
val attachmentHintsNfc =
6169
attachmentHintsUsb ++ Set(ATTACHMENT_HINT_WIRELESS, ATTACHMENT_HINT_NFC)
6270

63-
describe("correctly identifies") {
71+
describe("correctly identifies and trusts") {
6472
def check(
6573
expectedDescriptionRegex: String,
6674
testData: RealExamples.Example,
@@ -101,17 +109,38 @@ class FidoMetadataServiceIntegrationTest
101109
def getX5cArray(attestationObject: AttestationObject): JsonNode =
102110
attestationObject.getAttestationStatement.get("x5c")
103111

104-
val entries = fidoMds.get
105-
.findEntries(
106-
getAttestationTrustPath(
107-
testData.attestation.attestationObject
108-
).get,
109-
Some(
110-
new AAGUID(
111-
testData.attestation.attestationObject.getAuthenticatorData.getAttestedCredentialData.get.getAaguid
112-
)
113-
).toJava,
112+
val rp = RelyingParty
113+
.builder()
114+
.identity(testData.rp)
115+
.credentialRepository(Helpers.CredentialRepository.empty)
116+
.origins(
117+
Set(testData.attestation.collectedClientData.getOrigin).asJava
114118
)
119+
.allowUntrustedAttestation(false)
120+
.attestationTrustSource(fidoMds.get)
121+
.clock(
122+
Clock.fixed(
123+
CertificateParser
124+
.parseDer(testData.attestationCert.getBytes)
125+
.getNotBefore
126+
.toInstant,
127+
ZoneOffset.UTC,
128+
)
129+
)
130+
.build()
131+
132+
val registrationResult = rp.finishRegistration(
133+
FinishRegistrationOptions
134+
.builder()
135+
.request(testData.asRegistrationTestData.request)
136+
.response(testData.attestation.credential)
137+
.build()
138+
)
139+
140+
registrationResult.isAttestationTrusted should be(true)
141+
142+
val entries = fidoMds.get
143+
.findEntries(registrationResult)
115144
.asScala
116145
entries should not be empty
117146
val metadataStatements =
@@ -214,11 +243,13 @@ class FidoMetadataServiceIntegrationTest
214243
}
215244

216245
it("a YubiKey 5.4 NFC FIPS.") {
217-
check(
218-
"YubiKey 5 FIPS Series with NFC",
219-
RealExamples.YubikeyFips5Nfc,
220-
attachmentHintsNfc,
221-
)
246+
withProviderContext(List(new BouncyCastleProvider)) { // Needed for JDK<14 because this example uses EdDSA
247+
check(
248+
"YubiKey 5 FIPS Series with NFC",
249+
RealExamples.YubikeyFips5Nfc,
250+
attachmentHintsNfc,
251+
)
252+
}
222253
}
223254

224255
it("a YubiKey 5.4 Ci FIPS.") {

yubico-util-scala/src/main/scala/com/yubico/webauthn/TestWithEachProvider.scala

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,24 @@ import java.security.Security
1010
trait TestWithEachProvider extends Matchers {
1111
this: AnyFunSpec =>
1212

13+
/** Run the `body` in a context with the given JCA [[Security]] providers,
14+
* then reset the providers to their state before.
15+
*/
16+
def withProviderContext(
17+
providers: List[Provider]
18+
)(
19+
body: => Any
20+
): Unit = {
21+
val originalProviders = Security.getProviders.toList
22+
Security.getProviders.foreach(prov => Security.removeProvider(prov.getName))
23+
providers.foreach(Security.addProvider)
24+
25+
body
26+
27+
Security.getProviders.foreach(prov => Security.removeProvider(prov.getName))
28+
originalProviders.foreach(Security.addProvider)
29+
}
30+
1331
def wrapItFunctionWithProviderContext(
1432
providerSetName: String,
1533
providers: List[Provider],
@@ -29,18 +47,7 @@ trait TestWithEachProvider extends Matchers {
2947
*/
3048
def it(testName: String)(testFun: => Any): Unit = {
3149
this.it.apply(testName) {
32-
val originalProviders = Security.getProviders.toList
33-
Security.getProviders.foreach(prov =>
34-
Security.removeProvider(prov.getName)
35-
)
36-
providers.foreach(Security.addProvider)
37-
38-
testFun
39-
40-
Security.getProviders.foreach(prov =>
41-
Security.removeProvider(prov.getName)
42-
)
43-
originalProviders.foreach(Security.addProvider)
50+
withProviderContext(providers)(testFun)
4451
}
4552
}
4653

0 commit comments

Comments
 (0)