diff --git a/webauthn-server-core/src/main/java/com/yubico/webauthn/RelyingParty.java b/webauthn-server-core/src/main/java/com/yubico/webauthn/RelyingParty.java index 6c5257c78..59681597b 100644 --- a/webauthn-server-core/src/main/java/com/yubico/webauthn/RelyingParty.java +++ b/webauthn-server-core/src/main/java/com/yubico/webauthn/RelyingParty.java @@ -216,6 +216,9 @@ public class RelyingParty { *
  • {@link com.yubico.webauthn.data.PublicKeyCredentialParameters#RS256 RS256} *
  • {@link com.yubico.webauthn.data.PublicKeyCredentialParameters#RS384 RS384} *
  • {@link com.yubico.webauthn.data.PublicKeyCredentialParameters#RS512 RS512} + *
  • {@link com.yubico.webauthn.data.PublicKeyCredentialParameters#ML_DSA_44 ML_DSA_44} + *
  • {@link com.yubico.webauthn.data.PublicKeyCredentialParameters#ML_DSA_65 ML_DSA_65} + *
  • {@link com.yubico.webauthn.data.PublicKeyCredentialParameters#ML_DSA_87 ML_DSA_87} * * * @since 0.2.0 @@ -234,7 +237,10 @@ public class RelyingParty { PublicKeyCredentialParameters.Ed448, PublicKeyCredentialParameters.RS256, PublicKeyCredentialParameters.RS384, - PublicKeyCredentialParameters.RS512)); + PublicKeyCredentialParameters.RS512, + PublicKeyCredentialParameters.ML_DSA_44, + PublicKeyCredentialParameters.ML_DSA_65, + PublicKeyCredentialParameters.ML_DSA_87)); /** * If true, the origin matching rule is relaxed to allow any port number. @@ -448,6 +454,18 @@ static List filterAvailableAlgorithms( KeyFactory.getInstance("RSA"); break; + case ML_DSA_44: + KeyFactory.getInstance("ML-DSA-44"); + break; + + case ML_DSA_65: + KeyFactory.getInstance("ML-DSA-65"); + break; + + case ML_DSA_87: + KeyFactory.getInstance("ML-DSA-87"); + break; + default: log.warn( "Unknown algorithm: {}. Please file a bug report.", param.getAlg()); diff --git a/webauthn-server-core/src/main/java/com/yubico/webauthn/RelyingPartyV2.java b/webauthn-server-core/src/main/java/com/yubico/webauthn/RelyingPartyV2.java index ded75539d..c6ca119ad 100644 --- a/webauthn-server-core/src/main/java/com/yubico/webauthn/RelyingPartyV2.java +++ b/webauthn-server-core/src/main/java/com/yubico/webauthn/RelyingPartyV2.java @@ -230,6 +230,9 @@ public class RelyingPartyV2 { *
  • {@link PublicKeyCredentialParameters#RS256 RS256} *
  • {@link PublicKeyCredentialParameters#RS384 RS384} *
  • {@link PublicKeyCredentialParameters#RS512 RS512} + *
  • {@link PublicKeyCredentialParameters#ML_DSA_44 ML_DSA_44} + *
  • {@link PublicKeyCredentialParameters#ML_DSA_65 ML_DSA_65} + *
  • {@link PublicKeyCredentialParameters#ML_DSA_87 ML_DSA_87} * * * @see PublicKeyCredentialCreationOptions#getAttestation() @@ -247,7 +250,10 @@ public class RelyingPartyV2 { PublicKeyCredentialParameters.Ed448, PublicKeyCredentialParameters.RS256, PublicKeyCredentialParameters.RS384, - PublicKeyCredentialParameters.RS512)); + PublicKeyCredentialParameters.RS512, + PublicKeyCredentialParameters.ML_DSA_44, + PublicKeyCredentialParameters.ML_DSA_65, + PublicKeyCredentialParameters.ML_DSA_87)); /** * If true, the origin matching rule is relaxed to allow any port number. diff --git a/webauthn-server-core/src/main/java/com/yubico/webauthn/WebAuthnCodecs.java b/webauthn-server-core/src/main/java/com/yubico/webauthn/WebAuthnCodecs.java index 735177ae1..70041f138 100644 --- a/webauthn-server-core/src/main/java/com/yubico/webauthn/WebAuthnCodecs.java +++ b/webauthn-server-core/src/main/java/com/yubico/webauthn/WebAuthnCodecs.java @@ -89,6 +89,69 @@ final class WebAuthnCodecs { 113 }); + static final ByteArray ML_DSA_44_ALG_ID = + new ByteArray( + new byte[] { + // SEQUENCE (11 bytes) + 0x30, + 0x0B, + // OID (9 bytes) + 0x06, + 0x09, + // OID 2.16.840.1.101.3.4.3.17 + 0x60, + (byte) 0x86, + 0x48, + 0x01, + 0x65, + 0x03, + 0x04, + 0x03, + 0x11 + }); + + static final ByteArray ML_DSA_65_ALG_ID = + new ByteArray( + new byte[] { + // SEQUENCE (11 bytes) + 0x30, + 0x0B, + // OID (9 bytes) + 0x06, + 0x09, + // OID 2.16.840.1.101.3.4.3.18 + 0x60, + (byte) 0x86, + 0x48, + 0x01, + 0x65, + 0x03, + 0x04, + 0x03, + 0x12 + }); + + static final ByteArray ML_DSA_87_ALG_ID = + new ByteArray( + new byte[] { + // SEQUENCE (11 bytes) + 0x30, + 0x0B, + // OID (9 bytes) + 0x06, + 0x09, + // OID 2.16.840.1.101.3.4.3.19 + 0x60, + (byte) 0x86, + 0x48, + 0x01, + 0x65, + 0x03, + 0x04, + 0x03, + 0x13 + }); + // See: https://www.iana.org/assignments/cose/cose.xhtml#elliptic-curves static final int COSE_CRV_P256 = 1; static final int COSE_CRV_P384 = 2; @@ -178,6 +241,8 @@ static PublicKey importCosePublicKey(ByteArray key) return importCoseEcdsaPublicKey(cose); case 3: return importCoseRsaPublicKey(cose); + case 7: + return importCoseMlDsaPublicKey(cose); default: throw new IllegalArgumentException("Unsupported key type: " + kty); } @@ -263,6 +328,36 @@ private static ByteArray coseCurveToEddsaAlgorithmOid(int curveId) { } } + private static PublicKey importCoseMlDsaPublicKey(CBORObject cose) + throws InvalidKeySpecException, NoSuchAlgorithmException { + final int alg = cose.get(CBORObject.FromObject(3)).AsInt32(); + final ByteArray algorithmId = mlDsaAlgorithmId(alg); + final byte[] rawKey = cose.get(CBORObject.FromObject(-1)).GetByteString(); + final byte[] x509Key = + BinaryUtil.encodeDerSequence( + algorithmId.getBytes(), BinaryUtil.encodeDerBitStringWithZeroUnused(rawKey)); + + KeyFactory kFact = + KeyFactory.getInstance( + getJavaAlgorithmName( + COSEAlgorithmIdentifier.fromId(alg) + .orElseThrow(() -> new IllegalArgumentException("Unknown algorithm: " + alg)))); + return kFact.generatePublic(new X509EncodedKeySpec(x509Key)); + } + + private static ByteArray mlDsaAlgorithmId(int alg) { + switch (alg) { + case -48: + return ML_DSA_44_ALG_ID; + case -49: + return ML_DSA_65_ALG_ID; + case -50: + return ML_DSA_87_ALG_ID; + default: + throw new IllegalArgumentException("Unsupported ML-DSA algorithm: " + alg); + } + } + static String getJavaAlgorithmName(COSEAlgorithmIdentifier alg) { switch (alg) { case EdDSA: @@ -284,6 +379,12 @@ static String getJavaAlgorithmName(COSEAlgorithmIdentifier alg) { return "SHA512withRSA"; case RS1: return "SHA1withRSA"; + case ML_DSA_44: + return "ML-DSA-44"; + case ML_DSA_65: + return "ML-DSA-65"; + case ML_DSA_87: + return "ML-DSA-87"; default: throw new IllegalArgumentException("Unknown algorithm: " + alg); } diff --git a/webauthn-server-core/src/main/java/com/yubico/webauthn/data/COSEAlgorithmIdentifier.java b/webauthn-server-core/src/main/java/com/yubico/webauthn/data/COSEAlgorithmIdentifier.java index 2b43fa59e..9d4cf1f5e 100644 --- a/webauthn-server-core/src/main/java/com/yubico/webauthn/data/COSEAlgorithmIdentifier.java +++ b/webauthn-server-core/src/main/java/com/yubico/webauthn/data/COSEAlgorithmIdentifier.java @@ -176,7 +176,40 @@ public enum COSEAlgorithmIdentifier { * @see COSE Algorithms * registry */ - RS1(-65535); + RS1(-65535), + + /** + * ML-DSA-44 as defined in NIST FIPS 204. + * + *

    Note: This algorithm requires a Java runtime that supports ML-DSA (Java 24 or later). + * + * @see COSE Algorithms + * registry + * @see RFC 9964 + */ + ML_DSA_44(-48), + + /** + * ML-DSA-65 as defined in NIST FIPS 204. + * + *

    Note: This algorithm requires a Java runtime that supports ML-DSA (Java 24 or later). + * + * @see COSE Algorithms + * registry + * @see RFC 9964 + */ + ML_DSA_65(-49), + + /** + * ML-DSA-87 as defined in NIST FIPS 204. + * + *

    Note: This algorithm requires a Java runtime that supports ML-DSA (Java 24 or later). + * + * @see COSE Algorithms + * registry + * @see RFC 9964 + */ + ML_DSA_87(-50); @JsonValue @Getter private final long id; diff --git a/webauthn-server-core/src/main/java/com/yubico/webauthn/data/PublicKeyCredentialCreationOptions.java b/webauthn-server-core/src/main/java/com/yubico/webauthn/data/PublicKeyCredentialCreationOptions.java index 8d8483e56..1206f56c6 100644 --- a/webauthn-server-core/src/main/java/com/yubico/webauthn/data/PublicKeyCredentialCreationOptions.java +++ b/webauthn-server-core/src/main/java/com/yubico/webauthn/data/PublicKeyCredentialCreationOptions.java @@ -543,6 +543,18 @@ private static List filterAvailableAlgorithms( KeyFactory.getInstance("RSA"); break; + case ML_DSA_44: + KeyFactory.getInstance("ML-DSA-44"); + break; + + case ML_DSA_65: + KeyFactory.getInstance("ML-DSA-65"); + break; + + case ML_DSA_87: + KeyFactory.getInstance("ML-DSA-87"); + break; + default: log.warn( "Unknown algorithm: {}. Please file a bug report.", param.getAlg()); @@ -593,6 +605,18 @@ private static List filterAvailableAlgorithms( Signature.getInstance("SHA1withRSA"); break; + case ML_DSA_44: + Signature.getInstance("ML-DSA-44"); + break; + + case ML_DSA_65: + Signature.getInstance("ML-DSA-65"); + break; + + case ML_DSA_87: + Signature.getInstance("ML-DSA-87"); + break; + default: log.warn( "Unknown algorithm: {}. Please file a bug report.", param.getAlg()); diff --git a/webauthn-server-core/src/main/java/com/yubico/webauthn/data/PublicKeyCredentialParameters.java b/webauthn-server-core/src/main/java/com/yubico/webauthn/data/PublicKeyCredentialParameters.java index 48c251fe3..a7dccd135 100644 --- a/webauthn-server-core/src/main/java/com/yubico/webauthn/data/PublicKeyCredentialParameters.java +++ b/webauthn-server-core/src/main/java/com/yubico/webauthn/data/PublicKeyCredentialParameters.java @@ -146,6 +146,33 @@ private PublicKeyCredentialParameters( public static final PublicKeyCredentialParameters RS512 = builder().alg(COSEAlgorithmIdentifier.RS512).build(); + /** + * Algorithm {@link COSEAlgorithmIdentifier#ML_DSA_44} and type {@link + * PublicKeyCredentialType#PUBLIC_KEY}. + * + *

    Note: This algorithm requires a Java runtime that supports ML-DSA (Java 24 or later). + */ + public static final PublicKeyCredentialParameters ML_DSA_44 = + builder().alg(COSEAlgorithmIdentifier.ML_DSA_44).build(); + + /** + * Algorithm {@link COSEAlgorithmIdentifier#ML_DSA_65} and type {@link + * PublicKeyCredentialType#PUBLIC_KEY}. + * + *

    Note: This algorithm requires a Java runtime that supports ML-DSA (Java 24 or later). + */ + public static final PublicKeyCredentialParameters ML_DSA_65 = + builder().alg(COSEAlgorithmIdentifier.ML_DSA_65).build(); + + /** + * Algorithm {@link COSEAlgorithmIdentifier#ML_DSA_87} and type {@link + * PublicKeyCredentialType#PUBLIC_KEY}. + * + *

    Note: This algorithm requires a Java runtime that supports ML-DSA (Java 24 or later). + */ + public static final PublicKeyCredentialParameters ML_DSA_87 = + builder().alg(COSEAlgorithmIdentifier.ML_DSA_87).build(); + public static PublicKeyCredentialParametersBuilder.MandatoryStages builder() { return new PublicKeyCredentialParametersBuilder.MandatoryStages(); } diff --git a/webauthn-server-core/src/test/scala/com/yubico/webauthn/RegistrationTestData.scala b/webauthn-server-core/src/test/scala/com/yubico/webauthn/RegistrationTestData.scala index 4d5e8b721..e2e9a4d5c 100644 --- a/webauthn-server-core/src/test/scala/com/yubico/webauthn/RegistrationTestData.scala +++ b/webauthn-server-core/src/test/scala/com/yubico/webauthn/RegistrationTestData.scala @@ -140,6 +140,9 @@ object RegistrationTestDataGenerator extends App { td.Packed.BasicAttestation, td.Packed.BasicAttestationEdDsa, td.Packed.BasicAttestationEd448, + td.Packed.BasicAttestationMlDsa44, + td.Packed.BasicAttestationMlDsa65, + td.Packed.BasicAttestationMlDsa87, td.Packed.BasicAttestationRsa, td.Packed.BasicAttestationRs384, td.Packed.BasicAttestationRs512, @@ -197,6 +200,15 @@ object RegistrationTestData { Tpm.ValidRs512, RealExamples.WindowsHelloTpm.asRegistrationTestData, RealExamples.ThinkpadTpm.asRegistrationTestData, + ) ++ ( + // ML-DSA is only available on JDK 24+ + if (Try(KeyFactory.getInstance("ML-DSA")).isSuccess) + List( + Packed.BasicAttestationMlDsa44, + Packed.BasicAttestationMlDsa65, + Packed.BasicAttestationMlDsa87, + ) + else List.empty ) object AndroidKey { @@ -471,6 +483,120 @@ object RegistrationTestData { ) } + lazy val BasicAttestationMlDsa44 + : RegistrationTestData = new RegistrationTestData( + alg = COSEAlgorithmIdentifier.ML_DSA_44, + attestationObject = + ByteArray.fromHex("a368617574684461746159058149960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97634100000539000102030405060708090a0b0c0d0e0f002067f0258315894a083edacb0fdbccc116b0dec2fb59f80ff610bfd5c9f7e74d0ea3010703382f20590520b84122d2a7a2dfb84a21e3b6870ef2e4c1d9ae1bd3d237dd62e9adee77f1d2ea81dee4c42fd05864c046cc8d1587b72b0b79a59101ac582bf2f448f425f74b437f6feb144852cc62f286a0016bcde6e340e5f68bfaaec38dbbc794bb35220e7fa361c01811468c38bfff8d53126cccaf6d8eca2ed76ca4dbdb300e2b78b930ae1093603027e271fdb30d42494954f196de0aa34fa669f7d19e3aafbf0d575e69c361a1c405d9cff120770f0f29734e9de84f41ba07e492cd6e7d7a953b33e7039b16c616bfb6808f1600c2c7b08a44f060aa2f618d92df2d786957d3df779e0b56cc5ff29c250a8e6c6ba9e0e1ab124017b67800e4a0fc1ddbf47efd8809c3aaba5b8cb76919187ab1c371f40889a856307c857bb88232d4599ca5df086547015282f09060b568286b79ef1b2cf7e7dc88f9a1ff49e080ef894a33f5d213f7e134509dd7ab90adf053e2cba7a508c3f9adba3abe6aad8c104c47a77550187c5bd7af64b21689d9a8451aa4c5ab8a477566ff4f1b173fb9198f64ea44e01994cfc1a0b0a1c7f4b83dc6f69bc5777755762797e4c4098b6d7476289a013af1c314ee40eaee7a21adccb76c8b9181f59a5fa63a899750a187c6913f05e0d134d247b7dd7a629b03ff2a952511786928766215cfc0a386ece427f915f85d10bddff4f5bcdcb5b847a4a4aa0675d27b705b278c8c0241fc4de60ed9b20fc5b1d7f8366ecb8c911208754c881fe85c72ff8c6656055bda1a67edabefd8288c4b3ae020f5218203cf79a1e08823bcd35cfd42dc56a4b36a02f6b830ce468ce854eb76f816ddecb39b6ed266e61d43413a5a73a1cb9d7fd0c1dff5ba97fe22900c608df59a4cf43c23dff54db09d50c878540defc31252addd3488cd954a275dedd5d22516a782d9990616478079347885bcfb971791081159031fbc7690c43b37fd17ee27fb902f1cf2149c9074bba509f1a78687a71bed9b8e60a5125037baa6b9bc51849fc2cda8abaa2ad02b89fb2633c4486721d67166c321ec0218e34e6664fe74d571d1b3fab2367569efa7290f79faa7074be61f43278c083ab3f3422cca0d6698f4459a1134b2f5f032ee83e27a625aec287517ee3fa5a175d4ecc1b717bd970ef8f56bff60820648da097d675ac5a78d6a52b26053f6d5f5c2b4a8d19505df48c8f3e9bd9a9b2ac3c5fa754e29a907867698bb5a4fb1afca557d3ffa5e9774a7c40ae42327b3d75fd2e2f726b2e1481e9c6004251355c9301ab1b23e9811fc281301d64ff8912cc8227edca5b77b5248ae14dbc6c9437259093f6feca0b0c0f2d5bdc226309e42e61dce05bb3c71ef96d65cbb827a9d8add9a8cfde1e5e20c42c51d4953589d7447951bcaf28de3dd026ea0c1eb006c3953c9090cc20abd2f8f5c566c51891e0bd26b224f25985c4eeaf8fa439ce1512c62aa3a39227c95bb392d35dc6dc55c3c0f9ff34dc7f33a4155724932bb5dfe52ac77eec1e6ab176464e814eb14fad1bd7bbe802d4e09573e68a57c00c00d9d553868e19f02499b3ad4a461fc170aaf6bcaf82ff867e027252ab0474c5c92e4a5365579d14901f7226d8c98703ddac3be33cda74c4f57ae32b527d6d49787b8e13528121f748afcc611dde4d6024476d37f978a63b9c13ca300f8b4da451adb2f9c878a90a3222c56efcf7695d33210250f5650409c5c2dcf923ccefd118e423ce95744d8579f982f6207d8c539c417f79400bb30ad146cc908a28783bb4eb64617fbdbe4bf0e14c248b8a19c5cb51def7436fdfeaa6f04bbef1f8f335bca0b34477604dfa3b924b618df9f9ea69c417b28d78539c9b2f5599db2712c830032bb64a5549e6377499b63666d74667061636b65646761747453746d74a363616c67382f63736967590974acd06bb6576c56ac952b2e93332d2160a2eb7f288d9602101cba7798b36d47d46bfe263e8b61b80abeca11de6112f1446994de9e70aa5c8475d45fee929a7aea5e3aa8d2d2ed92ffa6bfb7d5495657621e3db553349de9430b13435663dfb5ef94eafeb4c0f7c9ce5e9a5ec7dff7b4068b15a941d63aac0d9519228c0db5fd0a7c367dcc15dbf2ea44e8c4351c49cad510269ad71325dcdd634053e352a934b4f29fbbbec369582bdeab305e306bb8f5e40a9bb4a7c9adc143ea5be8b9a8c54a8ff3d4dfef95b067963633399e9c300fb23323ac653574652a6275f9796fbe9e1f1e1af5d2bf9f394cf6ae410247bef46f1c00bc855577fe6327d09262422c12b63b8a724603727f24c7e6d166f830edd2079a8d5089b48c7182cb60f7b3c3e790e7869321dc80c251edff9379c20712acf26f0377e44da8dc543096c1087d8e867fb46dc7e6527007af2176e769852a6de65c5c8d3791b9d1c4896fcb4cf7848cf387efb894e18016f4cfe1b641f67b52462b643a7a8a448e721db30308f059924aa82a3eb82616108da906a2db4affb11ebf16c5c43b664bb469c7688b82fcf0b7aed3cbf9579ce64a3aac3a883e7589a0e75586500b733584e1f7d90e0d58f6cab709d15b548dfcaa11482404a4127b07354ca03d6d7da93a31aa8fba47998dfc571c97ff13f12fba4335d887be9f1825ba7c48b0b84d930a7a972f8f545baa2b266b610533dedf5a87c0c4609e8ffa662a2a3980c314b050a896272b401266f79bd29436ffb3f9f2c26466c06a3a1de0c190aac0b6409132e211182d3c6f832ce3f892b75ff7e32fee4c8ec70d099d929dcc1d78ce183c5f33341b0223401031ffd78af22f7234e7ced821282540ba97b0e1b1225be3ace2f57454b6d28c88feb54651993c1af24528884e2e5c6ffb75a58dd5cbc99c5ef11230c71643aab3289ac86dac7bdbd9e84052df047aa977a9277b14d809119dc9a727cee39aa7131f8bda373f0a68055be995dabda06000e428efb06d74787421dbda26fbcb3b26c088e491432472b731bf15e6e1bfb9b56dff309ca607a9534690e1c1904669bfcb99183a4f8778678ad187210a3009a41bcd4d7a7743b9dfb2aaff27456f3e214dc59280f735368e2a8f26621556142da3ac56c620b51233a87c6e7378c72c5bd1cdc3341cf727106a1777a03734d5d2f47b2cdb0cb666b7d7c3171acc8c806e4070da4df7c5c7293b7a4ce2db01966f835dc699f27a059c15c42e6a9b47ae1889c7920901714f2b0f8179632e14af988ba160508c22a747f3fbc5e08637cdcc81a838160da83bc66cbeaf1466df83fdf56ee0fb3861a4f9c12a83024bd42d339b39a597488a9cf7b18a195fcd909111b2557e78f315b11289f7459bae36c245cb6422bf34cf23889e76983fe8723ed176dae56070a400771a8092401d0dbfc006d83a2b7ea0f3c82c151f667b32a8092bf2f32a695cbbf366f47b0d87854191af8b6e355a450c6b0337a727961fb6917cdb2ec32f1fe8151b2809083292d1146e82c77502aee401188f1978f1dff6f23418143467040df1058fbc2903fe8134f9c3f0588f9777004938797b3c86af393f362fc48d4b38b0b0b9e93b78731922fca9a9d2e4a35f78fe5ed2243c8789729202a95ceb311b7adc8d7f9ebbae8eb2c6620a2afbf4e6f6232d9a7d7ff865b85e8faaeb80323440092e4ea8bb6a287edbabc948a89707339617c127cc6aed72d086c498a378cd4d3f84dd0a1dc7c54068ffd8abc39a6945333ff39e2c0d035bab89fc2df6f4dae0a82bf246c5fb1ee01a6f539d9681fc2fa9dc613efe52441bd0ae0b7bc58b033210025f6e45d83542139af57526bf490e5eaa5b2968ac1361d3f3003f7d88620bcb340284fce0eab7a7e2bd5ca4280a48887adb40f1da47deaa6b37ff6bb5abb080ae9ec7568319f5933c2e606e9ccfc7afd7170420cc837002775b33c796f6a0dd8128201c62093780b664b9a4cc0f500d443157e99cc28bc70fe9af26fda16334c4835befcbaf332487b5057e84c99960f09d869c2178bc84b202b82bae1c1432f56274f76e60fc835040276c8fd10697d1a8dc6cb1e9774a06006a34176dbbf453915fe44f7475bcbef4788b6056347866b732d113a4db860d7285b8de3a33a84d5915c61e234a7ef798644a3aa5bf2e0d131c5263322dab190e11a0a3b8c7eb72652e5cd15e453d6d0161f3792362489a53680e6fdfe8d1fcefae49e48b55078a6965c811086d1d9cf2ec34899356c9195b84176bafb59dc569d4bfe345d718d8b824b8c883f2046689a408ff98b102f9cf8fe4236690259d2f1b926bb4201273832ca94731069243b7c52e97095d6caf6ca8d5aac8c01c6ee26195f3d9ba151ce0fcfda25e06b5863cd1b98afc4517b92ddd10d303547a41c096597d17573346c71104cfad3ad4454512a207a3fc17c883b8b26a9b0136d1d56a96104effcf0d5895ce754bfd715a15d301943a5e03df5d3fc8b3dd8eefb0c40644e6678d793b1026fa264ce66cdc07aba707425809bb1f00a373320abfdf2eca8e38862660dd2416a804de9af7e3c1105a9a08a5896e3b203ce581cee8bd55deda91c1577b6b686e0f96c534434fd35affb8c60c1aa655e79360122ccb51b0d9681c6b688265e2ad860fe02a95972c4803e862f81d399da31aed9c538b190866f95b558881f6b645dd2e940b3dd45b31d42a651a91b4712639d5b8e64d85f0f383aac4004c36cab0d75d2b43fb317253a154f60bc4d92434965f4815b55027f7fdd597c5be7ea84ade884a55095d4ff7fdc2375adecbcfe61f9ad634ddf963d436c2beb4810a6487bdade0270e1b13544e67c4a3e5f85c483edcc57f488f320b8f04e75f684c04ef91e9b30e445794ecfd76a41368561b4d63706fa05b7123ef0e3641eca38009bb61c9da259ac33f2cd436c1b266e9687a3e38fb97e77785997a3f29b1281e49b4bc7f97e05362d0459e4b0f4bfeff0566a3701d443a6330b27c16e9a233aac39d11e451368a8b6e1eb2473aa14590101949b954050f2f83592a12f92b37a739841d01aafac9c6f30af448fdf6606bb26d7c174aec5921c5f21c636dc066004587e20a2a4c5a1a3dea7a6b3e012c62a3b9bd7ff300bca1d473a90d88f5ae374f31c1588cf5c612b0f4affa7c2b6420d75705bce1bd658645b6a744bd0e1908e6adef21d91311c985c22630bf698afb39a9d4a4bbfe503bcb59e0cf0700d5ddb29ec007c1f614f5c17b810cc23655b0e3dc7d336fac4ee3ebe62b3e3dd2bd57bf8f9d7d5e06191b32333e404b4c87999ca6d8e4f0f12b465f787a8fa0a6a7a9afb5f3fb103136464c5d5f727679869495b2cde1f20d1a2453556062656b86b9bac0c9d2f7f9000000000000000000000000000000111f30416378356381590fcc30820fc83082063ea00302010202020a03300b060960864801650304031130673123302106035504030c1a59756269636f20576562417574686e20756e6974207465737473310f300d060355040a0c0659756269636f31223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b3009060355040613025345301e170d3138303930363137343230305a170d3138303931333137343230305a30673123302106035504030c1a59756269636f20576562417574686e20756e6974207465737473310f300d060355040a0c0659756269636f31223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b300906035504061302534530820532300b06096086480165030403110382052100a80ab668b399c1785009e8e602bd850463eda0f065547e4e095fe1d13d0a881741dadf2d3df553a65c0942285943cfcf68dda51edbbee64a14a1f829735f52d2ecc6bb77d7a4b74b6eac0ff972ce3e624a9f83b79923e6635d8b82c0738c48e906e7f37d82af03c119af83534469bf9140f87ed29455ef23201603d5483c37801014b3e7c3f1ac94e23c491a03ec01f4f7e6b5e7cc8088bdced0bb3834608d9d3e840948aada66fa2c9b8c87c405cb21e04fb41aba5e18880705c25aa2ea7db67a13cd45062b62f9a4839e83cb4901615526df85cbae06002fa296ac4f7f172629771d7eef3f9c420a35d98bf6a9bb658da82255f6abe8658fa1da24cd7603c3c1937b395ea5a8c6be4a02ec4a674ce0b9a55cd0c27032ed71eb7464fd714c6d01bbd811bc24639c736ace320d283c686befe11c9f8776434d57cc30f232cdf617436c00d9ef552efe4e7169906eb75ef8a426ab53cbd25eac09ef3a48eaea2d76eddb0b1de50f3d2d529ae9e542841fe7f39f6bee4c68cd713eb6a2b9ae8652f4a58a1f0a2de70d93e1c06527a52bdc12cdc51c3a301e16cfb5653068a51afdd66bef33bf5c42539f8e853656e83d30eec1c1765bffeafed2b83966afd62169cc2f6f9c7289aec6f603fa402797b20e8d14e5ad59096b73542fe9dce45f5265d8b2d7e24a8b5409243781f73fd9fdb9e260ad6e75946189569a629a64af4b1e599cb83a8d7bf634700de50ec57febda48c121e4df403049862eb3e061c3a71942fe0dfc59e2c0e3aed480d972b0b3dfec30bc75630c524e44458f3881174114d1ceed5231033b96f985c4a4af19c4d8166d064f3770f1083b668120d778fe9a04afc1e956721fceb03dc63370f60ac393c3817c27a672ba166aacb7d261e3f0ee7f60e16e08111f8337c019c03e7d6000f1de467082d80a1db5ca71a93ec5644d36b47c398f5f68be72aef217c409100a9fe32b13733b1b188f7e281081ed996721b86505a8b895dcb5868bb7140e536d926e521976aaaac1bbc5ee5d1e56745cdd4b13a45f68fbf174f760ceea0f6818efa26fb889ec77146a57aabf42739b0163dccb734a7683bbc408bf0b9e1a490c3d9aed7417a5d03ddeda282eb20029975b9990e546086f99c83c86e8a7fc6202e982b3a3b2bb2b3a0a8098624c68898b271b363538e607ead5d7eeed54e561be8eddd1abc4786a9f2ad10b8bdae6cacee48274a9caf8a67e27d52b19f559257914fb120fb2c14632bc8d60b1ea26e85f3078f6cdc8250bcc8edb86ba7be5e7874dc87009ac5bcdab069c3190b01b092ab72d22ac6b50ddec7d59b2334e4500e9a6087a92ec99d48b5de33909ce6b6ccc1024ba332233d2e358d2ee6be1fbe93c4b5f48b2ebe7c97bac58b54a6f543fd10feff0353112e084d5a3787bda3fed1c28dcec614e776de3a32ecf8aa1a0c2dd74f280597d55b8453027de6c284c90833f16393c6cddb280c4ce1ba19e43ede6af67f7099a85ebe4638f237b8c4c44c9770fdb9579b115245246d09067edfea8f830ac5bcd66b328646a774a4de217d081f14ad17d1643bd8e577dab0591f9673c2c9f684f0df4fcd32829aef28ead94c80e529fec01199e68b12ba9bea2cd8e4485119facca94f7f18156957467ef7c2ba3143b5c85a22dc58abe6b8cf150170d40fdb59ed23a9aafa69bc9fb579ce28811776f7c9e816a6db8349415c5b868271674408ce8ec557e7bd15e6372c963f602b73dc4c8cd108509631948c1fdd8c6930f3894d508c5cb98b0980745a3da057b92f4cf24224d551f333e176061b47119f84a8325f2eb3fc174baa5fc467407dcaf491545ef6a770fc479b6c64b300b0609608648016503040311038209750044ed1d54a312b40a70b8008bfc12412cebe482576f22c8931309a36700c648d6553a49d898d63a69d1497f2a7b588a97dd28381ad5d7de34937e5a29450b08b0f1474b18c66cdb149bb023ce878faff32872f06a871f13bf8054a98b9ae1b291a1af90dfc77353fd5b37cfda56a5bdfc3ce4ffce7c0928be412f1ade8e7d10d830264350a2e2b9194ba86b5fbbea9e36e764a2d188b34ba2fc55db84e51ba5aaff9a8e0e89074f04a0801d1384776d8db7288f977114599afbb1a9dbf51eefa8976b0cdf6eed9a64d887129c4b53f68bb09342848d2d76993e91496307ec95981be8dc88ed7ee7b5625546173e2df418f025a9184afcff6a05013df1e56f543656eeffde24253f336f9bc9b8fadcd918e28e3d53ed63dc864687e120dc7591c6ed86c1566b34922bdd7b2191f487dbf034613ebf984101ffe18837421ae3ade21b29a6604f3cdb56a0b6c2786c360c5558b574bf0ee7bd03d185fb06128cfee1bf8db6752c90b2bb946952f95433da3f375d5526b658519e0babf80aa3c168c8a1df482513dd15c17c7407501a972d04349140b00dab7116b15a54a918ee072d8d1fbdbdfe281fa00b1ecb5fdee64319e1f18825a2f8202cc67c9d64937c7f604c973237a15f1a772f9f2836f189099f869d3c3419efbe5f4a83aece6ddc6f43bbb3f65bcb1d61e6d846452a42c7fc4f7a4b7c6b5b6b0fa2964af7f216e2fc0cd29266aa25ac788c633ffbfcb77bb583d184a2901cecba3abc78c6982bf32b93522d208206a7f19170e1a666b78cdd6ccb0468d1c3397661742f2573196576f9ee00820beb0889ef80b9741ab3cd3008d91c237d232fd0636337f8f91a8804f486bdbe700484bafaa97a7c2c96949561eb4948a7eef1f85a209b151c40a3d9fb241954f6e9709b2dcaf62bd9f71009fc82ae256087b115a628b62fd88913342a517d41ca91f48f28732445f3f9b244f80701046178f7002f037340c4e34c70f53297aad760f909564c34bcb82b2f14161e1469127a1c936f435ab4f88336f449f891afe7d83e5334d190bfa30c572b2ee9e67b3ac1523b39d08a968c6cb09a8ff0b3dcdbdc5b967d2e0e9e59fde00d57fef63b6c933c2287e46416b3dad509ba23a699129e36baf0705fec9d3ac95fc311f3fdb6e615fdd3e6b7776e9396552f8990398c075c881f4915378990cfad2ff667e115e6726b928bb0a71418b211219adcff3f1d6a99b8cddf538e90e9c5f6b4c4856ca77e0e0b2a11c0a7e3797f8eab4a09e1c575b7f635819ab9ed9a8818f19fad361543a546ac7b91c47fcac22bf8e2eb10b7c0f8f699283138dc7b588d0d0bd87f2ea07827462fdc75316f1294475374fc511085d7e8286a563dd577f063eeeb03119079aa7c49c9b02f719114fe48b1465e6291cb3b18318fded4f98b427b4a1afb262164e198dc87c6af0d1406dff2a5f021a4035054bd7b6e289776c65c84b409dda6c04bed5b1c0beb6e6aca226af93549defe077355228cd32039aa4df212848a333bf091961c1c47720e3a37a0f77df01d617bda48eff341be74ebb78de4c990b52d4fb906b0592008cc9602c3367f8edf1cd2e587574c4079a0a3b4ad42dc423a26e4bf207e3ad76b1cc49f6137101f97c8b016c03c0bb012ad8f2180624931b10f452f2449d9ffea911a9f69f94833a6d1f9040a6f9acc85cb9acab644a6a8e7b2395794ac2ca8fdf30ebdd6bbfab0df5549a6f9d349c51b1cf09f9dbe53a20513ace9b7d91d1fe2fe105541fe5fe963901b417576abd8e7ea8e673018deac054025ff251ab0540cb4e296cca110825b244553b79e0e50383d7602da14b120b2524d5f6d915a5a77af2f5c155a8129e936c1bc4915fd08f16f05cfc0b22608da8ce0640eaf13929863a8816f7c95d2d54fcec52062194d2eac7ac6195af9aa916bf06ac91548b458342571494eb71353ebbd8ea5cb94f57824af0c3754dded51d55dcc0c573a5104b82deb85bac688e3d84e5df681decb6e2a05a1719ed66b8e83b06cbbee96ef3b39035bf1c3e049fd5dd0acb37c078ac2c369de6f0d10bfd9440022cc8730c21e69df8322dec54e794fc280e3b0df0b37b357203269ea8b1feab53fd11e7eb42538c68dc2a36040baa8b11bc6efb8a83a546b4356298839be2cc5f9fb3555cf534369f3e99ac33dc720e19e538d338238ab19d08b25c8e376a93576593d2b93e09edde6fc0efc4089b95b7e481cdce05478546e43f50862663b521c6fc77a1090680136ca0f9a32dd6b6125eed0ebc3c1be73ac0face7ef14ec30d618047d1b766cf1886615a2e6333ad1da5c988621927dafc08aac1d8de0fc3940559f2399fc7b48f9068bcbeb3c043951023b7c5d70027d9b0bdbb3178eb4e8594127e595b7d5d219e7967a64a6cc4a8a67eb7a970f68128cc034de3040e373e1e7ece5fb061feeeb6b33bff64340c882b8b26188a10f27ec42c2205cae002f45c56ceb49ac076c8f9df60d22a4ee0299701254f7094c3616c8b4a8844f09b30369f7cb8f8fca5f95fead8cf8f7338868ed051f8258dfe7eda9f7b3830acb7a145e2ab36d4981abf6e305f2b52fa9810519118ee5b94e38e31b9036aec29220f351776adcca520ed58f88c6215b1637d774927986b8126481ba448ad235c9ad730550e14b2f61c5c7225b9d40ff176fea3d6baeb0eeb23905c58bb83298c0b653977356409f005f27ded78fdb86554bd07143e63d684dc51d6330834f40df5ad32373773a7d0aa4c7571d6c63563bdd601c1291a79403c83dd2502e1ca6e5b8d74c407ec527ff95bf478bb0d4da5010ed522f1bb8c0e9a7d650838016cded6f7dd529edd938ee8d17347b46e06c6d597975ff29897ec16796eddb2580caf79c722d6c875fd4518b218c90baa28b05f0a3e53cb09410760caf434b419b4c33cc693fe96ed82192ca98655141c156d3d43d77c6e5bb0215ec439906e77905d3d3e7d0b1a57ba1b30deac9b0ae06d6a545cbe0f7913092ac4921b2df4a2154b189a616e18a69ac2e0bdd478589d2b1b0c0f75484decc27091ade974622eb6576d52b35709420568a1a00a9bd5d91ef38b151bff1f3192c93bc138f2227703cdb67473a92edaff7bc4328be56993b9ff3d3611767f32f5ab41958a61ca4544e0bf22dbaf0ea6f5e6a3670b66cca80ceaa20e43db7ec52ab14f8b95684721e5c65db9a11fede3a1abfe8d5c6e708cdba68f9d46fceb79d1843e19bfe4dcd438035082d5b7cb04fdd00dff11208ee05aa4f8c2cd11729ae95a0ecacebdb03e7b1dfe2c179730ecde9770e151a1e21252b383e42494c5153546e787a898dc2cbd4dae700152b2f313e466e75d1e4ed03051318282b5f646b8889999ea3a8cfd8e6f6f9fbfcff01222e51585b70a6b3bbbdc0c6d1dbebec00000019253c4d"), + clientDataJson = """{"challenge":"AAEBAgMFCA0VIjdZEGl5Yls","origin":"https://localhost","type":"webauthn.create","tokenBinding":{"status":"supported"}}""", + privateKey = Some( + ByteArray.fromHex("30820a18020100300b060960864801650304031104820a0404820a00b84122d2a7a2dfb84a21e3b6870ef2e4c1d9ae1bd3d237dd62e9adee77f1d2eae4476270ef3505d2308645229352673a9a1f183aa9769e95754ff07c4ee0d35e03bb57d3413e7c910fccec3dcc2edd1b530eb10961e41e77383d7f174ce546a89a0d9b23efc18636471361e73e69a3089e6282cd1a339e76ffb918b8be96592899264e4c364264104e8a9448429451190602222986191911da126113b650811025d1842893b02d08a464621431c8068e1c3532412292204171d14448d8846c02a02004432cca92905cb681e0c2884b328840960c24269244362011102542484c4a348c0a946181240081360612029062884d144830d80292a1c681241350902404898869e0089264226a9938411412884192411ab94c5938818a364ac322415c386c82b6510b360e99143124b79081240d92268ed0047243208294a22c19048181360d4ca40941142e18b2718ac0902242049490489192401c335241848182440493968404298e54b02502951188c6290b424d13060ae2c66da4222103308a538645a1464c53c6310b3985e09011019251022422c0348d0187440ac77020a56801126eca0412621270e218890bc0910c172e922030029048d8803021812902b668a0065042301118c780a320529a1441d848508b884894c6294318698c2452048684494025429001539251181160431868a43864513212c1a80d0802865c3466484050e00866e2180224442c1b4024a4b250110104408420013285042730cc06115bc20101b70942a04d5942104318225a9470c8163089402920248ca03085da16511a814c1a0632d2b84c59a001e2380660427062844d8c4401d09284e0800113404a1105604410262439709a946d222945c1b64448209050200d1c438d8cb0090486094a446ae202669bc210d04068a346050b494960120d11c6001b268a51985123c2008a4010d0c4080235211b1812e0b48d91100c2349600b368e1922695122850c192908b01019b44910a16422152a89a6011841110c420948b08d08162164142549b250c822049886714bc2281b8111dc346d11498043066263044ae0488262180dd118849a8620934272a3087143320e0b937191b444db988480442903c7658b966d89842188c60c8a209023c10410b8242406042433014c348a0c863189324248922424470919c6651414910845714c4041c0144e512441d9006acc0605dc4042e0a20d2420410b858850088e1bc94051a46da212810aa7889c8244ea1c1bb28dc674cfd92da842824a3adc127535c6910de13372a819a63fcdfa6555e035d20c2a4140373b6111c3f176caabaf613225744a85e0c67ae1024821748ad0fadbcd8e5c29fbf7fa7087a0cb7ddd5d082ae1d654deb83d480d49a3e0d5f62da02b6dad83e713f07e856080558119dfb4cdf6ea23b5cf1fa0d23bca5d06835060ae98dce3b5986941cd327f5b44faf068d351a740fd746d130734227420ac4fb54aa188d32a0ef39a0690810ff8f2999f6cab76717c70983a17677ad83e14981c6581731b78a4b43fd28d4739aed11aa61614dc8d757f52cf0c258ab641ff411cdc6bb13294f65826c7ea527d8b211a45f1ba4bab32196c091c666794fbdfcea0b3aa99a4e21afd964748c64f602328ca617aea27680e7fdb72db9d215207b523e33c7a1e6980c9376ba36cbd30859498a50752861c477bb7301b2aec69c061f9e4bf471f52c4526b44e42315eff160361022eeaff24aa4ffe5e15fa25ec63349ce7e8ab828e194e1688c619e94779064878a58e213c59f71210c512285ccc472647e6f105da83255f8a8a87b9f1220e69633a10cb9c174cee646264fedd3011408b58b8c4148461e1c9dea990e450d7e3d07ca5386b8cf7a06fdb3380112de2d36ee02c3d70b15ee63f310097356bd2e6a4ed217dddb21d1246ebb880534d7b3a702a4931718989922a79686a584ae06c4801f46f528a94432efc67a025d68fb996da86650d3265579af4b7e7555dd0560601a2ffb2dac2d492a53ea5b3863c78751e8e1aa924bf72ecbd1353294a468ec21b5870ec3c5e0f8848379426b04610433f4ce87b3eabda810e4a3e7de7e2c6a22d25326b827bc62cff846474e1c7b70f730e04c59a12bc338eaf78aeb6b5c265fb2af756ec9a075c3d878a744401c27efd507a8739454b2df25c406bce9169b4075559543a865ad2f9a7be4cc508a0bdac0f451793af32fb4cfec51b0774b5a2be1b6c0bf4eec5ee9409b577d70c935d8e55ac603232afd261159000a5cc493447f2aa899ae67674361b33f16a2d1b447eff272b27deab037bb0e463a828429161e6730eeca6db8a5d2592ad886df33d49161286493d1b9d7422673a24ffd66f1bc3fae83197a902bb475d81fed704ca7cfda0fa9e88612e7423f05e6ead96d08d1fbbc5cc7696b33b55a03bf0a9bc0279b76f89def7c8abff04c7a6e150cf2cd773ac025668634b69b083c98f9d9ab20d6386d614b6fe7c0269e15aba21090a92c0080641ea7401a3cec75801e5ad2b07bf57c48511533725045616d5a9e2b75ae45dcac007a432490fb0305621b1926a730b614e26906d9ad98ed87bef8b202cfd0497ddb5ef57c5dacb44c4d5ca713e7361f73043de8482db815bd5eefd0198e68cd85d9db3a946c6c8835e0cdf31cc2af6c2b7528acff2d9683b2db7eb32d6570a10624f4bf9ffab63450aa361abaf2d079049032d5456e39bc4d57f13c2bab957c0d9c6571f3f0b2d73ec97c3a21451a00cef287b6e9d005081f3bf4639a858b2572e00ab5c9269d34f34b8f999893175a938ebabe1290d93ecccb4e967ccd72ed35707e0e95a8fe3efc9ab48c57311cf07bdd3644ab4d88ae90b05512a186fd2ca8b4f3cda2a78e3ae4205c0892824ce176049d010b925bb94a1c4ae248e3ca9abe1bfd026c89022e202133450cdca632065ac4928256f8f24692ec5b7f954fcb17c7e0ceb3140122272bf27dd2fdbc33584a61b424122d6fbb792a542f7783184e497c80d96d7c9ee17beec4c789d3ff19de4264ca11ca1bfecbcf356b13c60f322cd63c67c36b46ef2da6d6a385c2e246c72b24cf4c9ca59b952e6cbc69d67543e325344e21494e7add3f64b727743a912292ed864957504e99ecec36f4754e89bb9c0877f9fec833047df4d6653ecddf618b2b64314c3e9e3c8318b7a8df3ef18f9401c8fb2db44ebb6dc757a60f5071cb5effc0c0fdc786f0ff1dd4e896b82031127c26ddbfdf2ebf7e81e49db4e52b0a0b056e87cfea8f98078cc54b725eb9427b07b6a73650f5d5e307a51c0857ce9ca2895912cb9f335fdbee4e3a1060cd09ca20ba4db6c7794e1c77f8c9a11a9ccdb4bf5b10e584dd45d63da6d6bfde724776e60067426073c6c22d8fc9853f1a509780255d2c65c0f0eed1a8045b0cead2121e30112106e69f667f3483003e63e7dedfb12d5fffe6d3bbfee0b1b905dd364ff36332babeef8254a4b13ceb3dde18f704e651fcb966f25f935b70444687880223d660c596905cf6423a800eb2fa774f27872d816e3589886bc1623c8d011a2d382c1956745c5d773c10b327f46dbebb574a4af63bd95130f888230aee8909648121691cd5") + ), + attestationCertChain = List( + RegistrationTestDataGenerator.importAttestationCa( + "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", + "ML-DSA", + "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", + ) + ), + assertion = Some( + AssertionTestData( + request = JacksonCodecs + .json() + .readValue( + """{"publicKeyCredentialRequestOptions":{"challenge":"N3LjI2J5ylyWe3ED5OT4XHLRqHwm_J48_D_hoJOFf30","hints":[],"userVerification":"preferred","extensions":{}},"username":"test@test.org"}""", + classOf[AssertionRequest], + ), + response = + PublicKeyCredential.parseAssertionResponseJson("""{"id":"Z_AlgxWJSgg-2ssP28zBFrDewvtZ-A_2EL_VyffnTQ4","response":{"authenticatorData":"SZYN5YgOjGh0NBcPZHZgW4_krrmihjLHmVzzuoMdl2MBAAAFOQ","clientDataJSON":"eyJjaGFsbGVuZ2UiOiJOM0xqSTJKNXlseVdlM0VENU9UNFhITFJxSHdtX0o0OF9EX2hvSk9GZjMwIiwib3JpZ2luIjoiaHR0cHM6Ly9sb2NhbGhvc3QiLCJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwidG9rZW5CaW5kaW5nIjp7InN0YXR1cyI6InN1cHBvcnRlZCJ9fQ","signature":"5CdBlXujQ5Hsd1IyPIwu5BXj0M1NgQqn1VtYsreRx6kR5dcTIcTk9ZAyzVzdofNeqlmCBA9SGlrOJp21xMK0vmhOiqM_7DNcu0gq7SCa18VoierJnbbp-r_cN6SLEYn_xlOFhAH48TKBPj9bKJ6hTGsCRB7uwbk3WZ8aaW37D3ntzVIAuq9M6T97tai1xx8K9WdwCqsktvX7ZLO5O0d8nTZ6qeHGBUPq63lyUoMhtMguxhuFkhieu-BMSF0sz81Z_fJXJuWnnGwrkC1uvjPTfJGfpVygu3_RJ3hX8ohaFVoQNHoTWjpqcNzpCedLHWXTfkrSa5UYgAeYtoqpqCIYEkFmnjAsjtchuV_mndlYitCGktEz0T8pFDQxSSZokZqHWeLbrFYzuDCahnAukGNgWKVxUi7wZsfxwv7GWO1ba0SMf_WptYhvHhQ706NGx2frKYqEHgaaOXZ_I7vE2dhja8XuGOFPv8Isf2ZEPwS75mKRAkA2sgVgHYPaJCS4VBjlrrTNqe-B0A1yV-B019n_-m2WzZ8_SIRPTHk62KqnUQuaoOT9OdxjGj3-G59hmbzVUWywRTFRka6CTG5ktxXnJkToq0SQXvukjCh0UUQ6PhKP0g1i49AL3JnMQREloSq9fk6bibFhibNvrkcEq1sXw-_jk9nQbjRkvni9L0Hhml1R6dil5E0hsan7gO86hmO8Fr3IBclZk2b5gGeW9C2xobthXaM3gn0zJg_xoLhU6cA22eSV8bBegiJlR95swYJO0ex9dCqfPFHsI8bHzREqqJxh0HbjZlV2qmL5A7cBIrU_8QW4sSRFc7DNFAwSFxe3n9dSs1MepJChcYz-GcUmUanANOTDILBMM4KrQrXq9qqP9GYTSJLBkfhUT4jOMcgtKSKn4_s-q_iOnF7Xi-VvEytyd7U1NAVg1tgtYP1FqNCv6DXrnzQuGLs8vmzeM2RAyZfJuzH2CfJQFot7MCo2cFDtk5u4pQ9FKFtR-GX0VByUxaFZCJensve4edtksOZPfTrHmYtJMMXoafp3mdtfqeR1m9I5uH6mXn6eZ6acHW-lEakXDhLT8ayaK9h8aqOiGnQfHfCoyRXEy4tWvyluRQRPwsPitudHxhgzGXcyDRc4zZ-0nwrAjx977aEPOopQKa9PDuyNGZTtJFfWjOtVPSNjbvC9lGc2NEZAKEiuyfNtw7gbP8TcQ4ewpeBLOItmaM7HlEcJ8K1Hty0MRrq9HaFVuOd3IOvBhJgsuv2LXrMq4Gq3nFFN2cgPNTg9TaQgzQcFUNrDT63vvD_ew6-iqmVPFjUCCG2FyekHZLmngZxhCIwGqDS9N-7Wx5WIBhpz5SNXXhVSj6axxPElRGqyWGpAScKg-1ecYNs0LVSoP5TkpQxqDq9drZv2rzTiTkgMHPcLtcbB1Exw1k4cBUUfSdm0M740LvQ9jw20YcjV_rGrJX83hnFQa6dYwOE6rGmqTcYvtiwUHsHss6KeSOF9C8UzUQDsTm8ZDgqgVYBQlHXGYg3kepDzZcV7tX4JPOPtnsXfh661mb3WSDAgNMy_CV04Yr7riEIZrk1_1J4Ip6GwL_zkpDYG0hyC9lXNL3stbMc7eDgXlNHBW403njTJaPoGzaj8RtHsR2Fg4mEYdY42KAUt7pzCbFGnCcb8IBQAsYsmgff5jci1HTWvL9304asTLp2-AkKXvtrlHYCU9Sr3mcohU1svKeIWtNZPGtdSIDLE7tKkZoSiGUwHKFYNHEjwufI5jnAeW4Ui48evlLCh2yEztF2B2q3tSJFzjRnrmJPSjKg63k3xYim7O7iGk6Pjh343_L5rXSPvixtZSfbOEgE-SnCR_xc9RoiJzpDvjxyCKmxC77KgK6-4CRkSHKUxwFY2eBNlFRi-i5gf2pabi8DgCnHmxP_Lrb9qqpayILHRWLGz2ZrGLd_9qCJa-9cBs6Wsy9EfrVB3a5VyGPFhDHleNhSk9XeFOtQLkQ_O8QOHePXSF3J8CLL5XSQCrrqPKXjmGkOsr_JiHFvV2ngoYYi0icIuSBVyOAs5RLr-T7VRfDnAkCzb_kyn0euw_PcBuns6HVX8U9L-SWoXO84AnWJT6puGECEx0FxLI2-rQAleStRN_cZCj-KtCOE7LaugMMesdESlkt_aJnEEl_91k5neOARr08GQaAIsoG6IoJ0rfPIOYb4q1tDHuxEpxVCUUK2mILcUA8KC9PZIkV4GHYoa8ayOIDI7b1zX8GXFyRg8fF1a0L6bRlduwCWRDWH_A-lEEakmLS9QHpE3TCqChkLe0V6OSQQsQqeW-SCpV1oD-rZIrRNnAx9kugmUUZ4si1Wo-mpobiPXn2BGicn6W9B6o20JNpB1xNinHzCkcYNdgFxS9K2U4xrATd1VsbVKlnauSqljVmwG3Zq2zbdH292b3SvSg4rx3KMfCqNsX9JD30ksIhXmv5UDc9XI5tPxCkrY30qM_2U8gvlHtqUIsXyNScxtXgg8_WedzwMyxBj7q2kjdxY5NaElrweV91ClEXJ-kk-SuyHBLlZn1BxkAJyDlEVGFUZXcH8uEFPedDe0HFT9zVJVvLm7s86WYqyI5lWUfeDCgX3Qdm4cgQsed4_tCf9TCgjOpQX9vLHWd0TAVdqtFKCSoPKcBMCg71SFXMRTnAHtXkZRGoHodXht9S9fcSxpURSEjOjowyZrR8O0Ru-M7KQ7OZygagkIkCVi8IGPid-d2j7awRDa7b3cET4AqMtlBCRoKJ9tWqE_dtpd1HMqT4pWV6pvwQ-PpaF2YNKNjqZRH1QiaPS6vzzzoxLwtET94Z9A6hgRL_-fu2DKn1xng5-A9UIxqG1J9NQGNt72aCHu9QJdXbeeF2NiwwfIHstLtTmtFDvLQly2QQ-EPTF0bUVLD3tK3PiAwapJfPgL_eVvdy7CkVQHbdNf0RntHQE_r4aEx7PGiyiqeEgjyJ8ucW1_dNLXrnEDEU_q4YwFzGiH7Db88jis6aoMJRd30KR8s0bKEmTQSrwdhz2Pw96hjvCSIW87TWVXj6FhNVbskKtRYabgUWhRo8txCBTaiisu2WkVueV_RMQb9tyA5eEJr_vj3g-1BSYCGvrq-6pZ1xfbwgbsJMb8RiAPGUV8mq-02vUODxMYHyMmJ1tudoKYpaqvu9sAAxoeISIyUGVzdHuGk5WXmZ_Aw-vt9QUhKzdBY218rrrO2uL1AAAAAAAAAAAAAAAAAAAAAAkbMkA"},"clientExtensionResults":{},"type":"public-key"}"""), + ) + ), + ) { + override def regenerate() = + TestAuthenticator.createBasicAttestedCredential( + keyAlgorithm = COSEAlgorithmIdentifier.ML_DSA_44, + attestationMaker = AttestationMaker.packed( + AttestationSigner.selfsigned(COSEAlgorithmIdentifier.ML_DSA_44) + ), + ) + } + + lazy val BasicAttestationMlDsa65 + : RegistrationTestData = new RegistrationTestData( + alg = COSEAlgorithmIdentifier.ML_DSA_65, + attestationObject = + ByteArray.fromHex("a368617574684461746159080149960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97634100000539000102030405060708090a0b0c0d0e0f0020f8c1d13c14d6b6cd9de9cfe7470c65ce7e193ec584ab80e30a2cfa04dcac79c9a30107033830205907a04c1661dbe48a1e08036388935c3ea62d1e9a3063b7815348abc24ef3be3a69c68befc0815388bdaa25b32fc99ce15afc6d57a0a60c147e2c0726d28a9b309d082129fbfcf4436997b52a9262d667f86c4977fb804480646054fcc2a58ae96f0af50f5b83f92b37ee1b56080cc65b74086291c0324aca2ee18cb5ed780639cc282492bc8e677e803ffd7b1fbb304147f90aebde6a4af78d6ec2bac6e6bf670fd77e1902c091c8e51a675eae479a6122dacdca7306c5401d41a216949cfaa28b466dd62f780cab362d75d65decb2f8217fd8082b95575be22a2ee2e159d1fa9c2226aee18a6f72d4d4f4d264465e378cb7df8ccc00feb23a36ce8dbfc1797ed1eaff7591787b520006a09feabbd535a7233df86c3a8c9c6cdf91e2bca0675b753ecb77600d8e26af9c1d00bd8dd8a47f614e87e0a3b15b63a04890d23f9aefd77cecd309eb3f84cc41c399018465c01cf72cec16072e35ec511e898609bdda8fe997b9b2c8faaea5bb19577dc82737b5a613997a4e1e9fd91f0a3312f1e94d4781b27cd349384d40334bf2c1bd1050e472c91e12930cc412cf4210c7fcbee87276ba09efb078e30dbb5b76a412a6c82b93b11065e401bdb0ed6753d28bd042dff5b4ff45361f67824c4bb9f80012bdc04ea8bff18c3c0aedc4b1125e388d89d451d7843160399288b45b01599eccd2cef8961cef6f94c9e950c75605f8fb56a8581a0cfea54ee3a25f3e50c6a9b4ce78a1e0f7e966c7927f9c08d334aa4b0cd0b9126d1c7410f0fb7bdb0291adb2ae21724cc4b9ca65bfc90f04f96de6566f9437865d9038c12f8528c4e788f491762ae413013246accc074da7b2c6834ea11676164faa7be123d3955333ddd66629e2fdab0ea2a0b32517bdfa13bf270cb67c2d787463f7da2565a52e1f5d4b7c2a84eccc29777881c8d715eb6179410aef30464ea1f7a6d92795c25578356278cf099e817a260d40b0cd2e8764895b6be9eeff04e21233cd1484e9d454d7dd2906f1f01f1e2770013b9bc872f99db93cf0522f93025c03cd9cd3ce0e40850428e4bb2174a4e50793bbd6807695144801e97180df2a7809b584e16aa45bafdf6a94d7314ecf17db74e65f5297ed036f3ee0599569b5042ae443110c484bb42f492a9c0621ecd50e8d00d2635a5fe27ebe40526253dd01c2eb56f71d234e4cd3adf6e9352d19f4f19285e1eb1b6ed8dce78c32ce401226f043e71ac1f6805e4a240aefe06f600660bc4013c0c44f5c0e9e149050258966a9a81af11e8e6af041d79c6310a96594c10cb9a1d5fd7ee94d0d692d7ebffb1d4801a118ee04b4789a131ed908431ad8ad7647741f686dd411db5546dfabe5543aec257757a1d16675b0243850a5ccf52aab7975c271164f2f15078836fe2dc865b647eb4dfb2cf104fb032cb45d4f48bb9f4d1a31a6ac337f381576dfcbfa0660accc29a0fb6199dc5ba0b237020e7814762c9fe95605dc3fdc1e89c3218fc60ea606036295a855a2f35c1e6ec82462c36f21134beea46cdd64f1650b1df0e25a1b26a881aa7e196f3e0d63ca8459c358ec197c49e6f5d7ba6f9c21de9eba0d28264e9755b7915994184be7017c9cdb9b4fdc283e13242ec995966a4db99a738a05ecd5e4d78b7db9c65d6a48bc193288d845505839fb56c9786432398ec891ebba82fb8e3b6f23597c0b4ca76fe212fcd1a3b8a5dea9c136fc3ad784cd8c7483293b68b1dea4fd2c54f4e7763371e5bbdc28253ba19d96947905c25d8bede7dad735ae3820c7c16de8b5dbc639ec63e0e4ec26b8553298193febccfc7d0ff4af65d690acf7d943e2f65bd391137188c66bc6e34ba94bc3ed95fd5339ade078b31d802f9836ccee9aef44b308505390d521fa7693c649dce9e6489be9d6294a4f59a941b70a3bc8b70f0f5d866eb7b1485f6b44c4af2d0093c74172086b03dc1b8bf27d52e6784c8fbfdc1f526c71b98099fe73ffc7cb9dfda6ce3f82b8d3edff9edeec7fc286646dc0c853392362486c81f41dbd970f447b7f8adeae06dab11dfd543d9aeaa7ec8352770935d668bac3e3216190be24ea3335122345a99d47dcafe00e591b4bd2871c1876e3da0e0e276ec0b22b060e8eeaf16d608a2603d3718591bb632741f000f6045b532c2346143f5c6c7473e9368aa98b790136ee533fa479fe6c4021bc826c36915ca7046574b0bf12e7a02536f2bdb2c93fc07eeb7ddb1bc44a713a2a31403674991edc699237c973f9648cfb747bf41a7b55b7f1c870bfc7474ad70e6a15aed17cbfd4eee359d3d47089a48841f2e19be69d06683aebe4ea386c744672229767bb55118c872d350366dfbdf5991edc4ea4ec30143250fdbb2f7ca9dfde9186926c73922a02d3f6071ac4abc07356d0e3858a49d3556889a19c78f2927205b883f66c75ce9c22f73149d276f7c924c0f92b38130038c0108e249f142ec7eb9b379461f78e26c49dc3d07fb1406743c1edd9e1a8d9443acebb4e96a1dd1495a8543c72731b90c88ac193f7658a8301525c92397a70e5929f2dd2e9d3018e26eab8d2f3848dec97133dc0a1f1d9f1c303c03796a9778d3f5d7a0f89b4accfc195f076ae50b45bece934bd4acccff020457ec2baf17ac94688f5e56175523721938295dcf753f0e583af3b3ae84b472314dad9f84e16e47a877d48ecd9a09d3e201db1d436c05cf0c95a1e88d2c0a045d5b693718819d7d2a96cb19295f8b7e6b871a96bb9f81bd1812c81ae16fa334ada068d63666d74667061636b65646761747453746d74a363616c67383063736967590cedb764221857ffe5ccce6f7191e44932f0239921ce171a70b32617cd618ae1a07340b9c1054799f64afb56f75e4099aff15d548b4942dc3ab583cfa287d71253a55c6f5caf511e3dcc129a582e9c3423c5b469b011886ae6f2be08307171b44998a5cc822897049ed376264639f2baaab442bbc01ec4bdffdeb24c1704dd7583d4169fb041f7eff391aa72fae8ed2334c04c5368eb3da3ea51a8fbae84e6da0ef78cc0b4ead5a39dacfcd7e4459e1771d076270d7f41486afd5a95551466ff78e164b6a3f5b0ca0da143798d7d3a653d459dde0e9781836b95ce4ba6fcfad48a38e54303703a1313211079952f3bae22846a29f12ed5b413473708d4857e4de10a09abd1b43feea6f50f21146b054522daa412bc7654ef49926551a3a6399b12963607d61104c048a10f5caf27ce59270598fb2a87c86141684af102c90062d47f19c7afcfcacf8159a2de61aec28e05955bc207c00560513867738701ff7b4674e5c6f4e1afad57eb5298cc6e5e519ffdd976a65e0bdca0012d9cd23a64d97a9812f28d47eda52d078e3d288848b89a6a71c9d11e24335bc05bb21d54a1f77c682f8778892e3844f14122f899aed5896d7498472629b455501e33ba996a86917d5a9b9285c8ed6dd71f3db43ac7292720b065f645d37687b7d6ac67d7fc098d005db980d30764edb1a181692d2bce597e8b168cf1c95002b79eeafb4239502f33ab74dd2736794b7a59ab924704604a74eaeafd7f858432e5d5596befa1c138fb840fe5b5d081cbd99948ddbc9458539b8b21bb2609045f2bada9a4604a9b67e7036d758b88c1ef06d27e8a530173a45b211ab1ae452bb2c03ce2bdbd0b3e8509733417cf3107360c3ce3616711a095f00e011ea0428a6a06deab08d8d5c2afce5db7a483f3903a064779992fa9abf5d60ce1c82e5a972ee359af6667fcbcfbf6addc1687a2edd92e743acd4b21acf6602f89fda35e02a79bb51275e995323e4292f65508c8d9b960bd648c6a12523beb4c97782b0ae6cb4f7c9840ba08c525efaa9eda75c83be21141ab06fb49e9d76328d4e90324de11e111e1dddb42e2f576a5b7d5637e54b13555ba89a4d1b11ba29455feee3c988464b23779cb6d2d613c0505d3fc174156d0b3b93657a441b6b005c52763c2abdd829e2d2fb76de9fa80010c6830ac2a4988dcd8685a351e679bdf439cc2f5dbafaa4b9eb9e437cd3895c6912b3981ba20647a8766ec334a0158bf6a59a4ea346e2cff4f157ccf208c5420f7f1cb3ae0c7c96aa7bafe58c4c51b87d88de89684d7424eae74febadaaa21cd8c94460be36bdb6a152083f6ef5d090ae26c525f2d7bdef5ac2fbf651be3869cb032272d78854f9cd36960e2d65ae864febbeafcaee3c12221fe55c500f05922966baab2126410ab3f6100f7823e10a258a1a0a28d83454e14729806963a77c35f53bc539693e323dbc19c50c9528faf2d903b5fdb49b85b61e72a48031cc2d98ffb264099b1ba758975a8daa627c5842f37d9d6076435cf114ce6be0cd34c291716cc72990c68bad9dd507949dc9701eab0552ec70b3c34872326a1dd1382e2d73fccd66d09a384c504519c1b549b45f96f89cff71c3b8af78d2daad71c51e0a3fc8561b21271ac8b728e8dcb7a2b70e01d88ffede82de144cff1294cb30d007fde48033f3357f5b509c8e613a4471698d63fc15a228aa684a8917471fd73247f3521782ce6819c52e2c987e25e4213290feecd56b6e3845b0e5b962b8332abfbfa511e42d82a03c974736b695fedde5e2d367c6697e40d40f444dda913f03fe8bb557f5103cf46322bc5285dbdac044386dce99a5f39e9473fd4fea7bfb7ecca059e4a335d76b0b8022e57e7577b513b270dbbe4f691d535883a1e522194acc02a611a72103cc3def13a36607725e2326d088650e9fa456f35e705f339704ebb502d52080daebdf9057fef0dd4cb1212e4b7ddd4d5f8dfedcd9975c0db4ee15d9d806b85801a3cae47c3b43e23f3ff0547a051ac463833efe9ae917a7c132234fa93c5739ebf740f3a7e2cde0b2b804b568a110ebe888e02ccadf12a08f29be11f20f6206369dd2f68c7e5f7808cf572e7aa703921e6d7cbf05a53259e64af178980533097730ae408cfdbf8ee5271a4f553c8d3a0fb2ad36480e3161a67fbcbae9e9317c81745ff37f63b09df503189b6a104ec1d38e9bc00c8c033dd7602082b65c5883326d6be3cad674559e3869c107742022767b8543a97af7a61c4a52ba0e3e4b8e4a0b3f1456256f3703f235f2ec6720fcf8e077c86d9bead81cd9e03f5f013cc23e0eef88002bd5d1d9e4906854941df7df5dd407f1a25c76c3217f6cd9685ebea37a198ea823ccf921e845c1fe71b21fb9ba00d76a380396fa92e25638678374b52e05f2b64406294b855a2cc8189b20b47c11c4e0d298962a054c934abd7ce7b520a3470aa83af74881abfbeceef3b9215df6e6061aea6dbc35dc7dc268403029cf1a840b57199c2ec7a6c8726e05930cc9d5c6624f7c0f5b9941691c3f85b02d69e315623123587719370b696685289488848bdced8dd0a4bf813a29c614770aa7b77e232643caf9b488c9d1f8a811c81193cde0c5c5907724730bcd47e208ce20fb0077fcf1bc6f95898058d62c2080e27440aeb0e81530039df515638df30679a2c8b8cc1b95d766f6097741e87d90cf4f3c88c16a326d9e2555c1d553d541929f4543164f140edf47fdb7ecb7aa1e438508621d6461807fb1d57fd8b3b21fdbab1f0afd6040f4ac81fa834e9fae52d01295af389fd6ba0ee6358d244b0e24e4f13a1b7cdcb98133b2a5497ffa5f511ceae6695beb9a2aa053631526aca19d5665a3a8d2f60ff5a8ed24adc5ffd525d5ad039e77cea03fc1e75eddb2e0eee2f64312f64b92d493bbc455e2c4a55a78af6f6a30575783aa71295a00bb7c98e5550909991727ab85d958984675df983cc994607e435a659c4e2a0111c75cb5635c4432b033854f02150b74fe09a3aeb2f51ff80aac88d0ed0a2f7b3e8fd1ace30fc6ebaa080a65e7d258108db092a5bc9885665dc150e23084d0ec935ab21f0559ba6292794d7f6cc0701dc1ea166410c456237a551c486c2fcf3804b1d4ba28f012964d49bc2738104c531645b81436446415dc9659e41291b7268d67f93f8470b0d3580ae24c33616650340c9d089dd0106d7bc5101d04ef414821a263e547cf3ac0f578221ecdfdd9b1105d1e8a851bb01ba7168f3169bf5e86c72abea3973dfbdbc3a85e6d44729c5a21b4603f6559a96b788b5f4f09b9318d31870a9928acd9bedfaf29f47afb42a7363ee2290e9d18bd03e17d6a44ef0911c163dde8a57a68c512ccc4c379f01b2222a21d73facb0074790c79a7d6bf66b7f3d3852796d91722fcfc93698a29cd37d1f948cbe2d7ccf80f972ba830e14cddfb738eed88fce0b682fd8fb27f42400a3a2ecbb8073684a82d326cae2560761afcfde4b504f3bce83016c40abdc91ae3b37b93e8ce1dd28b58ac55db983f02174202527791c74b9b04f21a2f71cbd991fa7cd251f188b349c460cd104e22613a9b672a76825a023ff056eb06d08630cac20e9da65bf405c0246a61af66dfe52b0dc791440966d2684c886686cee64da1b3e883980a8f3996a5ea9c8af00f4d8a4427c601e817b6dd24ac70b2f6254aab3390964865152238d9ae66cd3f67bcf963faf8377d051bbacb8b3c72815209742c2e689fac64daefbfbb6106ec4774276dc938ff3393fdef68a4fe6526e0cb85c1fe0b7cec076942952fefd24b59dcd3bad5957a084d28af2689b01c63fc242b400c2136f913e292fea34c2fb94be09b96906d2fc2aa77ab4dd078c5056ab51f80fd56f4c31cbf01d507087f4c13298f667f9be358907d30f87e0f1f41ec9b2659fb4e0cc1d329d31566ec0bcc53cc19d52eb448973cd07390df5754b8cbb2fb3907a94d966b3cd3d5aaf8ecb71e1f7e6e041dc2391c161157ab8a59c7a1a721502ba13f151584f5584c7954d8b4643c2731cbd896d1242bc873c382b47f7e9f1df8252c61e1e87c73e105ce03f03433dcfc7dbfe2c10604b0693ce63e16530b01bfd6ec91e4b88b126e50d47a05039c34423043b23abc111d7e699e1c97dc0f7c8c1f68b48b2791f09647bde0077b3e76a787f7894821f789e4df1b0b3ebea71ea0cfe5330609345e834bcba0d3f0f92fa4994e588bd64461592fabf0893a02b753b9eb95df0e60a94f2dd49e18afe467d66e181c0d5ae1efc85d7e44c6da70f6f834e28bda7c8dd32a96bc31fbca3aa710d44e74683829c0191dbdf723eb63cc215baf25782ab4fc293a20ab37bb8145097d50f592a61d7377d875b5a2be22285e484ee2966766bca62c6e0a6c0f87d7b46c7950f156c5d55268ff90a0c5dee06e8f652d7c180839b3a440382b532960c75d737c4ba35c03775cc80944ecfd4054615429811f50c751e465ac6ceac37709d810dc2769b4f8a764829c9f79dadce60f6e5c2811000ce052ac2210e019d63ad8ea01c398e475cd54f84f5cfdf8a15e44c76adb5c105738f16feed7d526cfdd722a860de5fef2f4a97b2be30424c939ee327add8171846809597e61922506db5e3ecee8ee41645b20000000000000000000000000000000000000000000000000000060910181a1d63783563815915c5308215c1308208bea003020102020209b5300b060960864801650304031230673123302106035504030c1a59756269636f20576562417574686e20756e6974207465737473310f300d060355040a0c0659756269636f31223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b3009060355040613025345301e170d3138303930363137343230305a170d3138303931333137343230305a30673123302106035504030c1a59756269636f20576562417574686e20756e6974207465737473310f300d060355040a0c0659756269636f31223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b3009060355040613025345308207b2300b0609608648016503040312038207a1004cc68ae211ecec45cb07a543139e56e82f529d0fe1e4c1751254121ac2696247c08d1b8e3f34def8c3ba6c3e88473abe3ecc88250dfab3de7a0f0049742d475a2ce94105cb8382e5a2ff9a64f83715c8d04b09319042469360744fa145c63fbf3705b098609527ee197fe0605f4fcb2c98447e1e9c23bde218ec99bca0069d9bd2adee5500979c46f134665a1d3d55ee7ffbb6ac881ab828783a3922ab192d063030824200548e8b79886eaa1960119ce9313d08942cb7ee0584169298d3668bbffe0319fa0b17c7a548db5ca2ac0cb8f2c35d26d688d5fa47ce901008233170063522a1b5e2884cb7efe7dbff21ad0a1f451ea2466ba3933a98c006e31ae74093a2e0af4984c2abbe039bd71c2fbb593747ca3d61665a6b34bd4578bcf3377eb5ded88afa3ff2fee9d16a4305dd9e274936fdbc92d01f78c4f5acf9680b06a1dfa59fe725c731736f2df0b958bb47cb3b5f619b21422a5fe66f455ea6f0b8226235e5bb92731fbc8b075c39c7158f542625843c01551638746d067a524932efc8351b903cc4139222a301eba36c468b75280fad6e1c5da3e4ac7dac4989c8f27fc79a096298751f71ceaf3b54c61c5432f28738cedd3a8497d44848189ad31178ae4b1d1a9ca79fe70fe8633d1f14e632982e02482b7d274263e69e79cadf8b7b9213f5eac0704b6bf6ac4295e1b5889617d732f9f8ed2e556e504c866ce74e6cc915ffacc2ab679985e4932743e179f78d8d0d9509a879b9e1e94047f2da9da9056a1a0336d15ac9cf9a497b0482bdcb47c7c0ea48eebda659d7e3bac2fd23d34436c5a80bfdb5445a4a305d2c016c635118ff18b57b3d161d6058485897297cbb82403e7f10ef689a85db64cb34aa4e627ca23c11afade2c985b156cc6b49a748307c6457807b60c114f804a80a5bdbc397e86381e3ec9d1707cbf13fa466534762cd439ac20e17c7d09eac08233157e71dfd2128c1bd6a2f3d552e070b46afe9a9e6590f7dc324e224d4d34caf9ad305e5e62a38624e0844ab7a186741cc5e343ad558d563aa1dd97b47975819f130d45b2ac922d3d8b64e385b1149598129850de11996780764a07f1b812b7e023ceb8f575f003312383ac8d3e5bfdbb025fa40068705cc8a1c990415ef8ca41bf58395f1cf66a3bfe8863437fce00e421b1a8437db1f6e33865e452ae7415e5a1a652b23e37edfa21d762f0d3ecca03989b46d90c720f322be9edef48d130efaebf32e029afbc1c940bc458407b838960075f31f7c0072355b471af025990a53b4baffb754a978690a222d63fcf7f818e0ad05b959d8a5301e993d78898182ca0869880ca990cc2d25e390088223d223ad15e4ca9f9a3fad2a3ae33d6956211a8af24855bcd4eb56eed61872ace5c68c5594e41cfbf408c7c27a9ea2190aa3a067009d51090c13dd8545bb9fe51aa0b96da4f1c501bebb8b44adef06a7ebf118dbe0023629fb84021ef34549cd7fe977a200021fbca33919cdf401dd2d0559fd5e393087d228989aad997ba0b55f92c5450148b098b06f6b4e941e876d05302a92c6863fdc26e7ef973090f2ed51b91a80d145df5aa683f44fb9d6089e20d3df2d0b39e4fd11be98ad3fef83faa1aa4e3aed8c195a6dce9da06e756e808da28301888d80bc7b9ca388d275d71cbf5ee1a17ee0f5d480d8070edefdc611d1a61855e13bc5a3371869bcd9eee66ee1e0e07228a12498da4f22709100d54ed5758c79a01c124f5983377c2c9ccc72a8c0a03dc32f34dbbb19ee0dcc247dffc8854c8569cce99c46b3c5eb02854f0b0d422f7d4ec5dac0ebd4735a63886ab1087e9fabbd25fc2287d69a80ed74a875c127230e18675d2af9ebfa9be4f0fe8234f2c8cac9cac44aba9f3b27070dcaa0fc26529654f4f1541d6138525f0f78b733f512dd751be23a3874c13730bcf19b143b9484b4d9748b92d1a555e3b5e5fcc52e1c55824adeda3620505a34204de13aad2bf1bb53b45ff6a218ed23e6644da9198ea05d20225c8a7eca0555afc492623ac2932d2b1604178373982edc2bf2cd3304abc0e312102755b987d697c29d1455f056f93f1a3beb0b1d6372c12b0a6aaf42abd6ba790be551fcd47f20bbf03bbcc77076338bc46311fafc9b824b9fcf2d4d96387d5f225255368f89a6e3fb3cca9e56e28a33752e5d35cade9d3b05fb1790622e4a05914f0e4ebe784a13e96ac72aed8c306bdbd5f07129a9222844f672f6d7f3bb3eb7087d3f139d9d1f3c7de8addb20a1602b3dfef09c042c96bcf6c30e32b936929a6f7451cb67c983ead5f6e52ae18af2ee59c3b0f53b8288511bcb4798304b39c409f5857045c3c82b5e2f443fedca12dbff3775fd0d3a3d4eb469fb590fd47a713bda1f81e3fca981bbe71e9ce7d7aacd0705a2acf3910e6c90284192216c4776bbd387cffbd9ef5577e408f5d927bf7e0621eb7e05b18006156b493c2cc93ac36d7ed791277bc12dd6856fe178f191f66affe4a2ec149da4b4602fc67e17598aa2d9ffdcd8f9db227b0a6175e7dcfe647b10ea42ae4f70c330aff53b0065112eeb4759958a5ab5e7db7af4a0dff4a821967b23c096bdb4751bebf31dedf7c4a5fe031a4307fb0bd4b7ce147a06682dcce682b97d7c9423d4d94d5e002632d8b9ebb821184a242da776f3062985aa81367ed10a2684590a97593198cdb326874b853f523dfcdbade5a19a05b101d979c6a60c40883787257bae56ccb590ea86dd78abdcf7c943f9dcb97c8a300b060960864801650304031203820cee00ad3dd7c097a6a4c2e2e39b795bbc8fa80741284dfe185deff5e29e2533ede70bdc24375458c7472db73bdf06072e8da45e036ccb5671140b409734ec48e74d3bdff153f920a41048316cfe8174844e146a95fa06292b0bbf5f104c9ae67eeead490bc1013daf03b5084b10e6e24e0a0649f36c8e901deea52f0a4e81c677cc6560ca5492437c0034891d52c2446e63a0572092f0e20b05f0a18043fa569f773a78b6c8a9284fca6e2f031c44d039fe44c93d6b29ae19124c05be41cbbcacad50d700f2fef3632e18aafcc65b35c0085f5819619c609e6fb0a374a1b2d227d3f20cc92401ad07e409378d2a9daabe22c42553b5031112ce3eac1929be6f7e35df9cd5046447fce34b028cfe17ef2bcb1a824da351ab82cbfeaa1ad3da7d479fdcedcaef8fb7b46cda91a5befa5f8e7b8f6fcdc957df86fe174a655ae090342970636f9cd12fcf92403d7bd2243c51ff63c83d34eca7a3fc66e87ba0be57736aa77105363955dfc72b1c5666788a8297bc89dd8af8763824a216afb1cc0a9f9e0b610bb4b10e95e6b2f80182d0c3887b485fc6402cfa1ee809b09746f315a0c6a0fa276cb336055d84ef02948847b16012eca7df2e2d70c2cdec26e87be23572f53064e4f229dd2d06b7d95682806a330dda8bb0bfa4f20135f8bf797a8be454e75fc7f30587225ffc7fb1b73d08562bab4bd88353d716a4655c10d7d6d4d959bdbfd8a6ec5cb75b0bd6079965744e7b389993275e09004e135dbf6612f58077095fbc29f4f0b604933b66d3d91f1e883975ccda9e4708a4c73347d498360c6268233d27855b62c3f993ab32c098c25ad1d8bf9d2e7b312b3ad40e5c227ea5051cf44370ac4f99b989b7b355900ad5c163e384b34033c22b97140af073dea6d1124698b34991b1773a3a866c55e1fc481b8405a11c70fe338ee695d42fafd1657e23c2edd74e86aad384fa521ec57960e72ac053980f762f00b93ffea683dd8e436da71d9b310be18a53758f63619584f79984dcd2fc0b0cb3b3d283b005144e554599e2f1235b256df08597e0d1daacf7a0d8d16d904d046f44d672da3b959159893fd91313346bfd6319146e4898ad012fb6158ca33a55fbb9261aedd3d24a1065526dc73d79ebe6e41982bbdfb4a14dbd2846b3ba938998d9676650f02d0a258fd89b7011070e73a3fead694c0124dfe5387f1a8b7fe86eaacc48db4847e6fa28396db9de351e8d5d902a4ff0d86c8f10fc2bbf2809bc7087c2d3cf4e4ffceca0555dd38905688108a20be5b4c83a1bc7d9b3ac10e7d222875eee24e8f2199cec7d72faab9b1774a6dd9f1e99ffad33c80cdcbc4db150e54ee2dddec205952f15f119923cfa187172be54aded654e17c3adb86c7c940ee46ccea60faa1e46cc5f9d2b538485ace2c9b305e222af454d129377e647e77f685026ab2e3c93c74cd4766945982608f8cd02a1f026405e6123f248e559ed8de93dc769be93b1ca39ab82296c59af33bda9dfbe6b323956143243142ea0ddac0b423c0e3d8a81d842ecccbf49025c01836c0dc858fdf228963274dd1693e69b8fcaaf0c49263fc87b5bf442f5e301fef3d0425c26247fc9ba2a2fa8b0287a7c83d6457ea1654ea7995ec26614b6cf7bf81d701d5c0bbb5aeafc75382afd1b5bf4bef9bd359310ff263eeb19979d4ad65106277ffab7eb6327533948d1e1a814a5b09c530a94d4137ffa21d63007a3b64ec9fc595ec0d9910b47e7e277b34f919e9011551faf387e268dcec1e74a00ea942cc0469b00687cd6b9ff3560d0a0399cc3cd580ef82b719ec73777178b244adcb437f7e7345eaf6417d3c068052f61ee78e0aed315991de8ef80413af3da1b8af6077ac4d9d890fbc4806fdd3267d6eb2dd5d3f2166036bcb9b80b44e648c7c71dc77a3e449624a22bd262a3f4b69347c30d23d0c59b973de1713dc6f93488320fea0ea2b63e2ec7f22a37e741f4687f2fb3f2b6abbb16f59100ad8e4b598958e964cfc9e4c95a59927a6ee154814823b868d49adb5c4715973ef12e470924a299815b779c124583046451231078f854611b835a6c0dc25446d26e3d87b7c22b67275e20a09788355f319a0932433eb0ce4b44b5e9c38e04810af77b5189e676e1b9259dd12e08f21a53fce22342cfd8e80f2da32881ea13afa31a4aedb7c4d4ab6a53b42ce1c683b23ac2d0ad8741673a5c29be853d97be84cf546694225652af91d7fe68fea78fdb50c4381f844824bc22e1ec8de48a4a95f6c11e4c0292b18b5dfb253378b703b302152d76789459acfc1441fe0445ac82c7a9fc5e17a3a1f58af236568cb75885de963f57b89efccdd5148070b9455d2c5d0b64e01e633bfd9ac5408642654a874bee9f2c8c33d8fc9e75e669fb89817652b592c091be1c297b708cfcba9686692a555a9df92ad1913dc479e146ac8ed0a15b3e613b08a741e5c1b0d4bd117826593bf8de751c2c61782d0376d6ae9ffbc5cd385dbd1db031360fde303033a10bec127e18f23d471c069d7aaa93b4cb2b7375489832762c880db33934e4bb38e5686f1267eab4bd0a2b29f46320db27c39e87072664911fe2d321a7015d6106ce8555f13ac09cb4ec2117f8fd0a43079564123698eadec29cb50d2faeea9c864142af640b24c0a19b6878b7434c0f9e51100074b33bbc4dc763aa96f8865eda392435eb3e84596179ee935b6ec943670d57d9e2a4b010cbecdb66827658e014d9d490050513823dd181bf45b2a28b79e5bfa3db462dd49f50376c54447cca6f3b20f289ec5ccfcb22117f4c45b887be8c1c562e0322dfaff1f08ea2d21ac351fd3340f27b3c7ca8ce9a586677e29f639c30659c24caf7ea42fee47a544e0400e9d10d04d01f9ce1dfdfc20a2259f5b64343c0c68e596eaf0357090ac2d67473c585a12589f491491af991390ba0e2576a05cf596c887b0d27c6d4018a0dcd7aa3bfb598472f690dba083c72f6fafa2deab3ec0c3ebc5beb380d5df745db478f23d9278ddd0c0f3cd95774dbf3032b72583a5fcaa2aa77f6d801871bbea760b2a8b9766ffa46fff00f157892a5acc097e41fcd9199b309556c1bc3bdb19d095ffff44ccd448649a4158a0d67ad97db44cd3f3d291ffe85ca9f01e5e0005bab96cc042306cc8b73c72168dd8fc67877e840d84c61a4edcac5ab90f66cd2484c1eb0a4b874bd7c7958e26533863f7f241c06ba73b61dabd1af93a397e3bb3ec73f8ba7fa11fc4a5ba421fdbc89c285c014f8879662314d3eb9a97f3b4eb0bd8102259bc48b5db5001b77532b3dc79ac1f131c91cf170f87279cea9764faf14fd893cd2a10d9138653c3ddf77b77f14b3dcb674725c93be1afae61475519f4229959b783370a5009e6e1aab545dc0b0dad702e953e3b620b10226f7556be3f16918c6a7343eeb101b0e7f08a07f046e7cd018b8c5d76b2bfba8ceafdce6410ab1ea23679adeb7e329c90802d9cc31ae65ea50d057b15e93cdf8bf260e49d068cea8ca8aaddb1208fcb36f18ba0bc4a0500fe5c34744039d4d8205167bb49a6290bf56db371f9c0bb471601f7b863b6d53581f7f300a9b427b7af34595722884871a46c23721723a549835d16e8becc6be91c61d66560d0e93a5351cde252e2e65a01b7f66c4d1c4aefd044b33e78f2edef3efed995570ef4fc9a6f1d79590d3105ba00d09e180defee0b09787c1db0a18f2271bf7e381f62dcfb37943f61010d27c0b160ba252f66b1645ea21396af9ef589a8812eed5c83ef8e6ebc5eb11cd173c68aed406d46a1b41f457f2106428ebd6f42424ab2169cbd54660e8a8f41bd6a7aeffc46138598e18f842d1f78c569879d99090c177040d90f07f3ea5a933d5fde2913919b3a5b06ed8e19b65243577e6fedd6a31dd3f8a86bcdeb26202ab5649170d535f296b08ce8849a12a07070d3cffe907fe83e446624e88ef8487cf809291c4c4470055fe19deb162835f869450ee40f3d3deaf8555b0aa825092a050858a46321bb0eef6eaedec24189cbccc3dcabfca39b3059844dccf8bc8f6e833bad739333c2f41266ac2729900028402748da28a20eaf052b6856495bb76882cea44320f6cfdac244b55fb212afd20a5675fa802995aacb6cc61c4e48d7b425dad82e8b040f482e9a76a0f85a677f2470f74796e1da482f9747113900fea7b4aca257388b55c696f81267bde9a1a94d4f69911b86666b7205588c20a9d047b8703715f75bb3f01fb95248b4efea961a9bcda1a7747dd25b8e75cd89358ba73db8522b419d80369e5c4a1d920c59a68de0060245b8982e0545c9c734396c88dc8eb3d42374435c37beaed2c5ae6dcd6e6b8a782ed927735f263d2c35d2b29f394b86a2c295135fdfa385459c35e60c559ab30c06f8ac2784a84f0abfedcb19458b51b9361a11e73cc348cd40daba69d7849198b64bd8e56fbe1399b7be1568fb090bd376cb8770aa3b3e7d58d92a0f673206af0eb9b37277b9e5932ae40c8ae1670b047a2b89c4d92a72dbdc03f316b03ad93fb7e5c67e7b0205cb5d47c35d47bdd5ae56bffa7637c72484f4bd1b1a0eb7d65d1ac9ca39df2e1c1b48be172553df30c2b5b9254b4cbe947617177ae0e3dadbdbffb0f2a5b6e70c0cef63c497f96a3f40000000000000000000000000000000000000000000004080d131b21"), + clientDataJson = """{"challenge":"AAEBAgMFCA0VIjdZEGl5Yls","origin":"https://localhost","type":"webauthn.create","tokenBinding":{"status":"supported"}}""", + privateKey = Some( + ByteArray.fromHex("30820fd8020100300b060960864801650304031204820fc404820fc04c1661dbe48a1e08036388935c3ea62d1e9a3063b7815348abc24ef3be3a69c6fd8079f42397b4c7e8b495e218b4e7a44753fd1fc6cb0c821455c076b03a621884af9a01c232dee0a4abc01dd88a13718c232b668974d277821dc6f1ba794b57cc32eba47ece8ab9d8f7e2fba9cdbfa72d0810d9f8e5dfa89e49148e5125aa8e268431438785664388646321016262686367544216304022045055662547130320876170586201348738116433407610688552472834368668473250322087086725118618525505865853008318418702544362366067842461138436887374148361547744441252013863484261345015437603807787857505542627628080332102514648261357050074835508011186600002715473646288637400306443472378311228024614325713536808363072533806866552810677116115285484865475865345502861276801042120060824156512538126873134225822805661237002031442410410882874822074318651331726756362015663232864016435508527468124235240180213768424742338025317507612024347014131767173747083843661078618134100226422861285356223880854320858660782104811304161544078281017765554286611704768771500857362073440065167862374027371282262885082684717177745812568266006106501736240136276641810842410010835816762607020431432500658340577342536315025604633816220035324126806031003761820473416427035132353161716362640025836283865400684878727780636346036834857740662470731131244314584680311020123845571484861040751234402505114411261785145180304868238424771421003728501401222612403024813688610723563352814568235200244882244267887673842111086661651807186530270845730225701364021050363266536853315016366032574431606048220837224200033023403234326606308410832583310033751108560503365201538685121026320840602127378815225445836317041403867705343468423833060837420513448441860404225061557841870518475426821463066770244308470370714341501041256450125018408727502167671265215024825553208046520671634701057011752686727560552455575401062643244582050661218435683227445655024627205006828283451607366806630085614367055606758858426467217533222024021015300365041088013718270531432123838685242865068730072052242240018810383546675704834313610833666732824060873855012648834880027012015280064344568015685382676608721436154730320536285676475712264234188648555007172860005855730115620004675702427557665114712442454382113675570583065428684414334427533456163785632021481280420405071033261840518325602111044402021775155821466080841078660755815152813288034016377528474638607781618460056625714186461712532004166028410762110461271617572162306312353180742715853378217063734245643275763706152761428851151682400660704265086100756608106827750817472350244420676483608755816256874680568137442151477512042066038155452803851631821816567850681175107771205724183410867505511446050708136802260547471845477122016446305701045822722712618854421888458316765228743570038327103038420407348625837345361122587775860405506331721756252241160032375046470722478000270143575487735481200611612300067357446000861333276454160623126517776577204246711751347506511324582834260027568815260205433433672828422155121327558151627288132882811010225675541865447327237071863486847656575654573555864412106526328647351274124114278758456306123622652406673488761657682765618111536783368331123748555239616f354c35186b894cdbd543f0aa20c48cf7279fce430ecb3c4653d18d31a55dd891a359317745ed68f7e696e820af7df1075af18e036ef713dea68af021a605a3c6e7082f529873310479ed53071c9c3f70f30230059114afa61713a498486c2a4bcbc7bfce08a42899291dd6f61e16af0a46b1f0f333aad528ab0383bad975a9ca1984beb468f3546d08baba60d1795d7dda8c1cb19900b5b6a8302b2e455f59d37c8b2accb98c36e1cfc25211d2b7ae1be227cebfb3667a44e6e5913a6b1423d71fd786b42f7a9267455f0eedc81a82700c42f23edd3252f784fededce5a09a579e42c82af5faa1a09d736d3a886d7f2304915cfeaf1308117a853656f6284b76775b4d5d33cceda8470e9a7b958b770d793e7dccfa961ba5fd5cd632533cb8d77f23b98f8442f2991a1cdbec2af4bd1659ba83cc8bdc9044330a9a0eba662b55b0f13331cd6de512369178f3d6ef41763c9e73fb8ce98119619db7aba451a55b511db1540c46929874129d07dac04b9f2ae716c1bc3512dd742940559811e07ba74f3a715d5ec580d73b73392b2186b01c178f83a80be0d7ce63435da365002c0b1e83b5f4aeb45867074ca427025af1fd148f146b11fdd8b6d27992ce75409195663356bcd71a7506b96ba508fb2d19b94709e91aec9ee7cc9d12a45f73e2ca5ae7b75b4b05a77b95229f401910b55c72a59c8b96e591011aa2ddfc5cc5ed586251e81e13b57a64108451e68382bab7edcef89c3f0e3afaa210f0bd6118aee31be38c4b7b4be10668a075129a0bc86ced99fcccc9edcaa0ca114e7a564894276a36c80862932288cb34b878bcbbfa2450445ba6e0c494439071ce3680bb8d7667a5daa6833d5632f1ebb777d2e510c76e3e15d6468c8f056b782f68927a63fbf33bd6832934aeeb9d097eef5a4fd19c1c8be53cdc538bda44c925e2eb6480556563f08d7ffb996b0ebb4a67a334a420c31b44d00706ef84b3936c825c97b7d3a96e98fc9c71339190b9433ff3a121947e3c111a0a159e82cd2fd0843256f02e1edd3fdb61bd1fe25a1d813538345e8ed78d2c1d9026645756ae38d6dad5a13a8cbbc8e703b257e0f70a05c84e99c972c1ceaab1d526f7d25c8bf41e89ec20af5d01abbf13ca3a1fd913ddbbc2cbdbd1bc04425ccd310d85e801d5500dd14969939e6b744f2bbbd72c023ed2cb826e60f0d6b256ae057c32951eb536f02366ef64af5d80e4bd40b98597d441aacc302941d3c153b1406a1538671fb9736932eade18ad07e4ec8ecba5deacbddb97fe4fec9d981ab57c404830ca02633aebd5f55992dcdaf6e6e481fb5652981b630ddbb4613ced9855296b3605df19848e20076cf1f41e997f4a90d66ba74f777e51520df6ca7b44a6a70775396824bdc07127c2a6fe5d43ed5d5f8b279553ab672c3054c0327b09aabd314c98bedc7d7b565d17ef3fb798e29ca2a16204c9e73a16a58eb9e4d05e6765af75184e44b046d9f9083489893f165931919231911ab38706860222fd42cfe7e05cd8860046e2213984c2e45d505536047ad8b77fef277bfba0e8e60f7cae2de692833d3799e65ab124d1ed99310f9d80d55a3762e094c582553d0c2812b5de0bac6f7baf47a81f9eba203bf0579f75dbf0719bb1031631dc724eb0375a2580355830b10cbd377fc0a99ee651a2dc2aad8cee36f2e88e6f184094c55171ccfc3537056ecfeb2016c8bbd96f12be0e897ea3ff9700a4dcdbe61eb08c6669fe0002d54b0c38230dd7edc6ff50c0d9b8eb546e077e132f43f2197730f4e5a74bc574b22b22ff06fee1592a7ddaa22c00009cc0d57f9d5698f3e25f60af333396c8931e70fda34cc31ddb9b17d3a6204b594031d6c99318ae7054226d246665e38e886deec8c740c397a77f537c3b82e6536a2a1c3b9fa6c2761eea84a95bceb2d571c7610e9b47817ba8aa1a54deeb9e8b511bbb97cf3ad0dbe1984378c029cf4e63152750708a1a1ead30d4c41daf144021a7a0d74fa09efc54672413ddca410425f1a956513db763c12eff6ea047289c3a14971a8e42056ca90234daa0fcdb41f7cdc39557c7723cfe69d248e152f30facf07b138cfa101c2b22b18f2a3cddae93338c2c138c76b60330906a4a6742558b93b459e07eea06d005286cd00c903a8091fe713f601d0917ce77606bb177b7d7eec3ae86ead3d71ec2b07765b11bd898b31de1d7f99a1a467ae31c5ca8e8487d29d2cbb55ba0e25e309ff5e57becc5d321c1d907dfa4ff17dfd59e25287968a15590c1f0c5bae13829f5dc82dc378b768ed2ba9b43ff48444ad9cd5563c7fd4f43a4ecf95eb4a76eb718a207fbbb478e90771baa43daa333c7f8f98e3e09b174fbfad07e0a29a2b4d3671a5caec87991947ed5dd8a078ba9555e3de86bab926bed773013227f1606d7a111da7c873eaac58548bd3e07b0e119c7ff7299332ee2bb7e69475651d43a9cd4524fc424b078e8cd463a639754e2a28a60ec3bc8a66be1f7e6215fa317ccc507811c9892998ea8f2cccd8d90d815e873cf3b55fdb942f5666d40820d0e852418abacd3f7881ac6dcbb7cb1a3d21e60a18ae092a9835f92fac7a710593a2b713caf67fb8bf9d18f732ebbde23287120fa898950f67946411c313b61dfb24cd607fd8894d7730355a16abff312f0289f77778bd1f4d64de5633a3309bcda43f21201f44d3ac10ea88a8415de07e34418f0159e70eeace642803b88a12fbaee7f2c357762cfad5fe01208c2e5972cb13f47da481560879b8319e12d44b55ed9f519203ff3ae797d26211d3fdf5128b966abd0ed88543bb147868ccd655dc133e633eeb9be29a67fdc8c2b5eaa4e2e132f6faa720acff233cb61c788d80f3f94405f80d1ff40147b43504bb42f78a63f621d52459c863ee3d73a8af7aa9fecbb8154793ff2369d5e1f08ee21b0056a1d42ecdd8e314149d2a621fe3121bd991bb394f5d01c5e998c8ce11ab3d22ee0d1bbfc060bfefb45409825f9e4cbdaa72080a40ea997a5f580e20fe85d7d3f731e16ea9d27aeb1942a167ed840b3661b0aad22cc5e3116d7f444f3e0809934d06268c3c64ec799b93afaecac3493d29a8f4ca5b822d9bb36708bceb071c9a42b9f3496b7ddb9ae97f7ff151aedd996f1267b3b52ced2427af82f70e386e9d1eec80a317a7e115bd8234d4bbf6d7705632768cbbf5113e25dc8463b440cb7d6e8750b53816985194addfe81fdafaf98edbbcca9773e85c49bdbc6c55fa665eda8223f2064a6d9a48cefdf51317ce4133041c3b6eb476f760502fadb48cc140942fdfd0570e83a626410a6d4fc8da10de85c7d4e5533954ad395265b0b73d9e45081a6480792c411057948c544a7d990cb9372a414fa1f09553843ff813a38fce49b593cea4a6c07e2cb1457ee2192d85b1fc12477218a2d46e23a910a6eabf6063e55c7007ba99e5e7d51e468360e89d053e13d8500fdb12cf7179cedca81d902d7b2020861ece5d1d22d1d5c7d484c5c87341a9aca73c2896c4cb0eacdf32") + ), + attestationCertChain = List( + RegistrationTestDataGenerator.importAttestationCa( + "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", + "ML-DSA", + "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", + ) + ), + assertion = Some( + AssertionTestData( + request = JacksonCodecs + .json() + .readValue( + """{"publicKeyCredentialRequestOptions":{"challenge":"N3LjI2J5ylyWe3ED5OT4XHLRqHwm_J48_D_hoJOFf30","hints":[],"userVerification":"preferred","extensions":{}},"username":"test@test.org"}""", + classOf[AssertionRequest], + ), + response = + PublicKeyCredential.parseAssertionResponseJson("""{"id":"-MHRPBTWts2d6c_nRwxlzn4ZPsWEq4DjCiz6BNyseck","response":{"authenticatorData":"SZYN5YgOjGh0NBcPZHZgW4_krrmihjLHmVzzuoMdl2MBAAAFOQ","clientDataJSON":"eyJjaGFsbGVuZ2UiOiJOM0xqSTJKNXlseVdlM0VENU9UNFhITFJxSHdtX0o0OF9EX2hvSk9GZjMwIiwib3JpZ2luIjoiaHR0cHM6Ly9sb2NhbGhvc3QiLCJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwidG9rZW5CaW5kaW5nIjp7InN0YXR1cyI6InN1cHBvcnRlZCJ9fQ","signature":"fy7sVh3ydSJtxhUWrkReLhHPrPPaZuEcnqvgqucPh1XFfSQqSseNblHHU4Qo6KxnJpWTHFL14LQVAzh0JorytCSirvYl2oddreQr4XANCI2f5MlpgnLWuqqT8Po5eSHQ41ymXaNshUUBYxJBVJI1Df1IvL-r_c9VDNfSj2NgIXefCYHLB_S4Jn95KRxPFsUOm146KzPybuYe9i3c-Z8DccKMGw1cGYiUCQQJFyFFHGT1GRv2oi2N84NC3R5f57jYeH0gKRlAdMxjh0yX-YTq_uvZnYWx0R8qVg3yZeB2hDD4nAmmWNIhxHEhpe_mBuNd3gN-HHxGDeVBmz3dywhKAoyEEGB_fILU4OsLnpFUNAqSsAja7ypj78UwYd9jwVUq3DJGQhXblDzSthlpfXIAJmkri3EreDeY6bqIz0Bet-Wpt_PwR4xYXNstku2KhkoDji6JM5svDiIbwMRT1Cc5hoaq3HYB363m9Hp-hQ_RblqK46Dl9h5we9Nvl0xHqt1eNh68cjU0jGyWpey3TU1kLDAtBf2QyIi5sHvnxKxw-yl9p6SDNtnUcGGG2rYVpoAQbI64Qhjl7TwLpFMrtHXZfVqKMPWfEFW7CwvKbXmwe2gRqQ9HX6c1izkdxZA-UFQkeUO97b-Sdfc_isXelvbyRCsoLGKs9O4v1WSfz1tpfKg0N4W2KgDGkMdawit1iXKvxTfi2BYb8MMqlY3lFSfCjnJzrG7AlpjkFrGCfB2jfBz2BldrTC-szjAq2o3JSrMapmBbiCJBWkeK53SEQ_H0TG9CBYfWFQm_kKYLqTbqRXAh5miWDKgTVrApUtnBnAWRTZKPsOnFNLarRixgBKYH97AlKNDpnJexGKCHYPhpL4C5ST_o2g0oF6I92hjojI4eA_YBOgjF2MzQZxyAxHjf6N-tzOXbpuqxlOMi72vJguKI2FHnzNJGz2BTMpTXGeqToRaNKlFf2E8aB72PCs9oC8NncG0c0e8iwwSAP_Yp64KKtI-EgKijSHpw6ZjcPZLJ2frsJ0GrjUxHSMxXXwCCm_w_t9p8C9T1qDvnXZYa4AXBkOIAWyUg2kmc-esGp1NAvrnHTKxgj_-zVWpwZ0DxTKiUehXoFoAaJT3xO7CbIerfjtnQUjjKAc06rhvqFPicSYyCp3WZK1XLyaUZI1PEtRWdlwRfWKMDmQ7Cn-pHFQBDaNtat_uZGOTKO38tfob-KPq56NX3IiNbbEi2c8KIDMJfPczteuHyrmiUKDfY7arITDL3dsNXmH4VHYKo3OefTeIJOAQJKS3tnsqzRgX9fYYqyirB0BV9b54ELP_iRWjqZlDcqgmr22WYrLncy1AVyRT49WbIw0FCr5riPQqSCqTTW3Aq5KB3x2YkJyjkRERfnemhV8tQqGh0SW3w_TxGX3O7DSouKjUF5TyR9pSWD5NTNSdgoy6tye1YZVFMzOItujyNr25XxY-9JXnoHsq4Q26lwbvD9MVkSdLN5jn-LS9qn93KDNVvwED1JkdUP7b8KDGco9jjuLJacpmhVp4iphKVlWL7NvQftGWRu-9XYvpDSmKFhP4Ky0CYQnCTB2pz-Bektxu3d2KSH2j2U4hyGkYgj_HBiWQ1bWcQbkH43Sbhl0S8ZHl56nlwXVtdTCuQ6W-Ax_mCpfblFVZ-ftIFEnIX0uwntfDRHCXO4PHdRXsIGrK6dpvFBo5DjUQEQIfLj7Glf0oZBZLH6P2gfzdjMdN04j0MxO0zFAqo-7YuR0SmpQFVdlNsArCcMhO2xkTokWVYiwZjh4ocoxtMcXov92awCCEFOSFSWW5l1wTXZF--8K7QuLFswidpXhCsRlkxXsEciZi-XrUxPRllm8e8zbhHuWi2lJEyeaD-9N8oT_y8DalI3_KrXBKjSoXQduK3SMU6NUmjDgfX-sDqabTPm0n6PNA3GodDKklzlEhjf3qmxlxJC7ZjSpJ6Myp3E9W_ocaxMTCa3seCDyeft1vN0cXP-phZe4UO8KvUWUo3v0rh-Ic-LQM_SavR_h8hTqnEojMCjsPpgkHqukIq1Oscz7phFO5umbJQFCzVVLDtFV7v3fTxw_K-8ft_RgEFYwFFASbpgPMIHqAOErL3d-ltBKWIP9Gf-W4NxBcHEayrBtTubno-f5G7MsDyQaSKgdcL39maqqC60d4W_xvLtMB1gooSmWyhArLILq3VelK86gU9Y2J0WXiNcLuZIjAe174IXTE7YB78CNVMOa-6rybFkIHvpADs4IMfm2FckWvvQ-Zdu8ZDxPKyUcpeDw2AlIR-Vn9sJ8_APgPIw1-syzmbTBbMJkUEpk0VoKP0POTi9Ynfo_pAqfvRmYXGEs0keHUYN7lNnC8FRNeIUxH8Bo_nQnRoZlQK212390NsWRaNeaBF7vU6GvQ3r6s6PXIhkY5h5LtolaGsFyBu-8wAENpDnnZ3cJZui7jhV9qSPF_Jfk5HksJBzVsX_EBtWMEYhZWYvome7utSoVDCLexOoWkIxJGW6dnK_bCHeHdPs-a782H8B0ZVevcxaMMFY1jwixigJrKgxIi6fWJTuuBFJ-ivRwOtxOD8t-zDz93TMqhOKEdG7AOAylHX3xVJPCjiYeUnSHvNucIDrq797mgzDwhvcaOpbwL7aCmbNId9goUJ3FbVMsGRY5iGx12bIdZsrIAupCVRLFCfb68QIzNMClw83woO2tHLyC9A5JvmvcS2sjmGgRfX1zz6GnHna8FgvIrIUdpw-ADj4elqgwhVPalR2dbkxwOxFA57LaoJydw6EomA12YcVX59opY2a0DEFGKuYVc0zjzG0mP3pW_5cIxAyaN0Uz7HL95Fh4yii5yaay5ammY7x6ioPpNpN17x3Q8utf5CXKHi50qDHdWgp1U1tkhYI6pDZ0vzQx_JiMBwRZ-MMC0bLRgDbuTXxMFDBYxzVz1p8PW2UZIVZmIjnTrWfUFoCWg3P6lu_b5vGrT5oWjYeE-Br7xHK1Xpnwoz3ZNb9OevsjUlg8FBEtq4I1hW2saG4pr0E-jBZ2gYgAKfn9qFuUsdcT_SzNg44boaFg48MpJDNcu-yMYN8-DQgBA0KLka_YZd2GgHshgzNmKWRVyiiESXjSClmkaIYmaVeQVdjQTfBAPBlsO1zos0ytMqlraVbUYaB9jz0DrHkZZF8Nu18ocESYKFErp5C2EKZOVZhsvu6_L0cM38qOwUrJ6Tt1J_PQuhB_7r5E8gdCTqveehpu3pankpPQO1AvIB1b3oa-80pwb4Vl57_jDUYET0nradHwfVEBhRRNadiJNQBJ9Ez5JtUXGl7bYTdNVb0CxC6T7ylbATd6UpGY1gOu_KXdUW3d46QauUEArIZh7Ez0kxDgVATc0C7Y68yke6OwMigPg_o9vZhAc0wtJWHN_2VMGCegp7Tjt-aEp2zdMA1DawfQCr9eYerVgus5NHqkkDyF__ah53qftpkslMZXwqJP-bTZSDODCU4KpQ9Sg7EgPk7muGpaJtnsUylgdW_Nm1XpuJBylTJ_cTsTEIFsZKjCTb-4tic1GtoJxgOV-WWDqKOI5md-BXCcVjqrkDEJf5gjeqlfICNY4mLvgeEdzkJO3lOkB5Fb5H-EKZhV0GMtVPNWbnhbir_SI-r1fD0Ttjbr6_Xih4PNioS54u-kFVIA9HtSPEVQPl-3ScfMqophGz1UnjzxLv065Q-Ti7k3ofA9isreDR_wbVfgdBG7peOsZoIT1JJ2buHGvvcREfjKIEC5327guN4oqz6936DMeyJJfHg5zw4tVmqVQbP_pncO_NpKP_XXYMr_YzwURejmBOdrnUbzLKpKS5D2Dn-PTLHIVIxNLbNV5twMt_DRgAqELlGBwXnmYhqMZPa33FfZFoCC4UMcy3oQZ7hCGkEhQf7-uOCyAGqT-r0OUA-VUnashR0rf3D9RzPFpvdnFqOfqLz7JxJuXoOTygHGOhCjbxAQYs1svyREXQxgEHQY36U4AXXeI8KxCLenOvcXIGIPJznTEW7l9MW1sQ46v8Q2eutuKBBYQAm1aZEU-lqwe7S4L2_IilnPTpApwFO9bK5V5PGUF2j0saIzZpjPmVJnbPrcrTVfttHmsef8LONHbX_d_l551V_YGWF3jhCo5MHZUQapMwCFJ5DOY0NfgczME7ptpqvuulAeDlBimzeIhatvoErFQ21lG_xMbrF_STWYW7okRukGOEigVeaERCoWdKospHQRgK5KsZP4f8OKstJ5HtXZmxL1g9IW5rHJYSYIOt5_rpsCK6tR_78kaOmD6DPYvou8IYTQQ1DZ4N8LFeajkV20YnxluRix71GM10N04oQbbwGOognqT3FGxYZhA8TI-sudz9AAu5z9bnARIihpGq5hszRnG-9YCNDA4oLWjg8AAAAAAAAAAAAAAAAAAAAAAAAAAABw0UGhwj"},"clientExtensionResults":{},"type":"public-key"}"""), + ) + ), + ) { + override def regenerate() = + TestAuthenticator.createBasicAttestedCredential( + keyAlgorithm = COSEAlgorithmIdentifier.ML_DSA_65, + attestationMaker = AttestationMaker.packed( + AttestationSigner.selfsigned(COSEAlgorithmIdentifier.ML_DSA_65) + ), + ) + } + + lazy val BasicAttestationMlDsa87 + : RegistrationTestData = new RegistrationTestData( + alg = COSEAlgorithmIdentifier.ML_DSA_87, + attestationObject = + ByteArray.fromHex("a3686175746844617461590a8149960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97634100000539000102030405060708090a0b0c0d0e0f0020e6cba398b3e2b444d56864acd1970c6fd07c4b414ca53a9a9dadfff7fc13bbd5a3010703383120590a201a3cfab5e3c8e8f8012b85529cfbc9016c59311d6623dcaa71cc40de5588f434cfa139c098c70c76d3580f0ccc10386e8dfb02c4bfc7b55a30ce0c36a1c1b31ecc3ed9e0bc3508764669557a8187b785bed0570947657e7b2fceb27a0de27194590cad49b519912c2bcf14b29b0d5e703fd1f5870809e11fd3670747c0a47190a44b83062074414f09700ce6f6525e391905aef9178061c0f92659ff012acb3a710be45ee4d2136814682834ddd31b542e8759eaf5b620c0c9eff9e97b1cecd54411b36cde4e4ad6183505b7527dd2a3122d3793f7d31fa4388af78185054bfa0e45878c43792cfc4927ef42d22e14a72b8e9b396c01f0899636eaf1044fa87666f400d3efab92dd94fafc0dd531e144a56834a566bb9637ec1d4fb11500bad680075a4c91a65ca3b43414ddf823dcb713f8029f9f162b2e99fb6bd3c6a483bb0bb59246ddb5ac19a53d2c7b471b850cb02c6856b5719c85cc7dff7ca25ed3607fba6ef7ce08b02ef0bffe2516732c3ac6d6dbda7a14ff32588e6a9b2d7722d29a00aee81e174195eb81ee2b6275219b8f2e8d65f834a1f3c7c329b119e25202ff2b00561b7c71d291f3d8eac211b80caee599b49cd56ed5cd3ab764571d09f98f2c4ed2a5a6632044382ab0325ae7e4c09962d5c77d025b1dbb2f3af9dcea42ba716e6fa5455d52e6703d052727bb0e97cd91b1ce05d00fa82a72b98a47cdbeb15934c2e735ec8359f58b5ce8a0714398696cf581f85352f5bfde58bbb696e3eb7de8bcfe17ce1a82c344936a94a58a37ffd968e8568bdd24e3e62cc4b94754d8253a2b13f7cb2cbaab91852078624109e76d548bef692e81479f9bd2739736598293076c3e7e2ea0c8fed84121107078a54f6d8e922fe61d9b9855eccf9236a9f25ef61c39f3635f52b976790f4814104faefe0ed52356c3b2cce9d7c3d52c1edfffe8bd551cdb6c44617c41587414effcdae7e934d323f3dfa6f5fbb55623a95094cd92bbc39ea39729dd5d6af2437d41bec10728e31d94ce5740da24563f91adbde6462abc84829915e1e0374bf7ed3ce594cdb18044e06fb15b3245b7148de5871d9f51b9e5aa0e0896dd71a43fbfa4878487e9958776645f56cca873ef9e6ff1a0650234e2c2872ed3d1dc843bf3376c1e977e9ead99ff64a7d1cc440cda51badfcc7165d188f671b9336beacfbd7af46faa8a484aeacd1275e8701026a5eb969fa61738f06b9575c890631aee97511b95f0cfbdc9c89f1931409da60a5b37655bb5b2602351e08d52b91d7548b4ed67089f9ed4d63008de5a6267484c264fb46d6874f10a5d3b48e8e07a7f9e19c812802868bdc823b8dfa689cad4b09c89193f093bd8921885134b190ac6555acb158337225d481ebbce728c40c9c092553aa1aa4f7360932a51f54e580de95f73787355a8b955118573d4df4815b0914882a3c414d6d6ac84bc90a365eceddc53fc895b7c1fb2f73477a26c2356f83f7d91874c5153b37e42ffc87accd7772a8e7e4d95a5083e9e1e1c6b43e5335c8ca65d2e9fa85b399249a7d2a73c83c49767463d238ae84089a5ebf03c76b2f5946df1571ecbc60b5501ed6c7e282ac325553a3ca09698e436d298890fa626b651f23d471557984cdf89762027f55174eac6d1ea0c6778d05398d4aafb497cbf9e0ef288662110facf26b97753230e99276a5c6ccbbd67097920da896158bd66c53425a1e30184c87cdc7faa291a4e20e27c6d46d37238c6973e3f26485c1ca2577b05e2057b91eeb87a591aeadf679b1b5948c8da88e82facfffe9404128fb2dbdcb65d74d3d8a30364df9634c0e89acc0b0b0d9710a14928da8d32465b11003a62cbbd9d0ff90f02fe135a6bdf1bdd92f34957e9087e8c98bc6918838fa198b6a64693616a55ad60c642d4c49d029d9c4c8245e7664ae5f17a899dd2121b690624e6b1fba301832f9c41ce42bbbf190c331751df90bc1369c3fca264c972c0f20ee0afb6639f7baacb8fa29d80499ae765856de67e05ec96a472d8d0fff103dcf36784a16f4c4b56bfaf33ee5b16af7562f7d3a4df6541f642d84101cf84a206b39231196cc3542e76be92d74ee9b5f579dd1b0dd50f2e1788f8ba6f0e02376517c9775e8bf79c9ac8a122219c44c57cb77a3741ba74a992c935f9b236b280d84a9ee0a79b4eb6441505d08ab45c3c6efdb28140acd2a217687eb56b489f0d58fcf96e95d0da57e0805823ded41887acf702a50f561ece8f6620c6751584b6b315f520bfede3814ead807edcfa4d7cfa37a8237475fdc9c4c39185dc9e3ae4cfabc563009bf179fd0e78c9297e3cf24815168849c9b4ebac795d307d26be1bce9d0071e2f8701525cf083217e16016142ec55e38e84812b32a9c46f53a2c824744f025da1e431ae9f9441734817ab0b483116b6d921ff46c0cf12af86b4d344706719907b4583b84751262e5d88ab75ec9bac5fb35f78a158f99cfce999c5389ca05fb0d1d42999040445520bc877ed39b69d01596dd92f00117f15c770aeab63bdf183d9d34212a92fe3190db9a16c3cf972cbaea4ebe4c3a8506f155a47d35e3bdb0ee59da53144ec8c85e547f63dd3b13ce54fe12154226ddacc6de0b136c78cbc31b6138f6f0a8ee8ba1cdeb3b918e7dfa178b8db38d90a7aadb127c5e4825b6018fb84248e1ef7a56829fbe42fcb78448b5a23915f333deac88dca56a77e371ce3907bf24eaec7805d686d0b8ec29f0f55146336d98cd0132caa11ce535e2abe3e41de8e48b7a70f04934abacfc5c22e4ac3d386e512bc198abe7d780b3be5995ad1de94c3d50807f66ef5a086983ae6eb9289b00a1d1e444182f7f89d878d39b4baee79b25142b36e5020460ff92c38ca3e8043f071155fab26e73fcd2f052ad5fa798002387f08d28d57867581af8b253570bff28eeae89511cd578a8bfa00b061c2f35c962e56ff052dcde2b720ef3fae24e10b8451bb7893c6f76e0c10e13f25d70822193dc614de63416e6f254a71bb73722a01125ac60bbc51b64159bd7d88f4ccc20965471f5ac8d9cd31d30c6ae4fd99ce50c98d64ae743bc7b6588237a1555dbeaa3fb1b194e65cfcc6b091ce9c6d7fbcf7e995881376b04cfb29f2f9a8697f7fc7b53d5fc3aa9640557d371b95f75378f5b412d89740752cec2c492e05f4a5ee6340f2556e3e3a1194ca6a2564cf9bf8e724619b418711e12c0e3e5614808232e6b5c56934c3a1d7f3b8aeba168ad346fee80505e113efca66a7f56a4d813156ed86195758f2b18fd14dda471c2a8ff6ffc74cd9ae3cf44d5f3f7373ef80c808cf90e0cfe4eadfeb42e777851972eae910f5ce3ca36fd9c22b443fbd556634bc2964bdb0849d2e257256215fa3ae5199b3e0943413321aba9d929b1a13118c2de56504650054e2512e36342893b84b63060e11e6233b811a140552a2f99349d5fe2f35e945b4d95070401414cce7d5360c47c3ea071c14fa50e413a2e9f40cf2c6534237790d3342426042fcc15a5ac639753abfeebf3dc996b0d9015a220d592f7a07f55dcf763ea31dbc8bda71292bd352b8b74e84b9f91021b1958abe32d7376dc13475e313ab4d981c6e5b94ec7ae554915a189134a810be86243874340c60cae9c3bdf255c944318fc20878b1f84804df05eb9104063666d74667061636b65646761747453746d74a363616c673831637369675912132425625b2a19a774cf34caad4a8481263a9d95132aca16bdccdabe5ac1bef240c42844648ce4512285871b379b9ce00d210655c3f92266b1f7d3626de24708ceaae1f164f5305f26784de8538ee12bfe6b6e01a50670ade123934fadddc96422e8b596cf5172e52850937b8eace485c419704739c7e17985f2f080593168c860776cb0d207e1bae4f15ad82bfdfd67eaf0bc7dc5b0d785c487539bd92a7095de4022253e24878b4cf32820a7a839bba244cd1ea2aabd3270007a6760fb1e38d14ed1b7648fbe5ee6dd0802d0fa72ecc8b78fc97e8cec7a439ef4c449af044d2fa03fd901507cf634f08dcf59e263d8e629ea3d0b541cf53b27b992756de32301ff05c186c6966eea218f5be0cec35d89554d42dd24b733651793f4bedc129633a112b0cacacde12a7107be45a97f4dd70869ca89db68ff7dabe0b7b458594e79f57cd3d36822871b2e4c4c10bd546e7c03421c28fb7f5caf4f164160a0b13fe38a6783953938ea7a060dc3f8ce4b52a2bd3849b8253ec8f95e008782b882f20328beb70d1435e5784e97a3baf4412380a4aa4ad88d6db355b4c8a6a868003a15edaad29bca65bacf44c3665c2e77c138f1865c94fbf85d6c20eec11dba48c1a0b61f96d6de455e8f145598554fd8a487d190ad23eb3cf7aae268efdd7940eaa0d93752a5017bdd08edebc221f460f9ea94238986d066342cea9333a6b41d0298dfb22b6a3c2dd5c6106caed46e164146c80defaca2b705ff2eb0fe429fbb58d036c4866e344c22f764fd6fabaaec1f7f929c6e6ea4dc45b1d92dc53e66fcc746fe4568643e84c76735800219c159b0e18db4d8c72b7e6333a8a6a23c53c8f50cfdecb30dd9140132ab7a60d4862db0c9548a75e6d6fdf0286adb3c0a6dec56ca562572c9c64b1c1730ac5e808fac787ecdf047a9a96c99b2429fcf281be196978c086a3bb82abe2ce02145a54a317318156efa0466f3a8050fd44a3bcffcffd8380507a0c889b55166542e02f67f2e7763f050b9f239a10d77552098e13c145f8f6527afb9fa5134014317a110f2cdf7982e0ff39d8a11f64c81df9bed4a02cc1ef67d01931d509a908c314840a437ee772b6c3d11fec0148e96c0019c868282cd90574712686c8d434d00a9013dee43a16b60382acd9bce0b5554154dd1e92bb9ea6a0aa021a8a7b4cf7dba87a48a54fbb3a6214a3136c0f2683b5da4a39131c11a33151fd96e0b53f297b5e85d705cf69ca798a11df02cd9df6ed4bdf13c97b9539a3ef8792f7e9e4ab2dfb9c93e949e4e350a827aa70508cab57dab4ae9f3d2872238d3cf6cdfa895ade630e77a71078fc79a3c7e7137da43decf59713a10f2a252c2e8b61017ed52864b31f507f17ca3cb6584ce4f8faa19cbdd90c44bf24a4925c64466fc011c8c2f6be650ed0f0164916b886778e335300318b73598303211dd728e7958f3e21a5fd0d815767f280485b0b392d40eb2dfc0033aae7c32be07da65ffee5d917abffc857a2501024ef906eb105d20659bd88a5b4b32f5b871baf3adcd5f73f0b2a1bdf45dfb85b9703a0a6b80a03459374bdcd45a4d56bc54ae2c1bf9ae88963257ac5a179155b192f326a724260ea0fa23b0f02b8bcac3be5c1903cb5d8c3f2d40a7bca2b98dd52f6a03c1ad6568f0647a28bb664a4e230a4c980bd3b76770383732df14f598f569427d25ceab84c3678dd0ca7ab162bf2997cd75051f15b8292de872a096cde1e7c1411568e733a903de9e98b135d2b18ff8528edec8321eab9b62389a8b2541c29a4588f5551cb2beb72cd096cc1826230471d4075bc90033a4b535005eb39a0f0520cd1f4e632518423098cdbe64bb7e6aa6ca265bd2b8493ae0d6cef71c21ac5903ae230f61020a0e5d11d16c1717718d133467c93cd63fb527ddbd57ea5e15ada9b2e49c438ac0e14d367431eb0e56d5743734a517d744ece8aab5e8efa2815d7e942118c554f76aa8b46f3f1a13960941ea627844dbc6bf980e7d0a97c8aceaaa20333b2545526029d52eed1b47399068e87c32b9a31fc0dea900c3708af43c41b09f30e4d66c2be11a721b2192cfd88ddc679ba816c3fdda6567bd9abbc99074a7437d72719a344814cefa1d4ee67159c41abfd99af92fea19e52be812dd53c3e36d14308395f7f260faf37f0ab584d41fe9a2023d066f5db56d5cccb9e77af942649bac3e046ee858800cefdd5421493392cf02dbf7d3dc54702b16a704680c49527117e2a0b941e8bbbaa969578fa4ce51c6fb512a381e19d8aeb70365e68f4ee6452e7e273069ab92600c1ee9281a4fd48f1787f7e81557f0f85e5442cbf6b6b203412babf347d3d6d52ad72cfdbf262ba05942f426db7a8acc8b371bcc3900f86929b0009cf7e1f726ccd6f09021e2085fb3ae57380f69594467d6da8e029043beb9b76c0b7658b31a789420209fca3114f0851c4b81305ee79b4d4f275723caa100bd038222c010563c0417a2b42256d160ad049c4881d3e0884f9c0685e541970583d1964df29e98162f293a766ed27cd51fcd85a0a0928055e0019fa3bbff0923825fd1a5277324ae9be5423cb3344be8de2b809ceff1769422f2362241f64508c6653e2b35ba5a32f78ec886a3689ba6d7aa309e00fccd0ecaf9de4a44f2b853974085d2d1432040c4bc3c84409850f31e591dd2069b218f1764f140f11660213687b68d2058d0eea589739bedf60bb43f21a6f0e4da505c110c5789668ea22ab625047a9189906ffb9dc8635269c1c14ac0e83534237206cfd26fe60b53d85fed3cb1ed948d31f22689d7ae76e2402f864cb762bea8352b62ee772ea7220380ebe453eb270a8542ad80361ab9f265dcb8a450a37e6c03d9e32606bf3dde0c0968f1ac19a3f478ee4968a42713e1071aa58859aee17dd977579dafb298819a232a6d79010cb6230c7e40abe7bed0f52a55db5dbfd4ae0b3e11d3665e849b85eefa9e66304dd52028673f4f246ca43ebce3c068c8f4cdfb983621776029e0cd9b3ccb631c676c39f3adf993f2db86e2ad48bbc63ff6427115b13682fa851c47404fd1cfd3ff9eed30eb930263d124a3cbaf851e9733c3ef37ca699af69732dd4a954013283fa17c6025ce8b303276fe31f48028e9d95ad9679b2e64abd6e8e1540a75a7f4d562e947266cc52d53f24f5101c33b2501c5bba2d6414a79e14a0896d3223c0deaf22e0b8beb59fb878b6fe922d3ec07660aec7410becd1fe526d842600add37db0f45bdfea64194a7aa0ad145822cdb6d5f43aefb00c2f5879d25cacb733dbd6994db40e3ce7749ff34b0aaaf3d4bf36bc815f5f854f72343bf3ac06eb501885ba89de01105b37ac13febf8e599efbd0a40658e4b958e9d09dc78817faf107c3ea7bf8741440a1213cb4785c30c48be5402872dabaee26b3dbd891c775fe202e722c442d97e9bca12373919e600388700bcd3f1a05f8893052f4384712836a0d42edc24a9d487d548c56eaa5d5aeac5a15c8255fa6dd4961ce7e596f945e0cea25f7b51f79ef937941452f353ec50b45e1a734f49cf68f7750d6dd15504ab98c76c7ade85f36f7a035eb4bb1bfc75da8af506466f5f7133f341e8fc9a34942512771fd3f86012ab2048d28957ee23385117fbfffdcba29e941ad0c35f99a800d6d61c2a2f05511e7f154b36bcf1c0ceef0e0968a4e7bfd3c73b87b0443f9d6cb82e111b841dc9efa8a1bf7ba8c4959ce5e0f41476e19c80d2188931bff943755eaaa01e78e8af3f364ae2acf3f083d2716c96c1667f3d4f5694a61c0f11f851b629a3a9aebe84536d2ba5c26c71d4badb39af802732a80959b476002b246721f3499721afbd6d979696562a36c9e59535cd7e815b6a806f676abd3af06eb769db4f67b0a918950dc7e5bf0441d24733adcbafa655d1579a53499dd5d0d3badc8792a1b6a65ccb37a9f273cc9a5c6ee705397a5606683723d0ef0f7fa1ffeed41d461d505f382f93807eda8f594021637304ed01f4dd3869ee66ef2632c3c4a7c0de5ac7584d0d82aa8f5113215444fb55b1295e585a767bd1bb9bc838258edb5fae0da1b3d496f501a6a871e9aa66abb81090b6b3a4527d84442cf22901f82b86a171e76abaa925d2f0271f77ae5c6066c105e1fb69fa7c5da29b882b8b08586ff550576e9886b40ffe15fe4d8b47d576f978593b7a9289de8a2682c742fc3071ecfcb3b788dc4487f509d9655a714469cf601144ef75918fa50140b0aa54ce961228aeb7821af0c8481a286fe7f328f65498c926527f38409d43dde957106456a8e78ad49362b27e493b887fd2575d37cb1be5602f716a1b61b2e27faf2eef42bb837941e3c6ab32ebe56293592546a80d080e15ec1313a3ccf0ae70b477741767575e2ac932d04431f15e7b8dec3e5854ac6f288751834f23669f9ab1bd3b8923d599226d6d18024bad6344f28944205d88bdc0d5ffcb1e5ce1c951be1a12a9b498e0371dd55a388e76059ddaed40c1a2846f1a345c07470b23859e776324034f3ac30d288e175c46fa0c20fdcf6cf6304bb61f87c73ad121a3bd2d75e66760378acc03bd6cc113c60b556ffba25de9167ccff3a9c8758bdfa310cdc0235a78ad41aca8a5b990974b956cfff362fc6c6c35f1959fe51049675aa21d0e244c34c1b74fa03a953e7b175538d963213ff08b116c1b8fb3b94e27522f207e998e0630ed262ac9f1946e07e028fdd4e5397e568f927a00571714787de9d6fc39eb50ec1c3743bc3f38f5ba3d073b7e736cfc36af7b3891992bb59f8924c255cd4cc4ae601aca028d76113985eab04d928b80ef864521dae557f00ca4a6ca1ab8e0e210113f337bec8b7458f487b9f0e9bdc7199647431e25d8cd934734c3251bda45f39c8c21c84f2dc22dc436548ef3f13c2b8cf00f424ecdcc31d60b98ba70a8e2298658d598bdac444b5dba3caf656f85a496d6294ebaf18d4c1da330407ebee3765f41daf1cbca396d01c94d0515ef670a75d2c8c78f82eb3d8224c84cf87f89bc5bee41341146bf935f49109a063a3696ff0e2cf085fa600e2fe0696699c9a2650dfa0d3d7778b7eeb460e112777b032f1cf4286d1bfed1005b0454b71ec8cf7d89d6a7aae2ea0c903dc67c984bd1039e67e9bdf853dc79d9c5bce18959e89301918580cdcc68bad4f603330994e0a4d3f692f4cb2bf44121a7652b089863cce6569bffe2adf077e647c83e175647073dca31dab470610d99a75a69bec07a957b61b4f8a1473991925319ce8fd3135199672240a641783678214720f67801a265d9d78bd70ecc14ff81991861e93dd449272f7b749c622028a90b7511ae4a975ac44aafb0b58e1a366a7fd7dfa8ef30a4ef10838f53904a6b375855674cbe31b9ba22863ebf3a3c1c5e404942392f0495cb241d9b6e29612b365eeb51a64b9f3e8af0de8916058e7a0e07dfec4ff9ed8042ecaf5871453a7a50541e120344071ebf77714402ae5e9df17a94665f5b944e17958c412efc061b5756e8d1a0100ab6bb1d49ccea3083d637201264f024772f38df2a3f5e0c8d7f4eed3bb6476a3bbb5f478685052265bb94d0940f2ccb2491056b96cc039c322986bff243d0d1b5950cdce28a7f1fbc41a48756b2767264e065a0a06d627af25bc9b007218a56e1677019577f5fc3c72175030270c7cd09745189291fa0028141ed495341966c5d444b3f437782fb24e6a3ca749b23f267394fafc5297f297e2826738416844604e2cb855e119402883b477abb02bfacf3ff4126a26cfce38923417805d1f0d5cf7d5881f690e411cb63d091eded3f5fece080d10a70949f5111292ae945ae4d3558a27eef869429705c162a9bcfe47998f79454654edf26a6edb821d7e2d0bcb223be5d65e0e9ec3baffc2d3b6b25e6c047981610e69c9ef57a986cb2c6766c9aebef471e9921de69d7941228620929b5665d29ae2ce6cdcb1b23aff68aa43ddd9ea304873791f27af69daf7d936330ef43923d4e24ea951a9bebffcf5a236c885993dcefe56ae332543f2d4872fb64153ba3a206fde00311d67c2bcd76d3cc9bee17b1ec4d21c6a99812f0ed2c539639fa361eb9dcbb97108ce65a2b034bc52ced199ed47d0ebb522538f411eeaec6596f6baeb87c813eccfc4b4a5fc461321a6139194b00c6905eee27963ee821d2a425e7d8a52617097fb8d12a9eb4ddf2bb0d9539361a6c423e25a7fc0e05d21a55fa76f5ce714781bce71313dbc8e363f883f744dc81badf95679730e3cca8d591b40e9990aa39dfa33fab7d3b4675a124efe7834bc848be7dc307eaf883acb58cf3d99fccb6b2826ce6bb7490fba7d738857cbdec37635a204a7c9933993befa84ee21a5a0958f9130a995ca97ae018e8ae196f8ffb33c7a86276d1487a9c56c51294779e0536f1f14880eae53de5578b13eef50f050bb0b40e1d304db8e96264a8fc1a2c3a4ba3baf87ea1acf0f710454f707f801a272d3b52d9dff8ff0e7397e0fd0000000000000000000000000000000000000000000000000000000000040a0e151a20292e6378356381591d6b30821d6730820b3ea003020102020220cc300b060960864801650304031330673123302106035504030c1a59756269636f20576562417574686e20756e6974207465737473310f300d060355040a0c0659756269636f31223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b3009060355040613025345301e170d3138303930363137343230305a170d3138303931333137343230305a30673123302106035504030c1a59756269636f20576562417574686e20756e6974207465737473310f300d060355040a0c0659756269636f31223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b300906035504061302534530820a32300b060960864801650304031303820a21002dff42d93201c9d9a71743e949abbade8dc4e5908f4eedf412e1fdbf20d65a570ae5c0753bd1de4727316ab2e2ac4fb5bd319cb2450986727536241b4f9b3c97005c4a2ffc875165689ea47a73e7e991a4b286d45eea4487280194ca19657d9a8fd04019a319f937213b06baff00cd1061b122ac3fae687868a244394b9651e6690736b2fdbc7ac861b595e310b236f14c79b356eb7414de6438298b29871a795ce60c15fdd22c4efacd1e52123d60b1a3f58705d313aef027a2d5fd5f5e97038b85c984beb3b628cbc7726f75bd006b9bda7f9470070668e79a1bcbdfc5bd6dd89a6cad4ab8938a33694ab87c4aee2e001dfb5c09d221e34b141474bcd75f897438b6ff6301bbbe70439fdae599996b819989e39205292f1b64ceb18fd329254878e22a8a12fbb85e956741f7e48bd14676df89509b7ec612d3bc25a2ccada38e524402227e0194a3cdf877208cbe15526d9a8aa4e6db7fa2d37d02da174c0ed5a46d4b36a86c7e3da107ef0291f6626575093298172aca9b52b6944da1d6613834b028848e29275898d122d92579c8ae4e12388a609cf711dcd2f97ea478b1074162fa4e8c1ba7ecb4192901816830bbf9267a944f98d63bc312f4318403295aa9b9c4d82d69dfe3b485ecf5c87423a1973591f72fbed312d3b7db7892debb8deb93fac1a151abb228092fd4f9a310b08a9dc809e1a57a16a3fc1aa8a2470c0780d9d5a9ba92dae069e2118ff88ab8b2c1b3995425582f860c8224c80eb3b176b748fd6e8c8352829ec91b301d4a257cedc55f45569dad0fc74c80710f4d7492a4b829f4a40b234e4e64fe6f68fc622bb6c3965e10f53b0f5ec988dccba6f8b3f8f016a605aae68185801b7067e1fae3d2fcadb96412192b6ce1f48ab6963e530bdcceb1569a51d6938efd65fe5c1c6ce4f738d96a656dc5eb0a1ca3cd4510bea5ce39074a2c4dcf673e1962ef06d76e7f8106ad287e64a727053839b528cc3ccd0611bbe17c6cff599d5713ef24aee26249c439cb220ec782d0cff82fd4c13866d731aa238f6063264c35f88561acf3f5761a9de385b5134acdedc48d489e999eeeb928ab6c53b3b77d18551732b8c8b6d61fa82abdc2b4922622b25af6124bf9f35f790922ab1fbec84b93eead527cbd89bfae51efee93c17e5a5e46591e141d94a9d364f089ec29c02b68ab259400f2aa5acdc69524fcaf8c8f88b9c32559a0456e3588666586bacd0e9f709209cde5250156520e97b4ff090a0b5c273005fc5934d7b1f4754726d6a4a99a3fdc924d846319cf186cb3ca5a4254b12d4f91bb9744f3388f185c9f6e9a0f9f033e26174d1571d072038c8b8fd19fd90d57bd8822c5b12e5544009dc2b0df3b1df470a0122fab79c8fef0c396e4c13aa71ef7bf611bc990bdbb1af68ed7e0fe82e7e29cf84f7520ba0640c546714b33c645abb38da47e9ff42df6891e5e07ce1a90f5533f1a668e5e07c2bfbbd956850ba6ee6035685bc714fa7b37731bc92ac10d84e74291354ad82d5ca2fdcc771385998c528c1da5af3d95db65e80d91e108aad0b50968a2b43538d4ff5b7c46a53749d65022719c4c0a91005c1498c7ba5cc895d818bf33e404bd0ad6e6e2559645bcc6c29e7a190175d3275617cb4e37c34e68d58d2f4f6a0e74c9aa1b8845975821b7c85fad1d63f38dcc112641206df4d7cac82ea44edf4f8b9d8c343e3c5782fb6c458ba8c23f408d2f2d546ae5be73f7d0626621399922766bbe6517abf9d7782a5da2241e3beff7c689b409f78f910ce22cb12a453006e6a11f1732a7beb2223da354543ef1ad6d50d6904183f7879035c7c7a2e5368415528f3bcb50079ff207d246ff930da0cfce66d81ebb39cde9e9c5a217717001d08a7b9d1bd8269f7fba01a44c0a5942ce2c917bd3fff801d4f099cba0acbc0bdf7cc56ad12d4c002663462ecc368b7a6a223594684417525dac69b9bce7ca7e7736f8d3f80c12f910278c4d521967bbec598a31706543efad717a58b3032e455ccf062386017e002f0f3a8c1fc7f44d3875f430f957cb7dd89426a0166abc407867636d66a240f8c665f164c3dba2a9f73402178ef1b06a5396d14c804e78e07b0e24000da28b3b819eb002127578cf67f3191a30d9ab23f8d0782c17eab266ad345a9d9dd35731c0262e8492f76fb58414b38bf05915570cc0de3e04a82e3d0e77434e4f60214e270117d62dd56b3100b3cc8395b0cd5ba54a1bed9020d5effdbc577a38f4eb3695bd0946169a359af953b598bbdec6807f4b2194a3d6da4a3bbfd938a0fabe9462bee882f8e9a21dac2ed0e90c8cddf44abb0976959f8df0fb08f2066d6d1c63f6a1417e9eb4473c7018e7e51f358817435edc5f97d954f200b6de33e3d88827cfa379bf942b8974e24d91eef5c62a8b2a50b44c2385ef1321586b61bce96d59fc59a386c82adb6697b87c12ba55d4dc5bbc9aba266c366b684206567ee6391c09b73cc1fd4d4925d9c45db23836edee51926107c97eeb68cec3f3025632e3e0cc10f8d2a98478db3060c1a995fdd8dcb7db274920005c685dde2e66c84a50e543c710bbad74b2030210028676f462a2ff7273d3cb182fb17415b896d03b9fc88ba5ee5938a105518318f1819b8caada45d0a05e295141b86aeb0e8eb7d337dcf6778ffaacc721d7835bfe75316e82c0ffc702e45f2811f292256e087883a514e7298dcb54e299e757cd397881eab3a1197027b85342f74522d0532747a66c0e8123680578bd36dfd85556146b36bdfce2d23a4000d802f517cfdd1232625516e09e7d9e4bf0b2bda433a234b6c4914d5199a6a206c6520d3cd93b3c28e345864ecd1bd0a019bbd3c5bfa023be725568adc7ce05983e7666af6f1f041a49e02f3dc5fa05d5480943991457eb2c8fb905a642a01bd3bad683b0839e662fe07572a2e4d7ed66d79cb66f4ed2ebf102a69f2f5db98009b0fb2b0343a1fe81a4efbab467e047380df0d9e81c8404333cc320c04f8ba6a21a940d77dcb241fe9775f7045b98cff362e7525fa6bbb6e67c3def36e8bdf0924f6dfa6e950cac459f31b9dedcb16582df9219f687132c655ded0d6dea24117d6219fc7644b9596888039944bedf5aa7349c0d604c04d7f6d0871d5623681a195021c57ef5590284930acc714015b795d090fe997ef89130caa1e889b1f8298a80983022bf2a1ff9bfe32eaafa8be1786160442a3f09ff2ee646df684100e05cd6bcafe70cf044aec0b66eafe7c31fff5fbef5b3d51e1fd8b3f9d0cf8384387b0296608d8ebde7036944dc314398fd609e6ec4c5f993ca6a146f1f799c4db41bbd10264a017a5dbd131129409819b26ad5d2fe5983390a93eea30096841ca7d409d56b24ce77a5c332fbe662724bedabeae529703802dd23f5a9289ff37368ff5e0d854eb8c92878ff864c35e412a827599bb949783a91afb518fea24886165e25c480d01f55183cd99d7d8c92bf6dac3d4f90d16c6115456d91f6077c545c2f38362d4394bfc196a8c9e951eb5a880d196543d9970213b7849876d09c062f7c4c656825ce67e1345e4a1f0b6e8e9fe0a337fec4c3df37cb5d15b593d2d7a79f19535a9cb006e8436d482996fb1a9c4f146a88ceeedcb40bdf57d1abe58bcc1eebc8ffa6d05bbc8a164f1bc0300b06096086480165030403130382121400b2c94b55aac1a1dade3fe73dcbf2fd5e46969de54a4f062ea779545fd90ca3dc3e7cb57e17f4c1ad8aa09ae87cee4da6fcaceb1e9c7427c352c04f0224a672e4557523a62470eade9325bd3d1039cf954b5cdc7715e47fb5c99722022b5cb84bd9470cf46dabee8f0f9bf16c92a0692009ba1284f207b3be0ca1627e95b554417ba7cedcd697e4b42a3cee3e309c97a7c0bbd5d34d76623f750debbf3bb643930c51612cb107c9ad35cfe151a486d0e6577b91dd71bfb726178242e161c072ca983d6ccd1e1ad7cf95ea8c490b3d4bdd42ba42dfa503ff3631a872396f8ff40113219f31cb23b4a4dcec42ab03e1cbde3c3e0c99e475fd191e064a4bdfcec95164e663ca49a3ecbcefc2f10a4f4ba87123cd0097b8149f939b9edc46816903800ee7d4dc1981ca640ad7e49c771b54044a9c9c56bc1086cadee590939f238d43476110d9190fb1e63dcfe96b5bc8b03aed83b4cc45fa9abb6b0abb9b0dd45f645272c1d5f988ac25fb96420121d4ab3fd0d55b06a4176326ecd99af25330517bf33274fe7d507790f5718b97e99a70df7a471277e4aeb47d4ded89fe40185b14470522f6a8fc52af7b1ff590f0049c31d8dd242e7b951fad7173915a3f309152de064a29941a691e6ab7e6423fc38c0ab33849341b2703f5ebe37edb4f2ff7fde68ed6a9363a6eafdc97eadf1c780e37487ffcbf217434ba70776063d4fceb3157f5765b781727dca48612c4d32bef5498cd1d855f3f29db263fa50ba8ad05658e9c8877c3b6e17c8d7042defb44e1d81040991b8adedc5256bbf4b229f5549e44cee82e190e53de8d5197c191ff11e4b0fd31f9f99b55ae8f013bea5b4bd939758c58ba43ac038fee6b2637b5d9b8d5b4303a9084f32da445c1b52bcd620f3963066aadd0178f4dc9539fa6e28732671f7a275e1f5f7a95ccf022a8ae4350ee66566adb5438a928dbfdd7b5cb8273e4bd0c2c17fbc55905c8e59ca6522f15fefc85a8cc4cd29b84f8abb3febedc7638eddca607f4862c75cc77c96f07d8191b1bc11514a24155ddc49526b626b573a80dc7fb4ca863b50005eb45eb2f06788f37d2f766d9ec4e62b2e420e5b33acc706a9260d10248be7fb94842799525473a2218a56632696db3d2459b064672d07d55eff21219d180d8c0a61e1665da85527ecd99776742b73a873f4e34bc1d18461990bbed7afb83ca641d83ab3f139def5bb2407177238bcc5587911bba67a503d795d4bf04bd55426ce88f48521bc37e6b097acbf5dfd75278a06f7b997f87908ed52095d15e7a9567b2c6a939410c7b88cf2bb84990b7dab7e972dfb4b14638757a024ebc4084f332c9211e1734a20af68918234cd6a35b9aac5ee31e902372299bb3312eca5fa85b68ca2babdb7b935cbcaa1ff9a653f900916b378e328fb1c8efb228348b64301e889bb5a5c191b03a77738ec6fb8af0a7846b096d928eb5f66a9618d34a316efd223149a37bb5e4605c94d64153ee61783c4cc49bacee157577a256320f5f0209b9781cdc7059da08ab6b6e15be8ec270d62ad5ca590b551560e9506f3a12d7b27229f9a247a32e582f9f7a5281b63a3928c5cb8f0a7e4d6c5db17cdcb351f4d7b0d57ded3be6fe09cab4c4d2c7511580c60973968ead51c8a05a56c4a482c597b590d5a87a07c6ce94223b98a387da50674b65dece566d0166d659d2addc7b4784cd33aa543c3a52710cc4c975a632718fbfb5b376e1b140bd125e26d3d3de79eaa3a10c6df12b9b58ebad5d9f117ee3031489f7b49067da251cde8be8b945dc5296bb091f02cec696b6a48734eb69ef25c8ef2baa6335a611d8d1e1ca6161f56e9731416229ebb53a3282d16230d699c10668935c3b88f5e7c605c8fb80e2d4aaf43bd71cd64a26da77bb234fa2fd49879a613734f738444db5d6c08265aa8b47c4270fb2fa4de22c86a4b2c9ac9fdd9511394dcc004e825e3d73d23a06f8376f30f5298580ca28070c1ef1c28cbafce368369d90144cfc48ecc94ac3b5be6dc809db3d7c564e524ff4e37334566d73f32439692080300f574d250cbecefdfd99db8898d18d5055ceecea57259ae55e418bdfa7925e4549fc0d6472b28f81e791af60974e526b6c88c97a270268c6d7350d4b4479362c20b47cb9af51427485098e7a29ee5ced4537556ebd91e6adf230392a9ee1ed7d4444f011c157046ecb55ac7195fd211fc08f8835f93d4594d31154711cc712f120a6d330a4ad1235847d70ab530eb59e454a7f3ae136d1465b15d8173726dc00beea5e064f99733e988484fd08de16fde0b1992adb8a83ac96145e41e3c235cfbecaae0f5d408e004bfb18489ebcc15252717342fa4a2c9f034e16c50876cc5fed925af70348699535a9faa8b1c7e58d1750b7f0454064e77f82418a7e77a34f5bd35ff3f4238fa7fff9e107361ae8443a40ce679c8342fc403868f50076888c239e3362473dd7085e5a5a9f88d15d42e1540b7ea61ffc3bb91222a346818eb116c45714090731ed5e808549a82456ecf435f71ae842096b44b1fc3818d9e84dc1e238e03af122e6ed8a132c765b104ffa2a7d434338943a301d92d12f45df3bc2e633ce94a4c3ca3cb34a66c77aac01c8d488c67d1391949209eaa392ea55da8d7d324aefa46f374fbc2e618347c51e9a3fc71678d76f99a12c97a77c7aae358d0ea6284f686f3358beac4210254f6a5e578cce7ee47c925535d1ad8446ec886034a51ad6ef6427412b301183dc4727a2e45feec825432c2e4e784bff971c08e4405f227682e75a4ad2f78931c32814d115495aaa02d5094819e8c1ac36f4cda03386843f9543d2861e604c234d1e02e9bd3b425f9ddce25130df69771f953de76e51992d46982008ff3726e9264855fc64d01e1ca5af20997a24f8f5099527c0854d9129c0dc40836c4b97c0e47f7c3f1f339df4162d4f1964e6c1e7f447d91b398fcca6c6e5f37fb01f64eb75021dd1e2c208c12ecd55ab9185a7995f16b5b58f2fa5bfaabb63c33934cc754d4cc6f753102ed837c6bc4b14ce0046273a56dc2ef3edf6ee1d7581b15ef3885932d9209cf5282dafe53ec2029a2230b1f9a065b9fae9951f677b42919199959919b8c8953641f64a0946cedaf0b3500900939ed84c3b1a66e525ee7c1b35d6ce06bc74b4acd910c55f3407af245f6056e90a84ee519d5b65c5ff26d18941cfde646c8ec7577236b0c927e6f033f1a8a2622d31fb3ed70435462f407d8629e00085ff520af0c07be58a5daeb6259f11102e3b105a66b6c911250e6b9f4fedf0e1fde001776a97a6281900fa91eb36de4931d5aa27b4f6182c34e153fcb518468b0f5d42dd7bcb7148de69f434bab677cbb2e38c7426d82fc8aed47c77e74cd5d6bf0b458b56d223a72cb87c8c0b49bc394798803aa53d504647d7719e5712f964645774a5cf10b3a42220bee4889b10bd0ce10645a8daa5f1a96565ba2b77b44ab831df3e8ae86c12bf705d530b98d4eb2d5799f1738f5234679d41be2799c5f5589057b8875846d1feb85c53ac7cb31d9a8356a99c5b2c75bc88152736f0fe969b38127085cddee190f1e97f25e8c5860454789206c3caa19370b355df7122b6a32bd26edb345399686467b6e072845cdc44e8b564c4aeb31fa0a497d70e6af9cf47474f687763ae8be06cc2fca2957192c4dca9fd34a4ce7a15f1456b984fa5dfd1ead901543933f46bebc190f8364f787ba22a6340587b6a9d4c6fcbb8850900bedfa3ed3bb27e987fab8573c4bbdd007511225f79585296a01749ea7d22af4ec599c7dd6b00ee8cd0c3ddcbeca6d6e41654910971fe1a5b956686b32e713d44c1e0a510b2075287d2198ac3ef6ed5e519cd4b8ec5998a6782a044810861681c01efe6cfae18fdcb1434328eac7983b549a8d57cabbac0ba824ae82acfbb4aa6e9f9933ffd46f2def304116f2f8c362ef1856aa66d0f790816dd663842029ac7953ef8ea240ec4335fb31fe7fd15ed265f0b7149daa652e2125378a11063071884ede0fb7cd8466efb085b030bbc97e37980744df21e469be6189318ccbc1e36f0d842f7ae68fe086ec2692d986c8def0c1b1a2c04ea377b648f9cc64dbc74683a325319e71f69449b44d5f04968369b2fff2d2cce0e7f8c7dc65f8254b4aab1baaa604a36dfeed1966d0216e5c00505f34c65b0572d0798db96ee469512757cfa833e1d0636893830103a272b6809e94338759003a8086cfac564def062d463a00572e800c42bdee71b3373de6f077c638a0f26f866a76a3d2afd95dd607f6182ae77b8e4ed137042272943b95d83efa9ce36ba65d3e4ded30b780e1478bd19f14515ccd755595459dbc74ce159e74f3bfc424631802bbcbd6ae08e14e4a152e76bc9ec68d5681e86420f00bcd83658b91a59dd506aca94de8409088e35ba89c69af8c1f4ac67e590959bd81df8d0c433af41da5987ca1b191e9e069a9e22a4f722e91d15d4a24c7b067b623cf6f95a84e790fc847d431dd9abdb7878345549f49d74fa219a87c28526cab553b3b347ec7267d8257c31377b7841f9f79e13747b285a0914a8c32e7d90371e000e9cb986c2a92863f9706db78f811be81e82230c1fbc3b861bcb4f452ff47938d2730c446c44e6235d6a90eaf7cbf329bc1f716341aa862ecb77bf9ff5222b71fe993de0bd5caa4ef374ea0d7fe73695a49e590a9bcd821965d6f610199fc81acdb2a6dfb79a3a36ded244527c73074cc9c94fba57a0623a1be619234bb6fdd59bfc0fa6dd6b76b79130eac3e3e0349ec4d76f23d10d1b69c2de9b1bd7b5cd82d5a095c92e29ca285e95dd2adaa042c740251471cd8be0ebdf6d847c8b3fd6c2ab87cef28b134061ccae920d00b1a6011ba863a688d952e9e8976e7af4205d406710131089bf90a85cda7c4bea595bbbed249a5e0f9eec211e1dd77ec93acb22680f5e104578fb60dacd6771f8e4c4d58c7d64721504f3b026160733c60130f4387c046cc8b08e3442044e5220b2abeff7e44e68d85b84ca7df03bfc69804a85fed7d073a53b5e7d896ac82fe0dfc4d112cd44e5a202ada89cb58f87ba03ea35b70749c5b2f4a98c664acba035a05fdb20282e13e0523001e4fa7a5970a069cd37dc1d61a858d98061a4e6c48f43612cc1d288d7f80ef51f1033335262a1dfad690a0f87bee53d45bb8ab560b57de55079a3a0bdf490dc3a9973c42d5512eea14f13faa17c24689f361ac3fda6bfceddf6566d92b4b636b9d3a63d20367251504f87586d6b156d3405888efbafe6ee393d1b6c9ddab87155eeb5347a097f595d099e7c89e44b8cc44d49dc65eb5923e5fe286eeb948fd13ac7f49ef9bc627ed7a4ed40305a6ebac8310574f79d72a98d1384224c70d4128600c47a635d341847bb0c5c04bea27b9f96ad162dc4d7e67a893c8a817fe08229182160837a23acc4f9f9dfe64d5d9e8b77b699db52f894101fea8b86d6c4f748ae60a8957a488a8e42587b15d909cbd751ffb469aeb98b6b6aacab127b4700f34de017a5e98ec986c254fb0adf733aead64c959d69a43e19c469c3e5c23476984e6290664bb4d094fc654ab9a4af498ef0b11886d44ada74351c790a5b8d8b9d40d69cbb9413aab5ae4d8d2a4a5f6cf57c4782dd6cc835d1f7130a426c46db571f7722a1060a27bf47ae52c6f7c060466f5454a4fb117a7fb8b66e429c450eb467b020d5598756b616b82d903570cd94fdd22326d9071f5e425fc6eebffa1150f996d51667213d9589e6aa0b90b623917c566c262868fa47dda2b15df7564f3679117cc38e4fdc6b04f81c0413658716bef3e45a64368397b3ddb1bb23a608d97cbd9e5f40d5569ad2577475322431a54a2a755fb219c6c428f459feb4cc2fc2cd997a2ba2592b37e7ac5b8b25e054b66eb75ff2268305d0b08997dfc02efa89d8f583747a25f81c7aee10f2efb92af37d2ce4e9e66464fb3d1ba6f51cef694fb315043978eaa4b92adf03ebdab6bcfa85d54a2c78d3179d67efd709bbe724b4d802047afcd4d8c179b3eb1b7f6e9e98100fb38f4d5942e7105f2097ed242178d3498fd413cd7ee3728386a8fb08c75dc5f6fa58aee4434d2c1487070e7e9fc93924d765f26ce01c2579ea07c1982a715b7ad15c2257378b4f65da8174ec83510e6ea4c6d54b8735e767295c8ddd2c96b9b8b32c6e2a9bf4aa0f5eab5414dd508aec4f76a7847b5fd33aedb96cedffe7c65bdcbe5ada4a43f470c47a2b146e3eff29d417b1ab91dc8cbe807310dd77dded052a2f9fd1f2e583378342a02337b70c778506ee6843ba02c7de58d7cb76f8059f50af8e1c27437ebb677553babac9c3f3b6f83313d4161e161d01908c181ed596d4942cb78b2d0a1ba041ad477209f519e4803a2c13eddec15ba69524a479c296f83a97002718705d38024d61639394d410152e343794989a9dcdd5dcec1c2e3d62707e848c91b9def62e367da3addbdfed18868896ace0004e536a0a4364757e8a9fa2bcdfe639808aaebcf600000000000000000006131f272d313c42"), + clientDataJson = """{"challenge":"AAEBAgMFCA0VIjdZEGl5Yls","origin":"https://localhost","type":"webauthn.create","tokenBinding":{"status":"supported"}}""", + privateKey = Some( + ByteArray.fromHex("30821338020100300b060960864801650304031304821324048213201a3cfab5e3c8e8f8012b85529cfbc9016c59311d6623dcaa71cc40de5588f4349f1233a0862c0bad18ce52e3da138a7f088526bc6ad6e094eed56b1de122767b341f660695b83bcff8bf6d0785df72b26cc730c717d7dc015ea3cea94d4a6718f8a61d6b105773d89bb1eb2321bdb74e266389bf5291e7fa86cfb7eb764a76790b388089b651131662140801089564d3224c63228d124501044232a19450193565521270cc24891ab68d54088200a54424328489a84803a46008428284b04044c269e1945151c6200b9771011860c03644d02084cb966ca1264613072624446a010205a0b6910c116edb288064b81124310a224241030770901285081068122310e006809c3420c31444da92851a1411a136421b1222c1109002008e0bb9880c464d8b129059188c040821d0308a51960512050283248e0aa55109a70113a50900408509358101158063428e9ca83013a5308126720247925988255a042202834d89908119055020028264102ed9368512450ecb144043486ed182490237004a282613282848406ed946108386611a195204920d9084705b084920416c118140d03242c3c20893206ee4926d1b4864103468c4022d1817811bb14994184648323252402c02963142028e50424ed0c684c9028589208092288441462c12c311432485c2a22d04c28503497210b431e2305089984ce424650497908b240013390c21162a04202411014e62324019353190280e84c421d82850d304729c246443128963080a21a331d1004e000941a24225041986c986680aa500e2c8709ca004c832488198710a9225c0b03108a181c4160550c889448208094090c008901400310b4362918870991209cac4419c18701c898901c384621220c4304518862893b6801125709c284d88180e1b8664e116321c092024948ccc140cc4b021da301101412d13193019a52dc384499036281c41508bb484dc38462413001a08268a34720b140c0287040cc9618802008124022192004a0201022790ca12450442911bb0509a168d63168014426a19036492424cd2146902020e934609e31422db088043c290d3a6695406714010000ab04cca26085c30088426845984850305864b167120480500c8004c206a14b851008471cab029d2008c1ab94dda164e502609c986291993912134812138200029619c040512064ec1b20189a2244ab29019b8601ab381933864d2368edb008010288654224a620828d3422812378cd19230d9c46d92b841db4460e0b870421489199805d0286c1c978924011013974063888523c6859988011a284121852ccb38480ba17110a96543b00c0843809bb43119c92819a60924c98559a86492801102434062968958c6498ab48103836550982dd11645e1002a21a74c2209890a132901124022a24159864464b2305a0211081021dc10846024490a926858064e22c011cc446e1a308101086250c60598402d49c48492a48c1b181102484563c68110426e629865c10624c8386c142480e100411ab12981860492a885e3082a02306259964ce1964514c6918ba20120a06cc4064e183370c0260dd01602014965db2261910070a44621a21651e4106e14132aa09264e1248a24834cd8122aa32806ca38650c804853b061880269e3482664308c20c03100168d9a406514b00d1342080436641c999012c6611a17625a120ee33645d1384a59c28d4098252225240b297298284ea0360d430866d0240ed0368409102613406102414201036e12359052b408119605d3224d83364cd1a24061b0019c2085a29490a2420a501688a3128814348509844899c02109b431994604a3282a1c280ed842090c2820411001142370120768524249038425e4b88811898118856513a881db14410196098838305b8881182746993892238569919680a3060d13454d1b2985001891203564d04481cc120112b768648864c1262a92b0609830064b348a0b39451c110cc2c62112228012087120a0218bb8309202508ba86d4ac42c194622db10658c222210053083024e09242d01a96dc9a03050887108a9611916898b108852a648999641091542a3480a02362ec1486904c55163380aa0824c5b028522414a01b5445a88100a8528a0440690c4516414665a8400188231528610c0c2005826654a80451c316614438d1c14620ab1840300810c926124a569191540dd31d1d8694220c3bc9f727c0d113d1c083a0431471f14e9666be672df2f19792e5f0d0f98260205809dfb711d3190b0d77df7a0007e7997fc9e8722083935caf36325b3333790b3eb7abed9ef6ecea1ed5f73982981031ab5265b0e395ecab7b5a1ee1bb9f1dac8996006b7c98aa5f1faa17babf6f46c0a8863008db50845820fb23dadda3586821fd8ba83bae37d5b16fd81961c326476a778373c9413f105a9a80b56914105f44be17c8feae02e82fdf7d4e2631bbfc56ab2fcc0a2e7f35b22a26917f7a621ef8b5b4b216671aad14ee07fec23ae3901173780eb90f1f4bc0ad2a585524a9b8338da8f848a83116457182e416a3e3cd5c6afb565b2316878ace2479a7716e95dd50a310d8490d60be7f635baf6fcda93cd95eb83eee32495fbbaf0469124efef7fa6b6f89bbdcc1bce937ffab4845bc41e122f1d3431a8da15052cd576c998c25a8b267d20e41884f4606a6169528cc0b598b9f7e99673244769a93837ab36f9117f013d2c18babb30955cacb5cc7ddde8ff130357e776b075bb67f295abe48dc60a8615ff22adcf9afc6b41fff393bfe4e104e4df0e1d76788289019701d3b687aafe6f42f92b85ea10142e5af9ca859e9689412205928af58601cdf6087917da94ebb49adf62c938061cadb96fe3b5c239a78d025a17df0d8144ba951a7f44e78f4ade2607b46dd623b3e6616d1c87fb4244cb65049272738e4fe6c09415a7d8921ce077af9ea4d6a0a484205fe90d031149e5db5a1089298671078fbd021f50e6ff3a9219e7f5d91a374b2f2e6476938d13c5fa9130e656c769c4c7f534e79ec590ac23c36596c7bf82bce57dbec96667bf5ad424463ca95b43b7ef64886168736b56d2fe4afa68e650bfdce489b6406b111bf4d6b21f222fb713c933c2feb6c0d8a0046183b422e50e732ced19b3219a4dd54451127f559a094b9f910e63c9b33fd10c5c3219657284b6b0a6a1cad5da383470cfe61605e2eb0fcefe460b2ed15bb3f17e15a13180224351f2df81c6b80bafe16eb55bfc705a80e2613e8feeb5d7cb87df8158aa0b6a3959753be0320e00de97532a7dda038011910408adbc07b5e1ce6d0f024119a1f9900ab0d4fcedc74d5d583d0f77345597177fb0343501808beaea3e446b0d68e96c35f9cf49c930fb92a241951965ccb78aa69aeb4886bb6e762e77b1fff8695fcc686921c837b52b7c6fdfa32abeb29cacfcef0658bf82a175ba3edf185b058c0e6f94351d5376c57956e67696ef32120a91125e5a44f80b9fcfe26dad681fc028d80ac2f7bebd9f2ff63fe614973dd23559817821467e6aba29726ce7596be066c8fd6f1eae55440265952754c05f06401836dc4ba5a4d0ad97cc35272d1fbd4941029d7e783aea444b51e0f8314f611cfd30305a37b776db070eabc68d71592f5136b7a4b8fe00c7b46fbb83a7b06fbcdb69399565c4a16f3191dc7160bd95691560426609bc34c0c48e24a2882a283e08edd724047a02c81e1919fa55f1eb10fcd02ec1e201f310d138cedc4c3679524a63a7fc6cdddbe59ce73888a00a3aef7a3d9278f031dc9453778394a2a8b20773df7ba921fbd5582d9015bb40391cbdf65cc24230abca0c1c7b80edb4a03e680848729f8809ee7ba416e151898e869e9feb72ab264b10a54c2b8524558ed70f035cfa96147a4f2bf1e755d3f528afd6047ab63eeb8c5b435f785aafe76682cb4d8ec80750b94628ead34be350b650722f6c8cdbab1b7541508e51ab8282643b8eaeccb98587926a5c9d41fa01f91c6680ea21e9d8fd6aafb2a7f0a5b1270b41d53291fd474c209cc19a9726bc6e56719591af7c5bb617c7442315aa3a62f3bf35bb5a2d72695809415749fc20801937059e9d19cee7974c0395adb4e5fbfa56037bd2f0097a30a79177a77b56fd799f319f441d93ce067a382b8bf9933fd56af1a386ba5b7ffe372c70c36270f0b84f9401e09f015f2b495c6036201a493aa3672052ecbe7a025a6f891011794c0945285fb99fea838ca0e5cdfd70fa348971ff03fd5fcfbf8030513ac48b3c568b99dad7b39f536f0d36e5fe6b659480fc7bc51ea309c787b983ed70efdedc4d58f829b1bed8a8543970e3b996f0789be5c3627fd2f3df2b029d887b1660cc5e4aca7da378154a9950d116ed2271b4b13374839847d9c6df2919e68a707cb4b22641375df24da31d74c32604942b53193b76ddd72e794c5c4b57d0c71c8b5a3ce9e002f358c3442c9b1d40405516e4e7ce80846277d5d271cbe68cdd83c115ba46428a00eecba32d7f98bbf719340be7e884d7ff4e609a6f57ee8837357d03c50bd55027f524db6d0d1c5b320e4937ff467f1e6347482771c3eeb61f26832a637de9383f98c5bfdaea59364f98f570a4f36d9bc57dbe759364c87b22578cdbb3f0c3920258205ee4bac9e7dc686470f30d46068641d2ce4ca3c248949173c77c1288492c2d11ba69249ffc21bedeb153546f22576b7e3a9a72038beeccb2409c5ca94bb696ef80caec40206c62f3e31514f7ff1e8e100dd4e551c192363c6c9fafcdd3dec4ca316c3441f64998a6c275d703a3013f8586dbb465d0013dd3e3e1a19f1a686c29516bbbb94b0dcb3934325bba05625d3f1687edfc7c9e20702db5e0d5567909c3834dc5541dcd1045ca03688a0c97f7745f2cfb49e34f1d06f23f5d1ffb9149d27151637cd31106946f60a77f4e03e023ac5b0a9f39d96f16ab1338e86baa6d4a961e01feb597775158dafe25319160d51d0c1f7065fe70d3f1fb60e4e19a33ee7fa5ef27746b4eef418d0c23a71a1bf00929238e187853c178e8cee44829f38a952c92885aa62c4bad171b030067827d4665d5e379482934d44e708b184a264ea660869e5dcfabbf7525f57d26deefccd24784be651e696e1151744417538a7176c21d34cb518628fe0585d3404b663465b7a5a09edd0ff0fd10eee25de559903747cf6d6a9c03677bf97b0d7663e5f68427feeebeed94c51d47f886bf990406ff392d98be9ffe651b76f977355fd672fb1234a4f3c809b37399bae6d0087f27b8a76e50349928446d3497fc3203a81f8a43680ccaa1b8cb507d4d4d910801271bed1468c5708bc1a3fbab050576f1c43552d45aae05ed920388597e6fe9e95702b58ec170ed7f06f10c168bb119024a9a9ed25d3fabefaad903f258c4315bf9db1376017e9ee93cece684381917076a20ad854e029f4e860459dd95e8b0e1bab49e245b540990a1c2062654be91940f98221fdce9397785d45c7b0f341fa8dda9269bc6a06007d1cd6e4853e0ea663aa34d3b7597e9f1531c61bd59999df5d6ec5e30bedaa02ef8ea0cdd74795049db779ab2bf044a97d1c31db3b80b4543642445cd983213f2843d020bdebfcdb9903b72620b4adf77cdae1e554eb0b2941e60be118d05568079fe503b8a58ac0aeaa98b566c0a55eec5b1dc6af8c4f0b9e0247ac7bab130b1e9d5c427ee0997b922463e065a38615bd3480e83035c608c2502ba9220ba4d35469dec29bae165e19137983f32abc701f858d3ca888d990e59550ffff1740bf774d99215902b2b2f3d3813514d177c580421f150cb8cf82aad34c9ea999ddd1167f3e728ee20c16866c01c7e1bc9a9e25af8a4175aaed0eaf95ca094ded697da6655c2812ebf23dbdb2954123b3f661a62899b3ae813f9df60876eb90fa0e27c42c5e0632d83190b0f6fbf5e5d69aa136cfb2519fcf0dd5efd3728392720df54420b226ff32d9b2b0f5bd9cc4603aa7c9f3abe09651060745a3edb310a519656b357c59b9893e8482c48df1959c837d8f1c435a31779f1d1f4ea50d504dfab53f23e51154656e1d587e49fd7ac4db7d162cec42107d1d4cc8db05afb0ca2093b11c9fc46c82da62759e5f2f211c335133fc57209f1c85bb0265b2307a696d647d8698c6e2c9205a5f6eb8bbca6fe3a74546cfc57d96fdf035667933e22dadeea27466aeafd070bd4a7ea9100b8fe2156880fe8f3368ba9d6843be24e6c748a964c3f332562a96e8af75d9acbbbc6b72484fa18f15b2ab5317a2aec190dc5c0a958c5af946fb2e734e4947ba4d57a1bfbfd7bc714aa89789dbc72db744aaa30228fb77041cd8553b308d09116cd3ca76d0c8aab4f3e3f9efad0b4bf8a03e1a487991969bad2801020e8a460b5099495d01e0c2bb4a44270164e7fe08fa918ebd2fff68074cf723bda5a23a91495146df136bff697b72081619bb5e179c807fbb832099f46eb390e2a96f5e6d88248899511dca72030d946d3deec4efd686e6df2afb677406e2feeb171f1f85c3b643b60c9b2b80041230752ad61d30d9acdb0a9f515a27bfd1950fee594ca234b0bc9fb6a5e59eef632f6f3e14740e9024c0cd2b324e73b1f6c68bb6a8f85fc2d8054933ac04f1f15f5fc3966bc86c6a1566f4354848b9f4a7dccaa4abadf58d26e2660bb6ca411e1dea7bc667880dc47632d96e6491a60ee6cd3762662bb11667fd18d71b06f539a067706cb46d136342bb26a94563c11067c0eb68fea7a78d1a73cf0124f06b380edd50a467df3b5f844973564ac172718da18a4188dc37c645b8b8634cab9cdb500e5f01ce6d7abd50c73e82b592be86345fbe427cfd497c2001dd2ab565456231d716310d6527550a303ed4819115e6015358a373456166645c624724d75495b5563f40117c34fff6e66a3") + ), + attestationCertChain = List( + RegistrationTestDataGenerator.importAttestationCa( + "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", + "ML-DSA", + "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", + ) + ), + assertion = Some( + AssertionTestData( + request = JacksonCodecs + .json() + .readValue( + """{"publicKeyCredentialRequestOptions":{"challenge":"N3LjI2J5ylyWe3ED5OT4XHLRqHwm_J48_D_hoJOFf30","hints":[],"userVerification":"preferred","extensions":{}},"username":"test@test.org"}""", + classOf[AssertionRequest], + ), + response = + PublicKeyCredential.parseAssertionResponseJson("""{"id":"5sujmLPitETVaGSs0ZcMb9B8S0FMpTqana3_9_wTu9U","response":{"authenticatorData":"SZYN5YgOjGh0NBcPZHZgW4_krrmihjLHmVzzuoMdl2MBAAAFOQ","clientDataJSON":"eyJjaGFsbGVuZ2UiOiJOM0xqSTJKNXlseVdlM0VENU9UNFhITFJxSHdtX0o0OF9EX2hvSk9GZjMwIiwib3JpZ2luIjoiaHR0cHM6Ly9sb2NhbGhvc3QiLCJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwidG9rZW5CaW5kaW5nIjp7InN0YXR1cyI6InN1cHBvcnRlZCJ9fQ","signature":"rlvqWEDCGjF3eUp9MkAuECJuF230ntd8u58L8Jr2MdMpDucjbykHcODWPbXbqOUaHhgE2mYnHmp_WTRol6Th3ztWpKD4C-iAFJF4plu3Ii5B7SMIPVEXQDbyRcdFphx8hDp6HqcAf9shjFHZymL2jm7sl6XwMOktlMIgeOpYopvkSGdkKos9bNutRIa7TOw4zZuAagp4OO8x1MELg5Bt7TWf5GeEolmYAed6IANAeBYO0oSRsvQ9ysih0tcdHFY_bqTADYTntdkJoKjPDYFkIucWlBYs1urqOQBlpehvenB662bMTY4k9KeHuvvBlobxYGsxbHD-C3RE0kg8i4M2K2wqUvZrzBXC5SEurUCCeiDq0Bx_u2zIbTwwlbOmyxZu5zv64540w0Cx1LUb2_lRviM3hwkgNnzaejeakzOr5QgVXPWuscyu7KFId3au2NyoULMQ6k9I8MwJRqCCSlHkj9m0wKAVJ3YPJayyMRUJyghYhEoKJTcLagtuI07FxctTpOCDl_4BVJ6uI1aEjLr-AEazBXFxi-PkUQIzpYOqjZgHPdeOmFZTFKPrxCEXXSwMewv4enOPGstCRdM2VhvPB6tXsgHTxJeWRGxx2VrQbYsYY4E6UB9MTLi3ItwO3GDQPX4PWXeyvwQM0Mcrq2lTXjdTXNZvzPPFc8koEWXaEZfIhMLyrPzhKDEktK2LRai6_R0V4Txlv2RwdtMljCogsKLTTkxXn67NSTZP9rqplDU4svYdIFzn7O7dBt5-ukPyVV4QpYCUpgtwSv4_afG942ReqmQBxVV5Jwgu1n6nxOvXqL39TbbHJCAS99fmtzRYQkwLrDlY-LP91rv1gRdromSEIFJJXeKtY23v5zOnoev4LZKu5oOPFkdiqHaQHBxv0hJm6RukZhzr35b1rs7KzPf3Cbmx220vySEc4JM_7hV1CZL3l24wCPODyop52pjC5Cy1jeA1uP61J0NYDs0U7chkD1NhBkY_tUvdxP3V2OEBtvq9iyrxlxa5Avii9_U3JcXDhzA1rss3SP5A5nNWQ6qr_Lh9s8wWtwimWrOmvc5x8AasIw4ElsYsg9ilizXzs5WDvJibYWsTnXV5Okxv0gxe42ZNfwRY_POEs2TMK64GukZt2NgsAp0JWYjyOUdWT8dDoxX35JekJwGiUtr7yWPU1qk1JvSgZICa0J5-ilvAZSMLxHBAXIesJnQGPmZClNJDvfWTumV027PlSkIpN6hUDvPNbzESJpWJORrP88Tet6aUF9l75iR9JYDbqcQhvu-XyfXaqaZhaXITqY4kPfLhy9xIcwsPnWsTthZBaN5Dx6ASqIlqKIB5Df4qaE-TkcEsd_QjcZYVQpS1tKbHIWN6y9uR74SV8aLIhFrxKMUynfSA1dS-PrsIGNQg5UgoP6AQp7onKke3BxTyXCkMj6CNDROc1snzYDPGl6bfyfxGgeZlRH4RJkaSwnfzW2MSkutuCAIhdtotceWZV10RLi5qpo-M-6vTXJ5tyKQ3rk6EZTAOzlYI293VbiucZfMjT8TIk8XsUKSMrWW4S47b8vYCPWMYs4PbZo2hdFsFDVh5ouoghy-Tl6dQSwXiP3bCgBcGg0cNEeYqpZ-3gmgqPgh_G26LcYT1bmPQEyxmEImmGhScDRmVRkS-gAjSbNaT49Ts-beO9PZbAiQI0429Fb3ruNPr-jUVe2Uza6l0zXGSi0PaAft_KTnFvQWQ2kKpAxNVH5J6ekZO4t46TbbW7BJSIUv1ZgcJVtw2BgiSyGZQ008KNmhcSNaQjuEjNq9PPyHtQ9jiyFXNDcG_xW9YSAbttk_HIXFw1vrWcAzm9a-oE82uQwPltppSce1HrCZeR7zlG4FTJFo_KqkgDDQwjRZEJvwLvR99QutCFV_LpuKsJlawZzlHFVBre2u_CbasAlGO_e7r_UWBQpDN5E0jY6iBGy6njPxrUo6L9Pd6pebttGAAa3R2FEzJcKZhcDneFRV6crJMZSIGwmYrUzsunRo1dXOjtLwhN7P0RyKKxJYKbE52Wtc13DJPU4OePjHwO1vq2zrz1kzzkvIAZVFGyYPoZtkp08TeLrMk1qbxp3Y738RVECqSw5f2STgkawuJKWWLGyXwlKmCVlAeO9Uv75sEgpGTuApbG_H-riQ280KIyZJe2o8XXuF_XZA-czcLpwXC7oCRZN9SAvEU8AWSMllzflQLz7DC4CdFWk0JlNYjOtfR_3sCPFyiuw-5TjA1y-PIqPPfe-lITiJChZA6LWTqsxcLQC01i3qVLBZrCcRLOeJVPwScxbEUYi5j0-9AneUoWHWwgz2UbOw2oolm-OA2sbr1Kv-wycckg1_XVtlEW_HBTf7VgBa4jetu_G-vD6qI__X9m5Bo9GR5H9rF07zhTGrB8B4rHced2mXl7_TBtpIlIZs7u15TmC9R-YGW8iSVStJR7WLuXJAA6BG2QRHke6yczZ7rUWPvXpVh06gEhLnklye0y-hdFydeqOHDvBHde5XERAd3wj8E9U4BqBCglr9qfIT2WDH1pE7OxclBbMepApdwi4PJHwYYQvKl2PwpK1cUANd-JoIm-8qyTGM6xZnc6UO1Py2Wc9zQk44rZ_8FC9NDwLWvC93QsUCoCiMOuKprR8CYoKOV9ktumElOG9RO2LkpmivDe811HpL6LHusZzB-fJR35UuJtc5ydCBhcDAipr4Ww78ZpVkIkWhTEviM4fBbA8UfQwhilqSyU-ikSTRiWlC3KYXGNGmzmJxRR62xmjOe1AcLB4VAOGj5nGsNW1aEaQ_evoo3BBK8ntKxdYouDcrhQ3a85YirPe2H-HFptGoJYmkP-ag9BbwWqGu_xTw7UWD0RjUlQBaao1jUrlxBB-aaT6rh6KKIQIJGTuYV-yz-lDgttuLsJR4hiuxltVjV6maRdx8wNDmVdVyeClzlQ5dB4ojrxGvppQk0-i74I6UVlgiagLrr0HOJyL5ay-XWxpAOVevYlkv3QSKDmBbsK8u5xG9B3twjBQv6bDgPhLRGNIUbPK-D5aBefVK5qmNm1PG_jVDWlK96PSK3By1WIknbVfWeYMM0ewTkXy-fTDhNoWzeSRLtPlqmdWNu1YibhkqQVviCeW566JsKXGXxTF3GvrRFWgTyxB9MXEvOaFJDqq_NsK_C4gqXS6-AjxcgKjU3y87RqsKYmccfoSipvQUBvvV6ZaR1l__do25zstcEdGhwElankZCOeRppKIPE7024EZ-LSh2SJTFv2de4TkMGOcCjzy-znvVwqz7GLWEGM-W_x0dx9uaN5CubR4tJuppFfn4gwOEKDz42HFc3wIHIdWtAugKYihuuWZhDLIPFdgY3GedSisoYYQTBUTruNTdZWQf3SHR9PBQl0aT6KHyizZq7Ym9XXvMsZwZOr2M3G2_d9NxtBa5fJuh1X-O12wjdGjRqA9Kvd1n0ibqfSVoJk6f6bAHCd1tNjYG2DJAsbZ8gB0OeluMiHt_4CDjgAPmnZlKUQvnnp0TH0C2Akl5HP_vQ0N4h1vTJa5Bn8DEjPsToLqq329edTKHJlA-TLD78cCZd2f_W6fch1OGKN8rDgPewGcPDHxeD-_suiYe5vP7EQhCGTGpsXneuKZOZPdi-Lpqz4w8GqrFQkNgzUM2y5GyNJYDv6H51235S97JAPfGVioZJT46jgarEQG5TsbFtTk9VgoCyXSnRGXi1P9V8b8hAh10SsztxIY1BOrO3W8aEZ9DPcH2RIo_oowafVpjMjh4mo0H5u5h5rZlzIsuLvuIzZXNClqS8mjsDVCuiGRcL90nua-1abN5fvmLmihj-wWQo7Dk2PUgBR8j62cZceq1Oo_2XQp0yihv1Lx_8zzdCxjsUXMN-_yiys6VKEac1FjKow5dTD8nTzhiaF-oUPf5SZpYyNpNSkhT-yi5e7L4qAAdLVyO7Nv79ts6wullthrnuXetDEN8CZpkuA1Yx5b0JBT0L1Ua-8qP0G3lidfYA67EpUZybCmWzYdW1vGcs8Btm_H7VdzuhGyNEfUBcvFWm6pd1fAeEtsFJfXJS1mR0Sbg2J30-I44PE4Vu0Q7Pmuz9Inj1f-iCm1MwCeQFDHV2CLVjXOKt5THQcLdrddsVhatpoUdKRDtDgOKSHWx0KH94x78UUR988r9uuL9xApHwOZx14gquYXgueiR3o51_kwdWASpY8_F4AYD7rNZpsfFS3aey3XSOpGSFGpUBO0IH5TqrtjnjxNN1gTM4sr0oZ43wOr-2abUgz9mCSafwAuiBWDItMemwwh_QZIlF7WrAuBruM0JMKeFcq0Lk4Lb5Z4ozoZqccEU3S7HPQrDk1eBcvqTyLc0ZLIkd1S5i1g5LPwUJ5TOZOsf8PCKjLrR8bPGduoTi4kFtcKmicWQ-uQXieco_v-DwcJ_VjeSjjt6L3YA5xe5T22VmzIOgEc_P_k2JOtXe137pN57xGzF8QxnnKSwX75w30Y2Asc_l9K5hsq_jbHz3K4njjivFYXa0uUon87aWMiKMgEaj_ViZQTcsX3xKDcsEfA00x1xU76sZJBNyfXCalAL4ZP29_pHVSJl_6blIsjjR4pnpGLDWyvg7pXrNpdvK2a1tSIQUV6CUtSfpkKgeoYVQOWLVT0pw4ZKahz55HMdPXH401tCdGifkKmCvEZaZ8oXT2_og751XpTY7kDi2A-yqUSm7BNp9OHL1PhvWovI-ZLd_qlhNUWAtj9g_u_nE8NeaEp4YttZV8CfZ7unRP1oMCzvtIlrw2XU61ot7nJ69ffUMDxmQ2PbT-Bn48MGbW7F_SvMV1pgFEc_P-dnDuN6a_NhwHL15VA-wps9m9zjGONpmyoqC7cs_rn8-qANognYLg1ktsQkvUxD1LrThMRVBAIjy8BjE90QBWS82hebFM7Lqfg9fWBC1g1z3k6n4qBST6pngubsete1I2LdiCcLwOuagqhc-Sv1dinMaE6o7JOC1CAexbgnVUc27x3GDVa1zJ4D_N7eb9xvg93ZZcXnc2lNL2c_ZJNSVPZBdMm_7q0otdBxFl2m2w9RMaMyVXG3kWurFDLyoqUoREEOX1EzgfNnzjkK_TV0Szf8Qg1ymRAYdAYUcm4NmN37842622uqV9lbPbBoefLrkQ_p84kfNMdrqCKLimfxRzhVpgHjWnH0MkSeBEn9TNgSGPtDoJBnVFSYcvwrQQwsY1gENYW_nikUKIbKQOE1maLzUGbBguWuJaL83pGIUQrIaZSkfh_QGEwEzlDbW-81O9eHvFx7mAd313FwwlFZcNSMlD_IpcjeHuCZStGpztIG1kBLVLuNPiUmg4Z9GyeVbzCJ6-lz3T_AhUS5RlbLrCzEstBq3ZI_mYoviV7HKqt3nXsAvVMIhGrqZ7LkDPZrCt_4sYxZF2XTfUUqVHlkYV697Isg5YUg0bB4xpHpbUEEAtfQqXIc2mdVcEzWbm-3XjXT24Xcx1iwY6MOdncqQNfv8fDdZaVkMydfn7bvH8WEwtXsbBuwbJOTJVJdJRFIgc-IThmuHcT3CD9L1vRfNV6i5eKKgCxdzdgKPP4sE9JLLPXyodiXFy5pnpIfa9yarNrHzO8czaQhdnJFFop2H5v0wT1NieMB9cFPUuUbe1RmHDPgt4ZbyZ3Q5UEsScykeR6FC3q8OBnOnZqoXY5A9a3dX7dVrc7E0mLkJGTXw8TlFsZ1Q6R5KSMeMC2oHB779F_i7Fxe-Z2e7Xk9pVDmeNLpCTDsI0zQV28bd1bOYGIATEfY-_PEmBNXWnR0uYQlLb3jvi1M3apO2RSD3gRf35Y2VgWC_I6NDiv--7B-DSwOpa8aIog-ThvpZxlD2tfH-08a2612vrM5qgCBbN9gnDH9UwtNYMkyCd2llNaoiW8zs7w1hz_oAM0VvOzLlO86yKYSDC3tBD9aW56cVJdubn-p5Ns7bYP3nTroIx5Ugwmfb97SXPqpgAZ-L0mCz1kP_1e_pWn7RZ1K-Igd0_g4Cb4eB5OHZJiOxIQpPsw5CyL7JrKAgXG5ZOdiko3Zd1nCcsGVFfXH9wKukqRTZlPRcEb-KT5kSmY2-_IxulqIitGMJLUpdYnyc1vZJS26Ur7i5w9zhAw0bRIugvb_-PUhTd5CVyCBaudvw8_3-B0tkervFAiRRoqrH5PAiJUdXhYuQAAAAAAAAAAAAAAAJExwjKzE5QA"},"clientExtensionResults":{},"type":"public-key"}"""), + ) + ), + ) { + override def regenerate() = + TestAuthenticator.createBasicAttestedCredential( + keyAlgorithm = COSEAlgorithmIdentifier.ML_DSA_87, + attestationMaker = AttestationMaker.packed( + AttestationSigner.selfsigned(COSEAlgorithmIdentifier.ML_DSA_87) + ), + ) + } + val BasicAttestationRsa: RegistrationTestData = new RegistrationTestData( alg = COSEAlgorithmIdentifier.RS256, attestationObject = @@ -1252,6 +1378,9 @@ case class RegistrationTestData( PublicKeyCredentialParameters.ES384, PublicKeyCredentialParameters.ES512, PublicKeyCredentialParameters.Ed448, + PublicKeyCredentialParameters.ML_DSA_44, + PublicKeyCredentialParameters.ML_DSA_65, + PublicKeyCredentialParameters.ML_DSA_87, PublicKeyCredentialParameters.RS256, PublicKeyCredentialParameters.RS384, PublicKeyCredentialParameters.RS512, diff --git a/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyAssertionSpec.scala b/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyAssertionSpec.scala index 995308afc..05929d7a4 100644 --- a/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyAssertionSpec.scala +++ b/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyAssertionSpec.scala @@ -72,6 +72,7 @@ import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks import java.io.IOException import java.nio.charset.Charset +import java.security.KeyFactory import java.security.KeyPair import java.security.MessageDigest import java.security.interfaces.ECPublicKey @@ -2925,6 +2926,62 @@ class RelyingPartyAssertionSpec ) } + for { algName <- List("ML-DSA-44", "ML-DSA-65", "ML-DSA-87") } it( + s"a generated ${algName} key, when available." + ) { + assume(Try(KeyFactory.getInstance(algName)).isSuccess) + + val registrationTestData = algName match { + case "ML-DSA-44" => + RegistrationTestData.Packed.BasicAttestationMlDsa44 + case "ML-DSA-65" => + RegistrationTestData.Packed.BasicAttestationMlDsa65 + case "ML-DSA-87" => + RegistrationTestData.Packed.BasicAttestationMlDsa87 + } + val testData = registrationTestData.assertion.get + + val rp = RelyingParty + .builder() + .identity( + RelyingPartyIdentity.builder().id("localhost").name("Test RP").build() + ) + .credentialRepository( + Helpers.CredentialRepository.withUser( + registrationTestData.userId, + RegisteredCredential + .builder() + .credentialId(registrationTestData.response.getId) + .userHandle(registrationTestData.userId.getId) + .publicKeyCose( + registrationTestData.response.getResponse.getParsedAuthenticatorData.getAttestedCredentialData.get.getCredentialPublicKey + ) + .signatureCount(0) + .build(), + ) + ) + .build() + + val result = rp.finishAssertion( + FinishAssertionOptions + .builder() + .request(testData.request) + .response(testData.response) + .build() + ) + + result.isSuccess should be(true) + result.getCredential.getUserHandle should equal( + registrationTestData.userId.getId + ) + result.getCredential.getCredentialId should equal( + registrationTestData.response.getId + ) + result.getCredential.getCredentialId should equal( + testData.response.getId + ) + } + describe("an RS1 key") { def test(registrationTestData: RegistrationTestData): Unit = { val testData = registrationTestData.assertion.get diff --git a/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyRegistrationSpec.scala b/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyRegistrationSpec.scala index 4d314940f..60b0b6146 100644 --- a/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyRegistrationSpec.scala +++ b/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyRegistrationSpec.scala @@ -4449,6 +4449,62 @@ class RelyingPartyRegistrationSpec COSEAlgorithmIdentifier.RS512 ) } + + for { + (param, alg, javaAlgName) <- List( + ( + PublicKeyCredentialParameters.ML_DSA_44, + COSEAlgorithmIdentifier.ML_DSA_44, + "ML-DSA-44", + ), + ( + PublicKeyCredentialParameters.ML_DSA_65, + COSEAlgorithmIdentifier.ML_DSA_65, + "ML-DSA-65", + ), + ( + PublicKeyCredentialParameters.ML_DSA_87, + COSEAlgorithmIdentifier.ML_DSA_87, + "ML-DSA-87", + ), + ) + } it(s"${alg}, when available.") { + // The RelyingParty constructor call needs to be here inside the `it` call in order to have the right JCA provider environment + val rp = RelyingParty + .builder() + .identity( + RelyingPartyIdentity + .builder() + .id("localhost") + .name("Test party") + .build() + ) + .credentialRepository(Helpers.CredentialRepository.empty) + .build() + + val pkcco = rp.startRegistration( + StartRegistrationOptions + .builder() + .user( + UserIdentity + .builder() + .name("foo") + .displayName("Foo") + .id(ByteArray.fromHex("aabbccdd")) + .build() + ) + .build() + ) + val pubKeyCredParams = pkcco.getPubKeyCredParams.asScala + + if (Try(KeyFactory.getInstance(javaAlgName)).isSuccess) { + pubKeyCredParams should contain(param) + pubKeyCredParams map (_.getAlg) should contain(alg) + } else { + pubKeyCredParams should not contain (param) + pubKeyCredParams map (_.getAlg) should not contain (alg) + } + } } describe("do not include") { diff --git a/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyV2AssertionSpec.scala b/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyV2AssertionSpec.scala index 0b9d5df91..1a1a264d7 100644 --- a/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyV2AssertionSpec.scala +++ b/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyV2AssertionSpec.scala @@ -72,6 +72,7 @@ import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks import java.io.IOException import java.nio.charset.Charset +import java.security.KeyFactory import java.security.KeyPair import java.security.MessageDigest import java.security.interfaces.ECPublicKey @@ -3119,6 +3120,59 @@ class RelyingPartyV2AssertionSpec ) } + for { algName <- List("ML-DSA-44", "ML-DSA-65", "ML-DSA-87") } it( + s"a generated ${algName} key, when available." + ) { + assume(Try(KeyFactory.getInstance(algName)).isSuccess) + + val registrationTestData = algName match { + case "ML-DSA-44" => + RegistrationTestData.Packed.BasicAttestationMlDsa44 + case "ML-DSA-65" => + RegistrationTestData.Packed.BasicAttestationMlDsa65 + case "ML-DSA-87" => + RegistrationTestData.Packed.BasicAttestationMlDsa87 + } + val testData = registrationTestData.assertion.get + + val rp = RelyingParty + .builder() + .identity( + RelyingPartyIdentity.builder().id("localhost").name("Test RP").build() + ) + .credentialRepositoryV2( + Helpers.CredentialRepositoryV2.withUser( + registrationTestData.userId, + credentialId = registrationTestData.response.getId, + publicKeyCose = + registrationTestData.response.getResponse.getParsedAuthenticatorData.getAttestedCredentialData.get.getCredentialPublicKey, + ) + ) + .usernameRepository( + Helpers.UsernameRepository.withUsers(registrationTestData.userId) + ) + .build() + + val result = rp.finishAssertion( + FinishAssertionOptions + .builder() + .request(testData.request) + .response(testData.response) + .build() + ) + + result.isSuccess should be(true) + result.getCredential.getUserHandle should equal( + registrationTestData.userId.getId + ) + result.getCredential.getCredentialId should equal( + registrationTestData.response.getId + ) + result.getCredential.getCredentialId should equal( + testData.response.getId + ) + } + describe("an RS1 key") { def test(registrationTestData: RegistrationTestData): Unit = { val testData = registrationTestData.assertion.get diff --git a/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyV2RegistrationSpec.scala b/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyV2RegistrationSpec.scala index 16d77ccdf..ff3978ed9 100644 --- a/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyV2RegistrationSpec.scala +++ b/webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyV2RegistrationSpec.scala @@ -4397,6 +4397,62 @@ class RelyingPartyV2RegistrationSpec COSEAlgorithmIdentifier.RS512 ) } + + for { + (param, alg, javaAlgName) <- List( + ( + PublicKeyCredentialParameters.ML_DSA_44, + COSEAlgorithmIdentifier.ML_DSA_44, + "ML-DSA-44", + ), + ( + PublicKeyCredentialParameters.ML_DSA_65, + COSEAlgorithmIdentifier.ML_DSA_65, + "ML-DSA-65", + ), + ( + PublicKeyCredentialParameters.ML_DSA_87, + COSEAlgorithmIdentifier.ML_DSA_87, + "ML-DSA-87", + ), + ) + } it(s"${alg}, when available.") { + // The RelyingParty constructor call needs to be here inside the `it` call in order to have the right JCA provider environment + val rp = RelyingParty + .builder() + .identity( + RelyingPartyIdentity + .builder() + .id("localhost") + .name("Test party") + .build() + ) + .credentialRepositoryV2(Helpers.CredentialRepositoryV2.empty) + .build() + + val pkcco = rp.startRegistration( + StartRegistrationOptions + .builder() + .user( + UserIdentity + .builder() + .name("foo") + .displayName("Foo") + .id(ByteArray.fromHex("aabbccdd")) + .build() + ) + .build() + ) + val pubKeyCredParams = pkcco.getPubKeyCredParams.asScala + + if (Try(KeyFactory.getInstance(javaAlgName)).isSuccess) { + pubKeyCredParams should contain(param) + pubKeyCredParams map (_.getAlg) should contain(alg) + } else { + pubKeyCredParams should not contain (param) + pubKeyCredParams map (_.getAlg) should not contain (alg) + } + } } describe("do not include") { diff --git a/webauthn-server-core/src/test/scala/com/yubico/webauthn/TestAuthenticator.scala b/webauthn-server-core/src/test/scala/com/yubico/webauthn/TestAuthenticator.scala index 9a4114ca4..a4688feb0 100644 --- a/webauthn-server-core/src/test/scala/com/yubico/webauthn/TestAuthenticator.scala +++ b/webauthn-server-core/src/test/scala/com/yubico/webauthn/TestAuthenticator.scala @@ -85,6 +85,7 @@ import java.security.interfaces.RSAPublicKey import java.security.spec.ECGenParameterSpec import java.security.spec.ECPoint import java.security.spec.ECPublicKeySpec +import java.security.spec.NamedParameterSpec import java.security.spec.PKCS8EncodedKeySpec import java.security.spec.X509EncodedKeySpec import java.time.Instant @@ -416,6 +417,8 @@ object TestAuthenticator { case pub: BCEdDSAPublicKey => WebAuthnTestCodecs.eddsaPublicKeyToCose(pub) case pub: RSAPublicKey => WebAuthnTestCodecs.rsaPublicKeyToCose(pub, keyAlgorithm) + case pub if pub.getAlgorithm == "ML-DSA" => + WebAuthnTestCodecs.mlDsaPublicKeyToCose(pub, keyAlgorithm) } val authDataBytes: ByteArray = makeAuthDataBytes( @@ -1098,8 +1101,15 @@ object TestAuthenticator { ): ByteArray = { val jAlg = WebAuthnCodecs.getJavaAlgorithmName(alg) - // Need to use BouncyCastle provider here because JDK15 standard providers do not support secp256k1 - val sig = Signature.getInstance(jAlg, new BouncyCastleProvider()) + val sig = alg match { + case COSEAlgorithmIdentifier.ML_DSA_44 | + COSEAlgorithmIdentifier.ML_DSA_65 | + COSEAlgorithmIdentifier.ML_DSA_87 => + Signature.getInstance(jAlg) + case _ => + // Need to use BouncyCastle provider here because JDK15 standard providers do not support secp256k1 + Signature.getInstance(jAlg, new BouncyCastleProvider()) + } sig.initSign(key) sig.update(data.getBytes) @@ -1117,6 +1127,10 @@ object TestAuthenticator { case COSEAlgorithmIdentifier.RS256 | COSEAlgorithmIdentifier.RS384 | COSEAlgorithmIdentifier.RS512 | COSEAlgorithmIdentifier.RS1 => generateRsaKeypair() + case COSEAlgorithmIdentifier.ML_DSA_44 | + COSEAlgorithmIdentifier.ML_DSA_65 | + COSEAlgorithmIdentifier.ML_DSA_87 => + generateMlDsaKeypair(algorithm) } def generateEcKeypair(curve: String = "secp256r1"): KeyPair = { @@ -1138,6 +1152,15 @@ object TestAuthenticator { keyPairGenerator.generateKeyPair() } + def generateMlDsaKeypair( + algorithm: COSEAlgorithmIdentifier + ): KeyPair = { + val alg = WebAuthnCodecs.getJavaAlgorithmName(algorithm) + val keyPairGenerator = KeyPairGenerator.getInstance("ML-DSA") + keyPairGenerator.initialize(new NamedParameterSpec(alg)) + keyPairGenerator.generateKeyPair() + } + def importEcKeypair( privateBytes: ByteArray, publicBytes: ByteArray, @@ -1312,9 +1335,15 @@ object TestAuthenticator { val signerBuilder = new JcaContentSignerBuilder( WebAuthnCodecs.getJavaAlgorithmName(signingAlg) ) - .setProvider( - new BouncyCastleProvider() - ) // Needed because JDK15 standard providers do not support secp256k1 + signingAlg match { + case COSEAlgorithmIdentifier.ML_DSA_44 | + COSEAlgorithmIdentifier.ML_DSA_65 | + COSEAlgorithmIdentifier.ML_DSA_87 => + case _ => + signerBuilder.setProvider( + new BouncyCastleProvider() + ) // Needed because JDK15 standard providers do not support secp256k1 + } builder.build(signerBuilder.build(signingKey)).getEncoded }) diff --git a/webauthn-server-core/src/test/scala/com/yubico/webauthn/WebAuthnTestCodecs.scala b/webauthn-server-core/src/test/scala/com/yubico/webauthn/WebAuthnTestCodecs.scala index 5f6c15c6e..2fe7e651b 100644 --- a/webauthn-server-core/src/test/scala/com/yubico/webauthn/WebAuthnTestCodecs.scala +++ b/webauthn-server-core/src/test/scala/com/yubico/webauthn/WebAuthnTestCodecs.scala @@ -64,6 +64,21 @@ object WebAuthnTestCodecs { val keyFactory: KeyFactory = KeyFactory.getInstance("RSA") val spec = new PKCS8EncodedKeySpec(encodedKey.getBytes) keyFactory.generatePrivate(spec) + + case COSEAlgorithmIdentifier.ML_DSA_44 => + val keyFactory: KeyFactory = KeyFactory.getInstance("ML-DSA-44") + val spec = new PKCS8EncodedKeySpec(encodedKey.getBytes) + keyFactory.generatePrivate(spec) + + case COSEAlgorithmIdentifier.ML_DSA_65 => + val keyFactory: KeyFactory = KeyFactory.getInstance("ML-DSA-65") + val spec = new PKCS8EncodedKeySpec(encodedKey.getBytes) + keyFactory.generatePrivate(spec) + + case COSEAlgorithmIdentifier.ML_DSA_87 => + val keyFactory: KeyFactory = KeyFactory.getInstance("ML-DSA-87") + val spec = new PKCS8EncodedKeySpec(encodedKey.getBytes) + keyFactory.generatePrivate(spec) } def importEcdsaPrivateKey(encodedKey: ByteArray): PrivateKey = { @@ -94,6 +109,33 @@ object WebAuthnTestCodecs { new ByteArray(CBORObject.FromObject(coseKey).EncodeToBytes) } + def mlDsaPublicKeyToCose( + key: PublicKey, + alg: COSEAlgorithmIdentifier, + ): ByteArray = { + val encoded = key.getEncoded + val algId: Array[Byte] = + Try(encoded.slice(4, 17)).getOrElse( + throw new IllegalArgumentException("Unknown ML-DSA ASN.1 OID prefix") + ) + + val keyBytesLength = + if (algId.sameElements(WebAuthnCodecs.ML_DSA_44_ALG_ID.getBytes)) + 1312 + else if (algId.sameElements(WebAuthnCodecs.ML_DSA_65_ALG_ID.getBytes)) + 1952 + else if (algId.sameElements(WebAuthnCodecs.ML_DSA_87_ALG_ID.getBytes)) + 2592 + else + throw new IllegalArgumentException("Unknown ML-DSA ASN.1 OID prefix") + + val coseKey: java.util.Map[Long, Any] = new java.util.HashMap[Long, Any] + coseKey.put(1L, 7L) // Key type: AKP + coseKey.put(3L, alg.getId) + coseKey.put(-1L, encoded.takeRight(keyBytesLength)) + new ByteArray(CBORObject.FromObject(coseKey).EncodeToBytes) + } + def rsaPublicKeyToCose( key: RSAPublicKey, alg: COSEAlgorithmIdentifier,