Skip to content

Commit 8dce8bb

Browse files
committed
Extract function jsonMap in TestAuthenticator
1 parent 3268793 commit 8dce8bb

File tree

1 file changed

+121
-153
lines changed

1 file changed

+121
-153
lines changed

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

Lines changed: 121 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ object TestAuthenticator {
137137
)
138138

139139
private def jsonFactory: JsonNodeFactory = JsonNodeFactory.instance
140+
private def jsonMap[V <: JsonNode](
141+
map: JsonNodeFactory => Map[String, V]
142+
): ObjectNode =
143+
jsonFactory
144+
.objectNode()
145+
.setAll[ObjectNode](map.apply(jsonFactory).asJava)
146+
140147
private def toBytes(s: String): ByteArray = new ByteArray(s.getBytes("UTF-8"))
141148
def sha256(s: String): ByteArray = sha256(toBytes(s))
142149
def sha256(b: ByteArray): ByteArray =
@@ -154,16 +161,13 @@ object TestAuthenticator {
154161
authDataBytes: ByteArray,
155162
clientDataJson: ByteArray,
156163
): ByteArray = {
157-
val f = JsonNodeFactory.instance
158-
val attObj = f
159-
.objectNode()
160-
.setAll[ObjectNode](
161-
Map(
162-
"authData" -> f.binaryNode(authDataBytes.getBytes),
163-
"fmt" -> f.textNode(format),
164-
"attStmt" -> makeAttestationStatement(authDataBytes, clientDataJson),
165-
).asJava
164+
val attObj = jsonMap { f =>
165+
Map(
166+
"authData" -> f.binaryNode(authDataBytes.getBytes),
167+
"fmt" -> f.textNode(format),
168+
"attStmt" -> makeAttestationStatement(authDataBytes, clientDataJson),
166169
)
170+
}
167171
new ByteArray(JacksonCodecs.cbor.writeValueAsBytes(attObj))
168172
}
169173
}
@@ -426,35 +430,25 @@ object TestAuthenticator {
426430
origin: String = Defaults.origin,
427431
tokenBindingStatus: String = Defaults.TokenBinding.status,
428432
tokenBindingId: Option[String] = Defaults.TokenBinding.id,
429-
): String = {
430-
val clientDataJson: String =
431-
JacksonCodecs.json.writeValueAsString(clientData getOrElse {
432-
val json: ObjectNode = jsonFactory.objectNode()
433-
434-
json.setAll(
433+
): String =
434+
JacksonCodecs.json.writeValueAsString(clientData getOrElse {
435+
jsonMap {
436+
f =>
435437
Map(
436-
"challenge" -> jsonFactory.textNode(challenge.getBase64Url),
437-
"origin" -> jsonFactory.textNode(origin),
438-
"type" -> jsonFactory.textNode("webauthn.create"),
439-
).asJava
440-
)
441-
442-
json.set(
443-
"tokenBinding", {
444-
val tokenBinding = jsonFactory.objectNode()
445-
tokenBinding.set("status", jsonFactory.textNode(tokenBindingStatus))
446-
tokenBindingId foreach { id =>
447-
tokenBinding.set("id", jsonFactory.textNode(id))
448-
}
449-
tokenBinding
450-
},
451-
)
452-
453-
json
454-
})
455-
456-
clientDataJson
457-
}
438+
"challenge" -> f.textNode(challenge.getBase64Url),
439+
"origin" -> f.textNode(origin),
440+
"type" -> f.textNode("webauthn.create"),
441+
"tokenBinding" -> {
442+
val tokenBinding = f.objectNode()
443+
tokenBinding.set("status", f.textNode(tokenBindingStatus))
444+
tokenBindingId foreach { id =>
445+
tokenBinding.set("id", f.textNode(id))
446+
}
447+
tokenBinding
448+
},
449+
)
450+
}
451+
})
458452

459453
def createCredential(
460454
authDataBytes: ByteArray,
@@ -621,28 +615,22 @@ object TestAuthenticator {
621615

622616
val clientDataJson: String =
623617
JacksonCodecs.json.writeValueAsString(clientData getOrElse {
624-
val json: ObjectNode = jsonFactory.objectNode()
625-
626-
json.setAll(
627-
Map(
628-
"challenge" -> jsonFactory.textNode(challenge.getBase64Url),
629-
"origin" -> jsonFactory.textNode(origin),
630-
"type" -> jsonFactory.textNode("webauthn.get"),
631-
).asJava
632-
)
633-
634-
json.set(
635-
"tokenBinding", {
636-
val tokenBinding = jsonFactory.objectNode()
637-
tokenBinding.set("status", jsonFactory.textNode(tokenBindingStatus))
638-
tokenBindingId foreach { id =>
639-
tokenBinding.set("id", jsonFactory.textNode(id))
640-
}
641-
tokenBinding
642-
},
643-
)
644-
645-
json
618+
jsonMap {
619+
f =>
620+
Map(
621+
"challenge" -> f.textNode(challenge.getBase64Url),
622+
"origin" -> f.textNode(origin),
623+
"type" -> f.textNode("webauthn.get"),
624+
"tokenBinding" -> {
625+
val tokenBinding = f.objectNode()
626+
tokenBinding.set("status", f.textNode(tokenBindingStatus))
627+
tokenBindingId foreach { id =>
628+
tokenBinding.set("id", f.textNode(id))
629+
}
630+
tokenBinding
631+
},
632+
)
633+
}
646634
})
647635
val clientDataJsonBytes = toBytes(clientDataJson)
648636

@@ -714,24 +702,21 @@ object TestAuthenticator {
714702
),
715703
)
716704

717-
val f = JsonNodeFactory.instance
718-
f.objectNode()
719-
.setAll(
720-
Map(
721-
"x5c" -> f.arrayNode().add(f.binaryNode(signer.cert.getEncoded)),
722-
"sig" -> f.binaryNode(
723-
sign(
724-
signedData,
725-
signer.key,
726-
signer.alg,
727-
).getBytes
728-
),
729-
).asJava
705+
jsonMap { f =>
706+
Map(
707+
"x5c" -> f.arrayNode().add(f.binaryNode(signer.cert.getEncoded)),
708+
"sig" -> f.binaryNode(
709+
sign(
710+
signedData,
711+
signer.key,
712+
signer.alg,
713+
).getBytes
714+
),
730715
)
716+
}
731717
}
732718

733-
def makeNoneAttestationStatement(): JsonNode =
734-
JsonNodeFactory.instance.objectNode()
719+
def makeNoneAttestationStatement(): JsonNode = jsonFactory.objectNode()
735720

736721
def makePackedAttestationStatement(
737722
authDataBytes: ByteArray,
@@ -747,24 +732,20 @@ object TestAuthenticator {
747732
case AttestationCert(_, key, alg, _) => sign(signedData, key, alg)
748733
}
749734

750-
val f = JsonNodeFactory.instance
751-
f.objectNode()
752-
.setAll(
753-
(
735+
jsonMap { f =>
736+
Map(
737+
"alg" -> f.numberNode(signer.alg.getId),
738+
"sig" -> f.binaryNode(signature.getBytes),
739+
) ++ (signer match {
740+
case _: SelfAttestation => Map.empty
741+
case AttestationCert(cert, _, _, _) =>
754742
Map(
755-
"alg" -> f.numberNode(signer.alg.getId),
756-
"sig" -> f.binaryNode(signature.getBytes),
757-
) ++ (signer match {
758-
case _: SelfAttestation => Map.empty
759-
case AttestationCert(cert, _, _, _) =>
760-
Map(
761-
"x5c" -> f
762-
.arrayNode()
763-
.add(cert.getEncoded)
764-
)
765-
})
766-
).asJava
767-
)
743+
"x5c" -> f
744+
.arrayNode()
745+
.add(cert.getEncoded)
746+
)
747+
})
748+
}
768749
}
769750

770751
def makeAndroidSafetynetAttestationStatement(
@@ -776,37 +757,31 @@ object TestAuthenticator {
776757
val nonce =
777758
Crypto.sha256(authDataBytes concat Crypto.sha256(clientDataJson))
778759

779-
val f = JsonNodeFactory.instance
780-
781-
val jwsHeader = f
782-
.objectNode()
783-
.setAll[ObjectNode](
784-
Map(
785-
"alg" -> f.textNode("RS256"),
786-
"x5c" -> f
787-
.arrayNode()
788-
.add(new ByteArray(cert.cert.getEncoded).getBase64),
789-
).asJava
760+
val jwsHeader = jsonMap { f =>
761+
Map(
762+
"alg" -> f.textNode("RS256"),
763+
"x5c" -> f
764+
.arrayNode()
765+
.add(new ByteArray(cert.cert.getEncoded).getBase64),
790766
)
767+
}
791768
val jwsHeaderBase64 = new ByteArray(
792769
JacksonCodecs.json().writeValueAsBytes(jwsHeader)
793770
).getBase64Url
794771

795-
val jwsPayload = f
796-
.objectNode()
797-
.setAll[ObjectNode](
798-
Map(
799-
"nonce" -> f.textNode(nonce.getBase64),
800-
"timestampMs" -> f.numberNode(Instant.now().toEpochMilli),
801-
"apkPackageName" -> f.textNode("com.yubico.webauthn.test"),
802-
"apkDigestSha256" -> f.textNode(Crypto.sha256("foo").getBase64),
803-
"ctsProfileMatch" -> f.booleanNode(ctsProfileMatch),
804-
"aplCertificateDigestSha256" -> f
805-
.arrayNode()
806-
.add(f.textNode(Crypto.sha256("foo").getBase64)),
807-
"basicIntegrity" -> f.booleanNode(true),
808-
).asJava
772+
val jwsPayload = jsonMap { f =>
773+
Map(
774+
"nonce" -> f.textNode(nonce.getBase64),
775+
"timestampMs" -> f.numberNode(Instant.now().toEpochMilli),
776+
"apkPackageName" -> f.textNode("com.yubico.webauthn.test"),
777+
"apkDigestSha256" -> f.textNode(Crypto.sha256("foo").getBase64),
778+
"ctsProfileMatch" -> f.booleanNode(ctsProfileMatch),
779+
"aplCertificateDigestSha256" -> f
780+
.arrayNode()
781+
.add(f.textNode(Crypto.sha256("foo").getBase64)),
782+
"basicIntegrity" -> f.booleanNode(true),
809783
)
784+
}
810785
val jwsPayloadBase64 = new ByteArray(
811786
JacksonCodecs.json().writeValueAsBytes(jwsPayload)
812787
).getBase64Url
@@ -819,16 +794,14 @@ object TestAuthenticator {
819794

820795
val jwsCompact = jwsSignedCompact + "." + jwsSignature.getBase64Url
821796

822-
val attStmt = f
823-
.objectNode()
824-
.setAll[ObjectNode](
825-
Map(
826-
"ver" -> f.textNode("14799021"),
827-
"response" -> f.binaryNode(
828-
jwsCompact.getBytes(StandardCharsets.UTF_8)
829-
),
830-
).asJava
797+
val attStmt = jsonMap { f =>
798+
Map(
799+
"ver" -> f.textNode("14799021"),
800+
"response" -> f.binaryNode(
801+
jwsCompact.getBytes(StandardCharsets.UTF_8)
802+
),
831803
)
804+
}
832805

833806
attStmt
834807
}
@@ -878,19 +851,17 @@ object TestAuthenticator {
878851
} else Nil,
879852
)
880853

881-
val f = JsonNodeFactory.instance
882-
f.objectNode()
883-
.setAll(
884-
Map(
885-
"x5c" -> f
886-
.arrayNode()
887-
.addAll(
888-
List(subjectCert, caCert)
889-
.map(crt => f.binaryNode(crt.getEncoded))
890-
.asJava
891-
)
892-
).asJava
854+
jsonMap { f =>
855+
Map(
856+
"x5c" -> f
857+
.arrayNode()
858+
.addAll(
859+
List(subjectCert, caCert)
860+
.map(crt => f.binaryNode(crt.getEncoded))
861+
.asJava
862+
)
893863
)
864+
}
894865
}
895866

896867
def makeTpmAttestationStatement(
@@ -1041,23 +1012,20 @@ object TestAuthenticator {
10411012

10421013
val sig = sign(certInfo, cert.key, cert.alg)
10431014

1044-
val f = JsonNodeFactory.instance
1045-
f
1046-
.objectNode()
1047-
.setAll[ObjectNode](
1048-
Map(
1049-
"ver" -> ver.map(f.textNode).getOrElse(f.nullNode()),
1050-
"alg" -> f.numberNode(cert.alg.getId),
1051-
"x5c" -> f
1052-
.arrayNode()
1053-
.addAll(
1054-
cert.certChain.map(_._1.getEncoded).map(f.binaryNode).asJava
1055-
),
1056-
"sig" -> f.binaryNode(sig.getBytes),
1057-
"certInfo" -> f.binaryNode(certInfo.getBytes),
1058-
"pubArea" -> f.binaryNode(pubArea.getBytes),
1059-
).asJava
1015+
jsonMap { f =>
1016+
Map(
1017+
"ver" -> ver.map(f.textNode).getOrElse(f.nullNode()),
1018+
"alg" -> f.numberNode(cert.alg.getId),
1019+
"x5c" -> f
1020+
.arrayNode()
1021+
.addAll(
1022+
cert.certChain.map(_._1.getEncoded).map(f.binaryNode).asJava
1023+
),
1024+
"sig" -> f.binaryNode(sig.getBytes),
1025+
"certInfo" -> f.binaryNode(certInfo.getBytes),
1026+
"pubArea" -> f.binaryNode(pubArea.getBytes),
10601027
)
1028+
}
10611029
}
10621030

10631031
def makeAuthDataBytes(

0 commit comments

Comments
 (0)