24
24
25
25
package com .yubico .webauthn
26
26
27
- import com .yubico .webauthn .data .PublicKeyCredentialCreationOptions
28
27
import com .yubico .webauthn .data .PublicKeyCredentialDescriptor
29
- import com .yubico .webauthn .data .PublicKeyCredentialParameters
30
28
import com .yubico .webauthn .data .PublicKeyCredentialRequestOptions
31
29
import com .yubico .webauthn .test .Helpers
32
30
import com .yubico .webauthn .test .RealExamples
@@ -53,81 +51,83 @@ class RelyingPartyCeremoniesSpec
53
51
.credentialRepository(credentialRepo)
54
52
.build()
55
53
56
- testWithEachProvider { it =>
57
- describe(" The default RelyingParty settings" ) {
54
+ private def createCheck (
55
+ modRp : RelyingParty => RelyingParty = identity
56
+ )(testData : RealExamples .Example ): Unit = {
57
+ val registrationRp =
58
+ modRp(newRp(testData, Helpers .CredentialRepository .empty))
58
59
59
- describe(" can register and then authenticate" ) {
60
- def check (testData : RealExamples .Example ): Unit = {
61
- val registrationRp =
62
- newRp(testData, Helpers .CredentialRepository .empty)
63
-
64
- val registrationResult = registrationRp.finishRegistration(
65
- FinishRegistrationOptions
66
- .builder()
67
- .request(
68
- PublicKeyCredentialCreationOptions
69
- .builder()
70
- .rp(testData.rp)
71
- .user(testData.user)
72
- .challenge(testData.attestation.challenge)
73
- .pubKeyCredParams(
74
- List (PublicKeyCredentialParameters .ES256 ).asJava
75
- )
76
- .build()
77
- )
78
- .response(testData.attestation.credential)
79
- .build()
80
- );
81
-
82
- registrationResult.getKeyId.getId should equal(
83
- testData.attestation.credential.getId
84
- )
85
- registrationResult.isAttestationTrusted should be(false )
86
- registrationResult.getAttestationMetadata.isPresent should be(false )
87
-
88
- val assertionRp = newRp(
89
- testData,
90
- Helpers .CredentialRepository .withUser(
91
- testData.user,
92
- Helpers .toRegisteredCredential(testData.user, registrationResult),
93
- ),
94
- )
95
-
96
- val assertionResult = assertionRp.finishAssertion(
97
- FinishAssertionOptions
98
- .builder()
99
- .request(
100
- AssertionRequest
101
- .builder()
102
- .publicKeyCredentialRequestOptions(
103
- PublicKeyCredentialRequestOptions
60
+ val registrationRequest = registrationRp
61
+ .startRegistration(
62
+ StartRegistrationOptions .builder().user(testData.user).build()
63
+ )
64
+ .toBuilder
65
+ .challenge(testData.attestation.challenge)
66
+ .build()
67
+ val registrationResult = registrationRp.finishRegistration(
68
+ FinishRegistrationOptions
69
+ .builder()
70
+ .request(registrationRequest)
71
+ .response(testData.attestation.credential)
72
+ .build()
73
+ );
74
+
75
+ registrationResult.getKeyId.getId should equal(
76
+ testData.attestation.credential.getId
77
+ )
78
+ registrationResult.isAttestationTrusted should be(false )
79
+ registrationResult.getAttestationMetadata.isPresent should be(false )
80
+
81
+ val assertionRp = newRp(
82
+ testData,
83
+ Helpers .CredentialRepository .withUser(
84
+ testData.user,
85
+ Helpers .toRegisteredCredential(testData.user, registrationResult),
86
+ ),
87
+ ).toBuilder
88
+ .allowUnrequestedExtensions(true )
89
+ .build()
90
+
91
+ val assertionResult = assertionRp.finishAssertion(
92
+ FinishAssertionOptions
93
+ .builder()
94
+ .request(
95
+ AssertionRequest
96
+ .builder()
97
+ .publicKeyCredentialRequestOptions(
98
+ PublicKeyCredentialRequestOptions
99
+ .builder()
100
+ .challenge(testData.assertion.challenge)
101
+ .allowCredentials(
102
+ List (
103
+ PublicKeyCredentialDescriptor
104
104
.builder()
105
- .challenge(testData.assertion.challenge)
106
- .allowCredentials(
107
- List (
108
- PublicKeyCredentialDescriptor
109
- .builder()
110
- .id(testData.assertion.id)
111
- .build()
112
- ).asJava
113
- )
105
+ .id(testData.assertion.id)
114
106
.build()
115
- )
116
- .username(testData.user.getName)
117
- .build()
118
- )
119
- .response(testData.assertion.credential)
120
- .build()
121
- )
122
-
123
- assertionResult.isSuccess should be(true )
124
- assertionResult.getCredentialId should equal(testData.assertion.id)
125
- assertionResult.getUserHandle should equal(testData.user.getId)
126
- assertionResult.getUsername should equal(testData.user.getName)
127
- assertionResult.getSignatureCount should be >= testData.attestation.authenticatorData.getSignatureCounter
128
- assertionResult.isSignatureCounterValid should be(true )
129
- }
107
+ ).asJava
108
+ )
109
+ .build()
110
+ )
111
+ .username(testData.user.getName)
112
+ .build()
113
+ )
114
+ .response(testData.assertion.credential)
115
+ .build()
116
+ )
117
+
118
+ assertionResult.isSuccess should be(true )
119
+ assertionResult.getCredentialId should equal(testData.assertion.id)
120
+ assertionResult.getUserHandle should equal(testData.user.getId)
121
+ assertionResult.getUsername should equal(testData.user.getName)
122
+ assertionResult.getSignatureCount should be >= testData.attestation.authenticatorData.getSignatureCounter
123
+ assertionResult.isSignatureCounterValid should be(true )
124
+ }
130
125
126
+ testWithEachProvider { it =>
127
+ describe(" The default RelyingParty settings" ) {
128
+ val check = createCheck()(_)
129
+
130
+ describe(" can register and then authenticate" ) {
131
131
it(" a YubiKey NEO." ) {
132
132
check(RealExamples .YubiKeyNeo )
133
133
}
@@ -161,6 +161,37 @@ class RelyingPartyCeremoniesSpec
161
161
it(" a Security Key NFC by Yubico." ) {
162
162
check(RealExamples .SecurityKeyNfc )
163
163
}
164
+
165
+ ignore(" a YubiKey 5 NFC FIPS." ) { // TODO Un-ignore when allowUnrequestedExtensions default changes to true
166
+ check(RealExamples .YubikeyFips5Nfc )
167
+ }
168
+
169
+ it(" a YubiKey 5Ci FIPS." ) {
170
+ check(RealExamples .Yubikey5ciFips )
171
+ }
172
+ it(" a YubiKey Bio." ) {
173
+ check(RealExamples .YubikeyBio_5_5_4 )
174
+ }
175
+
176
+ it(" an Apple iOS device." ) {
177
+ check(RealExamples .AppleAttestationIos )
178
+ }
179
+ it(" an Apple MacOS device." ) {
180
+ check(RealExamples .AppleAttestationMacos )
181
+ }
182
+ }
183
+ }
184
+
185
+ describe(" The default RelyingParty settings, but with allowUnrequestedExtensions(true)" ) {
186
+
187
+ describe(" can register and then authenticate" ) {
188
+ val check = createCheck(rp =>
189
+ rp.toBuilder.allowUnrequestedExtensions(true ).build()
190
+ )(_)
191
+
192
+ it(" a YubiKey 5 NFC FIPS." ) { // TODO Delete when allowUnrequestedExtensions default changes to true
193
+ check(RealExamples .YubikeyFips5Nfc )
194
+ }
164
195
}
165
196
}
166
197
}
0 commit comments