Skip to content

Commit 41e8d34

Browse files
committed
Merge branch 'bio-tests'
2 parents 5d2c161 + afe68d2 commit 41e8d34

File tree

5 files changed

+185
-107
lines changed

5 files changed

+185
-107
lines changed

NEWS

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
== Version 1.10.0 ==
2+
3+
webauthn-server-attestatiton:
4+
5+
* Added attestation metadata for YubiKey Bio.
6+
7+
18
== Version 1.9.1 ==
29

310
* Added missing `<dependencyManagement>` declaration to

webauthn-server-attestation/src/main/resources/metadata.json

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"identifier": "2fb54029-7613-4f1d-94f1-fb876c14a6fe",
3-
"version": 15,
3+
"version": 16,
44
"vendorInfo": {
55
"url": "https://yubico.com",
66
"imageUrl": "https://developers.yubico.com/U2F/Images/yubico.png",
@@ -302,6 +302,24 @@
302302
}
303303
}
304304
]
305+
},
306+
307+
{
308+
"deviceId": "1.3.6.1.4.1.41482.1.9",
309+
"displayName": "YubiKey Bio",
310+
"transports": 4,
311+
"selectors": [
312+
{
313+
"type": "x509Extension",
314+
"parameters": {
315+
"key": "1.3.6.1.4.1.45724.1.1.4",
316+
"value": {
317+
"type": "hex",
318+
"value": "d8522d9f575b486688a9ba99fa02f35b"
319+
}
320+
}
321+
}
322+
]
305323
}
306324
]
307325
}

webauthn-server-attestation/src/test/scala/com/yubico/webauthn/attestation/DeviceIdentificationSpec.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,14 @@ class DeviceIdentificationSpec extends FunSpec with Matchers {
169169
Set(USB, LIGHTNING),
170170
)
171171
}
172+
173+
it("a YubiKey Bio.") {
174+
check(
175+
"YubiKey Bio",
176+
RealExamples.YubikeyBio_5_5_4,
177+
Set(USB),
178+
)
179+
}
172180
}
173181

174182
describe("fails to identify") {
@@ -293,6 +301,14 @@ class DeviceIdentificationSpec extends FunSpec with Matchers {
293301
Set(USB, LIGHTNING),
294302
)
295303
}
304+
305+
it("a YubiKey Bio.") {
306+
check(
307+
"YubiKey Bio",
308+
RealExamples.YubikeyBio_5_5_4,
309+
Set(USB),
310+
)
311+
}
296312
}
297313
}
298314

webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyCeremoniesSpec.scala

Lines changed: 104 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@
2424

2525
package com.yubico.webauthn
2626

27-
import com.yubico.webauthn.data.PublicKeyCredentialCreationOptions
2827
import com.yubico.webauthn.data.PublicKeyCredentialDescriptor
29-
import com.yubico.webauthn.data.PublicKeyCredentialParameters
3028
import com.yubico.webauthn.data.PublicKeyCredentialRequestOptions
3129
import com.yubico.webauthn.test.Helpers
3230
import com.yubico.webauthn.test.RealExamples
@@ -53,81 +51,83 @@ class RelyingPartyCeremoniesSpec
5351
.credentialRepository(credentialRepo)
5452
.build()
5553

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))
5859

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
104104
.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)
114106
.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+
}
130125

126+
testWithEachProvider { it =>
127+
describe("The default RelyingParty settings") {
128+
val check = createCheck()(_)
129+
130+
describe("can register and then authenticate") {
131131
it("a YubiKey NEO.") {
132132
check(RealExamples.YubiKeyNeo)
133133
}
@@ -161,6 +161,37 @@ class RelyingPartyCeremoniesSpec
161161
it("a Security Key NFC by Yubico.") {
162162
check(RealExamples.SecurityKeyNfc)
163163
}
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+
}
164195
}
165196
}
166197
}

webauthn-server-core/src/test/scala/com/yubico/webauthn/test/RealExamples.scala

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ sealed trait HasClientData {
3131

3232
object RealExamples {
3333

34+
private def base64ToString(b64: String): String =
35+
new String(ByteArray.fromBase64(b64).getBytes, StandardCharsets.UTF_8)
36+
3437
case class AttestationExample(
3538
clientData: String,
3639
attestationObjectBytes: ByteArray,
@@ -391,26 +394,13 @@ object RealExamples {
391394
)
392395
.build(),
393396
AttestationExample(
394-
new String(
395-
ByteArray
396-
.fromBase64(
397-
"eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoiUUs2c25Jak40MGNNZG9oNlUtR3NEZnlFYzlQY3pKdEgtSTczM3daSDRIZyIsIm9yaWdpbiI6Imh0dHBzOi8vZGVtby55dWJpY28uY29tIn0="
398-
)
399-
.getBytes,
400-
StandardCharsets.UTF_8,
401-
),
397+
base64ToString("eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoiUUs2c25Jak40MGNNZG9oNlUtR3NEZnlFYzlQY3pKdEgtSTczM3daSDRIZyIsIm9yaWdpbiI6Imh0dHBzOi8vZGVtby55dWJpY28uY29tIn0="),
402398
ByteArray.fromBase64("o2NmbXRlYXBwbGVnYXR0U3RtdKFjeDVjglkCRjCCAkIwggHJoAMCAQICBgF4xhYQszAKBggqhkjOPQQDAjBIMRwwGgYDVQQDDBNBcHBsZSBXZWJBdXRobiBDQSAxMRMwEQYDVQQKDApBcHBsZSBJbmMuMRMwEQYDVQQIDApDYWxpZm9ybmlhMB4XDTIxMDQxMTEyMzcxOFoXDTIxMDQxNDEyMzcxOFowgZExSTBHBgNVBAMMQDMxYzRlOTM2YzgwZjY1Y2VjNzcxZWZkOGNhNWMxNDdlZTgxZjY4ZjVhODE5YTUzNDFiMDU5NmJkYmU4YWI0OTExGjAYBgNVBAsMEUFBQSBDZXJ0aWZpY2F0aW9uMRMwEQYDVQQKDApBcHBsZSBJbmMuMRMwEQYDVQQIDApDYWxpZm9ybmlhMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYc87v7q19IYjqS3vizLAet/NcW0NVpYRvzvZFfCT00nBR0rzITI4iuuBupVtSRFhZfHa3GhYUu/w3Mo2h3s/+qNVMFMwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBPAwMwYJKoZIhvdjZAgCBCYwJKEiBCC+B6u5EUpszNBikhFRpOuBolX7jPReSqGkIvBr0orEZDAKBggqhkjOPQQDAgNnADBkAjAZpK9Vw3hR3uCca+kUAorfR4Sj/HkCcmydzm/KuewaYC5lmIwRTw9SKEVmAAITRlUCMEC9P/ksVc5DUHtKt+rQ9mXHeobdGymHSM7xZtYMNOfze8hPo5HLnwtWCB5qF8MQRVkCODCCAjQwggG6oAMCAQICEFYlU5XHp/tA6+Io2CYIU7YwCgYIKoZIzj0EAwMwSzEfMB0GA1UEAwwWQXBwbGUgV2ViQXV0aG4gUm9vdCBDQTETMBEGA1UECgwKQXBwbGUgSW5jLjETMBEGA1UECAwKQ2FsaWZvcm5pYTAeFw0yMDAzMTgxODM4MDFaFw0zMDAzMTMwMDAwMDBaMEgxHDAaBgNVBAMME0FwcGxlIFdlYkF1dGhuIENBIDExEzARBgNVBAoMCkFwcGxlIEluYy4xEzARBgNVBAgMCkNhbGlmb3JuaWEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASDLocvJhSRgQIlufX81rtjeLX1Xz/LBFvHNZk0df1UkETfm/4ZIRdlxpod2gULONRQg0AaQ0+yTREtVsPhz7/LmJH+wGlggb75bLx3yI3dr0alruHdUVta+quTvpwLJpGjZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUJtdk2cV4wlpn0afeaxLQG2PxxtcwHQYDVR0OBBYEFOuugsT/oaxbUdTPJGEFAL5jvXeIMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjEA3YsaNIGl+tnbtOdle4QeFEwnt1uHakGGwrFHV1Azcifv5VRFfvZIlQxjLlxIPnDBAjAsimBE3CAfz+Wbw00pMMFIeFHZYO1qdfHrSsq+OM0luJfQyAW+8Mf3iwelccboDgdoYXV0aERhdGFYmMRs74KtG1Rkd1kdAIsIdZ7D5tLstPOUdL/qaWmSXQO3RQAAAAAAAAAAAAAAAAAAAAAAAAAAABRK0rg7vzmd/BAatDNkXX6aBhPZSaUBAgMmIAEhWCBhzzu/urX0hiOpLe+LMsB6381xbQ1WlhG/O9kV8JPTSSJYIMFHSvMhMjiK64G6lW1JEWFl8drcaFhS7/DcyjaHez/6"),
403399
),
404400
AssertionExample(
405401
id = ByteArray.fromBase64Url("StK4O785nfwQGrQzZF1-mgYT2Uk"),
406-
clientData = new String(
407-
ByteArray
408-
.fromBase64(
409-
"eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoid2V5TG9keXVzUl96SWtPWUg3bTVUYjBreGViQnEtV2QzYVJreUhMeHl0SSIsIm9yaWdpbiI6Imh0dHBzOi8vZGVtby55dWJpY28uY29tIn0="
410-
)
411-
.getBytes,
412-
StandardCharsets.UTF_8,
413-
),
402+
clientData =
403+
base64ToString("eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoid2V5TG9keXVzUl96SWtPWUg3bTVUYjBreGViQnEtV2QzYVJreUhMeHl0SSIsIm9yaWdpbiI6Imh0dHBzOi8vZGVtby55dWJpY28uY29tIn0="),
414404
authDataBytes = ByteArray.fromBase64(
415405
"xGzvgq0bVGR3WR0Aiwh1nsPm0uy085R0v+ppaZJdA7cFAAAAAA=="
416406
),
@@ -432,26 +422,13 @@ object RealExamples {
432422
.id(ByteArray.fromBase64("+8eKyPo9MGrhWx8Y7ZeoczjaS5mbRr2kqF7/zllIgZ8="))
433423
.build(),
434424
AttestationExample(
435-
new String(
436-
ByteArray
437-
.fromBase64(
438-
"eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoicWszNE1GRVA4dWxXaHVpOEpncmt0ZVE5RXhIV2NKYndJcjNDUm1lVGtqZyIsIm9yaWdpbiI6Imh0dHBzOi8vZGVtby55dWJpY28uY29tIn0="
439-
)
440-
.getBytes,
441-
StandardCharsets.UTF_8,
442-
),
425+
base64ToString("eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoicWszNE1GRVA4dWxXaHVpOEpncmt0ZVE5RXhIV2NKYndJcjNDUm1lVGtqZyIsIm9yaWdpbiI6Imh0dHBzOi8vZGVtby55dWJpY28uY29tIn0="),
443426
ByteArray.fromBase64("o2NmbXRlYXBwbGVnYXR0U3RtdKFjeDVjglkCRjCCAkIwggHJoAMCAQICBgF4xjGSqDAKBggqhkjOPQQDAjBIMRwwGgYDVQQDDBNBcHBsZSBXZWJBdXRobiBDQSAxMRMwEQYDVQQKDApBcHBsZSBJbmMuMRMwEQYDVQQIDApDYWxpZm9ybmlhMB4XDTIxMDQxMTEzMDcyMFoXDTIxMDQxNDEzMDcyMFowgZExSTBHBgNVBAMMQDYxYmQ5NzY4M2JlMTk0NTVjOGJjOWVhNDZhMjY4NzU0MzVjMmIwNmVlMTI4YzY4ZDFiMGE4NDczODkwNTgzMjYxGjAYBgNVBAsMEUFBQSBDZXJ0aWZpY2F0aW9uMRMwEQYDVQQKDApBcHBsZSBJbmMuMRMwEQYDVQQIDApDYWxpZm9ybmlhMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdrvYDb+UbAjcbbommtRqw+2Lm1fvHG6ll1dOgeEM25H8ThQ0yj4R3hVbc/ean1I5eqc/RXDFm/jJI/Lmp1uEFqNVMFMwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBPAwMwYJKoZIhvdjZAgCBCYwJKEiBCAQ6ifyo7KWlR86ueS0JMAuIi66gYkJsX+VxAcvbtEEcTAKBggqhkjOPQQDAgNnADBkAjAIu8Vx1tdGHSarO63RF7QaUo3/Iuk1CXA2Z0YIbDG4mLS15JQ/AUwctOpePcZoDngCMFMfnXi6jlhNBmppj5/8VQz2Kbz5eNxg+dqALz59ctCqXkdCVLMhUOpHWgMhhOadj1kCODCCAjQwggG6oAMCAQICEFYlU5XHp/tA6+Io2CYIU7YwCgYIKoZIzj0EAwMwSzEfMB0GA1UEAwwWQXBwbGUgV2ViQXV0aG4gUm9vdCBDQTETMBEGA1UECgwKQXBwbGUgSW5jLjETMBEGA1UECAwKQ2FsaWZvcm5pYTAeFw0yMDAzMTgxODM4MDFaFw0zMDAzMTMwMDAwMDBaMEgxHDAaBgNVBAMME0FwcGxlIFdlYkF1dGhuIENBIDExEzARBgNVBAoMCkFwcGxlIEluYy4xEzARBgNVBAgMCkNhbGlmb3JuaWEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASDLocvJhSRgQIlufX81rtjeLX1Xz/LBFvHNZk0df1UkETfm/4ZIRdlxpod2gULONRQg0AaQ0+yTREtVsPhz7/LmJH+wGlggb75bLx3yI3dr0alruHdUVta+quTvpwLJpGjZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUJtdk2cV4wlpn0afeaxLQG2PxxtcwHQYDVR0OBBYEFOuugsT/oaxbUdTPJGEFAL5jvXeIMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjEA3YsaNIGl+tnbtOdle4QeFEwnt1uHakGGwrFHV1Azcifv5VRFfvZIlQxjLlxIPnDBAjAsimBE3CAfz+Wbw00pMMFIeFHZYO1qdfHrSsq+OM0luJfQyAW+8Mf3iwelccboDgdoYXV0aERhdGFYmMRs74KtG1Rkd1kdAIsIdZ7D5tLstPOUdL/qaWmSXQO3RQAAAAAAAAAAAAAAAAAAAAAAAAAAABRhYCgh40b6Uj1WdjckwPAdCwd4fKUBAgMmIAEhWCB2u9gNv5RsCNxtuiaa1GrD7YubV+8cbqWXV06B4QzbkSJYIPxOFDTKPhHeFVtz95qfUjl6pz9FcMWb+Mkj8uanW4QW"),
444427
),
445428
AssertionExample(
446429
id = ByteArray.fromBase64Url("YWAoIeNG-lI9VnY3JMDwHQsHeHw"),
447-
clientData = new String(
448-
ByteArray
449-
.fromBase64(
450-
"eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiVVdobmx5VTdlVzZBTEw1M1VPcENnU1N3ckEzNm92R3VpQUV6ZE91OFdTYyIsIm9yaWdpbiI6Imh0dHBzOi8vZGVtby55dWJpY28uY29tIn0="
451-
)
452-
.getBytes,
453-
StandardCharsets.UTF_8,
454-
),
430+
clientData =
431+
base64ToString("eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiVVdobmx5VTdlVzZBTEw1M1VPcENnU1N3ckEzNm92R3VpQUV6ZE91OFdTYyIsIm9yaWdpbiI6Imh0dHBzOi8vZGVtby55dWJpY28uY29tIn0="),
455432
authDataBytes = ByteArray.fromBase64(
456433
"xGzvgq0bVGR3WR0Aiwh1nsPm0uy085R0v+ppaZJdA7cFAAAAAA=="
457434
),
@@ -500,7 +477,7 @@ object RealExamples {
500477
AssertionExample(
501478
id =
502479
ByteArray.fromBase64Url("qeNy9WGd6KRAq4aXf_xCgOrgjJoRH7Ve8KC7UJ3cpjDaFrv5egr5kJ7mBlrGiHlZ0OkD_Xtsd-lQTu_Ymr1crg"),
503-
clientData = """{"type":"webauthn.get","challenge":"gJQG3mUBQv5rR7mwUuHbxQ","origin":"https://demo.yubico.com","crossOrigin":false"}""",
480+
clientData = """{"type":"webauthn.get","challenge":"gJQG3mUBQv5rR7mwUuHbxQ","origin":"https://demo.yubico.com","crossOrigin":false}""",
504481
authDataBytes = ByteArray.fromBase64(
505482
"xGzvgq0bVGR3WR0Aiwh1nsPm0uy085R0v+ppaZJdA7cBAAAABQ=="
506483
),
@@ -509,4 +486,33 @@ object RealExamples {
509486
),
510487
)
511488

489+
val YubikeyBio_5_5_4 = Example(
490+
RelyingPartyIdentity
491+
.builder()
492+
.id("demo.yubico.com")
493+
.name("YubicoDemo")
494+
.build(),
495+
UserIdentity
496+
.builder()
497+
.name("Yubico demo user")
498+
.displayName("Yubico demo user")
499+
.id(ByteArray.fromBase64("n5iF3+LH/w9yfgIgEWdFL99YAD8PMpG41PEPzzV1RSc="))
500+
.build(),
501+
AttestationExample(
502+
base64ToString("eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoicnJIQmg3Q01yZElYTE0zMFBkOFZ1Ulg3TV9xVXl5VEpCWDRUN2xONUVRRSIsIm9yaWdpbiI6Imh0dHBzOi8vZGVtby55dWJpY28uY29tIiwiY3Jvc3NPcmlnaW4iOmZhbHNlfQ=="),
503+
ByteArray.fromBase64("o2NmbXRmcGFja2VkZ2F0dFN0bXSjY2FsZyZjc2lnWEYwRAIgGSqwfT67zXQVsgBU/TvN1MGbZkR5KEyzzMMbS9cJQJsCIDZJ90wxLjNnpzNZ+Ns64cmgwixb0CJcXdfVM35EBgm0Y3g1Y4FZAt0wggLZMIIBwaADAgECAgkAtcaOPpfL6PYwDQYJKoZIhvcNAQELBQAwLjEsMCoGA1UEAxMjWXViaWNvIFUyRiBSb290IENBIFNlcmlhbCA0NTcyMDA2MzEwIBcNMTQwODAxMDAwMDAwWhgPMjA1MDA5MDQwMDAwMDBaMG8xCzAJBgNVBAYTAlNFMRIwEAYDVQQKDAlZdWJpY28gQUIxIjAgBgNVBAsMGUF1dGhlbnRpY2F0b3IgQXR0ZXN0YXRpb24xKDAmBgNVBAMMH1l1YmljbyBVMkYgRUUgU2VyaWFsIDEwNDk1NDQzNzMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQXmY7aJqXBb5wsBbCAeJFdFa3Fzz8VU1qdJxUCgPf2MNcoMnikaKg0yp/bakKjCNIqmsb75RhUzS5UQHwVOAe0o4GBMH8wEwYKKwYBBAGCxAoNAQQFBAMFBQQwIgYJKwYBBAGCxAoCBBUxLjMuNi4xLjQuMS40MTQ4Mi4xLjkwEwYLKwYBBAGC5RwCAQEEBAMCBSAwIQYLKwYBBAGC5RwBAQQEEgQQ2FItn1dbSGaIqbqZ+gLzWzAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQB9yNliBCNlTGBrhYTTqHJm73KjMszL24buZcvifix+GRYk7D8I0/BQ20mQ/CITqqGTr5cvxjIKVw/2ed+326hITlhaWiwwEnwuI5afqwd72ObWczklHNvoV+uWtM9YVfk9H7VZqtQTMb3m8O+UWmkCGxLdqTprgTUSF/Tmk6KPyF1S6es6RJvk9vxyJ0T/EFkr9yAPlDzqtc9hEAUEPP5xpzEWRYon6T12AUW6wQwlkiA8q4gFIQfTGks1JX6ob/1nTvigO3EYB4wP3EIAJ+0HkpprKKDl4mRv/7b/BPuANq4jMr/9YkYs8XrmuUHdF0PwRzYPN4KtovuG0YdFA0ObaGF1dGhEYXRhWMTEbO+CrRtUZHdZHQCLCHWew+bS7LTzlHS/6mlpkl0Dt0UAAAAB2FItn1dbSGaIqbqZ+gLzWwBAvPVBBCgvthNO8DNbim45zueAndDzuMAQDBXL/bVsH9uXfKkrza7ya2DM/xka1hYW+K2d97qNRJmoAeetc5haaKUBAgMmIAEhWCDqr+a3QuoQk4VqspgOfHlkS2Rk+NpsHL5Rs4rbxE2DQiJYICjaw5BRuZKz5CPZRjiDJFOq51wbOrUggICGmC88+ZXq"),
504+
),
505+
AssertionExample(
506+
id =
507+
ByteArray.fromBase64Url("vPVBBCgvthNO8DNbim45zueAndDzuMAQDBXL_bVsH9uXfKkrza7ya2DM_xka1hYW-K2d97qNRJmoAeetc5haaA"),
508+
clientData =
509+
base64ToString("eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiOVVHcG1JOXdkM004dF9yUGFZMVRyWXd1LVVranRUdHV1N2RGcHlyNGtDOCIsIm9yaWdpbiI6Imh0dHBzOi8vZGVtby55dWJpY28uY29tIiwiY3Jvc3NPcmlnaW4iOmZhbHNlfQ=="),
510+
authDataBytes = ByteArray.fromBase64(
511+
"xGzvgq0bVGR3WR0Aiwh1nsPm0uy085R0v+ppaZJdA7cFAAAABA=="
512+
),
513+
sig =
514+
ByteArray.fromBase64("MEUCIGM9xK+AHlLTv3mJLagZuNlLijI86T2SzkyAy3NidembAiEA6Y3I5GPYnRoHKil4R8yCSHUFZdgc59GO1KfsoHYhA3o="),
515+
),
516+
)
517+
512518
}

0 commit comments

Comments
 (0)