Skip to content

Commit 82bea3f

Browse files
committed
Modularize createCredential methods in TestAuthenticator
1 parent 9fe13c4 commit 82bea3f

File tree

1 file changed

+80
-45
lines changed

1 file changed

+80
-45
lines changed

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

Lines changed: 80 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -302,28 +302,50 @@ object TestAuthenticator {
302302
}
303303
}
304304

305-
private def createCredential(
305+
private def createAuthenticatorData(
306306
aaguid: ByteArray = Defaults.aaguid,
307-
attestationMaker: AttestationMaker,
308307
authenticatorExtensions: Option[JsonNode] = None,
309-
challenge: ByteArray = Defaults.challenge,
310-
clientData: Option[JsonNode] = None,
311-
clientExtensions: ClientRegistrationExtensionOutputs =
312-
ClientRegistrationExtensionOutputs.builder().build(),
313308
credentialKeypair: Option[KeyPair] = None,
314309
keyAlgorithm: COSEAlgorithmIdentifier = Defaults.keyAlgorithm,
315-
origin: String = Defaults.origin,
316-
tokenBindingStatus: String = Defaults.TokenBinding.status,
317-
tokenBindingId: Option[String] = Defaults.TokenBinding.id,
318310
): (
319-
data.PublicKeyCredential[
320-
data.AuthenticatorAttestationResponse,
321-
ClientRegistrationExtensionOutputs,
322-
],
311+
ByteArray,
323312
KeyPair,
324-
List[(X509Certificate, PrivateKey)],
325313
) = {
314+
val keypair =
315+
credentialKeypair.getOrElse(generateKeypair(algorithm = keyAlgorithm))
316+
val publicKeyCose = keypair.getPublic match {
317+
case pub: ECPublicKey => WebAuthnTestCodecs.ecPublicKeyToCose(pub)
318+
case pub: BCEdDSAPublicKey => WebAuthnTestCodecs.eddsaPublicKeyToCose(pub)
319+
case pub: RSAPublicKey =>
320+
WebAuthnTestCodecs.rsaPublicKeyToCose(pub, keyAlgorithm)
321+
}
326322

323+
val authDataBytes: ByteArray = makeAuthDataBytes(
324+
rpId = Defaults.rpId,
325+
attestedCredentialDataBytes = Some(
326+
makeAttestedCredentialDataBytes(
327+
aaguid = aaguid,
328+
publicKeyCose = publicKeyCose,
329+
)
330+
),
331+
extensionsCborBytes = authenticatorExtensions map (ext =>
332+
new ByteArray(JacksonCodecs.cbor().writeValueAsBytes(ext))
333+
),
334+
)
335+
336+
(
337+
authDataBytes,
338+
keypair,
339+
)
340+
}
341+
342+
private def createClientData(
343+
challenge: ByteArray = Defaults.challenge,
344+
clientData: Option[JsonNode] = None,
345+
origin: String = Defaults.origin,
346+
tokenBindingStatus: String = Defaults.TokenBinding.status,
347+
tokenBindingId: Option[String] = Defaults.TokenBinding.id,
348+
): String = {
327349
val clientDataJson: String =
328350
JacksonCodecs.json.writeValueAsString(clientData getOrElse {
329351
val json: ObjectNode = jsonFactory.objectNode()
@@ -349,29 +371,27 @@ object TestAuthenticator {
349371

350372
json
351373
})
352-
val clientDataJsonBytes = toBytes(clientDataJson)
353374

354-
val keypair =
355-
credentialKeypair.getOrElse(generateKeypair(algorithm = keyAlgorithm))
356-
val publicKeyCose = keypair.getPublic match {
357-
case pub: ECPublicKey => WebAuthnTestCodecs.ecPublicKeyToCose(pub)
358-
case pub: BCEdDSAPublicKey => WebAuthnTestCodecs.eddsaPublicKeyToCose(pub)
359-
case pub: RSAPublicKey =>
360-
WebAuthnTestCodecs.rsaPublicKeyToCose(pub, keyAlgorithm)
361-
}
375+
clientDataJson
376+
}
362377

363-
val authDataBytes: ByteArray = makeAuthDataBytes(
364-
rpId = Defaults.rpId,
365-
attestedCredentialDataBytes = Some(
366-
makeAttestedCredentialDataBytes(
367-
aaguid = aaguid,
368-
publicKeyCose = publicKeyCose,
369-
)
370-
),
371-
extensionsCborBytes = authenticatorExtensions map (ext =>
372-
new ByteArray(JacksonCodecs.cbor().writeValueAsBytes(ext))
373-
),
374-
)
378+
private def createCredential(
379+
authDataBytes: ByteArray,
380+
clientDataJson: String,
381+
credentialKeypair: KeyPair,
382+
attestationMaker: AttestationMaker,
383+
clientExtensions: ClientRegistrationExtensionOutputs =
384+
ClientRegistrationExtensionOutputs.builder().build(),
385+
): (
386+
data.PublicKeyCredential[
387+
data.AuthenticatorAttestationResponse,
388+
ClientRegistrationExtensionOutputs,
389+
],
390+
KeyPair,
391+
List[(X509Certificate, PrivateKey)],
392+
) = {
393+
394+
val clientDataJsonBytes = toBytes(clientDataJson)
375395

376396
val attestationObjectBytes =
377397
attestationMaker.makeAttestationObjectBytes(authDataBytes, clientDataJson)
@@ -391,7 +411,7 @@ object TestAuthenticator {
391411
.response(response)
392412
.clientExtensionResults(clientExtensions)
393413
.build(),
394-
keypair,
414+
credentialKeypair,
395415
attestationMaker.certChain,
396416
)
397417
}
@@ -407,13 +427,20 @@ object TestAuthenticator {
407427
],
408428
KeyPair,
409429
List[(X509Certificate, PrivateKey)],
410-
) =
411-
createCredential(
430+
) = {
431+
val (authData, credentialKeypair) = createAuthenticatorData(
412432
aaguid = aaguid,
413-
attestationMaker = attestationMaker,
414433
keyAlgorithm = keyAlgorithm,
415434
)
416435

436+
createCredential(
437+
authDataBytes = authData,
438+
credentialKeypair = credentialKeypair,
439+
clientDataJson = createClientData(),
440+
attestationMaker = attestationMaker,
441+
)
442+
}
443+
417444
def createSelfAttestedCredential(
418445
attestationMaker: SelfAttestation => AttestationMaker,
419446
keyAlgorithm: COSEAlgorithmIdentifier = Defaults.keyAlgorithm,
@@ -425,12 +452,15 @@ object TestAuthenticator {
425452
KeyPair,
426453
List[(X509Certificate, PrivateKey)],
427454
) = {
428-
val keypair = generateKeypair(keyAlgorithm)
455+
val (authData, keypair) = createAuthenticatorData(credentialKeypair =
456+
Some(generateKeypair(keyAlgorithm))
457+
)
429458
val signer = SelfAttestation(keypair, keyAlgorithm)
430459
createCredential(
460+
authDataBytes = authData,
461+
clientDataJson = createClientData(),
462+
credentialKeypair = keypair,
431463
attestationMaker = attestationMaker(signer),
432-
credentialKeypair = Some(keypair),
433-
keyAlgorithm = keyAlgorithm,
434464
)
435465
}
436466

@@ -444,12 +474,17 @@ object TestAuthenticator {
444474
],
445475
KeyPair,
446476
List[(X509Certificate, PrivateKey)],
447-
) =
477+
) = {
478+
val (authData, keypair) = createAuthenticatorData(
479+
authenticatorExtensions = authenticatorExtensions
480+
)
448481
createCredential(
482+
authDataBytes = authData,
483+
clientDataJson = createClientData(challenge = challenge),
484+
credentialKeypair = keypair,
449485
attestationMaker = AttestationMaker.none(),
450-
authenticatorExtensions = authenticatorExtensions,
451-
challenge = challenge,
452486
)
487+
}
453488

454489
def createAssertionFromTestData(
455490
testData: RegistrationTestData,

0 commit comments

Comments
 (0)