Skip to content

Commit f04c0a5

Browse files
committed
Add and generate test data for Ed448
1 parent 05fcfab commit f04c0a5

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ object RegistrationTestDataGenerator extends App {
139139
td.NoneAttestation.Default,
140140
td.Packed.BasicAttestation,
141141
td.Packed.BasicAttestationEdDsa,
142+
td.Packed.BasicAttestationEd448,
142143
td.Packed.BasicAttestationRsa,
143144
td.Packed.BasicAttestationRs384,
144145
td.Packed.BasicAttestationRs512,
@@ -181,6 +182,7 @@ object RegistrationTestData {
181182
NoneAttestation.Default,
182183
Packed.BasicAttestation,
183184
Packed.BasicAttestationEdDsa,
185+
Packed.BasicAttestationEd448,
184186
Packed.BasicAttestationRsa,
185187
Packed.BasicAttestationRs384,
186188
Packed.BasicAttestationRs512,
@@ -432,6 +434,43 @@ object RegistrationTestData {
432434
)
433435
}
434436

437+
val BasicAttestationEd448: RegistrationTestData = new RegistrationTestData(
438+
alg = COSEAlgorithmIdentifier.EdDSA,
439+
attestationObject =
440+
ByteArray.fromHex("a3686175746844617461588149960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97634100000539000102030405060708090a0b0c0d0e0f0020b9ad79ab995dde21321b6a04b7a71e2769e3c000dcc9f969c17cc719c7f49473a4010103272006215820c200f60e3bdb0fc3bf5e178cd68ff8e15b47716b03f7e67c08cf9ea989498b0063666d74667061636b65646761747453746d74a363616c67266373696758463044022051b2cf7b51bc6956d512a1974dd6eab35adab213d219ea06edf6261b86d97d3902202dcf7fc49968decce6fe4385d1850b0c83b16b6bfb5237e102bdeaaa3c3ee60a63783563815901bf308201bb30820162a00302010202022708300a06082a8648ce3d04030230673123302106035504030c1a59756269636f20576562417574686e20756e6974207465737473310f300d060355040a0c0659756269636f31223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b3009060355040613025345301e170d3138303930363137343230305a170d3138303931333137343230305a30673123302106035504030c1a59756269636f20576562417574686e20756e6974207465737473310f300d060355040a0c0659756269636f31223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130253453059301306072a8648ce3d020106082a8648ce3d030107034200044ad6b73044981f8725951227fa9b3a78f5fab1a816b41a6f49a02628d3d570dee44207365177fa3c4660351c08bb29af686eb140fa4861cdb60b179c0a5c8e6f300a06082a8648ce3d0403020347003044022028a86c2820577920e1401086f16e6c4c6237e47b4ebd97ae519bbe7774ef64490220041ce97d4679269e7fde235786381e630a77b47e80ba9f60edfec7f0fd00c012"),
441+
clientDataJson = """{"challenge":"AAEBAgMFCA0VIjdZEGl5Yls","origin":"https://localhost","type":"webauthn.create","tokenBinding":{"status":"supported"}}""",
442+
privateKey = Some(
443+
ByteArray.fromHex("308183020101300506032b6571043b04399d78cbed100b03f5abf6c6abed37f9c4a0a620f17b64b7e252b2287bc6c4a9d09d240fd3d1f17ce0a47f4757824a3fdedc3e48562edfe6d5dc813a00d659ca2d581ce4e64747654f3e57db0846721f8ab8936f04f5c200f60e3bdb0fc3bf5e178cd68ff8e15b47716b03f7e67c08cf9ea989498b00")
444+
),
445+
attestationCertChain = List(
446+
RegistrationTestDataGenerator.importAttestationCa(
447+
"MIIBuzCCAWKgAwIBAgICJwgwCgYIKoZIzj0EAwIwZzEjMCEGA1UEAwwaWXViaWNvIFdlYkF1dGhuIHVuaXQgdGVzdHMxDzANBgNVBAoMBll1YmljbzEiMCAGA1UECwwZQXV0aGVudGljYXRvciBBdHRlc3RhdGlvbjELMAkGA1UEBhMCU0UwHhcNMTgwOTA2MTc0MjAwWhcNMTgwOTEzMTc0MjAwWjBnMSMwIQYDVQQDDBpZdWJpY28gV2ViQXV0aG4gdW5pdCB0ZXN0czEPMA0GA1UECgwGWXViaWNvMSIwIAYDVQQLDBlBdXRoZW50aWNhdG9yIEF0dGVzdGF0aW9uMQswCQYDVQQGEwJTRTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABErWtzBEmB+HJZUSJ/qbOnj1+rGoFrQab0mgJijT1XDe5EIHNlF3+jxGYDUcCLspr2husUD6SGHNtgsXnApcjm8wCgYIKoZIzj0EAwIDRwAwRAIgKKhsKCBXeSDhQBCG8W5sTGI35HtOvZeuUZu+d3TvZEkCIAQc6X1GeSaef94jV4Y4HmMKd7R+gLqfYO3+x/D9AMAS",
448+
"EC",
449+
"MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg1KdUwnJnE3sFiWc/RC1UZv6JHL+hZSI5ro7MfFCzBROgCgYIKoZIzj0DAQehRANCAARK1rcwRJgfhyWVEif6mzp49fqxqBa0Gm9JoCYo09Vw3uRCBzZRd/o8RmA1HAi7Ka9obrFA+khhzbYLF5wKXI5v",
450+
)
451+
),
452+
assertion = Some(
453+
AssertionTestData(
454+
request = JacksonCodecs
455+
.json()
456+
.readValue(
457+
"""{"publicKeyCredentialRequestOptions":{"challenge":"N3LjI2J5ylyWe3ED5OT4XHLRqHwm_J48_D_hoJOFf30","hints":[],"userVerification":"preferred","extensions":{}},"username":"test@test.org"}""",
458+
classOf[AssertionRequest],
459+
),
460+
response =
461+
PublicKeyCredential.parseAssertionResponseJson("""{"id":"ua15q5ld3iEyG2oEt6ceJ2njwADcyflpwXzHGcf0lHM","response":{"authenticatorData":"SZYN5YgOjGh0NBcPZHZgW4_krrmihjLHmVzzuoMdl2MBAAAFOQ","clientDataJSON":"eyJjaGFsbGVuZ2UiOiJOM0xqSTJKNXlseVdlM0VENU9UNFhITFJxSHdtX0o0OF9EX2hvSk9GZjMwIiwib3JpZ2luIjoiaHR0cHM6Ly9sb2NhbGhvc3QiLCJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwidG9rZW5CaW5kaW5nIjp7InN0YXR1cyI6InN1cHBvcnRlZCJ9fQ","signature":"1HIBzD_eMRlwSIgYwnmC7yvBBCQEJ1uA-Kmw5LPiQ8813XiMQK0h9ceB72rist0_80UCA7g-RpOAe4ZFTReT9VI0Ecr4hRGEKJQftpK334hFd-43aknPjMdv65baV14MZyO3dTHDOeyivN9yJMvkMyUA"},"clientExtensionResults":{},"type":"public-key"}"""),
462+
)
463+
),
464+
) {
465+
override def regenerate() =
466+
TestAuthenticator.createBasicAttestedCredential(
467+
keyAlgorithm = COSEAlgorithmIdentifier.Ed448,
468+
attestationMaker = AttestationMaker.packed(
469+
AttestationSigner.selfsigned(COSEAlgorithmIdentifier.ES256)
470+
),
471+
)
472+
}
473+
435474
val BasicAttestationRsa: RegistrationTestData = new RegistrationTestData(
436475
alg = COSEAlgorithmIdentifier.RS256,
437476
attestationObject =
@@ -1212,6 +1251,7 @@ case class RegistrationTestData(
12121251
PublicKeyCredentialParameters.EdDSA,
12131252
PublicKeyCredentialParameters.ES384,
12141253
PublicKeyCredentialParameters.ES512,
1254+
PublicKeyCredentialParameters.Ed448,
12151255
PublicKeyCredentialParameters.RS256,
12161256
PublicKeyCredentialParameters.RS384,
12171257
PublicKeyCredentialParameters.RS512,

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,7 @@ object TestAuthenticator {
11051105
def generateKeypair(algorithm: COSEAlgorithmIdentifier): KeyPair =
11061106
algorithm match {
11071107
case COSEAlgorithmIdentifier.EdDSA => generateEddsaKeypair()
1108+
case COSEAlgorithmIdentifier.Ed448 => generateEd448Keypair()
11081109
case COSEAlgorithmIdentifier.ES256 => generateEcKeypair("secp256r1")
11091110
case COSEAlgorithmIdentifier.ES384 => generateEcKeypair("secp384r1")
11101111
case COSEAlgorithmIdentifier.ES512 => generateEcKeypair("secp521r1")
@@ -1133,6 +1134,14 @@ object TestAuthenticator {
11331134
keyPairGenerator.generateKeyPair()
11341135
}
11351136

1137+
def generateEd448Keypair(): KeyPair = {
1138+
val alg = "Ed448"
1139+
// Need to use BouncyCastle provider here because JDK before 14 does not support EdDSA
1140+
val keyPairGenerator =
1141+
KeyPairGenerator.getInstance(alg, new BouncyCastleProvider())
1142+
keyPairGenerator.generateKeyPair()
1143+
}
1144+
11361145
def importEcKeypair(
11371146
privateBytes: ByteArray,
11381147
publicBytes: ByteArray,

0 commit comments

Comments
 (0)