@@ -137,6 +137,13 @@ object TestAuthenticator {
137
137
)
138
138
139
139
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
+
140
147
private def toBytes (s : String ): ByteArray = new ByteArray (s.getBytes(" UTF-8" ))
141
148
def sha256 (s : String ): ByteArray = sha256(toBytes(s))
142
149
def sha256 (b : ByteArray ): ByteArray =
@@ -154,16 +161,13 @@ object TestAuthenticator {
154
161
authDataBytes : ByteArray ,
155
162
clientDataJson : ByteArray ,
156
163
): 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),
166
169
)
170
+ }
167
171
new ByteArray (JacksonCodecs .cbor.writeValueAsBytes(attObj))
168
172
}
169
173
}
@@ -426,35 +430,25 @@ object TestAuthenticator {
426
430
origin : String = Defaults .origin,
427
431
tokenBindingStatus : String = Defaults .TokenBinding .status,
428
432
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 =>
435
437
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
+ })
458
452
459
453
def createCredential (
460
454
authDataBytes : ByteArray ,
@@ -621,28 +615,22 @@ object TestAuthenticator {
621
615
622
616
val clientDataJson : String =
623
617
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
+ }
646
634
})
647
635
val clientDataJsonBytes = toBytes(clientDataJson)
648
636
@@ -714,24 +702,21 @@ object TestAuthenticator {
714
702
),
715
703
)
716
704
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
+ ),
730
715
)
716
+ }
731
717
}
732
718
733
- def makeNoneAttestationStatement (): JsonNode =
734
- JsonNodeFactory .instance.objectNode()
719
+ def makeNoneAttestationStatement (): JsonNode = jsonFactory.objectNode()
735
720
736
721
def makePackedAttestationStatement (
737
722
authDataBytes : ByteArray ,
@@ -747,24 +732,20 @@ object TestAuthenticator {
747
732
case AttestationCert (_, key, alg, _) => sign(signedData, key, alg)
748
733
}
749
734
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, _, _, _) =>
754
742
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
+ }
768
749
}
769
750
770
751
def makeAndroidSafetynetAttestationStatement (
@@ -776,37 +757,31 @@ object TestAuthenticator {
776
757
val nonce =
777
758
Crypto .sha256(authDataBytes concat Crypto .sha256(clientDataJson))
778
759
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),
790
766
)
767
+ }
791
768
val jwsHeaderBase64 = new ByteArray (
792
769
JacksonCodecs .json().writeValueAsBytes(jwsHeader)
793
770
).getBase64Url
794
771
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 ),
809
783
)
784
+ }
810
785
val jwsPayloadBase64 = new ByteArray (
811
786
JacksonCodecs .json().writeValueAsBytes(jwsPayload)
812
787
).getBase64Url
@@ -819,16 +794,14 @@ object TestAuthenticator {
819
794
820
795
val jwsCompact = jwsSignedCompact + " ." + jwsSignature.getBase64Url
821
796
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
+ ),
831
803
)
804
+ }
832
805
833
806
attStmt
834
807
}
@@ -878,19 +851,17 @@ object TestAuthenticator {
878
851
} else Nil ,
879
852
)
880
853
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
+ )
893
863
)
864
+ }
894
865
}
895
866
896
867
def makeTpmAttestationStatement (
@@ -1041,23 +1012,20 @@ object TestAuthenticator {
1041
1012
1042
1013
val sig = sign(certInfo, cert.key, cert.alg)
1043
1014
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),
1060
1027
)
1028
+ }
1061
1029
}
1062
1030
1063
1031
def makeAuthDataBytes (
0 commit comments