From 4ff7bb0a502eec7254e25b4284df89debd11e964 Mon Sep 17 00:00:00 2001 From: Krzysztof Wicher Date: Tue, 8 Jul 2025 15:17:58 +0200 Subject: [PATCH 1/5] ML-DSA Sign/VerifyPreHash --- .../Interop.EvpPkey.MLDsa.cs | 52 + .../System/Security/Cryptography/Helpers.cs | 60 +- .../src/System/Security/Cryptography/MLDsa.cs | 260 +- .../Security/Cryptography/MLDsaCng.Windows.cs | 8 + .../MLDsaImplementation.NotSupported.cs | 6 + .../MLDsaImplementation.Windows.cs | 6 + .../System/Security/Cryptography/SlhDsa.cs | 46 +- .../MLDsa/MLDsaTestImplementation.cs | 103 + .../MLDsa/MLDsaTests.cs | 239 +- .../MLDsa/MLDsaTestsBase.cs | 91 +- .../MLDsa/MLDsaTestsData.cs | 3118 ++++++++++++++++- .../SlhDsa/SlhDsaContractTests.cs | 91 +- .../SlhDsa/SlhDsaTestHelpers.cs | 11 - .../SlhDsa/SlhDsaTests.cs | 54 +- .../Security/Cryptography/CryptoUtils.cs | 2 + .../System/Security/Cryptography/HashInfo.cs | 116 + .../src/Resources/Strings.resx | 3 + .../ref/System.Security.Cryptography.cs | 10 + .../Security/Cryptography/Cng.NotSupported.cs | 6 + .../System/Security/Cryptography/Helpers.cs | 10 +- .../MLDsaImplementation.OpenSsl.cs | 23 + .../Cryptography/MLDsaOpenSsl.NotSupported.cs | 12 + .../Cryptography/MLDsaOpenSsl.OpenSsl.cs | 25 + .../SlhDsaImplementation.OpenSsl.cs | 4 +- .../Cryptography/SlhDsaOpenSsl.OpenSsl.cs | 4 +- .../tests/MLDsaOpenSslTests.Unix.cs | 6 + .../System.Security.Cryptography.Tests.csproj | 2 + .../CMakeLists.txt | 1 + .../entrypoints.c | 2 + .../pal_evp_pkey_ml_dsa.c | 143 +- .../pal_evp_pkey_ml_dsa.h | 20 + .../pal_evp_pkey_raw_signverify.c | 278 ++ .../pal_evp_pkey_raw_signverify.h | 24 + .../pal_evp_pkey_slh_dsa.c | 245 +- 34 files changed, 4522 insertions(+), 559 deletions(-) create mode 100644 src/libraries/Common/tests/System/Security/Cryptography/HashInfo.cs create mode 100644 src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.c create mode 100644 src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.h diff --git a/src/libraries/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.EvpPkey.MLDsa.cs b/src/libraries/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.EvpPkey.MLDsa.cs index 2f41b60b6d1628..ed0a64560be5d3 100644 --- a/src/libraries/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.EvpPkey.MLDsa.cs +++ b/src/libraries/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.EvpPkey.MLDsa.cs @@ -132,6 +132,58 @@ internal static bool MLDsaVerifyPure( } } + [LibraryImport(Libraries.CryptoNative)] + private static partial int CryptoNative_MLDsaSignPreEncoded( + SafeEvpPKeyHandle pkey, IntPtr extraHandle, + ReadOnlySpan msg, int msgLength, + Span destination, int destinationLength); + + internal static void MLDsaSignPreEncoded( + SafeEvpPKeyHandle pkey, + ReadOnlySpan msg, + Span destination) + { + int ret = CryptoNative_MLDsaSignPreEncoded( + pkey, GetExtraHandle(pkey), + msg, msg.Length, + destination, destination.Length); + + if (ret != 1) + { + throw Interop.Crypto.CreateOpenSslCryptographicException(); + } + } + + [LibraryImport(Libraries.CryptoNative)] + private static partial int CryptoNative_MLDsaVerifyPreEncoded( + SafeEvpPKeyHandle pkey, IntPtr extraHandle, + ReadOnlySpan msg, int msgLength, + ReadOnlySpan signature, int signatureLength); + + internal static bool MLDsaVerifyPreEncoded( + SafeEvpPKeyHandle pkey, + ReadOnlySpan msg, + ReadOnlySpan signature) + { + int ret = CryptoNative_MLDsaVerifyPreEncoded( + pkey, GetExtraHandle(pkey), + msg, msg.Length, + signature, signature.Length); + + if (ret == 1) + { + return true; + } + else if (ret == 0) + { + return false; + } + else + { + throw Interop.Crypto.CreateOpenSslCryptographicException(); + } + } + [LibraryImport(Libraries.CryptoNative)] private static partial int CryptoNative_MLDsaExportSecretKey(SafeEvpPKeyHandle pkey, Span destination, int destinationLength); diff --git a/src/libraries/Common/src/System/Security/Cryptography/Helpers.cs b/src/libraries/Common/src/System/Security/Cryptography/Helpers.cs index e656d8411de491..2d3599a3e7b148 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/Helpers.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/Helpers.cs @@ -100,20 +100,64 @@ internal static bool TryCopyToDestination(this ReadOnlySpan source, Span hashOid) { - // This file is compiled in netstandard2.0, can't use the HashSizeInBytes consts. return hashOid switch { - Oids.Sha256 => 256 >> 3, - Oids.Sha384 => 384 >> 3, - Oids.Sha512 => 512 >> 3, - Oids.Sha1 => 160 >> 3, - Oids.Md5 => 128 >> 3, - _ => throw new CryptographicException(SR.Format(SR.Cryptography_UnknownHashAlgorithm, hashOid)), + Oids.Md5 => 128 / 8, + Oids.Sha1 => 160 / 8, + Oids.Sha256 => 256 / 8, + Oids.Sha384 => 384 / 8, + Oids.Sha512 => 512 / 8, + Oids.Sha3_256 => 256 / 8, + Oids.Sha3_384 => 384 / 8, + Oids.Sha3_512 => 512 / 8, + Oids.Shake128 => 256 / 8, + Oids.Shake256 => 512 / 8, + _ => null, }; } + internal static int HashOidToByteLength(string hashOid) + { + return TryGetHashOidToByteLength(hashOid) ?? + throw new CryptographicException(SR.Format(SR.Cryptography_UnknownHashAlgorithm, hashOid)); + } + + + /// + /// Validates if the hash length matches the expected output size for the given hash algorithm OID. + /// When the OID is not one of the common hash algorithms, it only validates the format of the OID. + /// + internal static void ValidateHashAlgorithm(ReadOnlySpan hash, ReadOnlySpan hashAlgorithmOid) + { + int? outputSize = TryGetHashOidToByteLength(hashAlgorithmOid); + + if (outputSize is not null) + { + if (hash.Length != outputSize) + { + throw new CryptographicException(SR.Cryptography_HashLengthMismatch); + } + } + else + { + // The OIDs for the algorithms above have max length 11. We'll just round up for a conservative initial estimate. + const int MaxEncodedOidLengthForCommonHashAlgorithms = 16; + AsnWriter writer = new AsnWriter(AsnEncodingRules.DER, MaxEncodedOidLengthForCommonHashAlgorithms); + + try + { + // Only the format of the OID is validated here. The derived classes can decide to do more if they want to. + writer.WriteObjectIdentifier(hashAlgorithmOid); + } + catch (ArgumentException ae) + { + throw new CryptographicException(SR.Cryptography_HashLengthMismatch, ae); + } + } + } + internal static bool HashAlgorithmRequired(string? keyAlgorithm) { // This list could either be written as "ML-DSA and friends return false", diff --git a/src/libraries/Common/src/System/Security/Cryptography/MLDsa.cs b/src/libraries/Common/src/System/Security/Cryptography/MLDsa.cs index e6f6f0bbdab0ea..d85fc6a7cc106c 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/MLDsa.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/MLDsa.cs @@ -169,8 +169,6 @@ public byte[] SignData(byte[] data, byte[]? context = default) return destination; } - // TODO: SignPreHash - /// /// Verifies that the specified signature is valid for this key and the provided data. /// @@ -197,7 +195,7 @@ public byte[] SignData(byte[] data, byte[]? context = default) /// /// The instance represents only a public key. /// -or- - /// An error occurred while signing the data. + /// An error occurred while verifying the data. /// public bool VerifyData(ReadOnlySpan data, ReadOnlySpan signature, ReadOnlySpan context = default) { @@ -258,7 +256,213 @@ public bool VerifyData(byte[] data, byte[] signature, byte[]? context = default) return VerifyData(new ReadOnlySpan(data), new ReadOnlySpan(signature), new ReadOnlySpan(context)); } - // TODO: VerifyPreHash + /// + /// Signs the specified hash using the FIPS 204 pre-hash signing algorithm, writing the signature into the provided buffer. + /// + /// + /// The hash to sign. + /// + /// + /// The buffer to receive the signature. Its length must be exactly + /// . + /// + /// + /// The OID of the hash algorithm used to create the hash. + /// + /// + /// An optional context-specific value to limit the scope of the signature. + /// The default value is an empty buffer. + /// + /// + /// is . + /// + /// + /// The buffer in is the incorrect length to receive the signature. + /// + /// + /// has a in excess of + /// 255 bytes. + /// + /// + /// This instance has been disposed. + /// + /// + /// is not a well-formed OID. + /// -or- + /// is a well-known algorithm and does not have the expected length. + /// -or- + /// The instance represents only a public key. + /// -or- + /// An error occurred while signing the hash. + /// + public void SignPreHash(ReadOnlySpan hash, Span destination, string hashAlgorithmOid, ReadOnlySpan context = default) + { + ArgumentNullException.ThrowIfNull(hashAlgorithmOid); + + if (destination.Length != Algorithm.SignatureSizeInBytes) + { + throw new ArgumentException( + SR.Format(SR.Argument_DestinationImprecise, Algorithm.SignatureSizeInBytes), + nameof(destination)); + } + + if (context.Length > MaxContextLength) + { + throw new ArgumentOutOfRangeException( + nameof(context), + context.Length, + SR.Argument_SignatureContextTooLong255); + } + + Helpers.ValidateHashAlgorithm(hash, hashAlgorithmOid); + ThrowIfDisposed(); + + SignPreHashCore(hash, context, hashAlgorithmOid, destination); + } + + /// + /// Signs the specified hash using the FIPS 204 pre-hash signing algorithm. + /// + /// + /// The hash to sign. + /// + /// + /// The OID of the hash algorithm used to create the hash. + /// + /// + /// An optional context-specific value to limit the scope of the signature. + /// The default value is . + /// + /// + /// or is . + /// An error occurred while verifying the data. + /// is not a well-formed OID. + /// -or- + /// is a well-known algorithm and does not have the expected length. + /// -or- + /// The instance represents only a public key. + /// -or- + /// An error occurred while signing the hash. + /// + public byte[] SignPreHash(byte[] hash, string hashAlgorithmOid, byte[]? context = default) + { + ArgumentNullException.ThrowIfNull(hash); + ArgumentNullException.ThrowIfNull(hashAlgorithmOid); + + byte[] destination = new byte[Algorithm.SignatureSizeInBytes]; + SignPreHash(new ReadOnlySpan(hash), destination.AsSpan(), hashAlgorithmOid, new ReadOnlySpan(context)); + return destination; + } + + /// + /// Verifies that the specified FIPS 204 pre-hash signature is valid for this key and the provided hash. + /// + /// + /// The hash to verify. + /// + /// + /// The signature to verify. + /// + /// + /// The OID of the hash algorithm used to create the hash. + /// + /// + /// The context value which was provided during signing. + /// The default value is an empty buffer. + /// + /// + /// if the signature validates the hash; otherwise, . + /// + /// + /// is . + /// + /// + /// has a in excess of + /// 255 bytes. + /// + /// + /// This instance has been disposed. + /// + /// + /// is not a well-formed OID. + /// -or- + /// is a well-known algorithm and does not have the expected length. + /// -or- + /// An error occurred while verifying the hash. + /// + public bool VerifyPreHash(ReadOnlySpan hash, ReadOnlySpan signature, string hashAlgorithmOid, ReadOnlySpan context = default) + { + ArgumentNullException.ThrowIfNull(hashAlgorithmOid); + + if (context.Length > MaxContextLength) + { + throw new ArgumentOutOfRangeException( + nameof(context), + context.Length, + SR.Argument_SignatureContextTooLong255); + } + + Helpers.ValidateHashAlgorithm(hash, hashAlgorithmOid); + ThrowIfDisposed(); + + if (signature.Length != Algorithm.SignatureSizeInBytes) + { + return false; + } + + return VerifyPreHashCore(hash, context, hashAlgorithmOid, signature); + } + + /// + /// Verifies that the specified FIPS 204 pre-hash signature is valid for this key and the provided hash. + /// + /// + /// The hash to verify. + /// + /// + /// The signature to verify. + /// + /// + /// The OID of the hash algorithm used to create the hash. + /// + /// + /// The context value which was provided during signing. + /// The default value is . + /// + /// + /// if the signature validates the hash; otherwise, . + /// + /// + /// or or is . + /// + /// + /// has a length in excess of 255 bytes. + /// + /// + /// This instance has been disposed. + /// + /// + /// is not a well-formed OID. + /// -or- + /// is a well-known algorithm and does not have the expected length. + /// -or- + /// An error occurred while verifying the hash. + /// + /// + /// A context is treated as empty. + /// + public bool VerifyPreHash(byte[] hash, byte[] signature, string hashAlgorithmOid, byte[]? context = null) + { + ArgumentNullException.ThrowIfNull(hash); + ArgumentNullException.ThrowIfNull(signature); + ArgumentNullException.ThrowIfNull(hashAlgorithmOid); + + return VerifyPreHash( + new ReadOnlySpan(hash), + new ReadOnlySpan(signature), + hashAlgorithmOid, + new ReadOnlySpan(context)); + } /// /// Exports the public-key portion of the current key in the X.509 SubjectPublicKeyInfo format. @@ -1063,7 +1267,7 @@ public static MLDsa ImportPkcs8PrivateKey(ReadOnlySpan source) return dsa; } - /// > + /// /// /// is . /// @@ -1605,10 +1809,54 @@ protected virtual void Dispose(bool disposing) /// if the signature validates the data; otherwise, . /// /// - /// An error occurred while signing the data. + /// An error occurred while verifying the data. /// protected abstract bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan context, ReadOnlySpan signature); + /// + /// When overridden in a derived class, computes the pre-hash signature of the specified hash and context, + /// writing it into the provided buffer. + /// + /// + /// The hash to sign. + /// + /// + /// The signature context. + /// + /// + /// The OID of the hash algorithm used to create the hash. + /// + /// + /// The buffer to receive the signature, which will always be the exactly correct size for the algorithm. + /// + /// + /// An error occurred while signing the hash. + /// + protected abstract void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination); + + /// + /// When overridden in a derived class, verifies the pre-hash signature of the specified hash and context. + /// + /// + /// The data to verify. + /// + /// + /// The signature context. + /// + /// + /// The OID of the hash algorithm used to create the hash. + /// + /// + /// The signature to verify. + /// + /// + /// if the signature validates the hash; otherwise, . + /// + /// + /// An error occurred while verifying the hash. + /// + protected abstract bool VerifyPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature); + /// /// When overridden in a derived class, exports the FIPS 204 public key to the specified buffer. /// diff --git a/src/libraries/Common/src/System/Security/Cryptography/MLDsaCng.Windows.cs b/src/libraries/Common/src/System/Security/Cryptography/MLDsaCng.Windows.cs index 5b38c97540868f..63825cb3481d10 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/MLDsaCng.Windows.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/MLDsaCng.Windows.cs @@ -266,6 +266,14 @@ protected override unsafe bool VerifyDataCore(ReadOnlySpan data, ReadOnlyS } } + /// + protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + throw new PlatformNotSupportedException(); + + /// + protected override bool VerifyPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + throw new PlatformNotSupportedException(); + [SupportedOSPlatform("windows")] internal static MLDsaCng ImportPkcs8PrivateKey(byte[] source, out int bytesRead) { diff --git a/src/libraries/Common/src/System/Security/Cryptography/MLDsaImplementation.NotSupported.cs b/src/libraries/Common/src/System/Security/Cryptography/MLDsaImplementation.NotSupported.cs index 3333c9a06086de..f42e3221690baa 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/MLDsaImplementation.NotSupported.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/MLDsaImplementation.NotSupported.cs @@ -23,6 +23,12 @@ protected override void SignDataCore(ReadOnlySpan data, ReadOnlySpan protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan context, ReadOnlySpan signature) => throw new PlatformNotSupportedException(); + protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + throw new PlatformNotSupportedException(); + + protected override bool VerifyPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + throw new PlatformNotSupportedException(); + protected override void ExportMLDsaPublicKeyCore(Span destination) => throw new PlatformNotSupportedException(); diff --git a/src/libraries/Common/src/System/Security/Cryptography/MLDsaImplementation.Windows.cs b/src/libraries/Common/src/System/Security/Cryptography/MLDsaImplementation.Windows.cs index 621d891d4d7289..65c3c32096087a 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/MLDsaImplementation.Windows.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/MLDsaImplementation.Windows.cs @@ -47,6 +47,12 @@ protected override void SignDataCore(ReadOnlySpan data, ReadOnlySpan protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan context, ReadOnlySpan signature) => Interop.BCrypt.BCryptVerifySignaturePqcPure(_key, data, context, signature); + protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + throw new PlatformNotSupportedException(); + + protected override bool VerifyPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + throw new PlatformNotSupportedException(); + internal static partial MLDsaImplementation GenerateKeyImpl(MLDsaAlgorithm algorithm) { Debug.Assert(SupportsAny()); diff --git a/src/libraries/Common/src/System/Security/Cryptography/SlhDsa.cs b/src/libraries/Common/src/System/Security/Cryptography/SlhDsa.cs index 40f3057e88bb7f..68e638ef09b622 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/SlhDsa.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/SlhDsa.cs @@ -328,7 +328,7 @@ public void SignPreHash(ReadOnlySpan hash, Span destination, string SR.Argument_SignatureContextTooLong255); } - ValidateHashAlgorithm(hash, hashAlgorithmOid); + Helpers.ValidateHashAlgorithm(hash, hashAlgorithmOid); ThrowIfDisposed(); SignPreHashCore(hash, context, hashAlgorithmOid, destination); @@ -426,7 +426,7 @@ public bool VerifyPreHash(ReadOnlySpan hash, ReadOnlySpan signature, SR.Argument_SignatureContextTooLong255); } - ValidateHashAlgorithm(hash, hashAlgorithmOid); + Helpers.ValidateHashAlgorithm(hash, hashAlgorithmOid); ThrowIfDisposed(); if (signature.Length != Algorithm.SignatureSizeInBytes) @@ -1995,48 +1995,6 @@ private static SlhDsaAlgorithm GetAlgorithmIdentifier(ref readonly AlgorithmIden return algorithm; } - private static void ValidateHashAlgorithm(ReadOnlySpan hash, ReadOnlySpan hashAlgorithmOid) - { - int? outputSize = hashAlgorithmOid switch - { - Oids.Md5 => 128 / 8, - Oids.Sha1 => 160 / 8, - Oids.Sha256 => 256 / 8, - Oids.Sha384 => 384 / 8, - Oids.Sha512 => 512 / 8, - Oids.Sha3_256 => 256 / 8, - Oids.Sha3_384 => 384 / 8, - Oids.Sha3_512 => 512 / 8, - Oids.Shake128 => 256 / 8, - Oids.Shake256 => 512 / 8, - _ => null, - }; - - if (outputSize is not null) - { - if (hash.Length != outputSize) - { - throw new CryptographicException(SR.Cryptography_HashLengthMismatch); - } - } - else - { - // The OIDs for the algorithms above have max length 11. We'll just round up for a conservative initial estimate. - const int MaxEncodedOidLengthForCommonHashAlgorithms = 16; - AsnWriter writer = new AsnWriter(AsnEncodingRules.DER, MaxEncodedOidLengthForCommonHashAlgorithms); - - try - { - // Only the format of the OID is validated here. The derived classes can decide to do more if they want to. - writer.WriteObjectIdentifier(hashAlgorithmOid); - } - catch (ArgumentException ae) - { - throw new CryptographicException(SR.Cryptography_HashLengthMismatch, ae); - } - } - } - private static void ThrowIfNotSupported() { if (!IsSupported) diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestImplementation.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestImplementation.cs index 8652e58af24916..efb9f3a42f229f 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestImplementation.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestImplementation.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using Xunit; +using static System.Security.Cryptography.SLHDsa.Tests.SlhDsaMockImplementation; namespace System.Security.Cryptography.Tests { @@ -11,9 +12,13 @@ internal sealed class MLDsaTestImplementation : MLDsa internal delegate bool TryExportFunc(Span destination, out int bytesWritten); internal delegate void SignAction(ReadOnlySpan data, ReadOnlySpan context, Span destination); internal delegate bool VerifyFunc(ReadOnlySpan data, ReadOnlySpan context, ReadOnlySpan signature); + internal delegate void SignPreHashAction(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination); + internal delegate bool VerifyPreHashFunc(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature); internal int VerifyDataCoreCallCount = 0; internal int SignDataCoreCallCount = 0; + internal int SignPreHashCoreCallCount = 0; + internal int VerifyPreHashCoreCallCount = 0; internal int ExportMLDsaPrivateSeedCoreCallCount = 0; internal int ExportMLDsaPublicKeyCoreCallCount = 0; internal int ExportMLDsaSecretKeyCoreCallCount = 0; @@ -26,6 +31,8 @@ internal sealed class MLDsaTestImplementation : MLDsa internal TryExportFunc TryExportPkcs8PrivateKeyHook { get; set; } internal SignAction SignDataHook { get; set; } internal VerifyFunc VerifyDataHook { get; set; } + internal SignPreHashAction SignPreHashHook { get; set; } + internal VerifyPreHashFunc VerifyPreHashHook { get; set; } internal Action DisposeHook { get; set; } private MLDsaTestImplementation(MLDsaAlgorithm algorithm) : base(algorithm) @@ -74,6 +81,17 @@ protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) + { + SignPreHashCoreCallCount++; + SignPreHashHook(hash, context, hashAlgorithmOid, destination); + } + protected override bool VerifyPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) + { + VerifyPreHashCoreCallCount++; + return VerifyPreHashHook(hash, context, hashAlgorithmOid, signature); + } + internal static MLDsaTestImplementation CreateOverriddenCoreMethodsFail(MLDsaAlgorithm algorithm) { return new MLDsaTestImplementation(algorithm) @@ -168,6 +186,21 @@ public void AddLengthAssertion() Assert.Equal(Algorithm.SignatureSizeInBytes, signature.Length); return ret; }; + + SignPreHashAction oldSignPreHashCoreHook = SignPreHashHook; + SignPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + { + oldSignDataHook(hash, context, destination); + Assert.Equal(Algorithm.SignatureSizeInBytes, destination.Length); + }; + + VerifyPreHashFunc oldVerifyPreHashHook = VerifyPreHashHook; + VerifyPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + { + bool ret = oldVerifyPreHashHook(hash, context, hashAlgorithmOid, signature); + Assert.Equal(Algorithm.SignatureSizeInBytes, signature.Length); + return ret; + }; } public void AddDestinationBufferIsSameAssertion(ReadOnlyMemory buffer) @@ -200,6 +233,13 @@ public void AddDestinationBufferIsSameAssertion(ReadOnlyMemory buffer) AssertExtensions.Same(buffer.Span, destination); }; + SignPreHashAction oldSignPreHashCoreHook = SignPreHashHook; + SignPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + { + oldSignPreHashCoreHook(hash, context, hashAlgorithmOid, destination); + AssertExtensions.Same(buffer.Span, destination); + }; + TryExportFunc oldTryExportPkcs8PrivateKeyHook = TryExportPkcs8PrivateKeyHook; TryExportPkcs8PrivateKeyHook = (Span destination, out int bytesWritten) => { @@ -225,6 +265,21 @@ public void AddContextBufferIsSameAssertion(ReadOnlyMemory buffer) AssertExtensions.Same(buffer.Span, context); return ret; }; + + SignPreHashAction oldSignPreHashCoreHook = SignPreHashHook; + SignPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + { + oldSignPreHashCoreHook(hash, context, hashAlgorithmOid, destination); + AssertExtensions.Same(buffer.Span, context); + }; + + VerifyPreHashFunc oldVerifyPreHashCoreHook = VerifyPreHashHook; + VerifyPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + { + bool ret = oldVerifyPreHashCoreHook(hash, context, hashAlgorithmOid, signature); + AssertExtensions.Same(buffer.Span, context); + return ret; + }; } public void AddSignatureBufferIsSameAssertion(ReadOnlyMemory buffer) @@ -236,6 +291,14 @@ public void AddSignatureBufferIsSameAssertion(ReadOnlyMemory buffer) AssertExtensions.Same(buffer.Span, signature); return ret; }; + + VerifyPreHashFunc oldVerifyPreHashCoreHook = VerifyPreHashHook; + VerifyPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + { + bool ret = oldVerifyPreHashCoreHook(hash, context, hashAlgorithmOid, signature); + AssertExtensions.Same(buffer.Span, signature); + return ret; + }; } public void AddDataBufferIsSameAssertion(ReadOnlyMemory buffer) @@ -254,6 +317,39 @@ public void AddDataBufferIsSameAssertion(ReadOnlyMemory buffer) AssertExtensions.Same(buffer.Span, data); return ret; }; + + SignPreHashAction oldSignPreHashCoreHook = SignPreHashHook; + SignPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + { + oldSignPreHashCoreHook(hash, context, hashAlgorithmOid, destination); + AssertExtensions.Same(buffer.Span, hash); + }; + + VerifyPreHashFunc oldVerifyPreHashCoreHook = VerifyPreHashHook; + VerifyPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + { + bool ret = oldVerifyPreHashCoreHook(hash, context, hashAlgorithmOid, signature); + AssertExtensions.Same(buffer.Span, hash); + return ret; + }; + } + + public void AddHashAlgorithmIsSameAssertion(ReadOnlyMemory buffer) + { + SignPreHashAction oldSignPreHashCoreHook = SignPreHashHook; + SignPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + { + oldSignPreHashCoreHook(hash, context, hashAlgorithmOid, destination); + AssertExtensions.Same(buffer.Span, hashAlgorithmOid); + }; + + VerifyPreHashFunc oldVerifyPreHashCoreHook = VerifyPreHashHook; + VerifyPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + { + bool ret = oldVerifyPreHashCoreHook(hash, context, hashAlgorithmOid, signature); + AssertExtensions.Same(buffer.Span, hashAlgorithmOid); + return ret; + }; } public void AddFillDestination(byte b) @@ -286,6 +382,13 @@ public void AddFillDestination(byte b) destination.Fill(b); }; + SignPreHashAction oldSignPreHashCoreHook = SignPreHashHook; + SignPreHashHook = (ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + { + oldSignPreHashCoreHook(hash, context, hashAlgorithmOid, destination); + destination.Fill(b); + }; + TryExportFunc oldTryExportPkcs8PrivateKeyHook = TryExportPkcs8PrivateKeyHook; TryExportPkcs8PrivateKeyHook = (Span destination, out int bytesWritten) => { diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTests.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTests.cs index 6f276d089d798e..7c701a1d451bd0 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTests.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTests.cs @@ -5,6 +5,7 @@ using System.Formats.Asn1; using System.Linq; using System.Security.Cryptography.Asn1; +using System.Security.Cryptography.SLHDsa.Tests; using Microsoft.DotNet.RemoteExecutor; using Microsoft.DotNet.XUnitExtensions; using Test.Cryptography; @@ -74,10 +75,18 @@ public static void NullArgumentValidation(MLDsaAlgorithm algorithm, bool shouldD PbeParameters pbeParameters = new PbeParameters(PbeEncryptionAlgorithm.TripleDes3KeyPkcs12, HashAlgorithmName.SHA1, 42); + byte[] hash = [1, 2, 3, 4]; + byte[] signature = [5, 6, 7, 8]; AssertExtensions.Throws("data", () => mldsa.SignData(null)); AssertExtensions.Throws("data", () => mldsa.VerifyData(null, null)); AssertExtensions.Throws("signature", () => mldsa.VerifyData(Array.Empty(), null)); + AssertExtensions.Throws("hash", () => mldsa.SignPreHash(null, null)); + AssertExtensions.Throws("hashAlgorithmOid", () => mldsa.SignPreHash([1, 2, 3, 4], null)); + AssertExtensions.Throws("hash", () => mldsa.VerifyPreHash(null, null, null)); + AssertExtensions.Throws("signature", () => mldsa.VerifyPreHash(hash, null, null)); + AssertExtensions.Throws("hashAlgorithmOid", () => mldsa.VerifyPreHash(hash, signature, null)); + AssertExtensions.Throws("password", () => mldsa.ExportEncryptedPkcs8PrivateKey((string)null, pbeParameters)); AssertExtensions.Throws("password", () => mldsa.ExportEncryptedPkcs8PrivateKeyPem((string)null, pbeParameters)); AssertExtensions.Throws("password", () => mldsa.TryExportEncryptedPkcs8PrivateKey((string)null, pbeParameters, Span.Empty, out _)); @@ -103,6 +112,8 @@ public static void ArgumentValidation(MLDsaAlgorithm algorithm, bool shouldDispo int secretKeySize = algorithm.SecretKeySizeInBytes; int privateSeedSize = algorithm.PrivateSeedSizeInBytes; int signatureSize = algorithm.SignatureSizeInBytes; + byte[] signature = new byte[signatureSize]; + byte[] hash = new byte[HashInfo.Sha256.OutputSize]; if (shouldDispose) { @@ -118,12 +129,232 @@ public static void ArgumentValidation(MLDsaAlgorithm algorithm, bool shouldDispo AssertExtensions.Throws("destination", () => mldsa.ExportMLDsaPrivateSeed(new byte[privateSeedSize + 1])); AssertExtensions.Throws("destination", () => mldsa.SignData(ReadOnlySpan.Empty, new byte[signatureSize - 1], ReadOnlySpan.Empty)); AssertExtensions.Throws("destination", () => mldsa.SignData(ReadOnlySpan.Empty, new byte[signatureSize + 1], ReadOnlySpan.Empty)); + AssertExtensions.Throws("destination", () => mldsa.SignPreHash(new byte[HashInfo.Sha256.OutputSize], new byte[signatureSize - 1], HashInfo.Sha256.Oid, ReadOnlySpan.Empty)); + AssertExtensions.Throws("destination", () => mldsa.SignPreHash(new byte[HashInfo.Sha256.OutputSize], new byte[signatureSize + 1], HashInfo.Sha256.Oid, ReadOnlySpan.Empty)); // Context length must be less than 256 - AssertExtensions.Throws("context", () => mldsa.SignData(ReadOnlySpan.Empty, new byte[signatureSize], new byte[256])); - AssertExtensions.Throws("context", () => mldsa.SignData(Array.Empty(), new byte[signatureSize], new byte[256])); - AssertExtensions.Throws("context", () => mldsa.VerifyData(ReadOnlySpan.Empty, new byte[signatureSize], new byte[256])); - AssertExtensions.Throws("context", () => mldsa.VerifyData(Array.Empty(), new byte[signatureSize], new byte[256])); + AssertExtensions.Throws("context", () => mldsa.SignData(ReadOnlySpan.Empty, signature, new byte[256])); + AssertExtensions.Throws("context", () => mldsa.SignData(Array.Empty(), signature, new byte[256])); + AssertExtensions.Throws("context", () => mldsa.VerifyData(ReadOnlySpan.Empty, signature, new byte[256])); + AssertExtensions.Throws("context", () => mldsa.VerifyData(Array.Empty(), signature, new byte[256])); + AssertExtensions.Throws("context", () => mldsa.SignPreHash(hash.AsSpan(), signature, HashInfo.Sha256.Oid, new byte[256])); + AssertExtensions.Throws("context", () => mldsa.SignPreHash(hash, HashInfo.Sha256.Oid, new byte[256])); + + // Hash length of known OID hash algorithms must be correct + AssertExtensions.Throws(() => mldsa.SignPreHash(new byte[HashInfo.Sha256.OutputSize - 1], new byte[signatureSize], HashInfo.Sha256.Oid, ReadOnlySpan.Empty)); + AssertExtensions.Throws(() => mldsa.SignPreHash(new byte[HashInfo.Sha256.OutputSize + 1], new byte[signatureSize], HashInfo.Sha256.Oid, ReadOnlySpan.Empty)); + AssertExtensions.Throws(() => mldsa.VerifyPreHash(new byte[HashInfo.Sha256.OutputSize - 1], new byte[signatureSize], HashInfo.Sha256.Oid, ReadOnlySpan.Empty)); + AssertExtensions.Throws(() => mldsa.VerifyPreHash(new byte[HashInfo.Sha256.OutputSize + 1], new byte[signatureSize], HashInfo.Sha256.Oid, ReadOnlySpan.Empty)); + + // Must be valid OID + Assert.Throws(() => mldsa.SignPreHash([], "not.an.oid")); + Assert.Throws(() => mldsa.SignPreHash([], signature, "not-an-oid")); + Assert.Throws(() => mldsa.VerifyPreHash(Array.Empty(), signature, "1")); + Assert.Throws(() => mldsa.VerifyPreHash([], signature.AsSpan(), "a")); + + Assert.Throws(() => mldsa.SignPreHash([1], string.Empty)); + Assert.Throws(() => mldsa.SignPreHash([1], signature, "-1.0.0")); + Assert.Throws(() => mldsa.VerifyPreHash(new byte[] { 1 }, signature, "a")); + Assert.Throws(() => mldsa.VerifyPreHash([1], signature.AsSpan(), "a")); + } + + public static IEnumerable ArgumentValidation_Hash_WrongSizeInputs() + { + foreach (bool shouldDispose in new[] { true, false }) + { + foreach (HashInfo hashInfo in HashInfo.AllHashInfos()) + { + yield return new object[] { shouldDispose, hashInfo }; + } + } + } + + [Theory] + [MemberData(nameof(ArgumentValidation_Hash_WrongSizeInputs))] + public static void ArgumentValidation_Hash_WrongSize(bool shouldDispose, HashInfo hashInfo) + { + using MLDsa mlDsa = MLDsaTestImplementation.CreateNoOp(MLDsaAlgorithm.MLDsa44); + + if (shouldDispose) + { + // Test that argument validation exceptions take precedence over ObjectDisposedException + mlDsa.Dispose(); + } + + byte[] signature = new byte[MLDsaAlgorithm.MLDsa44.SignatureSizeInBytes]; + + Assert.Throws(() => mlDsa.SignPreHash(new byte[hashInfo.OutputSize - 1], hashInfo.Oid)); + Assert.Throws(() => mlDsa.SignPreHash(new byte[hashInfo.OutputSize + 1], hashInfo.Oid)); + Assert.Throws(() => mlDsa.SignPreHash(new byte[hashInfo.OutputSize - 1], signature, hashInfo.Oid)); + Assert.Throws(() => mlDsa.SignPreHash(new byte[hashInfo.OutputSize + 1], signature, hashInfo.Oid)); + + Assert.Throws(() => mlDsa.VerifyPreHash(new byte[hashInfo.OutputSize - 1], signature, hashInfo.Oid)); + Assert.Throws(() => mlDsa.VerifyPreHash(new byte[hashInfo.OutputSize + 1], signature, hashInfo.Oid)); + Assert.Throws(() => mlDsa.VerifyPreHash(new byte[hashInfo.OutputSize - 1], signature.AsSpan(), hashInfo.Oid)); + Assert.Throws(() => mlDsa.VerifyPreHash(new byte[hashInfo.OutputSize + 1], signature.AsSpan(), hashInfo.Oid)); + } + + [Fact] + public static void ArgumentValidation_HashAlgorithm_UnknownOidCallsCore() + { + using MLDsaTestImplementation mlDsa = MLDsaTestImplementation.CreateNoOp(MLDsaAlgorithm.MLDsa44); + + byte[] signature = new byte[MLDsaAlgorithm.MLDsa44.SignatureSizeInBytes]; + string hashAlgorithmOid = "1.0"; + + mlDsa.SignPreHashHook = (_, _, _, _) => { }; + mlDsa.AddSignatureBufferIsSameAssertion(signature.AsMemory()); + mlDsa.AddHashAlgorithmIsSameAssertion(hashAlgorithmOid.AsMemory()); + + _ = mlDsa.SignPreHash([], hashAlgorithmOid); + Assert.Equal(1, mlDsa.SignPreHashCoreCallCount); + + mlDsa.SignPreHash([], signature, hashAlgorithmOid); + Assert.Equal(2, mlDsa.SignPreHashCoreCallCount); + + _ = mlDsa.SignPreHash([1], hashAlgorithmOid); + Assert.Equal(3, mlDsa.SignPreHashCoreCallCount); + + mlDsa.SignPreHash([1], signature, hashAlgorithmOid); + Assert.Equal(4, mlDsa.SignPreHashCoreCallCount); + + mlDsa.SignPreHashHook = (_, _, _, _) => Assert.Fail(); + mlDsa.VerifyPreHashHook = (_, _, _, _) => true; + mlDsa.AddSignatureBufferIsSameAssertion(signature.AsMemory()); + mlDsa.AddHashAlgorithmIsSameAssertion(hashAlgorithmOid.AsMemory()); + + _ = mlDsa.VerifyPreHash(Array.Empty(), signature, hashAlgorithmOid); + Assert.Equal(1, mlDsa.VerifyPreHashCoreCallCount); + + _ = mlDsa.VerifyPreHash([], signature.AsSpan(), hashAlgorithmOid); + Assert.Equal(2, mlDsa.VerifyPreHashCoreCallCount); + + _ = mlDsa.VerifyPreHash(new byte[] { 1 }, signature, hashAlgorithmOid); + Assert.Equal(3, mlDsa.VerifyPreHashCoreCallCount); + + _ = mlDsa.VerifyPreHash([1], signature.AsSpan(), hashAlgorithmOid); + Assert.Equal(4, mlDsa.VerifyPreHashCoreCallCount); + } + + public static IEnumerable AllHashesAndLengthsAndExtraUnknown() + { + foreach (HashInfo hashInfo in HashInfo.AllHashInfos()) + { + yield return new object[] { hashInfo.Oid, hashInfo.OutputSize }; + } + + yield return new object[] { "1.0", 0 }; + yield return new object[] { "1.0", 1 }; + yield return new object[] { "1.0", 2 }; + } + + [Theory] + [MemberData(nameof(AllHashesAndLengthsAndExtraUnknown))] + public static void SignPreHash_CallsCore(string hashAlgorithmOid, int hashLength) + { + MLDsaAlgorithm algorithm = MLDsaAlgorithm.MLDsa44; + + byte[] testData = new byte[hashLength]; + byte[] testContext = [3]; + + using MLDsaTestImplementation mlDsa = MLDsaTestImplementation.CreateNoOp(algorithm); + mlDsa.SignPreHashHook = (_, _, _, _) => { }; + + mlDsa.AddDataBufferIsSameAssertion(testData); + mlDsa.AddContextBufferIsSameAssertion(testContext); + mlDsa.AddHashAlgorithmIsSameAssertion(hashAlgorithmOid.AsMemory()); + mlDsa.AddFillDestination(1); + + int signatureSize = algorithm.SignatureSizeInBytes; + + // Array overload + byte[] exported = mlDsa.SignPreHash(testData, hashAlgorithmOid, testContext); + Assert.Equal(1, mlDsa.SignPreHashCoreCallCount); + Assert.Equal(signatureSize, exported.Length); + AssertExpectedFill(exported, fillElement: 1); + + // Span overload + byte[] signature = CreatePaddedFilledArray(signatureSize, 42); + + // Extra bytes in destination buffer should not be touched + Memory destination = signature.AsMemory(PaddingSize, signatureSize); + mlDsa.AddDestinationBufferIsSameAssertion(destination); + + mlDsa.SignPreHash(testData, destination.Span, hashAlgorithmOid, testContext); + Assert.Equal(2, mlDsa.SignPreHashCoreCallCount); + AssertExpectedFill(signature, fillElement: 1, paddingElement: 42, PaddingSize, signatureSize); + } + + [Theory] + [MemberData(nameof(AllHashesAndLengthsAndExtraUnknown))] + public static void VerifyPreHash_CallsCore(string hashAlgorithmOid, int hashLength) + { + using MLDsaTestImplementation mlDsa = MLDsaTestImplementation.CreateNoOp(MLDsaAlgorithm.MLDsa44); + + int signatureSize = MLDsaAlgorithm.MLDsa44.SignatureSizeInBytes; + byte[] testSignature = CreatePaddedFilledArray(signatureSize, 42); + byte[] testData = new byte[hashLength]; + byte[] testContext = [3]; + bool returnValue = false; + + mlDsa.VerifyPreHashHook = (_, _, _, _) => returnValue; + mlDsa.AddDataBufferIsSameAssertion(testData); + mlDsa.AddContextBufferIsSameAssertion(testContext); + mlDsa.AddSignatureBufferIsSameAssertion(testSignature.AsMemory(PaddingSize, signatureSize)); + mlDsa.AddHashAlgorithmIsSameAssertion(hashAlgorithmOid.AsMemory()); + + // Since `returnValue` is true, this shows the Core method doesn't get called for the wrong sized signature. + returnValue = true; + AssertExtensions.FalseExpression(mlDsa.VerifyPreHash(testData, testSignature.AsSpan(PaddingSize, signatureSize - 1), hashAlgorithmOid, testContext)); + Assert.Equal(0, mlDsa.VerifyPreHashCoreCallCount); + + AssertExtensions.FalseExpression(mlDsa.VerifyPreHash(testData, testSignature.AsSpan(PaddingSize, signatureSize + 1), hashAlgorithmOid, testContext)); + Assert.Equal(0, mlDsa.VerifyPreHashCoreCallCount); + + // But does for the right one. + AssertExtensions.TrueExpression(mlDsa.VerifyPreHash(testData, testSignature.AsSpan(PaddingSize, signatureSize), hashAlgorithmOid, testContext)); + Assert.Equal(1, mlDsa.VerifyPreHashCoreCallCount); + + // And just to prove that the Core method controls the answer... + returnValue = false; + AssertExtensions.FalseExpression(mlDsa.VerifyPreHash(testData, testSignature.AsSpan(PaddingSize, signatureSize), hashAlgorithmOid, testContext)); + Assert.Equal(2, mlDsa.VerifyPreHashCoreCallCount); + } + + [Theory] + [MemberData(nameof(AllHashesAndLengthsAndExtraUnknown))] + public static void VerifyPreHash_ByteArray_CallsCore(string hashAlgorithmOid, int hashLength) + { + using MLDsaTestImplementation mlDsa = MLDsaTestImplementation.CreateNoOp(MLDsaAlgorithm.MLDsa44); + + int signatureSize = MLDsaAlgorithm.MLDsa44.SignatureSizeInBytes; + byte[] testSignature = CreateFilledArray(signatureSize, 42); + byte[] testData = new byte[hashLength]; + byte[] testContext = [3]; + bool returnValue = false; + + mlDsa.VerifyPreHashHook = (_, _, _, _) => returnValue; + mlDsa.AddDataBufferIsSameAssertion(testData); + mlDsa.AddContextBufferIsSameAssertion(testContext); + mlDsa.AddSignatureBufferIsSameAssertion(testSignature); + mlDsa.AddHashAlgorithmIsSameAssertion(hashAlgorithmOid.AsMemory()); + + // Since `returnValue` is true, this shows the Core method doesn't get called for the wrong sized signature. + returnValue = true; + AssertExtensions.FalseExpression(mlDsa.VerifyPreHash(testData, new byte[signatureSize - 1], hashAlgorithmOid, testContext)); + Assert.Equal(0, mlDsa.VerifyPreHashCoreCallCount); + + AssertExtensions.FalseExpression(mlDsa.VerifyPreHash(testData, new byte[signatureSize - 1], hashAlgorithmOid, testContext)); + Assert.Equal(0, mlDsa.VerifyPreHashCoreCallCount); + + // But does for the right one. + AssertExtensions.TrueExpression(mlDsa.VerifyPreHash(testData, testSignature, hashAlgorithmOid, testContext)); + Assert.Equal(1, mlDsa.VerifyPreHashCoreCallCount); + + // And just to prove that the Core method controls the answer... + returnValue = false; + AssertExtensions.FalseExpression(mlDsa.VerifyPreHash(testData, testSignature, hashAlgorithmOid, testContext)); + Assert.Equal(2, mlDsa.VerifyPreHashCoreCallCount); } [Theory] diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestsBase.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestsBase.cs index 41e2d5e08cca00..c2da6357672279 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestsBase.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestsBase.cs @@ -34,6 +34,17 @@ public void GenerateSignVerifyNoContext(MLDsaAlgorithm algorithm) ExerciseSuccessfulVerify(mldsa, data, signature, []); } + [Theory] + [MemberData(nameof(MLDsaTestsData.AllMLDsaAlgorithms), MemberType = typeof(MLDsaTestsData))] + public void GenerateSignVerifyPreHashNoContext(MLDsaAlgorithm algorithm) + { + using MLDsa mldsa = GenerateKey(algorithm); + byte[] data = [1, 2, 3, 4, 5]; + byte[] hash = HashInfo.Sha256.GetHash(data); + byte[] signature = mldsa.SignPreHash(hash, HashInfo.Sha256.Oid, []); + ExerciseSuccessfulVerifyPreHash(mldsa, HashInfo.Sha256.Oid, hash, signature, []); + } + [Theory] [MemberData(nameof(MLDsaTestsData.AllMLDsaAlgorithms), MemberType = typeof(MLDsaTestsData))] public void GenerateSignVerifyWithContext(MLDsaAlgorithm algorithm) @@ -46,6 +57,19 @@ public void GenerateSignVerifyWithContext(MLDsaAlgorithm algorithm) ExerciseSuccessfulVerify(mldsa, data, signature, context); } + [Theory] + [MemberData(nameof(MLDsaTestsData.AllMLDsaAlgorithms), MemberType = typeof(MLDsaTestsData))] + public void GenerateSignVerifyPreHashWithContext(MLDsaAlgorithm algorithm) + { + using MLDsa mldsa = GenerateKey(algorithm); + byte[] context = [1, 1, 3, 5, 6]; + byte[] data = [1, 2, 3, 4, 5]; + byte[] hash = HashInfo.Sha256.GetHash(data); + byte[] signature = mldsa.SignPreHash(hash, HashInfo.Sha256.Oid, context); + + ExerciseSuccessfulVerifyPreHash(mldsa, HashInfo.Sha256.Oid, hash, signature, context); + } + [ConditionalTheory(typeof(MLDsaTestHelpers), nameof(MLDsaTestHelpers.SigningEmptyDataIsSupported))] [ActiveIssue("https://github.com/dotnet/runtime/issues/116461", TestPlatforms.Windows)] [MemberData(nameof(MLDsaTestsData.AllMLDsaAlgorithms), MemberType = typeof(MLDsaTestsData))] @@ -74,18 +98,25 @@ public void GenerateSignExportPublicVerifyWithPublicOnly(MLDsaAlgorithm algorith byte[] publicKey; byte[] data = [ 1, 2, 3, 4, 5 ]; byte[] signature; + byte[] hash = HashInfo.Sha256.GetHash(data); + byte[] signaturePreHash; using (MLDsa mldsa = GenerateKey(algorithm)) { signature = mldsa.SignData(data); AssertExtensions.TrueExpression(mldsa.VerifyData(data, signature)); + signaturePreHash = mldsa.SignPreHash(hash, HashInfo.Sha256.Oid); + AssertExtensions.TrueExpression(mldsa.VerifyPreHash(hash, signaturePreHash, HashInfo.Sha256.Oid)); + publicKey = mldsa.ExportMLDsaPublicKey(); } using (MLDsa mldsaPub = ImportPublicKey(algorithm, publicKey)) { ExerciseSuccessfulVerify(mldsaPub, data, signature, []); + ExerciseSuccessfulVerifyPreHash(mldsaPub, HashInfo.Sha256.Oid, hash, signaturePreHash, []); + AssertExtensions.FalseExpression(mldsaPub.VerifyPreHash(hash, signature, HashInfo.Sha256.Oid)); } } @@ -180,7 +211,7 @@ public void ImportSeed_CanReconstructSecretKey() } [Theory] - [MemberData(nameof(MLDsaTestsData.AllNistTestCases), MemberType = typeof(MLDsaTestsData))] + [MemberData(nameof(MLDsaTestsData.AllPureMLDsaNistTestCases), MemberType = typeof(MLDsaTestsData))] public void NistImportPublicKeyVerify(MLDsaNistTestCase testCase) { using MLDsa mldsa = ImportPublicKey(testCase.Algorithm, testCase.PublicKey); @@ -188,7 +219,16 @@ public void NistImportPublicKeyVerify(MLDsaNistTestCase testCase) } [Theory] - [MemberData(nameof(MLDsaTestsData.AllNistTestCases), MemberType = typeof(MLDsaTestsData))] + [MemberData(nameof(MLDsaTestsData.AllPreHashMLDsaNistTestCases), MemberType = typeof(MLDsaTestsData))] + public void NistImportPublicKeyVerifyPreHash(MLDsaNistTestCase testCase) + { + byte[] hash = HashInfo.HashData(testCase.HashAlgOid, testCase.Message); + using MLDsa mldsa = ImportPublicKey(testCase.Algorithm, testCase.PublicKey); + Assert.Equal(testCase.ShouldPass, mldsa.VerifyPreHash(hash, testCase.Signature, testCase.HashAlgOid, testCase.Context)); + } + + [Theory] + [MemberData(nameof(MLDsaTestsData.AllPureMLDsaNistTestCases), MemberType = typeof(MLDsaTestsData))] public void NistImportSecretKeyVerifyExportsAndSignature(MLDsaNistTestCase testCase) { using MLDsa mldsa = ImportSecretKey(testCase.Algorithm, testCase.SecretKey); @@ -320,5 +360,52 @@ protected static void ExerciseSuccessfulVerify(MLDsa mldsa, byte[] data, byte[] AssertExtensions.TrueExpression(mldsa.VerifyData(data, signature, context)); } + + protected static void ExerciseSuccessfulVerifyPreHash(MLDsa mldsa, string hashAlgorithmOid, byte[] hash, byte[] signature, byte[] context) + { + ReadOnlySpan buffer = [0, 1, 2, 3]; + + AssertExtensions.TrueExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, context)); + + if (hash.Length > 0) + { + Assert.Throws(() => mldsa.VerifyPreHash(Array.Empty(), signature, hashAlgorithmOid, context)); + Assert.Throws(() => mldsa.VerifyPreHash(ReadOnlySpan.Empty, signature, hashAlgorithmOid, context)); + + hash[0] ^= 1; + AssertExtensions.FalseExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, context)); + hash[0] ^= 1; + } + else + { + Assert.Fail("Empty hash is not supported."); + } + + signature[0] ^= 1; + AssertExtensions.FalseExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, context)); + signature[0] ^= 1; + + if (context.Length > 0) + { + AssertExtensions.FalseExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, Array.Empty())); + AssertExtensions.FalseExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, ReadOnlySpan.Empty)); + + context[0] ^= 1; + AssertExtensions.FalseExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, context)); + context[0] ^= 1; + } + else + { + AssertExtensions.TrueExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, Array.Empty())); + AssertExtensions.TrueExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, ReadOnlySpan.Empty)); + + AssertExtensions.FalseExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, buffer.Slice(0, 1))); + AssertExtensions.FalseExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, buffer.Slice(1, 3))); + } + + AssertExtensions.FalseExpression(mldsa.VerifyPreHash(hash, signature, "1." + hashAlgorithmOid, context)); + + AssertExtensions.TrueExpression(mldsa.VerifyPreHash(hash, signature, hashAlgorithmOid, context)); + } } } diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestsData.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestsData.cs index c7b705fa69973e..754c1e64fc7081 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestsData.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestsData.cs @@ -97,7 +97,7 @@ public override string ToString() => public class MLDsaNistTestCase { - public MLDsaNistTestCase(int nistTestCaseId, MLDsaAlgorithm algorithm, bool shouldPass, string publicKeyHex, string secretKeyHex, string messageHex, string contextHex, string signatureHex) + public MLDsaNistTestCase(int nistTestCaseId, MLDsaAlgorithm algorithm, bool shouldPass, string publicKeyHex, string secretKeyHex, string messageHex, string contextHex, string signatureHex, string? hashAlgOid = null) { NistTestCaseId = nistTestCaseId; Algorithm = algorithm; @@ -107,6 +107,7 @@ public MLDsaNistTestCase(int nistTestCaseId, MLDsaAlgorithm algorithm, bool shou MessageHex = messageHex; ContextHex = contextHex; SignatureHex = signatureHex; + HashAlgOid = hashAlgOid; } public int NistTestCaseId { get; private set; } @@ -119,6 +120,7 @@ public MLDsaNistTestCase(int nistTestCaseId, MLDsaAlgorithm algorithm, bool shou public string MessageHex { get; private set; } public string ContextHex { get; private set; } public string SignatureHex { get; private set; } + public string? HashAlgOid { get; private set; } public byte[] PublicKey => PublicKeyHex.HexToByteArray(); public byte[] SecretKey => SecretKeyHex.HexToByteArray(); @@ -127,7 +129,9 @@ public MLDsaNistTestCase(int nistTestCaseId, MLDsaAlgorithm algorithm, bool shou public byte[] Context => ContextHex.HexToByteArray(); public byte[] Signature => SignatureHex.HexToByteArray(); - public override string ToString() => $"Nist Test Case {NistTestCaseId} ({Algorithm}, ShouldPass: {ShouldPass})"; + public override string ToString() => HashAlgOid != null ? + $"Nist Test Case {NistTestCaseId} ({Algorithm} + {HashAlgOid}, ShouldPass: {ShouldPass})" : + $"Nist Test Case {NistTestCaseId} ({Algorithm}, ShouldPass: {ShouldPass})"; } public static partial class MLDsaTestsData @@ -150,21 +154,29 @@ public static IEnumerable AllMLDsaAlgorithms() => [MLDsaAlgorithm.MLDsa87], ]; - public static IEnumerable AllNistTestCases() + public static IEnumerable AllPureMLDsaNistTestCases() { - foreach (MLDsaNistTestCase nistTestCase in s_nistTestCases) + foreach (MLDsaNistTestCase nistTestCase in s_pureMLDsaNistTestCases) + { + yield return [nistTestCase]; + } + } + + public static IEnumerable AllPreHashMLDsaNistTestCases() + { + foreach (MLDsaNistTestCase nistTestCase in s_preHashMLDsaNistTestCases) { yield return [nistTestCase]; } } public static MLDsaNistTestCase GetPassingNistTestCase(MLDsaAlgorithm algorithm) - => s_nistTestCases + => s_pureMLDsaNistTestCases .Where(tc => tc.Algorithm == algorithm && tc.ShouldPass) .Single(); // one failing and one passing test case for each algorithm, each failing for different reason - private static MLDsaNistTestCase[] s_nistTestCases = + private static MLDsaNistTestCase[] s_pureMLDsaNistTestCases = [ new MLDsaNistTestCase( nistTestCaseId: 1, @@ -2262,6 +2274,3100 @@ public static MLDsaNistTestCase GetPassingNistTestCase(MLDsaAlgorithm algorithm) "00000000000000000000000000000000000000090F13161E242832") ]; + // one passing per each hash algorithm and one failing, each failing for different reason + private static MLDsaNistTestCase[] s_preHashMLDsaNistTestCases = + [ + new MLDsaNistTestCase( + nistTestCaseId: 16, + algorithm: MLDsaAlgorithm.MLDsa44, + shouldPass: false, // modified signature - z + publicKeyHex: + "866930601EB856FD921216F506039030224470B3361E4C1E5C897A883370A29EC822282323D36046" + + "97AF027A2D2177E2C8219754CC22E4E0407F003FD24CA806EF3292DA6824B99FBBC8133E53002E4F" + + "3A78EEC1050D252BB9BE8DA4B92BF63661E5082DBEB6753B7D618FCB3FB1961267E61349B1BD5F10" + + "3AFC6C02D74157F85CD1D0F64285F9D1AECD0B955B0E49A28D8004D6D30D4DD30EE1011C5D5B00CA" + + "1C0C45875BC4CA5139B0004A1DADC2EB05E486F42E4DB8F99CAA79D163CBEFC982646F0115EE9AD5" + + "EB3CE9A8DB21073D6DA2417AE9D5BFDD0E04644F965ABF965713CABD53BEC11A6168382F0B759D38" + + "A7678A8B96E98E0853E98BE281A859F3E8A115FA84EF72246F825338584D53A2EB517E8B4EF8E1AD" + + "702B442DBB47CF6976F256FBAFA464D68A17042705255E7D55D833EAD008468420BD3C760F0E1DAD" + + "EB4430C7C9DF16F43DAECB7387F18A22744B050FE1C9604F2062331D2894C26AD367274A538EAC99" + + "591EBDCF0BC7D0D39B40F3E5DC11481B03ED005B94DFF0099725F4F2AEF1BA7FD2719D77FF1A9511" + + "46B41E94A0C53B3924431B03C1D6ACA6F67139A3804A2CE9A8D82E4393051A8967F758167E9B7BC1" + + "9E9A91FE2DA4FA8FFA42D3239D96E503338B71B23C3A563CB20CE7DF8AF7EBEE24CFF2FF899E42A7" + + "C4BB7B896372808E92A2051D0F16869A20AA38213A67AA5CB9AC4BE99D55E3D9B035318E1C031C21" + + "E51D29C73BFD6BCBF2F338AF8C5676DC98348BABE62146507A0568B968493FE3A5E77B114E128C40" + + "C4BA8EDBD72B6A310F23435438B04E2CE88033434130EA617644B85152E77137986279F0B20FBDB6" + + "C8F560C218F9E18DB6F9333852AF51DE0446686419CEB83A891592F740F0EF40937BA2164391F552" + + "DB6B3C77AF0DBFDFF5F6C0A43CFE466773B0795193603C03E40012AAA265041AC8DFE3F3240B1B1F" + + "483F9D72BEBF0E7179D198A57E11891C360EAD0A73E3E4018DD22A82CB063A5930E26C9C17D4A423" + + "85637329E78EA274675622ABDF54163FD42169DE55E6FC08A365755701623BD8324C804854DC2406" + + "6C7F2735DEC0C8F3D6C78615082CBF6C95E00D25106DA1A6913BCAACE7EB34C07F8C9F7744FAEACD" + + "FEA9210B3AECE5FAE7E88DE71656992C05A80421F0F8CEE9C0B7EBA9807A4D253B8CC391B7F600A2" + + "A5F51AFB01B7E434941ACC24FEC26C4909FA01FEAC3CD543C4CEDBA7619BE5707872C8E310EC1A51" + + "4BE4B30B037553EB159303C283E8DEA718D37F013EBC03ED7C1553A4AFC3202C5439FA6779104FAF" + + "22A16C827F78216F45098732622150E7FB37C0A7C5C8B3991983678C1DEB6882E3861DD1BEB1B43B" + + "D4C8C3F9D87AECD734205BBBCDF23CF718C2A20C852753BB01CF9402CD69DD9BF985E32A3FFD91C9" + + "B320E55D1F1E028275E0E51BF6725D0A839D0434EA22703E08B9CAB1B8B7509442E51DCFED9062BA" + + "2084D8894A1CA4B045C14295010E240827E760731BFE3803536E583821F382993231D917C0D7FC54" + + "6261BD3910001B05E94C65CE8FA35BBC1AC059CDDD74D15076E77A5A73205EB4CAD14F5A626F99B2" + + "EF1488496B5B65943B703A1F546B8EC90091CFBAC18F82EB74780F95016235BCB1AAFE093230906B" + + "F4DDA58639A66FAB3139C7E6A615E8F853F1F053A45AE2D841DBDF1584C217387A18DF5C435919D4" + + "1856552625F176EAD2FA46607F259F2311F5203685953E523519E85B28C550498F8B57BB7D60E7CD" + + "5CDC88EE8AC8EA3F50EC278C1247745F26067757A99D551E1EF887AEE5453A4C7D8C9D61A00E4F4E" + + "1E24F2FBC849229EFF0BC7AF51D82FB2777C3F974673FC086BD0C01B49702DAF", + secretKeyHex: + "866930601EB856FD921216F506039030224470B3361E4C1E5C897A883370A29EEEEC161576DD7695" + + "A24FEB1B99DC6418D50C07FE1E4A34B8BAD5E018BF15D9DF5C0C599BF5629CA0EBC1AB2983A541C0" + + "B5DEC0629774AD251285014AC12077446A32CFB45E22FB6163E326D25E3BF9E4ABB36E06E5381806" + + "91D8766D49459A68C2881099880DD10890CA1208E040711B889112036A1A006084C62D48B20CD9B0" + + "2592244501112489224E019664D0B001CC128C22904C0B03329936909A382D4A049020B2684A284A" + + "0111122406109A028652C20D91386503A9904B22808296440482310A268DC326824C4060C8802104" + + "C4288C8601193582C4C89118197121047023840D62064000880C02886023172ED826409232891B44" + + "080C860003A98D09160921C18042B0008AC4655A82008AA00442408E88286A21446D20C725014105" + + "4CC88153268A0431845A9005E4061298A40D59C2501C272AD02006408604CBC60081360D83084144" + + "08318C082564467113450583C84D039781A1002C8A869114343012418E22C521A2B850CB020A6188" + + "090939915B409081800494C670C4048CA432419B428163242E0AB4094BB02CD3268E190469D0326E" + + "64C8494C4426E2422508080D84920CDC280210088614045222B1049036450C9825134325A28051E0" + + "C211120882110522CC22014C2200433452D01840A4C48064106850C6648C066E52004D0130495324" + + "8982942550147114B1681CC6504146922134664892911849055B0812484069C3024A90C071830485" + + "D246248A385119B6309A826824B42D089051D30031D090449A048561422D03358842866413A66440" + + "C80CA0060D9C962DCBA44891C2654A96299226461432315B12604C3405D0080C0C85511B194C02A1" + + "84C9A08D0A48459A0644090710C320615B4205C44270CA382801041151880808C00119228A41B24D" + + "CB186CA0146C0A982D8B468C84202E92324D1B0552980006A3940921C70804378C014072A2A02022" + + "206624166060C48852C271494844D2A02540380E8A880114054241048C929851D82405E1B8109AC2" + + "409418058BA05194A84D2246908A2640C18404A286312335264B367020184DA38871C4C484108204" + + "8314068C048184B2901A928804386D0B9481CA44515A080D20158D12C22CCA989141188AD402918C" + + "448290C0094BC808D3A2409442001239450C49715B14898C3825440608C238662436861A816DE232" + + "8CCB886D942030D29268A22868200291BCA572BF2D756BC7BC31ADDDF460E70AA596D89A32B5906F" + + "B8A2387E0A60989602EB57BC9026E7F7790C3572961A8A0D406B11D0B9B273F4EAE9B65ECB31F5F0" + + "22F4112D0070600CE013C699B0CBB028DFD28365077EEE9B841575BB9328958D1D9836BA073DBF15" + + "8409CDD19936C60A1F42448D2997CC80FF491B1AE6065F89D18E9F5160C9659608278B6B0E85B237" + + "1BD2E23EC9A85B328C2ED4C31290A6E97E4E616A50EF714A89CBD85E6F411B45154434D8FB7DD4DA" + + "1934EAE3AD425489FE9E9ED1A722B834396A30261D2DC9BDF23D04FC1AAF746517A1EBBD2BA1898E" + + "FC2FF91E99A58D1DD82D6E87369935DD13DB75014F4B9D01937BAA077B8066C20705855FA9B1EA2D" + + "336E5B4E5D4EE580F7861172EE859D362E53A05414C1430852B072DEF5AC8F126F705433B8F14974" + + "7FFC943E34C8453DAEC3C95A83FF1BFC83B3C9CF2FB1F953C0D42A2F4B95527E4B26F18B14430970" + + "8C3BC401C4B35795D925BD80BADA011EAECD0CF569DFC76BEC11937DC5182395466348D0522B3490" + + "43BF9398B616962D9D4701D71D64E38766E78128116C0AFBE2B9F693E9CF2074BA25C05A9B1C2BBD" + + "1B9AA0C93A09C8C4E7DDD25E221A660E9B2B95DEFFBFF3B3F37A1226DA705E347A4812CAE821D0CC" + + "65BB0A0A0236328B473EE64A6315416D286135F8429FB2AFA913CA8F891C8B993DD17DAD8AE6CBC8" + + "E90DE3B9390663FBF7110E5469EC9EDA76DE84C344B2FC1534DBE0ABACC3E1D6DC77087BBD4BAA13" + + "E8F4DF3A29C015FCDDAADA9E1DEE1BFC5A8CBA4A7A8A591E4D871E520BB381A36F5A3E91B642FCC6" + + "0E0919A3D58EBB8C146D8FADAE944729BD042557EBF6791B8B131C9B8FC671D5B64A5A09BF5DF28A" + + "0C399515186A1774DAA7B6F67CDC289535553338756272E096A710BABF688E1A90C659B5A91C4D42" + + "B67076F4D9FFECB825CC22214539EB4066BD66520A69C31D8480FCE524BF7BA2CF8CBA9AEF6C8453" + + "82C381C7910517468211D5EECCE68FD7F7934C248F235AD9F5DFEE94F269EA48A89C33425318CF67" + + "4F36072F23B068D6E9E05D7D20E2D4F9768F92B24550BD28F9E607ABE8C6A2FC48AB2517B9BFDB3A" + + "3E25B06D6C7171BA5FD98D44BB58358DFC6FD94FE7E7C6477B974AFD02F4CDDBB49DEE8716091F04" + + "567DF7D6C1530112B8775BAB78FD5952FC3D7B7E158EDC9C769FC5B6EC257AB5753B223E639495B0" + + "1DA831BA208DD289171AEABB82341B4ECA053479CF2DB189124C4225878E60100A0CDC59605A4CE0" + + "33AFBBC02A6FC72CD1C8ECDE1EC5CB2227A24C3826C11FDB17DBB5C7E6332DC9E87DD8508CDC5569" + + "7E06F725C994EB89F357AD79D00F1982AE124182821288705BE40A5882AB44C2ED1C7873C7C9F7BE" + + "29FED0EE76D26B410455A56D7C7957470BEAF69520E8B5B53D3906A754B15539EDA335B4BD505E99" + + "32A358C7BE175296E0D5274BFEB2E06FE8538736B0250C1CAD4F4C1F600BD2438711014A67FB432A" + + "D7875AF594B7CFD0384F4880468649F9F013DE8A2A789C45E679169B13534DB0F0F3C04FB968F94E" + + "772AA354FBB915C080007C5B453560EEFFACB219BD0BD68406C14B51ED878E5A20DCA87DFC6C61F5" + + "4D5BEFAFC1EDF678B3B36B3875F43BBBD16EEBE2F10DA9CE19FF8DEB48899681456D9F9985026695" + + "830CA7DF3C407E12DC1595004F085AE46F5117BA19E042D4C73827DBD93B2A8088BECA7742D49CC5" + + "74998194A6643FEBE54899B4826B2E9B011EBC934320C462BB00C92BFAD9C0542DFA0FF5BE530F97" + + "F83E06512D113FD086320FF1F2B2CEF3CEF29E1306B1A885CBDCAD4BA1B431F31A51FDDF08A40FA0" + + "158EC4F7D557985DCD64A6A1A68F8222D5BFB46B598840339DB9947B2AF0F61C3D7ACC32F5576274" + + "BE43FF042F1E2E546C8335A82DC697824C91590C7434D230350530E94F4034C232AEDC8EF7004CEC" + + "BF28E8B4C1B8F0EAC77765FF183B18B97B0ED2B567075A5FD30F14372242E55DEAB3277138069452" + + "CA04B9A74E21611A42BC25AD63571747A0C4B34EE659AD5CB5C474CF86D9846DC01276C950BE1A46" + + "B4EDFF8A03EFA9A1B1609D8A804273D895B494D2455CE0247C26C32DA9F9E7A6E4A1B226CCBB55DA" + + "0827F71B54AC8DA25F94E215DB7E057536DEC9AADF5B00E0A67915674FD3D9D2BEDB9481417C25A1" + + "38FD2EFFA30298A1DC8FAAFEA2AFFD8D7D5F2AEBB03EEBABFA6313EC8442DCC9EB4ABCE2CBDE855C" + + "315EDB5CDC0CE9EB3FFAF4C2B476DF8FAC092BF2A4F05729168389C627045D0416BDC6EA34EBA8CB" + + "BB30B4055CA5C12D19A5E6247A7141F0B7652C746D16238FFEF2AC9CB7D412B02DFAA31D118AB1C0", + messageHex: + "7398C12475340FA38B36E2BBF1A7C9C6B5372AC4A8B9B91FD28AA268FC8371AF56C58462D554459C" + + "18E3FD2136B9B483A20480DF450473F7FB9679BAD0278788571974A52A6CCB361670C81BB1B4B64C" + + "457290840CC9C8CA6BAFCEA08A5C0CE0FFAFD6ED05F9F632898CA80ECFDEA6C9370317DC0886382E" + + "06799F209E54C3BF7E97FA587EEE505C4F980B44F7CF440BCF6DF44D1C8B78F90754DB555645CA94" + + "D1A0DE13EA76372C51336780804082E1CEF66569E8945F5DAAE4CFB51AA190B6188B857AB1130135" + + "D7DDE27CE823DDD70AF5F7E6FBE31F561A8F26EBAC0E0934AF50A35D178DD7C5DC614C08EB7AECD1" + + "CF7BC424D63F06BCE99C0788D8DE9724E5CEF6D5F4AD53CE19CD25029F09F32118FFC94332EF02A5" + + "25980A6A5BF1930264EC11DE9B05D099BFF613D9E42C54F40763796CE0FB10F7AC92DAC54613C52D" + + "A70A2EF3FDFA84926BAA3F43E7AF37FF5D507D211E3A0D92E00ED820973B43FF39FB891C2BB24485" + + "8498A7ED8EF00685B371018912FF2830275AA6417F092A1298CD33ED35EA705ED99020476B34ED86" + + "505829C14EDBCD6DE8BE079C111E15A4DF12227B7756DEDC324F64DF6D10EE2EF6B76095AD0A25BA" + + "49AA4413C7A3AE3E708D585A63E33DB1EED7CB739516182CD1CF40BF5D8531376C865FB408CCB4FE" + + "C3FAF6853DC0FD3676BD1BDF429240A85F4CDF7BA272386613951A611AB46F09B60D05D6BF7878B1" + + "4AE23195EC45CD87E77A6877D56A0CC9D0B5FDB6724819A85307240F1A2822C7C3B5E6AF3B091B11" + + "4B8DAA345CC210DB1D1FFFE23F3C6631926C9F0756191591AEC539E5462AE8D0973DF2D87AAC15F2" + + "0E7A282FBAD18CFD9A2DD923D9B34E3E6524E071B41E56464EB9B3CC39015E6B9078BAA5577AB68F" + + "36EE049C7037894A0A2CD9D917A56BC91F80A97060C3EC9FCA495B62FE596B3FFEF8171FE876C6F8" + + "2A139025A029B5EBDBB9FEC2BAB4874E0EED12362FB35E9B527902CC9146821E436325E711FA8CDC" + + "808A165CF4BDB900C5A8666B94095C4FFBA2202C053576F216F38073B54CF67558A7408B035A3E72" + + "A6080207389811C3D7DB33086FE584C01619B7332F5F09C7AF9F04A6CD332B2FAB90118AF58D0BCD" + + "26AFD3BF13A6145D4D0DBF2E89E902B892F79444663873AA9A47AE8442D2CDD548401C32189CBE44" + + "E36ADE40DDC6765914545CC363540E42E2EB5BD1EAF8C82C4D9CF40042170DEFBAF798747A5595F6" + + "18997C0AFE1B723D415E4A258C793B7CDF599572BC8FF2915F5BDED5914FA12C10E74B2675A785E3" + + "0FB18F35A86C4B99CC2AC41C82A6DE64BFF1B284FF81EED094F292D71308A7A37518199AF3B28312" + + "DFDE567F20361FA2BF5E2F1C4BFBFB284C83E82B7E2B7823AAE452A1499DC2EE0DFD80FBA93A537C" + + "1E10028B2B5187C8B96238B6A1900F60D900BA74B33DB3C1E95B6DD2C4B48A843989BC8E8B512364" + + "5805DEFD5EAC497BD044AF34BE8D06DA9F8DDC4FB5DFCE975F9662EB0CE0A489347801B918534EC6" + + "AA22B2924CEA1B9C74C86E2FDA58DD59BFF650AD73F49D83D6FC1FDA297AA30EBDB7A892398D8EB0" + + "44D6DFAA637B8553532A34BB620C7E52B5EC1FDB9A5F725473D2AB60AC3084F3B2B2B9F147536FF6" + + "D7B9399BCF16E0681854C2BE804163FEC827FDD2725D0D8CC603D2437596A778AAA01CFD5D3A7B70" + + "A51DBEBABC4AF685F52E88EECB1997F4B797D64A878586D60E7F0977C6582C5015C8EC0951C5249C" + + "4D59C9FB6CB6F7B318E3568A8A903891270F7FE1E744DFBE2AF4A4C2CDB0D70E2160DBBF17AEE58E" + + "60F0BCA6175745BA8BBABA28D345FD2919E0A9524458A3D5896EE1CF4BC34BE2385327E46EF99FD4" + + "47E91B7185607C0330268363901EE287D52A9FB72B8CA3A62B408950492D4F9D443A7126E0780028" + + "250C5CEE6A7722C1A47012BD96E30EB810FCEA8589A2108C15EEDBB2E086F8E7E8369B3945B3A315" + + "C512F359B9648C1FEC51ADD960E85EC146A1A20E8DE7D397CACC222203FA0ABDD54A6EE763562DB7" + + "FC689AB41EC2B30A599E344F71786034F957B0E71C88888605CB9C13F3B7607AF01486ED1BCDEE7B" + + "B33EAB8B811089715D619FC3D11ECB8356B6820D3E6749042AB55FFBEABE95991B8206E80CDE3C88" + + "D8DA7A3DBC8A2F500F70ACB1670AFDB926B86ABD98624BD89E5C4E016EDBF40267E9173B2070BC94" + + "73F75D359634F5698374C300E1A472F0159BAD791FA2486CA642E55D73802EEAB84B620A5261734C" + + "D56DA4B6479B444D478BBC4F5A75E0D502B0960980CBD7272B0B9B26F2B97BD1EA08EFFF784A1D3D" + + "4B66284AA859F5547154C3CE335E54C56C1C0165D890B36FD664A94FCA522AC67ECA67D49044442C" + + "7074B6A52851369358BA51A2109B07B33BB98FED8565C928FAEC2069F1AC7FBEBF1200E044EE2965" + + "512EB5937A24B39E3459811002043E7154FA9452B788C20D4ECCC7C43A3B0CBCC991F1C4D61D238F" + + "3ED7F2B4B9CD8A86D63B1B50ABF3F643F38BB19EB3F176260D3BDE8D8B14AC704B4045AECCB598FF" + + "6A7BB5B1621AF7A81E7CD8838E6FCF8485BE6A52CDF5028CED7E6BA39B15BFCB0F3F0D8376FCE578" + + "8DAB828DA09AEEB7E3E0C38B81A83F78FE2CAD48928554A109791D7C26B264494AECFA0D6D00B89A" + + "C6FE28EFB6C9452CBC3435DB45306488B8EF8D5834B5B50BD07A55C7D4FCAD3407F378F60D0D9197" + + "D25232DCBE35C49FB3CF091A34BF8E3FF435FC4760177FEE11F4100AD01757C20AC217C3F4AA41CC" + + "C2B5DE53EBBE2817FD480E64CF9B59EA152786FF0286559122F4D85DD68C88029ACBE3BA01941697" + + "F3129125A97AB6E31FEE4F7DADDB98A66FE0E801551C2A8F6EB7DF857E79D865A433DB9B2DC5720B" + + "F52E79001BF6BA79516133DAFABACBCFADBEEA1B85AB1199EF6B736755EA07A3BAE3BB21ECD74D58" + + "D265319012C8D1189B318535682CEEB15065D8684F8CDF82F245A2CBD3660132F35248745C61FFC8" + + "D4C3F4356CFAE95DAE8E88ED0A40AB1BD98DF21190A5DC8F66F12F518A9D40D852E3A9FBA8B910E4" + + "573270AFF6672422A4D2129C3A51AB7EBF9CEE7CDE40901F3E7E542E6350EDEC2A2C633B239B2B54" + + "6E0D911ABD7E57A7110C4B95A53B10BA6E944A22BC922F35ECCF1B91F9BD8A0A3293B7EFFBFEB488" + + "A010C19285DABB46BE5CF8AEA55EE726FC8C187106F8B8D39FD1706081CF176642EF80A4B92BC205" + + "402289B1902ADBA2F339BE1265F67820B47ABE48E0FC68480D88D88100DB5FBB9F7E677F186C4E5E" + + "1A515CE91824EF1A71807F18E76184A8A1A21EDE88F5F35022D6375411E9A13493A5AA64A409EB2B" + + "676077F42C8191D6D27869BAA1E103C4B501F30350577BE875AC99783757210A5CBFC08BBAA95215" + + "DA87AC8CD216E12C1EE2BBC61448EB27EC319D7F966C5E7F053BD0830E22A771C7074B3C7F671A12" + + "2C30E596D626462D43CEAE611A1A1D25C42BF3EC280D5D037891EC5B752FF59A93B899B39222AAF9" + + "28F9916B261F03B463C06B7502ADCAC5E477B8811F6F26D43AD4811DCE80E630A0F59AF3D3427B31" + + "130CCB9B03306E14D5683478534BEFC3EC64AEA15016C02E5C6FA570C2A02E18F00CCC0E331339E8" + + "75D2338EAE439F46665D93015B6B3DE01AFEAF3C18E4E709F7E2BCF391552180660A0C8EF6DA2C0C" + + "ACBE54A9A925FBACFF5E645494A0F282602A69DB4F4C04BB073D2757183D3F7F5243DC0B66473360" + + "BE0C3F961128BE8E6125CB355A7F5089C9BBF1DD86BAB93EF5757D522E54A72C5FC35B9FD5CE76F8" + + "1AAD11D17C34F5D0960B600D74932419AB14648821D83B73F647694F4FE6942AC86571AAD465535A" + + "FE9E2B69C79E74C913AA8569F83F5E8C57E536CF8EF36EC17427ACE85D37C4317E5DC7806493592D" + + "17F842BEA70851744ECEE29896D1B7C51E90FC21CB8BC255692C724AB4AC5A3A7ECDA145B98D5170" + + "4977731F8D2D5EF0A77C2CBFCDD7FAB83EFB4BF8799AECC1EE70C6F5C25E424B4FCAF9C6440051B5" + + "25EBE5A16E48AA45C264A4FBD9A13A423EB71FDFE384DC8C1D9B08781DBD1DE2F72599B4DD2B790D" + + "4FAA799FEB60E75842168461E349DABFA0C2CCE856FAEF3C03905BC0F97D58C2190328BE437C4EEA" + + "835F720CF9207353E5923135EE93117868BC1C3A4A6AB7B5227D82569CC051D2F7BB7B677257F81F" + + "CAA62BB0327B409B59C47E954F46A5FEC6E563F2403DF9114364B12E2E6A3DE6516B81F0697E9A86" + + "70C29495D19536A8E9A9D2AF3E4A8A4B96942ECD02B05DEE5A502A85EF8FA89995A13CCA8990A571" + + "31B3DF8C5997377BF1707F11173028AC8D1D257707675CC8352B4775C67BBC16A546FD2B5DEA0B80" + + "C731ED4B58DDC5DD17024645A64AB82EDE3C766418FFADDEBCD8EEDD0D40AFD363CCC2BF963A05AC" + + "906074735A78EE94230A6B0CBE6F4C89F083865D8A563D8B76A0BE95DEDB39494935D465899D6143" + + "3579334BCB25742261A09ACF844EE265C5FD10BCBC230D575637323391AE2A8B530BAB6CBB038986" + + "5C7AB8EC328F817B686613B328B54EE0E6EE4E55ACD19D1A8DCD5F06CA4BCBD8B139710A04F345A4" + + "8CDF052FC8B758B21175B886DC3AC0CE85BDDF78340D5A6E95DB6B816860569E752A906D9F23D76C" + + "46941324B960B41DBBD96B5B91BBCF1C4CA552A0249F47259A71E791587CA7F0197134042AA713E8" + + "7C9021AF85F10F5CBBE8E94713F1DE7A983ECCCC4831ADDC88F14CA1188B0536EC66910319E06467" + + "3D30C2065830E265124C8F30DDFF4E0E933A8FEA584D8D7EEE4277F657F1C6286EAACC973F411718" + + "DBA5EEA509F478635CE8F4E009D21109C702477048BD0B01F199245663AAF6881B99BC6A57558036" + + "B3C0B362F2B8C293012F4236C932B2971045FA8A2B2C240F4BE798CB6513390A3811A3FA551B47EC" + + "234F8387BA416FB364227E905FB84856BB087D39A4E5E284B6FC7839E616BA8ED65A427382DF18C9" + + "203DB14898F006B04B8A110FA91D4666C30566D20A90F1166B1680666993E0CD182757EB4CA68A1D" + + "CF83C9D82D26A457C0AB0763AC30F07829FDEF220ED63314623F364D750711CA681303FB081B145A" + + "388F3C9CA7430C4E75CCF35E71F231D27ED1F34180DCE6FC48AFA6B97F65441C5B60153FA8B2E555" + + "81B72A5B045A790ECC82614C3770BA4DCEE44E8D988D059F28F7B8EA01FE55DF1E2BB23B2AB5E197" + + "3C3E4685056C14144A163DFE91038033F25410E6F1B64D130766B94C8405630CE3E09119C1F8F438" + + "DDA9A14F115D45D77736418EC1C477CD58087DF9A5F2BEEC654F5BD7DBF86A33E2D2AB6884A61B85" + + "605F3E43F2C95B3EB76C112B2BD70A881225F52DE2A636B57933571D032E3A6A33A9D1B07AD0125B" + + "7D3E7D12ADE4663AEFAE97BF114F2F310FB8130425D87C357FBF0F9212F937A9E5067C11D8466E8D" + + "377DF58063B929423CE3AAB279F762F95055581B719EB8E42EFA793A916B15BA6A8DFB87D2CC8AD7" + + "DA8130CADE65A35E410E7DEE00D91A3205C84CEE9104C36DAE89171D55A408CD4459F48CD1BDAC7B" + + "E90A3E55D8C44382AB502CDA9ACF30CE0D01888BE08D68806455B2435BC58331A2E7BDC2D3D16E36" + + "14F8ABBD246C22F69C505254EE4F62A7CD112747FB577B560E5146BCC5CD1F5F5676DA433435928B" + + "9CAE9BD71C9282E9A3838FF231C5ADEF3CDFF3B7F8BEA538276EE77038062A5C04580CA947B73502" + + "083F7B6B0546CE3DE713495E9296E4A857E38E51948A281FEE9538FF039502853E864EDC67FC1BB5" + + "C07BFB602519F23C570F3E4A3D7488561BE36720FC8EB9E3746F7884D33CB8952DCBC61DE1430256" + + "B6358DBC7877F5B60A2218209248818699DDA4286FA872E5CCB7C1322A93793403F9697D1452C119" + + "97E72D4521844CEFFDF1B05A78064F20B2A10F39908D9E38683AA4DE387F7749381C2EBEC82587DB" + + "F151BFC8CBE16EA8D8A1FC8B9CF935C6A5F56AA8603D41BDB97C3CE6AE27C1AF2DAB33C654442DD3" + + "E2041C793C31C67403DDE68AD4B4872418130CF9B451ADF41B39BC626E38A48C803F5DE76259D0C6" + + "75F0375B1CDDE9EA0EA1FFF8D0AE1240EC7ED20DF83C643A390267BD9F96C6170CDDA7C7919973ED" + + "46B49FD373DE8EE7FDFD7D2970DDA41DB7C9F58FCA2F9FAD7572D75F96103E69A743EA9C591C032E" + + "9232ED3E433B89E33C3DD7D0021B303151F8EF770D211AEB3CC164FAC0E05B8E99F7AAFB60F0A664" + + "EAE480B0FC7A2A0C3DAA7CB4AB9D263D2E4E2FEA9F73C7BDEED34A2D276EDCCDAD9A14335E493A6B" + + "AB046E879D4962E325D2693CBE53FEFE17DFFA36E5D511AB321AFE0D814B10988BED3D9E72DF9CE8" + + "092F0339190EE8ABA8967F6EE1C558E8A3E0663A326C13280C834BA6FEA695974EDBFB3EBEB48C99" + + "55307A95741C1CD7943C440776EAC4056EC2EDA5A83EDB222BF48BFD9CED25E8E8DD25F67282EAF9" + + "29F4E5DAC8C08BD9D9982CE49C75777A27EC175F1645CB79170DC802C49E9E9AA68A1B1FB9030E42" + + "53A14368673CF5B1DFE995101C908444149EDED703DE7A1D01932092265664BCFC34EF9A8AE017F5" + + "E5CBE03EBC9F2DC61C41761DC00B77433BCD497F31DB7CC02851B04A57A0868BBC9EE37A22B5EB4A" + + "12526DA3178C0EAC7F473A106BD493C84603F4A7EA3F188AE48DAACEB8F68A75DEB453C5A3C2C31C" + + "F89A8A702A6A19666C9B70AD2BC9FF65171165DBA9074709B7657A843A0064B6B01F71E9A5309B4A" + + "6854D5000042DB59398EC50879743C6A842FA0C6B481BB429B71EF072238F3DC19DF4FE671CB3957" + + "2C2F06F64200289F269322980CB52AB83A46CC399A07883F840708A11463FEA6C8AD7CDF3AF58867" + + "AA890EAB7877E4228163496F720205A80F40EBCA68D229353F9A10F1D8AC1B83B53E3C9FB0978070" + + "D270743D993D40D99E548B55793EA6E628BF43F8E7B693F6A0E2ACB3DBA3FC9A9665090EB952F583" + + "92F8A76BA2BC6662F21743AC3216D5DB7F2E8F8EC0D3D145BF2E12E0A198FE6B6C750FBD91122530" + + "716D87ADE9BCC8A845AAA7B8BD61F9A1B5397EC7ECD8D079C42C68FBBF1B8527E64DEFB975877F3D" + + "F6FFB87112C398D571CED8173A0B7D6027FC3468F9BEA8FE1BBA7B56366A708D50B8D36A39F776F9" + + "9562BA6719A1E162A42523E515CFF5C96AF16888BD2E372B36F1B91B6E22864BE24A38EF8812F084" + + "4238856D95A77F09D3428DBF425843CE52427A0926249B2993B98D94D9C90CF7B1ABE100FC8A6EB1" + + "FADF3F094B19046FDF12B9940AA130243981F703587AE9134BD8D947C822E00CD784AA5748D4AB8B" + + "BDE50FC2DD57D08BF3AA23DD964636A53688DDF6A5C155EED497ECDA2C24CE5D5E8E498E201F9C29" + + "CF7F091E11B5A3C45FD77B17310A1906742FE27A809F0AFDC83592390A957DB29F0F00BEC8CA1EB7" + + "126D7A36229692F1C753239DD13C39D03DD2E82F6CB531D90E9DAEC4FBE15A98CDB3B6B97047D0B1" + + "64FFEF3B6E8B4F4DD4FC9F2362EB6BC827EA7EF248F7F0B78F9128218A0DCCDDF54B1AD77E58C38C" + + "8FF6BBEC98EA2AF5D541C73D25C5FC7FD66D933117DF448FE8370D8DE0400AEE27A3B84576C72423" + + "C34000CE9DB51503D8FB188846EA30473B32B3BD0DED36D50F64F23AC9D57AEFF6DA1B48277FC29C" + + "F41A7A161619521ADE811AF1B61BFDDE88274D5F520A1D52122EA298040FC955246AD80ACCBEFD5D" + + "C34445E7288D1D99722057F0D5E606CD2446D51377165F2468427FD3B470FFE018234658D84299E8" + + "4119AE63333298A33D8D7ACB9F15800A9D1D29C1755EB221838B226D8A445A9E117528F720FC4192" + + "04F4326791826B3A91D09D33E1AB5D6A11CE6075C49D9770F40B4D0B4F11DA3A500B6DD2C9C4F0E4" + + "00E70B22B44FAA5F807809FA37929E72C7FC2B82676C219CF251828C0BDDE31BC99708620F5F6C20" + + "8EB57771AECD8CD39778B0ADDFBA7C084A1A81216F3914F8EAB7C7C46536EA77A90B3CE3756BB673" + + "73F2C51FD5CDD3915C6D99F9D6162CCA98EDDC644100C55D98857AB34BD876E31457389B03ACE5C7" + + "1C08C42B9383FD24BE87BBEC4ECACBAC8EC8CCBB94EF9A21982C7CD33AEA5253D92B2F0CAC542665" + + "400FA3E5F90F0F912A72865500BFF24B15717FB9E83E33626DB5FB5E5BF61E151ECD7A873BAF9217" + + "E565116D4CBF09D58A8B02CB694533BB96DF958C27F5F63CE0D3150A947CD7173DE8FE1BF9C94102" + + "4222535232FFE934D80F0413C7CF00E4800B378EC24BF7DDDD35CB52790BCA9AF25C5C27D9774718" + + "61D8568C5AB54C083B7827C464335F9F4A2CC979174B0D2E9B5EC813D83B5CA7CF9CC122EA410AA7" + + "AFE29D873965F9BA703463351F16B423FB41CD645CFBEBD9FF60295DEECFD4AD62E890CC6E086F69" + + "C2250FC3145C08F8F9AFF1BEEF6C903FAF0C90A9CEBBDF7FF87892280FAED3ECFFBDD1ED3B9AE58F" + + "0AF819CD4FCC25F5119F7A41", + contextHex: + "C967E5ED2857C3594030B1143A1D4C250C1165C641BD53C7C94DCC7EF661A121E47D274987139CB4" + + "53AF0FB494C90222B021AC27AEAC9EF1B16C00C50B170950E545DE3D40FD46B838", + signatureHex: + "8EC20406B1EDCD8C9D17C99B2DEA6E5D599812A68DAAC8263565B7C11F7070D5B808E64C4287990B" + + "63F6F9512C44D6A574D7E726F28D8F4069515814B11BC0F6D3F3959BCA452B5D505586E0929CCC7A" + + "29371BF54E2600DCCB002AF182A0B423CD7B21FCB3CD3E87E2D1153AC4BFD23575EF4AFE1305BF1D" + + "A85EE4054E749865F33591D29E2D3B69950038B0CA1F7C89DD41FA29FF319746013FE831593E7755" + + "682090A8344594466AD77AB3E977BA051681D1E7A73BFEC150405F90DCB1D8C2744CDC698E520694" + + "7192285B2CABF74C324E4B6499467452E669B1EA1FC7EE9159A49966F528A645B3D3581BBBF2D83F" + + "19AB3C65CC31BB56189B5A8544666498733DB74ED7A46A6E89BDB7A2B4A90F62224D10AC1E9A76B0" + + "4C4DE1CD57210C3E6AC205274162F5DC8D818937F0D483EDCEF416ADE6D1D4B9B9CFAF078611CD34" + + "C056B804A50A98299C6730E03B6706CFA8B7C41F422F7580756ABDC839A56804F938A5C477D15493" + + "63B67FF30660ED7882F1C592E9DA6F5125DADBC22A54B9AE398303CDF9CEB7DC54F05F7C46E673FC" + + "A8C68E4A8FF65E1FF67AB3C35555E7E702A885BC23DBB89488A77923EAD56A11C0F54D3869B182E2" + + "16F71979D9C1A26AFC28C64069DD6582874553286AF85514291ABC69AB985BE2B471EE7FDE539A73" + + "5C3F0E0B1F2367530CC0D4BA1C410D8992ED822CE7F360403186CBD30731E38141D2AE1FA29C41CD" + + "9CC0691A76983C6AEDF24ED3221256B97E6EC6E89B2EE3ECC0C6A281E86C6A9678275C8054F5E829" + + "C21159DE543BABEEA13D52DFE7EECAA9CE30B8CA3941BFAFBE5DCCE5B283EDEF5D929C8FA725AF53" + + "50ABDA8D9A4EA6C26097C1FEFDA904D572A5E763A28309DC1C58CEB8984601B6AF9D5C930C9247CB" + + "6496A2FD347D5213F4018A50FB4A6841CB6FE99AF0BB7B0CBE6DD86B10CE674D97B8A9E97FD2F1F1" + + "CC117C1B470E3B1DA223612EFB216879074668852AA5F0A3A2182C240753DEB3E9537D9DB426E0F9" + + "328CFA70F560143C71C06E56F0C9FC5A52029025DA03E631525FEA32E58F40D225FCAB6AC530EED7" + + "F08D11F76C029A302AF94EE01CF8A566AC2D3B503FAACAC975B229BCCE9287F82FF20ADEA967A757" + + "A7249DE24E181D99AB894B5D718B1DEBB40C1E57045E0EFC1CBCF67890D93E479EF45A6FF6691A88" + + "C3F5B83179608AF6554DBD5C1AB1F11A81156425EF91BCE802BF46B183F5253E234889A87BA3DFD9" + + "34853479E5BE750E314FC0C923523A8DBB7D3D66004231EEA7E952F3D48C6E2307D7DB4D3484C191" + + "E8B561ED3DABA762AB69FD6EF6FADB272F4200B311C1B73FF7CD3FE02F0E256ABFEB67C2419F0B6A" + + "E11C877A93E006E446E96D8BC7E6EC7C44B32F0036444762D34E9C67679BAB51DB794A72E4EE39A4" + + "DAB08472B97298D66C56C3F216E340BD3C0B0F2D7BDF32466798261EA39858F1406DA09D60270D2E" + + "C2BDD4227E4F34350B3A9098BD2249FC249BE8A306AE5A22BA03040F04127BDEF28969D259E10AF5" + + "57559C71DEDA8532DB78D8081188992EBB49B06DC036397DC744BD0CEC01074616474C8DCC51D7F7" + + "A4A8DE8459146E6850B5D45070B45DD87CD33FAD1CBF6DC6799213E9D8DDC10C00838A425FD164A9" + + "6347ECB643ACD35664ED18E20DA6A8E898CB717C774FFA9D1FFD987790E9017F218C75B83FBFDCDA" + + "BE2CD3C1BF676CBD9F94AC27F472FD64956CD5AE2A7A99375F324112759F71EFFC59A1F6062F0EFF" + + "A9785D313F06B84003B8FF0866BD08ED7CA73A4FEB4A5782DCB877778DA0BC20ADEC65222FCE71CE" + + "901B45E570805214D6AA407AFA35EA84C92AA7C0923272203313EFDFAEA9B5B7A442219ED2DDEF47" + + "558050C5A5F15DF90930A99275980005ABC4E3E79C9479B4940349FABD43279B96D51311223254A4" + + "F5117C7ECFCBC7FCF231D77C3CA4B789EB3606ECCC653D5129E32753A5AD07B60278B9A1C7CF84DE" + + "5A6384E527CACEED16694977CF8734124DAAC9C880F79C33610F074E19C7DCB8BA532C13D21DC27B" + + "BAEF22AD089763E3D8F14601251B0618FA8605658142A508930141770E3841AAF0091C9A3C9A63E7" + + "BE31227A5768B9759323FC98D24F9B87CFDC0020356E6797B6E5E6188DE0AF1FE51251D39F159913" + + "841980C8AE4853144526F6E7A4C7AF9960A637D6A83D914506AC2DFF1C50C1054573B570CDEC3450" + + "CF242BBEEDE04E4BC0E3048B1202096F111F93DAC9255CF9E945CD69E39008337C1A796B5AF7CE6A" + + "9FB2BFC625258C609368F5912ED7ECABFE8D59967D6933968FAA519CB25095E4A97AC23F1239A62C" + + "AC31806D341E959F7812816069DA8F874400C228EF8706149E3A17A043747E32E0D2DF5483C97B62" + + "DE642B91072FB34AC55DD51CE1A4D113AAC3A40DB842CA5F3B995FEAA64C8613700B8A160C227EC4" + + "EFC5C22F453C5771762F76AAE43AB92C7DBB10C4FED9E8B12B4F7783DC80544F3929A4D8A57E64E5" + + "8D46FB776C36DA323632F6E8D1038046BE7CBC02179DAC7B021A76C75A0019FDD6C7451A0FE1B29B" + + "363F8DD4AE968192E40C2D178A0315B07E5F5E4F3F52A126A54797FBBDD7D4F12B7132E2FF4023E6" + + "A23A496E11FBD10BDF0B91B2E0D9A8C1163B779CC4D4779F2275A230AA7A6B64471BFF569BB2583E" + + "85C49D4C6571881C84D5FA9453E7680AC3D2FCC8384D1F19E5558ADA091F045E04EFF6F024EC65DF" + + "7D7D8CDBD552166217FD8E086C940034AA28345483335BDB96862963C0112FED7655890D56B1FBF0" + + "62A13760A3C213D1938667E5ED9CAB9F167D39BBD82052D7D475C12FD774A4CAA83EFA60792B99CA" + + "39188B72FF238F8A0B774A9528EE2DADB5DC63AA62CC3A1F38AA7ECB2E934AD3414917C07E59D66A" + + "0EA05D23574107E90737574B38862028A45DB779FD5296349592CF80D28372A80690002546A02EDF" + + "4CB28FDDC088B1CBFE9A43B2CFD09B1716EFE22FF46CFF8ED916F9242BEC7B80043B362F42D8E564" + + "64D4BD342201E7BD56BD06BC9AC86FE10D7755BD3CB8CAEC405F9AECACE7531BAE1BC21B8D8820CA" + + "4EFA0BA608E9628A21FC4DC2CA533AFBCDC17EF0D76598184C6796B8C23D7711CBB687BA5EB41401" + + "D15ABFE35A51B0EAA9DF2F73F5EA12CD17954BFF34B81C04D15DDD6029DABC955DE35E79F1A475F5" + + "E229E54E039F095EDCDA5386367A13DCD487FAD3ECDA192AF380F95FAD4F96AF94F7610C0D73D296" + + "A9051810028C78FFC69273FC56C40BEDF4812F865A67068C4E4124E74BDDE031FF5D31DFF17F5BF5" + + "CC7EAD08793080C22390D48C41354A73111415272A3168B0B4C4CFEFF7FE0E1A2425363A45545758" + + "595D6C77797F818795C2D9E9EE01073F577B9EA5ABB1C4D7DBE7EBFA253543474D4F5274778F9DA9" + + "BBD9DBF8FC00000000000000000000000E253445", + hashAlgOid: "2.16.840.1.101.3.4.2.3"), + new MLDsaNistTestCase( + nistTestCaseId: 18, + algorithm: MLDsaAlgorithm.MLDsa44, + shouldPass: true, + publicKeyHex: + "660CFBB3C96CBB29AE2D60277C4BD97111AED10741099DF59CEE6B47A169BD4302D4A8C271C8BC51" + + "A491EB4D2458366B6A3FA1E8A25810BD43A6D426489661D597C06EC9A0DEC66D8C7ACC357489C92E" + + "9B28E494B2BE9BEDF5D6AB2C5516B901F426D60105E9E2A65DD12AA5071054811C3117283F2DD55B" + + "D1018942EE7330A2B5074592E26C53E38160CB8611EDF93B123C1AEE40C458914802F42ACBCCCBD2" + + "BD215D5273AEE983358F2CB3A44DCE30F3F1E387843BC6824565540D522E0573B4073E5563DB8821" + + "2B50EF7E1063D55B77873D774E250F2F4DC150D964938A81FEB59EBD3550D6A3DC3CDDA8AA82B9CD" + + "24E9D855F254514874C299BCD602DA9DD601602B8780965E0912E818944034D6F78F4D2A7835B94D" + + "4C8447C6D6D82B3F7260979CCA94D5072EE2D3D6E14FA1EE705823A7077CD6B4778FF1083B7FE38B" + + "ADBE6D11803189941A0F9EFB70EE1F581E7DBFE32F10541BBE61392ED85BE6DBC6F716955CBBD62F" + + "34A079A81F0B7199E4796D831B2C7EB48418F23BD79A90CD15F307C419D39C7FBAE2779D3D6D7D83" + + "48762585E2DE7E2C6CBF5A506F210BCFC848CBED678E21E7A9A4098D1B53BF20C780AA6C7F14DB25" + + "2B3A0A6DDB0754C56F8641650DB03FE037AA377897FE7853AB4DC03037F4994C54D590B44C2ED6A3" + + "64B5E01CB9759BA3565E9D5D87740DDEADEBEB3941BE5165C1FEB7B434F85BCFA1A6F3558E8C386A" + + "9EE6067D3EADF87E642F370A56D49CC90EFC9E79832EB965418C8473C8F9CD702D09185D7D977983" + + "3B286E7328D05AD81E15D9FD8AF186A3CB0B358E88FF642F11D85809998E828D164AD530D686F819" + + "DE1F6A3634FF6FD420AA0DA694B2CBBC5B3125DBC8B20C207DF5B69B66D865CE75A0D7A50F1EE98F" + + "C0FC9C6F2DD5B3A513C52EB0A4D3537E98A4C8D85FC56A0ACF141DB24747067709D3763F4930BC09" + + "279252F6D10461C3B0ACC4BBC9CC2E12A8803F5690F7B8C1301EC27FE32C992AA34DD7587773CA3B" + + "CA8237C87F2B39CAF913D0EDA328A4B6A40D9713404461E29D55F854FEBCD2546966E16EB4FA49BE" + + "8DB3B63F2189097C1C9916DEC8B1F1365EC7194203F27FC257EDE87CA2E825A509E36D2A2DCB6EFE" + + "EEC68E991D511AE268185EC8E01010938AAECC3047C203B18AB256188FF5EF44189A8F27AC0F0EAB" + + "DA0923F859DB1254C9B10F1D6A560B718D6B8AF6B7D270EC9AE7197DC266862E19943996C8ECA089" + + "188E88AE402995FC1EEB20FE0B8C9B6CD32DA7B680B48072ACAF71D0910BD235F90E94B5CE22F597" + + "B16741BA9EEC076C576F0C2861437E0C2E0E20BEBAD18DBDD9B31C64482F4715BFD26A64E012EA30" + + "B0B5FC01E09CDF222ED20E66177480AF099F85AD9AEBA1B6D913566487F11C80179277FAA70EC3E9" + + "813ABC8202DEE72E9D7CCC8DDAD84112BEC1EF29D7BAB653017FB32747A1734A65F2708C7F8711ED" + + "7856737CF2C566B013E984FE6AB456ED1C53606967ACEA50C1DE5373A049EC3AAB02FCC0C1E8E7F0" + + "3BC3B428352900763F80936127E1DD7F3981C68ABD2FAD170E71BFF33EAEF94F08A280DB5D17D660" + + "90443842F639E70E9BE4DCA09AA56DBE1B84FA33F970CA77FF30F49FF8F06BBA04ABC7DC6BC2D450" + + "6A737C2514B1E99B44D4E136B4D5B7543651199818A977F0A77E13E4AA258A07C9DF0E0BF898075E" + + "62AA4F5D04098B6D3428DC4D0F90BF0A91949D7C76F3CFF57538C8015A8DAF63F7694AC8485CB57E" + + "C373012F07DF41C6852E40C6EE2F2952333CC5E08CD4BA0AAF18016BB1B8521C554674294FCF1CD1" + + "6F8DB507F0BE60BEC505AD3722057D1A76A07EC6782E3FE0A66CCA86AE0D7E80", + secretKeyHex: + "660CFBB3C96CBB29AE2D60277C4BD97111AED10741099DF59CEE6B47A169BD4322B7519ACB08D365" + + "CE6D25F3F67DBD87E1FD122FD4CE4B31B5C2A0A3ADAF9ACDC2460DFF494E413F6787671FADAC28E0" + + "068B4735D8FFFE999A67F044FE388A6D8C31C4DD6B1B3F41FD5D13C01293DB4B2CFFB66DA87B7ADF" + + "AAF61502D1CA70DC933051989688DCC22D1845618AB42099C265212288C10289C0042011926CE484" + + "89A2361022358609C16C989645CA9268243031CA488AC1B08412922964202950468C22B72D8A1800" + + "1843502483281BB891242782D4086900864C4B1271A3868DD3088C21144E5B902D0A098E62140C0C" + + "828C1C88300295040A230A08206418104A12B9010229625A1808CC288920980154C268C8026D9CA0" + + "90599270C3164DE240911A37820A07851B04110139724B280220196AC4164023B188031405084164" + + "084330102944002362620640E134121BC689D4988D1B488C09A98CA0402920A984DBC44002888DC0" + + "0021D4884462882880A2495A423010C650E04691E02425C1C0201B9091E30221D4420CC2A6445914" + + "658B025013258914890491186D81A82102104584048002065201058C1C243211940462226D444066" + + "834448E2380898480588A820410060C81481A30620214582E13260A4268D5B244103A10D582640D0" + + "84100B84294B9620203552E134905A3045D8260559B848A124520347840C425101298063B209D1C4" + + "6121A504D0267023456D61942C12116CC4106E1BA48C0CC00583B20819072CA28249042521A43006" + + "D8064919B54563108C241628633025941251528245CBA28411C785C4065089462DA0304620390022" + + "A60CCB364C19A11082860123425220B86524462E4A824D48844C1A432C42426199026D5A4864D200" + + "8560B22D19C7101B326C9A967012488CD144225A8848902469811086C0941084B629210161091661" + + "5CB03182162219B085241891E0243202432622B78118192A243030D3264E0135211C4205D0B86442" + + "A80D92164C58B83113A08009434C49269052C264201780A2B0109B4050CAB4096318519818901226" + + "4E04B14520246918094C64888D0C9851009010808240103201D4124909182C801271204868081821" + + "0C360C418808543204938084CAA8504186710B4021931624881004D10885124141DA8488E0124213" + + "912DC0382D222326E34649218450E3304AE1168118A209D14000524470A0968C61164264C62C1887" + + "3060466580B22953484E24106EA20671D4E4C3961B57F92171F441DD5227887C7E2AA4E4E0812EF5" + + "F502A97449CDA602211C42E1A4CB7D2B92E73872DDDF0F2F680320214E487A95B37721A139F15D7E" + + "0839A464AFE4864C77DCB7CB5720E23860851562C1AACB394F4229B6587CE68B67EB95C9C8917B30" + + "49C0C7ECE4B9BF5026910882E3FF6A25A6DAF827084AD7C2EF819953D9EBFEBC4D2CE4656A8815EA" + + "B492BA0FC67BCEF67136A012A65B8AFA2EA49D3F7D4FE2C609FF1B636FF48547E842193BBAF95D65" + + "091244F6BF2CFCDFBBA6A6B9E0FB6CB011210FF08A09E9E5165414E2559DE20B116A8868CFED0F92" + + "3B8088F520C2B2D2E6FAD640F7789FA669F8FE9779E4008C31FB77CB1BBEBE5BD99DBEDCC62CB477" + + "78960C670F1B0204B5BC7B5CCD0C32817A97A7A102921B6E0D77335BAD7AA240D60EA8646D9449F2" + + "2844EF1DAC1131701BD6201863E7314628D450157DF5C2FFC2A93F80A12CE130D44B1F427C0C0B65" + + "797F3C538D62294E2661C4D64ECF605B916789EB6A1596E5BCC8B003F963C18BAFD89E9DED5038D3" + + "39DE124237B51E7362162FE4D4422B9BE7CD2AC424B932AA3DDD7D25F2F8694E55748CBBBEF34AEE" + + "136DD2043CD8D85A032C0334E1A00290225C549C360B679FB80401445AA17AF294254CDCE6C7EDD3" + + "187DF93F340D055007ADF58BC55B6100335DADF3C0CB22C537F1DB1D58697AF7C321B7A426A56C82" + + "0E301A19A9D2B0D805FB847F93B6EB1D0A8E4BAD1526315BEE2ED30AAF332CBFC7352014DCDE1443" + + "B9620269CBCDF8286A694EFAEFF4FFC9C4D5E0A187D94661AF8915BD29E6E8CB87717390CD8A8125" + + "DED0E5691502F5AFE85E2BD0E4C2EAF989A52FD7FAD6A4D987E5CAAC31551BA378F2241EF6FE0754" + + "941F2E242743AEB5CEA05E67B3E4604FAA96F147BADC6471A414E6C37C507742FDBC87BA210CDEF1" + + "4423F1B5BDC73B7AE62D46BA049AAC95B785CB49A19EA847F248775003CA0C4640F27CFBAD6C8F2E" + + "C1372E43421270080061DCDD53797B319B6A4FAA54282B6B2F78D3DD0B122D9B79465D0253607A58" + + "B44A7F57F689B53B59ED3BF4A3D69E824168C3F4233042FD224A83739C6E4CEBC321E806932006F5" + + "F35D282DE640AC47DB9E2B38939A8EF85963A7FAF1F8C8F020C2CDDBB2F9EF8AEB421CBABB37BCCA" + + "C3C94C5479E9476E4BFD0C781B71A5D9D90C2BFB0AB69FFBA59FD2C6927D7EA8FD732782DFFDDAEC" + + "5EAE3743128F4A886F622C0483EEF09B5B1F0FC29BFD5EC3FEA64122689B395F1B21F244020D8C6A" + + "3F3CFF641200B102298F3647B1D8EC34F9B6BCBD5EEA37EB35C7B8BA4EDE63535A5BE20006518425" + + "36923E7CEC7FDE3A4A99B5025C2CCB4E57E28E44DE8D7864BFFD1147D5D98970E2642E15460EDB34" + + "F2AB57CA546A59624F31FA2CFA4FFB0AD00702B18032E120D26AC8C19FC66D31F7E411B673CFAAD0" + + "0A4E272B2E486209EABCB3979D326EFAEE903A0F3C7FC182B43F013660F81AB1D011084E2208E15A" + + "0052A7014C69B59E2B2A9EA6F505762FBBDA1E73A5B6A8EB3173DCC61B5A76958F619B2FCC5D2671" + + "062EEAAE609A38C02AF708BDC6CF29C3A623F49298B07BC8FB22AFDD28DC2F04C1FE1A3AD7522D9A" + + "A8FE1F206D98CF22B4A983DD5D5D08462B72AE1E9C415B6869FAAFED5AA577B06298587D82FAF5EF" + + "04445D094E380D5E223AD31FB7A72EB9563B55FAC63415C19B15CA87055D655B5820DEDB0DD0185A" + + "6BF18CD3E8DD0F845859574B77183F4A2F12DA0DA2DEE0A16421009726FCB377066362369BB96C5F" + + "87B9178BA80C1E54BB4F2AF834ED16CA37B3CE5C49BA2182A6720DABC479709A3131DE0744D7C15D" + + "FEC25C2F0A1BE1A3A54CE4404596B3F3365F16C17730E0E969B29C7043309375E2E796389F4B75F6" + + "344234606D546EA0168DAE6E56B6E5B5804DF510D4BEE2A52A5365A2475C8276280451AD071F70DC" + + "00F954206DF2AE9839CE0357A3E4372AC9E2D9DEE1FDB2A17396E3B43F35637179024D5B9CAB462B" + + "5CD7FF6ECD0CE54CEDB2001ABD8672993372323CD11458FFD79252B943454BFC3D8C856B48530E17" + + "2E1DA792CDED9DAB23F148884CF17DB7135AC16BC32C3822A8FD0406B99309A7DE5430D3077B466F" + + "538F0DBCD9CBFB120B58C5AA3118C4278F2DC1C83500B06F00D583345B54EEDE181C7615384D8E60" + + "31DC865E30312BE632F2071D01828006ED4B0E1409FC13B0FC5CC1BCB08C9CDFB038FA2DE3D7E69C" + + "9AD595ACB1565922AE80B62375484AE73049CA912D0D312329D4B1509DD6DC04CEED2DF430848FF1" + + "5CF6A5B665D78964C55EECB9A32CE8E1C998735D520DF846EAE7EFE4FCDE49B332DE4E8ED37B00C5", + messageHex: + "6AF64F60229BF7180C6B152550A3EBFD9F998D1C0E264F02D4EDE229556DF93C4960543A6783A312" + + "36DAF90F37326E79FE5E9118D12124BE31B7E3C6AE2DF3057A4C57BF1DEA5C30B15E3D33E581B9B8" + + "B4905648737388A1207124C3B35571740DDE90F0EB220A55A7048C5AC2442F567A971C1FA100E30B" + + "3D42E2273F03343DB8007814D83450D0B0F849567FC6E4029864C6E8932A7486F368253BF3BA4DF0" + + "5A0B20A747C8BA4180AF491686D674637ED5E28CF38F49D9A7BFDD9276D07FFA0ECF2DF32962D87B" + + "F0BA78DC031C45D1FB9B0C73B45CC088FE49092043ABFCF98B4C32CCA86FFE8A4996E8B4184722B1" + + "DF213E72C90B47419CD56328ED2111D96E912425CD25F2390ED67FFB9E5D5E6172F64155856A8AB0" + + "7200F29AA90D60C892861176A995A82177C3DD53BCBA428F700C354DEAA4607F07CEBB75476AFDEB" + + "293BB5E0ECCE6EA7442CFAE6EA917E2E763A05A6F88A034867FD45183DED4D72A9C8E53AE8B8C975" + + "B32DD8EDEDC87D4CE6F86395DCA6B30F759E99B54422D51D1AE7AE68DE6426D9CFE14DAB9A79E600" + + "B3893B130A675A5730C39E0E92995701D97267D4C830D5210B6DFD36FEE3D314AC2B4E9B23AF9081" + + "BC7698B3863247CC184B8F6D8D932B02245EC29BE916CEC8772540D9666F4D68DFF468F432FA80CE" + + "08E64CCCAC4A39ED04B50A71187075246ACBAE06004FB364183BB7C78130B72ECFDB0B5E3A389425" + + "2C412919D465A497BCE924E92850A9144587054070662F2ECEDED6BC07320E8FB5D657A963F8EC1D" + + "7B282DB05E850DA698139149C849FC83EA8D11C08320BFE99A836F35F74127D6D0CD896CE919BBE0" + + "9E5ADDC71BA812240C4EEB8BCEBDEB059517CA1965AC0175DAACF2DA6E09D1D518E07E6F25540165" + + "9CD5E1F8B60283C3A8F876BBEFD3C11DC9021C1D0DAFFAEE46A18D528094FD0BD3B9ED27C9CB77F7" + + "CA008A68F81877A533FE032260D41F8AFCABC32EF94DC332606ED46779F41CCD257CF12D39F79A0A" + + "D0869F44C65E7AA721671BE5989C74BB2DC45F9222482CD343CA81DA7B40F218905BCB6D09F0F6C0" + + "01F6AFA6C75F97A6576D6D2B0F2A659BF4A834BD1F7B9DD00DE3442F43CB289AF06FBD88E4217B77" + + "87A0561911FFFBD58B0E39328BE630BE7E93C743D71E46AD867E2B0B00F1AA2EDAC0A44F391C64D5" + + "261C4E8979AF191B7ABD798E4F56382BEF903675D422F1D997B3E1A402AA7BF821169A0F49353DBD" + + "F4002DF1CA42E1BC64A6FAB51486EBC12B97BEB76C0D1CA8AE43D031139CD1E9454BFCC0E31C7156" + + "6B4EB21E532A3BF247ADAB1B1E8308F0C1110E3B984D0B16C54DDF5078336FD7B3DD3A74FEDDBABC" + + "7F697E1EB39636249B74F453F32434A6C3B0FC0DE6BA5BC5CC5EB255A7A365B5640260CDF3CEC6C1" + + "5AC60BD4F93C366532E21863931EBEDF3671ED795891EAA748EE8F298A6788DC138F2CA59A9137B9" + + "D80AE6924BAEA4F32BEA347BAADA50866BA56530F50E70197463113712EACA6AED9754A917564CAE" + + "1F8538FB80FD4025C73F9064FB24512CB3FEE8985CC37964E6B478EAFF18C6FC096155473B24175C" + + "FC6DFA8B4FB01E658253C1DD52560F74CC741F97593C92C2CBDF141A8AD38075DC3AEE6C3745D805" + + "4BD22692DA91DC1E7BDF1BBB99F397EADA32D128B56A38A8E69B6F2E748B53E72FB88AF1266CF49C" + + "07C985C27C66104B6963F78B2D08BED6C44DFFCF2DE4E700A29822AA3E014DD1BEFF307441FDF6E5" + + "6A9C135C8CF67F5263C9F3743EB29C383EC6C0724C7BE87CBF8481AD5A219FB7C13E81C91C26C762" + + "0A6E26267E0D563FAC8B96E1B5B723EC662F8253588AC089EF718295F248C3D4A7752A70684FAC42" + + "D8DA381BAB8F2944D37412E0FA6ED735DE8E752B502F1AE5A64170DEFCF76179107DC230C09F1765" + + "9DD2C40C2E6A1518532768C9C8BDBF9A0BF8BAC3F5C6179880414A0F862B5C46583EE810CA25DD61" + + "0466A51390E2BB5B8D495C1CE570A385E28E310CCB197EF93AF8AC84184CE36715A033994CF927B2" + + "4D16290425963F04C2015CAE8DF30138FFF20DB8950871B64D82B3257566873F3CBEFFCD517DEB47" + + "B0418C8A0331EAC8C5A9FFD33964714CE47B8211DEEF464F8B60DF77BBC7E1FEC6471C06555632CF" + + "939214BBB512A01C35BB95337BB28ECD47E1E035017D5ADA64B5E6DA81A70779AEFDC36DBC8E306C" + + "96E1F416A146B3AD219DAE5CCFE0CD57FFD149E67F36FE2AD137792F5FB06AF63EB016CFD45AABAE" + + "9B65117FD2D9B0282D221E27846F1CACB1C9714DF54F13321D80368008FB791DF8CE559BE3B0F343" + + "846E7E72E3887674301FCB4E78A47DF101F42FC51D3596AC9501AFFAE44DCC7C17E9F2724114274D" + + "4653B59FA70F1EA8C83AE8AF2C0B2D77E1C0870AD5BCC8E6BF725D974D462CEAA45CD14AAD776C1C" + + "0B85B7AC338BEF758040B86DFFCBA9179D6317142B2A2D80E71C3B1B80ADB8992D86D67FD46549D6" + + "8689C17BC61306DF7852F8651199A2E1048B127D6176FF42BB7F8006AB226995C828AECE0C320BF9" + + "999C9180F07318AD8C81A13DFB12FE3558CEADD20DA07C0AD2E8D929472F63A6C90E8F60AB571069" + + "518DA6282C3B7EA152F5FE70D8D50828FD3DD701DC6A3B32AACD7979B3512A573E85A715C87A47AA" + + "E9B59483620E74438743B2D5AF4EEFF9A26FA273E56757E678607E4C188F6BAF138750CB63DEA24D" + + "415FE10B38A3B8BCD2C0A5342A5A313981F761045BB5A2694EEA79670BC1B947A3CDCE16A1D9DEDA" + + "65D902BBF9BA9A8CEE5B8D1D26451A107683E5177D1D95D57B9EEFC4E71F940F15874A75C619EC34" + + "01F784A09635E69291B53636E8F461B04EC8D4E5EE9C8473FC24530CD8ACC6ACB9CD0BDFCEE49E4F" + + "83DD616B929033689323218CC5A6020CD7528535856A70F221C8C71C5CF5D370559A8BF0A95BC681" + + "59D876499FE77581EA67D5A154F3EA0FCE0AC758128C410A6CC0743B27EC74ACF4D9286F793EFDE8" + + "21D9A99EFF4030CAD5B3DC1D07BA5A8148F0889CD0975A9306D4E285BDC0C2AB28CE136C0E89FAF5" + + "5C45D3827F7A81D65FE62F3CEA25B73546B827F9358D0FA9355C988991B968782C72C188CDA14B2D" + + "CE1713CD69F707C057A526770126671ECDA023CBA84FEE72B39934F1E60FDB6C2F29209CACDD4A58" + + "2741D9802C1B116064A798A80D7B57EFB4BFAAB34F2F02302552931387CBC565493046003FA3325E" + + "4D8421E84001BFC23DA768724394896D4218235E795EE48590D8AACD3D94971D32ED47D99D444949" + + "B10C726C51553EF3FE8395D6C0644B955DBE2D894A71CFAF14B9C8818787F1D7EEE3C3C5F44243BD" + + "62F43E0C44ABD6FA6FCF608E1C372D74D266AE9413A0E83D90D981975EBB65BE4C49C178E6A115C2" + + "4EDB2270C581B1707B228159009006236D25AE5A6E25D592402610CDA7A89754BFAE2419C456623E" + + "34EFBC344EA5E45C1669207DF5D57172F5E6C627C0E5603756CFFEE4EC1C8C8DA2A42FDF97CA7907" + + "4DD0B208E0ED23BE93113650E305E263CF54FFC7AD322DC871006B199404842B37AA2DA348308B56" + + "97AC161AE5FD8E0DBDC3E41BF6B0B27B73FB386B44BB6AA92B1B4E7213A027B46FF5785FADA1C3A9" + + "6CAFD4FEAEAF47861D404470E4FB4C0F0BC3BBA9A7FBBD92C293CB3D37CFBBB76B1D6790CA766DE7" + + "C5F66ED033EA473B33AF2F68592FC6D33F9F751B970C7C8C10775B2C377FBF3A2C14D96ECFFC3238" + + "AE624AB35BCC2FC7499E1089B199FB9E643DCD6522F69E7E638B3588F610724F2926B592AAE1C9DD" + + "DC7D23D5FD22C5619DCF7F414C5B5E64F5F59525AA0C446D730DAC77FB996EE47F19C0805A9373F8" + + "B0DF953B7EE65DD59DB12B19C649F79DFE7E69711B7641320BFD28AA31FB15210E5B6FA1AA43EBDD" + + "7FC7ED3DCB79E2A7C3F17C70B5825420813F7E6AC3DC9D8BEEF792A8F1BB8F7BEE1EF36F97C3718A" + + "68EB86CE870418A004605D39BEDAFB723784003D034A934AC00374CD225880DF793D44BF4FD410EF" + + "3495F384064F7E63EC16C817A2EBC7ACAAD6A297F34D36F7E463893D3EE888FF9CA228CAF73D2062" + + "9A681B59506542027A83A7D8D3AD915C60EAC127B219CB076F187DE5ED423051AE754485A997E2A6" + + "8B3B570AEFF8171A87160D278FCFD8DFEDC4F0320CCD3ED28E96D0EBC719726D1251F68AF9B9CC5F" + + "4A89B22C14BEE87F600B9E1C05F4F881C650C3BB5862A33A4222E6784E39EB8BE1F526044F052351" + + "52284D6A54B590F9C945C3E444AE55718D023138103BA8AE76F2D295EDC1C78935086AADD3313D74" + + "5AF6B3F6E7617EB48A14C5178E585ABCD6209C912AEAEF7D3CAA46C262DF85531AC0906AF87ECE13" + + "83FC80DD3E03347BCBCC8D58845735EB61AB75B57401B10BF1041BC3D32589637921E85FD65128B1" + + "60BAC413EA77583583648F81E247346C5C562E67B594368FE078CFDC8CB850F02D57FDA96E0D6120" + + "6BD0580AB469DC48FE7518264155095D6433204C97C305DC6F44EBBE9032E2747C70BDBFF29AC201" + + "C567A09294BF3418168DDB5081DE90288F4BA5776AA1AF9F07ADE5766E1FEB4083A22B28EC952714" + + "BB555F40D1EA2162E72BDEDEDA46A3F08F8D28BCD3F06E75CDAD3AA34077546E297FBD0E913F2C30" + + "69B866DC95B9EDBE466CA0410450937964F17FFE1A8A1B4D087497C805E95C2FCE2D0C6769D3674D" + + "AC552E5CC55CE3C048C3F8ED6FFA5D751FD0AFFC069A1474C8669DE810DC3C5DDEEFF977003A1EB8" + + "719E62195E24966C151D43A630463CA5CD2E97E414545EABDD5712056772926377E042433FE1A35F" + + "4AB23C6F871AB4F1F460EA939E9598B4E2A2FB0184E01E528CCBC0E4373105B7C13579AD08414DD8" + + "5896E686C41F2E37C57A7545986595C45F45B0D5F20D88DBE6AEB2CDCD5D2E57E7936619A57E983D" + + "A0B3F2BF0DEC657402470B3799356CBFB08C045C5CCFEBB73A8232FED9970B6B7D490A5ECC3867EB" + + "0B0E9CB81568DA199140B0B1E91586AB12BEF874D871829EFF209F734FFDFF603DEE71E37AFD7632" + + "F70A6F5C360B8B1CBD595CCC99A5DA7DF116B68B9AD224019CE7BD743244046F8B911AB2EE74B5B6" + + "AB3A4573FF9C48FB63A4277E6C01C312BD5DD0ECC2365703CC5B68E1A03E211995238D5EE4E15E6D" + + "D37FAB8947D1CBF472BBF00F8E4BD938982A545D091C7A0F2D6F5037F636CDAE6D5F379B6FF02D21" + + "B972FD1B4D4F89E55B8394B18FCBCC0A1A1A7A75F3846670D73E5E173034BC2DDCE429D6279529A8" + + "E443BC5CA7A4ECCB7768CF2B1E0905E34824B177F76E2917E03C567C974372EA45987FF868AE9588" + + "B655855A4C9C6A3260C11999806F41643C250B3D2DA221FCC21CC8883C65A461BE31E738D2653DEC" + + "79831EB84035060E21BB5E0D1054BA9D8E58BF8989E3B67F795ACF877E621F9A331C91E740AF5481" + + "A5516CF2E41EBC8DB8659AF2FF70080A6B5E6895B6AC5F8DAD432CCCE27302284ABFFA91EE21DDE1" + + "EF8533DDEFCDDE5FE9745B42D89E409FE35A13C200AB13EC428ABFDDD0F27FC6A14034F74C42E7C1" + + "062D78F55F45B3099CCA846DE87F22237C7F1FD78FE48C626ABB888BA8DD6A67C8FC4222CF8F6C62" + + "624EC25C54E9822ACBDCD4B6A9B0BE484F4885CCA715585F26D9566AA9ED005136C9874D2DDCAAEF" + + "8730A0013C91401E67EC10D0E0A22CEA9CEF39FFD9095A6BDE1147EACE25355F19666ED3FFF54E60" + + "D82F740459DF627EB45673623CC356F6049FF68BF1194EDCF069AF4320E0400F5175C32F005E0BD4" + + "9C38041D0126C9C8A98FB44005A0D59B5F756364B3FEB6B8747588058C0086B8E0FB2BC6B5AE5153" + + "CE6341D799B585DA7B4F308617EBCFC7FFB9CB5379972CEB674DF58A7B50EB8FFB7A5083C6B67240" + + "C8029DB8ECED06D585A617A13D4DCE1EE6078D0BF54DDD18081C741DC1556E175A09A048B612F3F4" + + "58EBD75869F4AC709712D935CDCD4A684A53CBDFE25EC05DFF8095EABD6530BF3C5AD83FB6286BD3" + + "FB567C82B26E97F0F35DAEE6D2304F312A8E80D4C8A7C613948BA365BD3DC6F9399E0F3290EBEB80" + + "555D918379C54BE0C0957D7D21A5720B880C6E9EEEED4D85E128AB1E100FC7A80BA27A3AB24E2002" + + "2A91520AC3A821E5BC1F415794F722D09744D29AC8757112A04126428B2F2ACA64029511BDE5CAB3" + + "C27494812268E931E50669DD188405BFA310F08E5CE45A51A164BF7E2907D60122EB1FCD35142391" + + "CF8226E580CC2E2381BE1994E7EC9FE141C99646F9B9B40CEBEAA947A8877EBCA5D77AFBC59B1A38" + + "ABB937DD14C2EBCB33C754B4D1C868497EEC819B04D9DDB89C2D56D3B7D2A9967D670F620233F86D" + + "85AD21853F1BE9FBAA32CE6F3298A0BA1B3A100C2F7179544D94CFBAC4137C4C5CB434A494F8F3AD" + + "3A86443127F62B4D22D3757F7F5421BA52B57E33C92382EF63F5655EE6C28E91B99061512CCB0ACB" + + "C898DE4702DF41C1121A672289AC3E9BD771FC31C1F3E6001A785EC11634D4B9D807DF07BF596060" + + "262752CCC3A909185178850184E3D2A8A09DA1633F68E965E72ACB93C490145D728114949C869EBC" + + "DB9E29FF99BBE4A39AA497D3B7D2E13BBBEE526165E5B77B771FBD68866D4C3770583621A4A45339" + + "8C30787B0B8C7D2FEA9B01E8BE0F1412C0CDA4EDF570D41320A35F3402CBD7BDD7117179F777491C" + + "0DB2D95B806DDBD08D38EC7B612B4AFDAA70F255A88AE2C3F6825699DFA14BAC490519406E7E8413" + + "F807BFE48FCD3F2DAB501B4323922226F348D90581D4D74C1D7B49A158F64EC5B416E7CAB1D60BD0" + + "87D76EB7EE692892A77136BC44382AE0D170BA9A9DC704190809AC4C25C9982A041D3DABB4A9BDD8" + + "16E7695D0F56CF60630C93490010EDC4822261AB413F7910CF451313988DED65BABBAB8B8C873B69" + + "B5EE8B9ED967701830D639A20F7893C273F5E44AC0844EEFAB6DB170291E9ABBC47024D501EC05B3" + + "90D397E77C99D36C2CD4AA274300D9DAC38D8BDF1A01ECC8BDB63BE2E4C0971D1C274B995E127C37" + + "4DCC7215E75871FF520895990A22DBDC6DF6F9F9D020389EEA927FB4002CE258269502F5DD59BFB7" + + "AF0B031C5E82AF9CDC4BC6416AA3CC50C24F6FA70F210A5525F31BB9BFB7283338649D9C71FAEE5A" + + "398FD60B82084C424FC2AD058DF81B4DA774164CDCE92CB356484AB7E51C136F55FD9F2B6FB2CA3C" + + "40F7A3EC6A7F7B821C83B984694357D8BA45BE4C448D39F2AE1884097B37D061F8809033C2E6F815" + + "948F441F0FC187DA061A634014C2BDD02B65D36394101261A2C845F11D5DF31D85D20E025E645781" + + "7B18198D9873293E72AE91B5047EE7A391A284664303F220A7FBB33D012F7FBC1AD7E27BB3A30427" + + "2F89F4107E9B19390F1031DD2172595D94CD309C9A58C866BE0F501EB8F6B3C280A5D99C6087EDD8" + + "984E95C9963ECC6BF59B72676684CC082655986B73B288A5D9C71BEDDE4FF9073496216761EEBC57" + + "7BC3D0419C8D8A9B92B8EC598E216EBAB5F6B75295482FC6DC0EF4F11F5EC112AF268DE16C3E9C91" + + "1AB0350D15D515288741C622006C7D09A53D80381EA54CC8C6022FA44AF6FB7C19B7BE1251D5035D" + + "4613966B278714DFCBD8D867BAB549D9C387E319335C3B1EACEDAA144B48E17EA43BED687E0F4FA9" + + "1B63008615A869C3CC0A5B3353A898347B157B76303042CC5EED0F237916E31FBA36C2CB91B63328" + + "63DA448D14406CB45F677E622E0ADFDD2E923D48D0CD9E11987073C05CF79BF978A981100D715E9B" + + "36E0F117277C902EF61FC32CB0ABD2E4EB52FF73DBA394507EA5DEBE38D6FCF2BF", + contextHex: + "4ADCC0D5EC5A0C02A4552EF588C698EA8B1E8CB2AE78425BDE52151C6A6F518559ECF7C40FC93691" + + "1718844EB390A0D8375A2E1A813C3C42A0CF9E22EC231A29A4E186299FCF44B9380DEFEBBBE32B7D" + + "7501408598F666DF16979453836E9F06034031DE0D16DA77DFC710E81C52D9352221918B291E69D6" + + "C094407947248148F50B3D94184E9E078D6AA402CC27745611DC7804B7941141D54A2CAC1E67E283" + + "C9DC0F90A9EA119A2549203B603E20EC405EE129A84A25049CE77F29E9C350ADA60440ED13B5B5F2" + + "05204EDD99AE28547415706E15888809CA23455EDD17BB7326BAEA89939402B0CDF6B13054EF28E2" + + "455D40A4377667908DD382166682E9", + signatureHex: + "D1759CA6278B3B6770F90BA23CD9252C37EB099FE82B767206373AFAF7DDF2A79F6D518A2257CCAF" + + "9201EBA3A26A0501940A6CC22E1655A75F9A64F5DAD78EC1265015797FE28254EE0D284C82EC2728" + + "8BBD2601F1CE71B205AE19D1A469030089AEE7665AC1372CACA0D16E095069656F6D983022C695F0" + + "0907725ABF520BBD19245C2B3E6533123A89F73164BEA1F3A7BBE0BFE819ABB915160E94ED3FDB21" + + "1734656BAD45EE2C1B02E590B85D8D6CAE95194637689D611916A3280B637CE2A4E5205F9DD8569F" + + "3CA0CD5029F5D7E064DF8D45E1F3178FF768F3178F0E23254B893661722D2B62242C7F8D7304BCD9" + + "1216BCA2D3E918972AE5CDE1D7DFC0A998F9B63B93D28EC2C2F30398DD25DF878EF3828A26C2129A" + + "25C7C6C5F252E8E77DCA7610F6E7EFE3447CF445D05C2C5CDAFAD005EA88AC9D2C19595A13AEAF42" + + "F0486FB4A9298ADD0421A1044B8DAE882E623885A5CDB5DB7639B3B797930A7650A55BBB4AEC5B16" + + "0B13244D89B6AE25C08B8C025BF17829FA216912C8F7085EDD7CC4946B2C2AD1323B9F4940D4B37D" + + "E7E1C2FA7575CBDB13A18B506CDD617641D4DD73AD003741EDA92D3C203248DDF5AE85D827DADB26" + + "5F751738BC3906CDE81F8ADF362527398ED0554D85B2E5FD3721345159694B879A03767031C84B4D" + + "58470FF7D4E34DA416461905392B61959705B2A4FDD72E9A29C6C739D87505F86D2D0DD5E99093EF" + + "0D59A9D08BEBF0F4C3719B0E245E8AB0E665703950BAE0B87A058E8E94DA3E681C4D0762801684AB" + + "8ABEFC9C8BFAD2587ECAC970BEDF928B0745112BE3CA61274E89BEF0ADFC1FBE3BC27B42CDC932C8" + + "620CF64EB3FD2AB8E95ACDFB2DA987C0C426CCED25CC71D857F92B55118622BE47289BD452CA23CB" + + "D04FEF6873D38E132407D50698A192EC663170EB8556AFA3C2258354517C3A6C6C5B1918A6772A93" + + "58F69B07269F33F73B9601C1614EC2EF4942406491EBCDDD1D2FD436573C40FF018376FCE8526265" + + "6D5EC5EA800387ADE46D86F0F0DA45BCFA42525E28B28C0CA03099B01A9AAEAF95D1987459EAAA30" + + "F42ADE2519DCFB3AD8551987ED0413351A9CD47583123BB1C15BEBDC7DA35E41584672D0C8F1418A" + + "05B993C3D3AAC984914FD4428114703CB3AFFC5BE7AA1E377D9D7A4939C83195E36D8DA5CD7C5C57" + + "263E138C6EBDD1C9AA610F32AEF440C7E34670C52E8A7AEBAAAF3FDB646D713C7E4987ED8589094E" + + "03B8F3C357BE1F9A4AC79C5253EE6C3DC1790231374DF96AED8901D618400A191B016CEA1B7D4349" + + "E00AC661E68CD0E1BBA6CB557A2E94DEC693B97E18551DC5680FFD0B3FBD3CA6D9F5B6C16B773DF5" + + "AA1BA6366652A2F91F929C220A237A702A9538DD32AD35EA3756738F8FE38A0876A8D93D0321C43D" + + "1CAA45E67ECD5E7953BDB5F94945F3CC223A92DD00A0EA205D13BC5367C41F0430A4173B7F425C70" + + "A46BF37B783566662923C97883765FAF281B4E66E79B44E987DDCC528151BDF4E06201241A468586" + + "5E68C80CA08ADAEEBD4A110CD5FE05CA2329EE8050A827DE592EF41CD43DC93F922E9836A699E2E0" + + "311A3881289D8BC8201EE3DAB9DEFE742152237C08995A77842E068CAED3E945F5BCBCFD4A8CEC44" + + "DBDA1AD43D2A77120F7C17B6BA9CD5F9FD71E735A33A1E1A30486B119FAAE58482E019973F94B596" + + "891AAE12A6665D8322C9F300CB732C83579663852501513045047E16878CA62CEE49AE3CD0188AE7" + + "8B6049A4FEBCA2D29CD4FA3F4FCDE2F4676DFFA82E253998D35DBCCB048DDA0B7126B74E8D81E6D8" + + "0F8F78E7C9C6E9B9B2577F70135B76DF88FB91330428509EE3C9D11F92595C684AE085646DAB3914" + + "CF5F3C574888F2615B3AEA729FF25F1B927C983B7F0575FB727BE1EC713BB3D17234E8DE0EF873CC" + + "FC5733F6D07C58ED58B6DC71309960226EB210BD31DEC00177F3E566B60852621246DB046C7F362A" + + "B7584BB68ECC7B0B869761A90EDCD2AB366BCEB8A1055A918A3DB6E5F47A3F02D629D61C21CDB8FE" + + "821A7AB4135D1489DC6D9A05120AAB65026C0B809DCDCD71C18C64B8EF3C14B9D9DB1F85534EB0A9" + + "82B99F30648AF35A6FE9C0B89B2BDA0EA497658E23A2A363C3D6BB4DE84C67064A27C64DE9F2223D" + + "08A227942BE43D9A182F32C41767AA265BBBB7E20624041B6B942ACB07B40198D4B20FFA093B5C54" + + "8CF5B23A2078590825C81FB4C447B301B3143D526009EE8DAA05CC5C8D6E5655EE917EB0A3088FCF" + + "ED37D7C16AA48BAA2D79C061D024F75648FCA5548FFA35146409BE00972CC5F2FC9354BD688273DC" + + "1C29FCA0A326844552BDCFB2FB2B6FF062B97A7198E8C00F983F2E46FF8186B2F15E5A6FDACCEA31" + + "26B1846DE349AE218D4CF70F70BD587CD07FCA257C376B250F0CC5145DA2FABB990DB2AABF05DB04" + + "4A36D63D35371A3B0AFB08E86A305EBCB0C85DCF07C4B3150EE016C0597FCA336BC2B9E8B693C845" + + "BF7C85CD7B250B5A183EBDE78FF4C5021C0C039938F49DB1A869447078FB2BCD84CB494015A85675" + + "44F7BCF48D3B23DA01E76C5B9AF46069FA672FE4CEB1A7276F73DB8637C3663F4162EFAE531B5FDA" + + "CD920667A0A4C88A068C1D949DB3D38AA8E9FBC4FBDBC29E10917D5F96A97FCF897871993FFEC36F" + + "AB03A5AC502ECD6AF9EAC4A4039CF0DC83CE4125B59DB319079F26D8B80F0AF496B958DD9D4FF943" + + "EC0DE148BFC569A9EFA00B6558A9CC11B27E5FCDFCCBF127C5D63055D9D79F3116B2904EEC5E9B33" + + "FA4C25EA66127AF56B94B20AACAC7D455F47891A0790AFE7D2E53FF337845C2E0A81FC0126BC8F28" + + "426073F91149229EBD68039D5C8A14543AE6A016CDC2AC91ABD44191416A6B06A01AF639889A884B" + + "47FB1337E924B5FB4B66659BD39C3A129CA30F7EF23117D8DECCDCCBF5E2215CC2D7860A5A42B920" + + "A5361287B603CC1B1C4B7B91BFB2EA9E1137171E07D181A2F94BDC97F7052FE09B95388AEFFAFAF0" + + "EB7ABC0E07125399D3943132CC3F137A5227DC17CFF6079A8D0912F5CCACA13312C5CD97354ACE37" + + "8B5820C1BD548E95FB90232E4781B922A0DAD2DBC590B34BB8064AC57172B4F63AA4D21685A02140" + + "5B951420822257755A18FEEFE0544F0DE8262263E8AFEF8D171CBF2DB41A4DDD0482F41D0F7B85B4" + + "8D03C6F140EFB213DEED9FD43E1D4A39AA9CC50C7B3B4C0C45E5D09B2A8D0128247CEB2308E858C3" + + "9584F4233F1BA1A9CFD5D7BAB8B4BAD97EF8D7B5C00AF4E936B877878C36C5D2D2C926967AE5A646" + + "4EE92D9C0941C2055C92C094EE5C0A8C05152E35365D74777880A0C0C7FD04090C0D4657636B76A4" + + "AAC4CACED500020A1D2552536A75C0C6CAD4DEE6E8EBEFF2F7FB0510292F4350515D6176A8B2B7CB" + + "D3DAE2F5FE00000000000000000000000E1D3245", + hashAlgOid: "2.16.840.1.101.3.4.2.9"), + new MLDsaNistTestCase( + nistTestCaseId: 46, + algorithm: MLDsaAlgorithm.MLDsa65, + shouldPass: false, // modified signature - commitment + publicKeyHex: + "A30347C219786095DAEF91E735ABC25588AB2327C04B1398EE9FDAE9EA5DB34B2890261CC7A6E036" + + "36E23F3DF6750FBE929B75A678A26DFBC54DBF40C596AA4DDA87F5BFC01EA7E35194270BA981CDF6" + + "385B826319B8A50FCF7E748975795F46B03361E925B0D53A068449870B76C1B3A9F2B5268FD78762" + + "EEF553CAAAA00D67CF88ECB3814CBEED5A206E587929164D9EC5A0113159BB3F8D2757287F4E9741" + + "07F36EBC170A85BCC4E6662A13B3BEB8369143CD37AC59D1BAEB90370DEFA601016F40FEC6DD6977" + + "D4BAF314182670CC5D50A81B573855505E4AEFA77C2D952089A951CD01EF4E60F72081AC4B8E6E85" + + "7018F0D6FD23F046AFB289A54F43DAFC77A89A6A29569712FF36C7F66F6BE93D9E1A2C0AE9553857" + + "9CAEFA6FEB80EAFD45E1DF2A408A631715957ED3B332B9B256BF4A3BC7B4255300BE180FC7B4318C" + + "F5488DC98C137735E11B9D56F6FB82B98EEF98421493109016F49CE1FD84534EE17F011DFC202D37" + + "C26EB512B18153A100F5EFBAB2430409B3539AEA28878E979509F030941B7BC16020DE9C06E4DA44" + + "4DB8925139C831F3E895D9725955B2CC35DEAD47A8C5E90EB18E5D97660FEB7380CE851F267979FE" + + "705404CAE808C31BA99AABB2DB44B0C34864AB2FFDE0AF0955F1742E2CCA5AE560C77BB9EDFBD44C" + + "806E7E9A56F08E402B3652BE0A0EE95D14D3F2234793DCC51D715222B468DE64E23445D471AC3ACE" + + "8A6E95749956FBB9FD0C90D7F4DDAEEA7839B539C1CF8F3DF583BD64318AD9E9FD68D15801CE0B9E" + + "65BCAF1AF41E2EFAD6DFBCAE231673A89E6AAD9AAC03BC94481017F74B4264EC658ECDC414129051" + + "FA5F6529B207B3EEC53107B1130A62A0235B6F9EA3E0FC0AC3F0DEB451EFEE24EC9F43AE58F4CA37" + + "A4CC7971E1662467961C696614276BFB397E9B2B542328CDB576174B633AEF2C7256653D11AC0A1E" + + "F781D1D397F5570CB36579692CDA06F12D7EE8BF590628A1D83806286ECA46FBD4C1FEE6CE69327E" + + "68F1FA4053A428840B2B884405B61F40B8F44A7BB9036845000D9EF5097CC6340FAA889258A9BD7A" + + "FEC2569A10EC803B5F210BFF86E166A5CB5C4F1F04B93FD8E25FBE2152AAE2463D859D3F9B4B6665" + + "2425FE68BA84A865A9869E698798226973C632CE5B3818E0BC21B4A7EA9966E0A465D22185B6C75E" + + "D45CEA5C1FEAFE76E250D2542D9818FC151183FAF96426BC60883DEA17A4C39158FA5374802DD7D4" + + "D5A92CFD9875221875DAD2678FB908AC723BC17A80D9FB968AAEA3289DC936BDCCEEC089B845CF1F" + + "A547D62B4E3134E22B9C0D50608A4282B26EED0779C7D305B430935E383E65E75833E858E5F73CF7" + + "851D02DCBD1C6210A50EF002166E42261294EB8FFF2C5E1F29AC50429D9A82288602A43A4AE597CF" + + "A11F2138B4A42CC66AC6C3F3A9C224924DC50BCB62E49C22D767728C95BC9EE8196383C760432EB4" + + "E22A8F14814E13487AC1C99A18EF9C92F9684A726521BECCC32864B2A715782B0C98DAC1985830C4" + + "1B69003E7097640C16B888A28D54EAF44AF9D32F1E201538AD60F398AB088D5D86C61CB46BBFC809" + + "59849F59AF2D0941FCC4AA4C81D4AF283FAAACF9AB124014C09525548E1652D08A7BC783B8BEEDBD" + + "1454255532177EDD529259217D30D84D1DD6CE584387CE00980FE2EFC216CB2821E92F274E5194EF" + + "1C775A70BC508B820904A8BA7829B1B0F064395ED17A3B0BE99103E908A8FA611558CE1F8CBF4E1A" + + "0CFE88835D3576C8C10FFC7CCE1AC082D258F9771BAEFF2295117EA63588126E2472036E00CAE0C6" + + "6712ED3EC94ACDCB1759DACF2EA51D1DDF43F8AC9DF0C8AC32F604810E5F4B5F895916DDEF2CB1B2" + + "D53462A60823597FF8A1E357A14553B96AF631AABE08D62E74653E093523B13BB6567B9AEF247F01" + + "2B48C60FE5FE8C4405EDCA94DAF970AB284DE3B07A38CD71C7038E3B58BDCFCD9D198F039D99B3CF" + + "544E564F806E38872EE0C6DA61390285C4007E7FD7D78957A51C48EE6C62152CF9044A9309C8997D" + + "3761D60CE53AF42A54139D8B54DCA81B364D78738AF3FF29F3781A3DD811C90263A68B1D8B0BA95E" + + "A43BA2C04186C588AC48243C187FD988534BE1A006AD365B988259B44D524AEF502869385D900D1C" + + "D7F4829E16E3DA79159D0C06DE325D0988CA8EC5E92200F1E563FA4DACBCF4D18179B2EA10453AE0" + + "2B3D5B410E8F8B9BA37AB2F0C3F1557F82BF893BA88973B34EF320E34BAEC8F71382A224AFAB0468" + + "31A665DB250D62E468F2A2115F30AD681942B65618E2D9A747CFC5C8F2129FADF0820BB73F5F1BFF" + + "7E41D68ACE194304917B7A6E8BFBB90BC2480755DFC13582FEE9435867751D5A340719BBF7DE9D63" + + "7D92DFBAE0170242DD9AE86788289B45E792BD01F595FACA0935DF84DC191C2BCCD59E33B0D1405D" + + "22581CDAE28081E0098D5FE117D2F250F74E90C89D1CAA2FF34AF71B59090021E0FC651DA614B324" + + "4991873F86674D17170359C63E8D8C97E9CAA63A3CEAE72742D6AEB7FF9E24E31A8E0925C1B4F980" + + "0D2F848079011608227735E7CAFC55DBB5CF44C58A0621A0B63998071736FBDA99B24C150CD27541" + + "A96714EB02D47576F5872EA61BC981755FCF1063C4910C9009FB1F46CE32B197B60CF7F92F4E0A26" + + "C7F93ED19C4A045371F31BEB65372C2641AA697976E14C3A28EE79008848505D3ED3DB16F976BBFE" + + "A7942F63C5BE45E870D4B29AE8386D57C2A39A5D28A09B7E9DE3D59F9F43F15F", + secretKeyHex: + "A30347C219786095DAEF91E735ABC25588AB2327C04B1398EE9FDAE9EA5DB34BC5A2F16B81224267" + + "B2F812D06CFA8D12616BBE022465FC3DA11C3AC2FB2DEC09A109AB7AC6B41793320320164A5F15FE" + + "9257F6D5B47A5A58A71706F5EFAD60007540301A5913C2E47B3D2D8E488A983C60E81834C612EC6C" + + "E33A60EA398919671742005061877663656851876033072270665282065515842284306032708247" + + "63358322066353867668033523626612481227273284680323827142720044573323748601765346" + + "21133377874260343753037721141083350625577781421747681020867404885706082114360132" + + "60628104512266625848630118888711800583838217822857504841446660456341471003564633" + + "51421115016655143787858823738514868500108146505132458357614041088754215725531140" + + "32573267627822362705462621155844530452252018816747112436276415811833117436533506" + + "22736067711283474386605581501301581044306355100147211154314862520787648240856678" + + "15055005820231867180030103466618083784051167451466371064838818541377721472457085" + + "22270723776124340882875807061538358643386860288256280223783006436446645821557470" + + "56102112483848183832442435416204824722166530321264703074881422411020503480173806" + + "03842472224056371784256711574126367432213288580086374023370317235743606828375174" + + "33276530571088282548554444805420402451124768111260058813336133018765557035411124" + + "61168633102245766846455146446184007300258186004452228454630482648386241153017375" + + "67727882437614214180544262087656408168127417744857458716020278053156055651567687" + + "50441107117661014201284345210037042814857628617005512857042345452027441308676442" + + "55673257462022341146077145427554861440406248638285846235120628153277887251276085" + + "24528103057017600237033470537075806048524464676184178071737782453305243644407671" + + "23410063678254514612145373184776673742843545486383703346703407013025112557235810" + + "43417461740704317730282722631521876786405004608041623136163502805062577432844032" + + "13781226652382836586816652535651653875153253553280134706017442835887744540266331" + + "41131078778823054550211766324123850418655204842451700750543700512834822315685118" + + "02521702285557428666188533842775571025733300500050343773110684650588532322735265" + + "28327511673718588841766168854081782681415544441806635408443102737132172358453203" + + "34664623480124857172602233867425534557118104681400860682460755623272563548275050" + + "38472670387602210528018132878625713573370026808435426470648310030054425070025058" + + "85834875716230854353444338822418486328043035685416275458602827100668470831608188" + + "66438466277152634855341050071272613586560531261263088278861438712886357576613555" + + "01735404466023210873346350581331162546313711626064082751075172144564470617057102" + + "80587176220251502564866440221528165566673676870886318015617435725271448152822267" + + "17112218824628408242757111720770473604521715586176017788421207730666371246203643" + + "88648208722827625473374485412452743783441721262716120262266665877010824476281425" + + "25528715704518730643375316755527273244504508524011513664581630483734541341334160" + + "80408227143157373644150106361028786185173358128873660780248151205765278248785670" + + "53615404163441745443543417112147385038421435722257240223627332563454454078326164" + + "45162463158232877232857231065221863476473634447157311452561315723286603802583783" + + "03432703454268737561734104755441E0DC051ED47DF66A651FCAF954479C5DF9B81E5B6429889E" + + "D6101402A8516DB2221A0077540416A3B824F994683AE92F05AA5247593679B767480F6A599BE392" + + "27F627DACE9D23DADEE98AC311929E73EBA01D4015B78439906A33B92733AC60C0B10BFBE16D3AA4" + + "70BDC9EB34D99A250C8030A8174DA92EDEAC2060A60B43880FA450B604B1BC8D41FC40121D0164BE" + + "98DAC8377D9462396DD6C1464B0525CB4E389E8D7FA70F1778F8A810DA033D7CCC30122CB369C463" + + "B983C844537E723065BA6E002910CDE03FC2A4D42FDE972E8A10996D0883AD8C05261F63585C6BA5" + + "07C1DAD827BB84EB0B2B8C66D723C72B08B440B6634EA9B8C5CBCC96246C2C78C306E04BB9F5FE3C" + + "33888CB5B374E9F44D8AEBD868AA61A6EC9F9F34E96F5254AEA17486831981E1A3EA5403A267CDB7" + + "F5716D41C179D7D1412EAFBA7B977FDF035CD7D92FB99CBA6ECA108D3B1F2CAAA5B71A5C68EAF6F1" + + "C717F09372EC4DDE82158F14A96504B1806867F9D1647E2C7D043CD1CF82BEC312B2AE05B677D941" + + "C8E0A5520B7B2F615F2275C9E2C532C1DDB8614CDCD51AD729852B665D888999B3F9096D733EC5F6" + + "A58F8B4BB627EBA7769296776823B656730F053860C610BCC23E1AA52B3AA27D60581208B2F44A5F" + + "EA3B7B4B905D13214AC06C52B27F94326BFC34CC6D7D0A675ECF72B74157075FE3498CC943045B20" + + "0733F2F770A81B9B7B3AAFEBA40BED064BC772842172D885BB2291D86D4BAFA7EAF634EAC8D76D06" + + "A3AEC3264C70333BF46C4F1DB54C1D14F9F57E7D815DB6CCA1D51B300ABC9D99038AA0302D7CAD38" + + "9C27F925E58AD52B7B349DD3D4935048D2188A8B9062EE4FAA637A2CAA5FAFE291257E2C733A1B5F" + + "E58BFC60393B9F6B91F8DDC2A7276A3A95C8A53E3AC4D39DFA7FB49CC2698D44B61C85C0C10B9F01" + + "50AF96138EA7592AE317F77AF067C5CC9016B112990019A9BE30F942932A5464AE307778C009A459" + + "46E4ADC003284F61AE70B528EBBA800856CD29ACEEDFB8511C5FBC5A12EC6080288A79EB799FF4CF" + + "D1095B04FFCE822657264E7C662FDEA1FE4B1083E1525DC87EB610D79ED11392469BA08A674378D2" + + "25A567892CF1734B3CDC72AA538ED62D8146A2D72EC104DF3899AD2E14AF77E64D7A534A0E341304" + + "5BA46690FB7CC1A72354FC8BC12B6DB5BF46B155A6811F39229BEFEC466480CB3D3A72E8A8D9DF00" + + "0F62E4B5405F4AEC498A583A8AE5204A37EF7944D5ADCF4FA72AB638130FC55A86E320827479BE6D" + + "9DFBEB32D93416E7D1408C42E3D3DB653C4B29AD68D18ED601DED0267B2E4685854E5AA4BB64F1D4" + + "1ED0CEED8C584FFA166A22CFCD73146D0CEDCDF42E4557F93A0E8F6A635DF294387CB1B57DEA8552" + + "94A03F8FDBAEE2C1DE2F65A3AA1E7744CB31CF55F9C02BD176DB999D2706CC30EC8BEFADAA1F72A8" + + "7F99B4428016FB2FC23220E637D6B7D90148390219BDB82297B8E346126329C3D7F05A34EB054466" + + "35DA939CA476E1144942889086CD84B7A7F363F9E9EEFA3A21539622AD53E697D396763BC893987F" + + "65BB3AEC480A3E45D9E81CC5271A42292FBCC3E783BE9629C88603B04116E9820D0774108600744B" + + "96E1B233CBC7A7E34E6494994876F4148379FF08E8815A59107E6049DAC5A6A932331806354AA67E" + + "1845BCB659CD848EE24F59DBDE3D04B2FA1C0CD49D7A98BEE682B23BA787A22599A19F1075CAA22A" + + "B35610E6F1D9D4C2D5732528E32D32BE953641CB1E9A4380056CFDE224B73CB41CBC163C09D1715C" + + "EB3B743334D1274E9CB3B3DA691BB1F767F2D0062D35A4E19FB06664A0CF89842D2F2319CEA78D7C" + + "A12A2A0E5B57D1727960E5E5638BF99AA11876EC84F923A3422552ECDC7FEC307DB3C7016A71B07E" + + "14A4AB0FC52B2474A3EF756DCAA76161B34C20878C71E5D9FAC43E6CB86CF22D0C364E520AE32707" + + "7FC7F8FD1B1A6E19B23BB606392FED56B49C2F29B902AE34111C1AFD4E6D327C09E5AB8684904629" + + "B89E300656ACDF9701E91BAE0FC951EF02ED7DCB3CF782B0B4C58D237D566E77F1A674A290945291" + + "CE417B996B511D58C29B78D1473F08C840AF6067393C6A2B6DE8D44E30B000D0CE221BA28309267B" + + "73AA75F6C9C851518BE02C5C1990FEACB0F9F2ABF8C8545E47823F7238C9AAE4A62B0531A3AB8B09" + + "E1DE597873EB55046EE273946571F1A065DCFF807F7ED8665E8B581FF48297BE609C5B3C0595AF47" + + "F1188B68F741344F9B5C1A3E002A85C278ED311D3BDF1A52E3FD571D11853A4A59D528B622ECB504" + + "FDDF827AB5736B2E5E2A060A0BF9F6B3A3CAB9FD83DD5E5702D83720B92CD89636BFDF81C9250AA3" + + "53AA6C2E2960AB2CFD17344431979A728E39EBE46C552AD45ECBCD54C64DE6F291BDFC783051A169" + + "12358C8E1315F2965B6A36C99DE384455A71C33EC5199E1F332F109E0892481B677252B123783A5C" + + "7F42F935C530A153503E4CA2C9AB098E18F864C22766F1D5121507C781A3DA83767A764FC9EF8F54" + + "029BA7A5239B711E6D357406F556C0B35D60B21188117B2DF409DC507017C65112CCBD5147098C28" + + "DFFBC0ED9F8D2049AD9A2C3DC33468D762E486858E96058A465A7E73E19567528AD5D91231A0AA24" + + "E8B15918BB802BA01EEF482D4E57B7163D0761EDD0A18BB171314C64D0D5092809B706319CEA67E6" + + "2638A6847E40719E3D0B335804A98A2395016B23FE5415E93837BFE2E59BEB23FC073B2100F960C0" + + "05F591BB91B4E3BCB61306B44A9BE0D9C22E75D8A09B69664F105C46369B0AD7F06E6AE985B29D3A" + + "03B1AB17E7C287B9CB24A4A71BFBD5731BDAB10B1BB4A4E9D7A0F9A505019E8CB90E79DF2215A58A" + + "5F68D2578F6B8E846D22F248BF8316EA54FFF377B041918083CABDA65B2987098A309494D6F52505" + + "120E75A36E8BA5F9C8964C191911C5831409F3FA91E1785A9EC29A492A27F5E4811DC8EEA3601AD3" + + "348ADF54043FDF312F4CD80974E3582FE34B52C07A9C384E897327E8BBEDAD7117E03EFD500A36A4" + + "0FFAD55C4A712A93F66A5B90737450DA13192009FFFF21445B90FE4711613DBF27C051C67B8D3C2E" + + "7E4DEE9D1349EA88EB2AF971CC85C7500CE187FEB63708238D51020F81EC0895D153B52375AEFC44" + + "DAD1B46D74AC046E36447AE1A58ADD5BD3EF02A1B9BDFDF683ECB70382B68F084C8C65356E89DFE9" + + "B7AA35CD5B4E82090A1FBB4BC0484B56A47255896D45679269432ECC6C8581216E277B2294175A58" + + "88556B1C77CA0ADFDBC3B3767C618728F3AD1F7BD45A279244C160DE0B6A9E8822A96E54DC0D06DC" + + "84D7A85ED11EA570C529CD8677989765883BF548E80CCDB3B167298C95CDE1732AD69105727E7493" + + "A79AD778CCBD1B60CB428553EA864C01355610DE6CA49502C406C4F66296B4F3699E372670AF70C9" + + "231889B2BB944C336F7C218F702EAE663DCA6B286DBC28FA6A174A62982B624264CB9FF8CCBCA688" + + "03666AF1B9B79FFA451E78072AC3109F6BED13E405B143F48AC67C8B34D9E88C", + messageHex: + "AADD8FB620F8E098A4B3425D0272D6D125AED2B91420AC0C7ED71B16C8034633ABF0E42788E9C112" + + "ABA43A111B5FE73332FC0B0A3224F48F04179FE10B8C3DDEC45DBCEAA608CE31B904DE08AFB0231E" + + "B926A205E20A9068DA8B2F561B7A1789ADEAC13E7DA15AD402EE15C38DCE1A346EBB5C2215EAC886" + + "9C3A8B01DDD01FCEC76BD7CAE592D91549B8F0AA902DA3658C0D263A49DFF484B4A7D157B6A48DF2" + + "98A6F03034A64195F6A5020A6F7C2D6D9241A56AC3B875B89B0C702727CFBB4BC35F27BE9B35A731" + + "77E9F3BF97909124CEF82771F05052C0648B66DCD8B97EE964999B00A1FB66B9B395BA1579DA4301" + + "E948E0A6B920E55E60C8B901EF5BC732FF6C99DB927A6DAE9EE092D5AEB3891E8C56389FEB7E56FE" + + "752D7B0FAA049A466B69C802F9D05721E8CC24101E5A8BDBD864058AA1329BC86F92ACEA9B567BC3" + + "F1B0303A8F618392E0DAD28746C6912117166525C88BF69BA358647C6338FBBA546BD6AF7CA3F23D" + + "8ACE1698CE3F20D30F10229710CF2FC760ADDD819F0D60F672A1C76799A0323AAE76F5F753574981" + + "D90389C42F6E5B1BD36F4FAEDDA0B37FC569EF17C0FAD798D451056CEB0237B05CBB22538C266062" + + "B988617039078CB3E3E0F98A07A53CFC5616EA8FD015A335E089B569549760BEF4F6BDFDF62DAFBF" + + "E1D5818E371839112577EAEDE454597685589EE8C66D89656E30A240B761734103CFE4298B298D7F" + + "717CD7DEFCCFEF9637745F6A6EB38FC6FF0DB7C497AB8EFC55E7BCD4EB90EAE5C30D9B5634887226" + + "F539EB455EC928BFA3D0BA750E508C0DD20B676FF5E4D023BABE3497723396B983C61523B86108BD" + + "56B2B8BBB4A4A3F7A40E89CA42F5ED0B5DA3A767867E715C8C6E1AB248311B5CD6A964E2F02EC761" + + "25BB15E48F22289D785E55D3BDDF66BA94A9EA7C06C8B2B9F218ED6A936569B3776446ED39060676" + + "EB217BFBEB0E74C313F8485AE13FC66BA84EEB959813BEF35940E132A37AB2DD03CBBBCC345B08DE" + + "AE867E5259C3F35896E967EBE40942A6EDAF57F3EC2349914AA11DD4975C55103ACF9FDBBAACA3B0" + + "34CE55ED0BFD7E21A053298A6C42AD4E6138FEFC742726ECD773E9632BE2FA1639C3369A71ABCA49" + + "9D92FCBE492C842332CBBEB5C2DD746A68C798D6461CB49D1272B7F066E0191FEDC1D9E8918EB36F" + + "4A2F7FDF800C89F1B39C7A8BCAB80A777B8E4DFD9CCE52B2AB3EC14CCE2807E252628F50942F2B60" + + "6F53BEB892C45DAF0DA711997105D2D980140FAB6CF94472550C4F2768181F8C27BE026EA7D2C6BA" + + "E92E45129B5CEEA18AF769B4BB521F72C1668B597F47DE53BAACF55FA75CD0E9C8CAFE8B6B05D9E1" + + "65CF6E466CD9381C1EAACA78BC8F85E8BAB118743D5471F93DD58DF46F3D1C8CDE48E8042F9804D2" + + "2033B418550EBF56BF6EC98891B7294ED39EDF70AC594FD3C320867BE544568339A92B67A345971D" + + "46394DBF11E0AC64C4CE49861C3E7C4C9A585DED2B05900D2DDB683E1CED1D1D24FBAF28A5EA2C21" + + "0DB2817651845FA2E84854C162BC18F562F3A93D01BA1645449A0A7BE16494EE19C0A944FBF200D7" + + "196AF9333262B82E77908C3AD846E1B7F67C68525B780CE17B87231AEB9086EE2D8284E2720DC1AC" + + "ED66F4ED4610763DDA94D481E02E599D4D6B40F40FA5956C7ED34A4E84BC4CCAFD4980B515594DBC" + + "7B33BF80FC04C178D1089FBED8BEF66D1C0A4793CCF2719A14D185A2A62BA5EC2919B30512B176C5" + + "661741F556619C82EB27E1BB4577D52F39D23173C9288F12FDF51F7441E194FDC58D0AA221AA6C46" + + "444FCB363DA2E1498DF5E7A7AE3C5271B9629FC3A7E0D2B65E1E5E27C06324207AE0AF1C9949749D" + + "B8C7541398F21B23B4CB0545CAE727F36C6480B23F9A10E208809ACA60073CBFA76AAACFD33E1BDE" + + "D09DC1D1452DA015AB0F23D5091C0763962852B4D1ECC1769C4A726BFCD202903A8ACE47FDA70A5A" + + "346CB7217DD80A1AD6A6A1D6CE55699FE5BF784F88D5816231A1AE1337DE0937FE20093A8CA73514" + + "9AFB417D343331E89D062506DE097B3DA743C8B2EDA4151724D50AFF3D06A50BC65758031328A5F9" + + "539BB74DF62D0D091F474132B2FB6BF2FE54A6DA2D848455531C34EC129B85E9757BAD5897146CCA" + + "AF3884C15CF927FA436B9E98121A7501F44E6162F8BD41A4099E2BDAF5AF5E9DEDB8F4A38678A4B5" + + "7E2CAA543F8E87A055A308F5B15983A4DB0A3A01AEA627EEC0DD2799BBCBA4FC4413BB7B621DAF43" + + "9FDA801D9E1E7B1452B06E2B75E8C83AA70D72EED2277BD5C0A6132C6DD5554A36AFE977E0CEFB32" + + "CCF9C036A165A357402950B868E5F3895160EC9950470E13E70F9019400963F8C5DAD3C6B0CC36AC" + + "4064747CE83D59C6C82A8144C7C10CA0C07103D712E3BCB5A539F6C1ABBCB3D2A4B35B5DE7CE84EB" + + "E7A2FCFCBE0931BC9C7F82639FDB5F9BC15C4A6D294069C5263F4DF87DA91F42D5A3B3727F7E11F0" + + "A61F021582DA12F2ACD9060711598E9A147C7ACFFAD7DB9F95043EB1CE0C74C8635CC7B7DB7E42A1" + + "0F48D05948B4471355817EF446754D6DD7DD94C47B213B7C324FBC586DE41B9371C1444745B27C29" + + "C9B9D30988A71720B5349CF611B3625490160BC5DE10CC298B069B5E9502A273D4A578DD76CB923D" + + "149A693A0DA6990D1FDA4AE72551CE419749D51BE42CBA1F6EA99DABC0822EDAFD3116AC52647261" + + "22808A4F21101C72513860A4A6906F2A47BC9E8007BC8DAA296BF842C31F7AF7EE7CAB545601DB0D" + + "29A5674E2D5846F574D9CCCC5C60DDCED5E151FC1E4617B8878DFCED86E3041389FBE0E58A628B7B" + + "681689DBD80185EB6A31385A1564080A8BF2B1B9D4AF0CFDB5A5CEE24C47000D3C67612751A3AB38" + + "46D09D93E1B9B957DD2C2D8A70C7E2CA3EDA7E833ACCBC07C51A14CFBCE637B87C2180B7794AD833" + + "2909AE084FC52750361D0D885B275AC78716DDBAECE2618B357C4F981819E74B63D9AB9594441EA2" + + "D400B11D716C35CCBA98D061963B0DD49E424C6D68FC50E83B7EF590F31560587873F5F9B7FFCE81" + + "EAB795680123CA586A9FAAF49C9616CAFA691C3FED1F834F01D284609377734837E8047EC74B5158" + + "BEE2B07764622AFDD489712B470569EE365CB3537B893B1A160F57C794EB546B946445570EBAACB5" + + "2600E9CF928A578EB098691CB6E6BD043ABE31111751FEBD5904B59E931987A0786A3A388D75D947" + + "206E1892A8AD6F4A03D871955A2520603976456BD177FDC82B12C92631C0DCAB538B3738B138349E" + + "6F871690E2B2B342916BF96A212CD357A7CACADC4BDFD11A6953470D68B1CC33E06698A5CFA492F5" + + "EF150603DA45FF9B999FEA7E6B1404082CE63475A7A258986FD3B021C86CF7914835F150E7FE009D" + + "C8EFAFC0493B0790876012C635DB2BE066ED01DAE3C88B496034BA72A58C683EAC6A50D382BF8670" + + "AE93E954B657C503A797DD503CAD0819C3327FCFACB52471B5C81EFADED377433E3D88EBE24E7BE0" + + "046628CAFE1D06CB652FA6FA02C4AE367FCCA23137C969D061DB6E42786D48692C82945AECA43D57" + + "F956C448A3D81FAC8000582AB8A76398C1146E3C750021297749D322712F36D8F65AD99B612BE4D0" + + "18E4439996C0B2FFA50589237D34B2D3F1267388A93891C499EFEB6AA6089E4B38EC7128D3124FEB" + + "D17C5A02F3D0C8E2C580A300761DBC890C16ABE6AB847B00087DF4451778539526EAA565C19DDA44" + + "D597EF2208A7C82C3188A026A776D576E21CA0CE159D79B4A2ACA73F49ED11AD3D525C81FB5D1CA9" + + "4B09E3902CF641CE29EF53D24A18973218EA80255013351419CD1CE944FF6635EEEBE6ADD0929E23" + + "D1F7527F012A7A5A3CA18061930B9431B6B323CB1913C67C6F55FDC572D4D4994B1430E445ECC73C" + + "9936FD0B7BD58BECB05981A42CEA3702DC976BC967139039ACFC361EF8448A37584FB65015A214DA" + + "1E65D8030D819682322829CF231F8C4F8713AE8FB0A952895C8E25C26C6A2A06678FE9F463184C5A" + + "8CE6C84ACEE7C67E1223BB40A97B6A085A3C1C59DC2269FB72F7B7E99D9F734253570B1AB2ACC579" + + "E802E5D6659DFD1F798794D65B9FB297017AF69360AE80F8F920DDA69BE38FEE1277F98EBA6A7669" + + "8B18981E976C6331FEA7FE429AD8F0E190A040DB06893711A52B43BED1B03EFFBC916B519010983A" + + "FCE430D3F5351A5535CA3EF96A33FBF769282E30A75F152E7AF377B42E26ACCF99AB0E0280A139D4" + + "5CEA1EE6DEB9F334469A773DDF31E60BE6B0742F0A764054B11CB25D674191E0650E618D6BFCDEEF" + + "22812B6E7A5EEC4C08764312829FE3BD7889E3BDA815B67108F19BCB7EEE812AC2F7CEED34B8DD95" + + "DA5A721EB39AD201DAE07CED27A1E6F16E5F2757F3C6A77B94F7AC54A0BD9EF4760A5F8E0625D02F" + + "498F92256A16216F4B6FAAD2AC549F39E9794384C91B916C05E703481032601931D3AB93FF90F5D8" + + "7B75703129A3DB7A5370C0673E0203F52391B660EE9DE5BCA1D47588CEF3A9A9E18186CD10B4FEBB" + + "47F2E6F6EE02EDA75C7A86A93AD659024381E6275F236C3966AF692CA9606FA93BF03648A0283D87" + + "FCD4AC3A2C10594AAD302D7F5E39AC7E3A861E2B8AE97C09B4B3B993210733710044610BA1A7C084" + + "DBF3152669245DF5845850D3993ECC5EE04EE2ED94343EC35797A4BB2F30D68B5AB76A56475C5797" + + "A14EC75FCB8A08A5FF913B78321B3C454A5D82C0BBFE434CB81B5EA1E3CCEF1BC61409D1798921D9" + + "575FBA737C8EA7B9594D2237781DABAA1F41E9EC646004BA04B807D9D596936C94FADE67A9638DA1" + + "08C301E786F3D4CDEEDE670DF5B5D436C664D60A2FB07C5B35A92A4CEB9A89874EDEA23996CA1EDB" + + "C3378951F1C916BF47CA0133EBDC80ABFC98B2A5CE9705783058D60C751C01C898C2E7AF5B78F3E8" + + "4EF9E4F113BAE024EB18559792B69DAAE6E5CAE4B165B82CBB14EDCB016BC3512F455C6B42EC5EFA" + + "3D87712D49BCDD858DE91B1FCA232DAB6427DD71B41DAC5C459F54703C2A9402059407DF101C5498" + + "86A2E8AEC709F184B59996D6EE638F4566814A9E5563287697E228BBA7E344FAFECBD4446212DD8F" + + "3DA9D364A02BE42D50AFC2541753645BE64BC0A5982F2E89FE3602D291DFF429D661F1B9BE0EC258" + + "87C1EAD56C4231019D6623573CB4F12F63927362836CEF3B852F97485401C10AA3FC59895E911B71" + + "99853E801B7A586EAA46BB80196554E14B496788B4CB86DCE63FD294229B761E128CC8D84D3A85ED" + + "B84C14DBDEA74975917C25D5B02EFE625D8CBAA06711BABE229A2863DBE65D701F17B7B32DE469A1" + + "DF39A6DC5A98B93AF0A3BEABABA40470FF42BF484929AF37597F6D6969EE061C3866446C81B900E2" + + "E2718C8B1EB7F08C8121A13401A20724A627965B7A9CAC7C2EDD629B318691A176C1EA504D555FEF" + + "DBE805156B35F99B0275F2125A76A3CDC2DAE07DA6CB7587370D69FB3D099A993AF0D21D696E570F" + + "5A0967A60DC8AEDFBC285AE7EE99E0AD066F84C24554A5691C00DB09565FF51CC2CF1787797BF6BB" + + "D0AE4FE273B69916FA287D5F8A19DF7291E02103847F8D0B0ACD9E88B0DBD583CE0EDC25C7364A3D" + + "045F88E46B00E96058C7624EFEC4CAADD31619BDF39D76830CE85F747A383AF32F1FC84E2C612224" + + "8B9125265EE16B2E83575D012A795DCDAEB5458E2475F27DEDC0306AF34E0430174337516A243852" + + "7684EA6DB527B45F8ABC9C31923A67C3E3904A9634E2B26DC41329DED9E7894BE6D8C88C38D50E38" + + "57644CA6BBC94340221139F36F1F2A3F102242C4600BC4D66258FAD67B8AD41C84BAB55E21C39007" + + "D789EA9DBDEBA3E1AE44160CF192F30CC36D6A4BD01BCA0CAEF7DF1300D983272F345653188743CC" + + "A4CBF14696831364CDB637A4EBBF3C2EDD022501B847AC9F8AAD8F05F6C0C2FB12550B0C49A80ED4" + + "F8985AAC790DD4BF3A4D14DA835622AFD73AEEA5570CFC2863B1B2BF7E767CF2DDA857DAF683DA78" + + "52E611F3E925ACC4158982C59AEB7C50735130548627A54B41FD002F1A37395A008891D35D6F7994" + + "0538E724C1BDEFDED872122FDEDB00E3BA6E6362BAB1FCFCAE448389C954C385810F2F870A60BAA4" + + "60BAE11733E79E84125B2820F5FAA334BFF1857B624F98B98946177C5F123EE38E585D5DE6BCEE33" + + "C0E5D9620E4DCB988C8F99494449FDBD18C7D3221A5E69EBBE366DC1932FC3593BC9C4600DB1805D" + + "6831DBC9FEFD19FC19F18CAA152AFC8545E7138FAA34CA685898465E4517AFA472E84C17E4AFD3D2" + + "C517F55D971CF182270A77BD55F246B549BF79D1CFDF140F4F23C707AD248FBDA46982F0E91327D2" + + "69163D5926FEC839F0F93B736D773C4708DF71BFEE5B9865649DBB1E2C36AF8533E6490B271CEEC0" + + "E3B5624689F35B5F88AE2699995BB8B321647615BEACEE5340C466C8D7C4F52F780A1AA70EBAC9DB" + + "B37ACA1A89EF4A9AAE20CF1C4C67CBFD5C710053CE0ED953C8B088E3F567D3F181C37C8AA94BC440" + + "1835D6B118BEDF01EE0F0EE1AB4B9E2F0474664E2F62CF85D1E8DB2C68B90D6A53AB9E6C3EDEC82E" + + "FEB845C5ECA4D95DEFE544B7B618EBB7A2158FE0EDDEBA33D4FA8684A98E15492B1C661B19729B60" + + "C9C80B22EDE265DA2F47FA5427F44B65D45F378705A226FA0831991CF21BFF9D69B7D539448E920C" + + "828B27CF881D7AC5395937180F04189E014FB180EEE86557178371A2BA84BF0B77478C1D40284AB9" + + "B1880558721621DB598FBD04990A530FA968F7D3D72C4E3EB2A92E31DF722DBF534A8A42F70FBF0E" + + "5748CE08C371B5A6786B906EE79E033CCBFD6832247924289780754EB0CC7A39D6DF72DB68193B1A" + + "DB53AA039BC540C9993B0E724995EDC9233722FE8C91F9226F2B3428689D77D96FB1C712424860BA" + + "7F02E0AAEEEA640A07DA78E0F3ABCBA365ED4CFB7FBFCC79E5FD5DADA0F4A49C1816A958355F10BB" + + "26B3E734165DD7CD5F6806E7E478D0285A1509FEA68BBEEF0F8E3DCB782A0C6CD4307450E8268EEF" + + "FC04395FE3B32B56E1218341CCE4EC9B04CF5AA54DD3D198C7EA9B0FCEB14ADD56D5E39327C3BE69" + + "348B9F49C3D457704043023203E5C5E0976022A21D5FE1806B461623552CDE06015E8B13B469F9EA" + + "8DB96FAF32B5246CF939C005C9C0C8BF9E53B2BDBEE529AFF234E72752BF195766EC63E61F7FD31E" + + "04D4087FDCD13BE986DDD2CDC060D6F19F8E2F06D3284101B89CD705AA4E9D7021731D95D6C93D21" + + "3ABB5094C1D2F43DF10E35BCEFF491226ADE481AF375A4D67293A0B59EC8FFD44A1EFB654BACE001" + + "B6CA7A4F250F03C129BB5DD59D884035209B40A2D3AB086C5D5ACCF3B6BBDEC8B4E6A333ABC572B3" + + "357360A6345C2F1711B120297495E75AFE261498C2393589629132CD9F52E741C5B537BB05069272" + + "F38E2CEB454059E7B34386920738686D2E66ACC6CE22A53E9C656ACE7C9B9D84B81CD02BA663F00F" + + "5801EF459184A72F83B456A28B4A8EC3BAD24F354FB1E8A3881716AF67EC21850938115DE66011EC" + + "9BBA80653F269CCFCB3817C7E9F947695ED6A6A27043E9031995C9271959FCD19A382F971B477A2E" + + "B986F251EF3B1BD2602BB7E231AC24CA519BADB9555655BD89070304CCA89416B9D74E950E3B9FC7" + + "4F1E7E6F1785D89D3CFB3FB05D3306081C008C8F026AF1DE9ACE680A4961C6914B0BEC5B5F71BD16" + + "96056EBD862FE421E298F6D4CCEBD23B7ADDE1D59C6FA3ABB9C6DF4254E8A112D4597AD4A66BBB7C" + + "A30479ED0C80572B4D41440084927011DA142842AC88265B85035424161F7DBFDD66670C807DBFE2" + + "088BCB7B442716297E91F4232A99E30B11FA6ACC6260B619BC89279BBCEEA2CE3853DB8F943755F0" + + "D0B784CD383A49050224FB224CF836E41A5FB29A17E6E1025E2D5E739EE5300C1CB7C49845D1786F" + + "243F829DF100FC96C77A74C44372A7944FC99FB1AA6D4484C2EC23488EFD5F8F24F60DBF7B30CCFD" + + "DF08E1E369F2F840FF5396A4609D6632FFFDCEBEFEDB9FA95DDDB73CB3A7E8E56EFF4F10A0438290" + + "AA22232DA7BC6CDB33C06663163AFD2E198127EB83A36222813D60CD7999F36561E5F9FC0AB82B84" + + "C93AE015C96923CECDC8AA93A9E376A31E2DE6D241351513D630CC3909CBF7C315D0CFF947815067" + + "0FA2038EADC9962E1F03C7017C4055983327971AD03271D057585D401295A7E62F621397CE493B6D" + + "4B9D6C7B9C4E1C7211E18FEE6780C9223AD2D8E937E2CC8C7E635098B3677AC316FE9B9A55ABA32F" + + "419422DE2225497FFAC6FE480D516CE637C2273F7E5D0733C0B114B1FFC4E9381AE53AA3C8034EA5" + + "A2CFF6BA9A3A752AAF9A5E3EE4BD157C38EBE270CBEC4EF0819983827B1B8195000BFD94DA401EA2" + + "22DF9D4EB46AD29D68B6BF4A994FB1A063D0FBB9DC97094DE913A9B75B7D33F8357BBF7C8CB2C17C" + + "535F1A85696BA8AAC259110D38541DE15B2A0076E725FD823B28B542F974F975DE330DF9796577EA" + + "8991DC59FF6F20EABDB8F08527A0B0615993EAE055323B9FB2117C583EDA9A4CB028169786561526" + + "090A743413AB865B8C4CD414B22812A02863B015952AF531ED0431ADFB3CAD2DA79C0968D2640362" + + "261283330C8851E1D612D43484BDC312734799170EAD6D0F80E19D030AE8B2FC9834D2593C687987" + + "1B3F5B694B2D0F44A0135085619B97F96BC09C860F6D21317B1F6294026425C3CCFAB2A6A7D9CF1C" + + "67AC702B192D1CFAC9D5BD622C4681CEE602421B4A76F1113E6AB37D9560CE2923C8CC913B0733BE" + + "3BAC0AF475642E807848067502F2E5333EAC334DEB58A6D3C932C75AC6F916ED78450E2FAA30BD72" + + "B89FD63B34975BEA22938B51F5AC034ADBB52433D7E61F4E843B0D5EDD08C6CAFE28FAEFA28288ED" + + "669F41E6489A2885A3EC3771FABC9BB28E78BDBD85C1896479D4EC1D32A73613261FEF7399AEC742" + + "F89320676C409EEA462C96D895AF0C5512DA9410DC2119C453A3B198A6E1DE2551536C92179C3E0E" + + "E4C83E4B6B89B6D7B8965477D4199565253703AA4E83B3857702624B86C4EB6752692971863EFC57" + + "4DFF1C5A665528B49EF357020390770E3AC58968E104D7D4F0BBCDFCCD33587C3A073BC691EE4A00" + + "6B434F5E98DB231F66F7A5DFBA365E89C5AD48B15693F8EE51EFDE26B0DD06DFA5449E408D9D8139" + + "6D2490C621AA6C192EEBA397CEF0450983DDFB1A149043F6BEC78A274F8D74694417A29B9D7CCB4C" + + "0AF3B7F4D4C4A72F6BEECD0206C6500FBF2E42EDF6760CE5E0775B751FB0F851DF01E065A0032400" + + "B4809D5C7355E1A08CC14C96CDAA4EEA5858F8F9C45CB0094A4057E766DCD10BC40F984460653ED8" + + "7120D1D0BA439136E94642710FE9104CC5FEC1B12D52C05E9106D95EE137319ACA07E2D4A876070C" + + "F1843A263B63129D6E797C91FF08E053F57A46C24F82BB236D7DD522867EC64290C1B90DA5B5D8D8" + + "C829E19C5A9E179F2969536EB898CDAA92DFDC133BDBC74F15D73017A70ABC48E9FF5A1D2D4D0349" + + "9110FD4ECEDB19C1D9611762FEC2D722470EE95DE8A9B027B7214AD159A70CAA41DAD613FE0E5EFE" + + "3419C15731736A33D1B3C539F744246723FC5C2CDA4EDA9AB949D568F6A8D60C48E0A20D10D32314" + + "4E24203341C5F31743CCBBD41BA6DFD726D12B5588B858F1E607FFEA5C6833DFD077D3BA25016CE5" + + "9E5E214E99BD1348CBFF7544B3F48C21DE4535AEAA9275651A55912EEFABD69C16DE4A14DA37361C" + + "B5AA7CD2CD4E3462A6C265FC9E82C4E872FC86D0D9C9F248D14392E85632E44442D3306F7BE862A1" + + "266AF7E2F4A8DFA8C7A047BE7C79EFE519F8BB2FEF5BCD9EA45AA57D2B8B89B9BB0249C8AE0C408C" + + "72824323D0899FE7515BFA04A21DA36F33A6EE3535522B0AC418481B60404113FC5D4D92CB004493" + + "8FDAD056954ED2031DAA09F0203DEABF150E24151C2EC221B290537421C11A3C970F721F124119E9" + + "2D64492261F4A450D16E54E53DDBA202FAE297AE38FF6867CC6AE4C48EBC2E69F361F1BF31BC034A" + + "3F8B748928E6A77CD301DB40AA0C4B1F247ADF643EE3DB46F87CCBE4577603D62342BB831F8CE2AB" + + "CF23A7690226E6BF4649363492268DFA0E93160B91769F7B6ADD6791CC91695AAF718BCCDDEAD90E" + + "875D5BF7F26EB48AD3871488E6921D5AEF8554DB346E1CA14128A347B16182231BFD9DAFD18F01BF" + + "B99CFFE933AA8252B93C2D600EF50B250C2D86F32D6D26D370483269E4D6971CE662D1409329CEC7" + + "1BD0B4D734F36B4E66828569ABE7218ADC921202729E236E146154794372A7929632DB4FF8026583" + + "4AA4080844AB7D3ADC14B23ABC65FAF620ADDA9A77B5F26F8ACA142921FD9F8ECDCF676C95431BEE" + + "FBCB2F36E1315DAB5CFC4D97913353B1119D4B5F9979050B4B936C191057F36D446BCDCA67040CD5" + + "2AAEA32709", + contextHex: + "AC5AA9DE77F1CB53771EE8CE1125E4A1E1658A5269CA08E0837594FA91D6967D6C256E12DB8F604D" + + "6D16BBC931AE25B99D70BDDCA476501A6D846ED73E386A32E8197C36DF82119F412FC8B9E47565F2" + + "4DD333FB097E96E85C4D94EC2FA27C36D09F3F96A0738DD06BC75B3B5FAD6702719D7ABB6F3AD227" + + "B01CAA6C537D669C6A28664B78D790C88EA236DCA6470507B9E86A953FE65E37EBB76D303B1C73A2" + + "A3018264B421EADB33B9A1CD72BEDF1D4DE688C61F099EED8D1A6D62B2C4823070A89A866553ED42" + + "AE899FDED3EB52581A20F5BE4CE34B3D88E7B8A1649965D39775B9C416F93E42A4D5AA6A4726D445" + + "BCD1FB17971AA5296DB080A3959218", + signatureHex: + "7A81E060EE1C4B16BA278208C47EE25F5241B4D1C5B7DD5928CB11B8584074FFE3B8D71245404E04" + + "067FF9D68CCE5FBEE69C2D98BCC50BC1F8896B1B404D68DE18E8402BB3EEC1F3CB9CC6A51460028F" + + "7B6EF522423C478CF4FA1A35469D271391801879FA0C390ECB0E9AB37EB69BCF4939D1FD1B886BB1" + + "2A9B0FEA187D9AD8C3620BD42EA338E601D5AC316174255587C21E066738A2CC86E708D7589B8F0C" + + "F4FA66464979E522B7F9508BF8ED62FA8BAFE7B1945725EE9F406AE9269A5C7469E472F071393130" + + "AB8D532B6EF71190A3509B17548194378C10A8A357A04217712FD5A917BE63522814CE322F329E62" + + "3BF6C8B350D4420B6F565AF207B772B3EF28AB175CED72EB2D62C3901526D5E081F4C12C83532BE1" + + "72E9A26072563E2095BF9052D24B8900681B4F89106FF35B554A59E2C197E8F405F8D41CEBD29CE9" + + "9CB746D19DEE8ED77070631D35151C3EC530D2A2DFBC2F408A1A25A3151E8AC004900CA7CFBF83F9" + + "A064F3EF41D9921EE25A65F241D11D78D5BD050F70E0A89DBEF36C2E7BBF1176E1DCEFBEF41DE6F9" + + "A2DE6B268E8025BA470E1F7E1DAD99DB468FEED9306A7B3168F2C6FF1F55ACA06F920D8108F8E30A" + + "B707DBCDBF95A837B2B94564296454E9A3778EF8522B8B3A2E67404063C8504484D83CF4921F329B" + + "63BF9B01B915D7C0D8EE8493AB8588A2D57054A6695A3CAED52655BE62303DECEBFD349AE4416B17" + + "8CF4AACEDEFCB6BBF42E6DC4507868B6332C6539E03D68599A4F203265174F83F4575B88D73B4AF9" + + "D93905DA220507A6785BF83F5CA94B59359ABA05DE73BE3B9F5B4E16D17F21BA6FA353DC9EBC288C" + + "2315B1901C29859BFAAD9A49EB543D0D2D745B8613D1BC5E3CC8E6B8909D51F9BBAA539CE475B042" + + "A0A33E83F1A6631CB14D12A23071B6761D1587AA5C77F39D25892197076497D1DF5CD9381EBBC23B" + + "392E2126AA4AC29B342F7C31E9636E163204954E1DA0407622BCBFC22A27292D090ABF967CA5DCE2" + + "EBE932AA10A4D4348695D8D92384E99DA34E8910C698873BAF3E736D702735ED07CEB67E308C40E3" + + "FCD77F009B6F76B189CD4A2EA004ACA601499D41345F2170593A5DA48AB4906D2663DD2E3638B9C3" + + "3FFA6D3C02F8D9A96A6E1B0B5E5B0194C0046AE36F323274EAC4EEC5474B9E4BE845AB547F276129" + + "07F1274941F59B153CD7F3806A0237FB2F260DF270B8AF57BAA5A2A25E08CAA5DD7B68BA5765CEED" + + "3AF544E215FDD353206CF3C9E9DE49FA32BA46FAA5F140B5846358E06E15847231121D4B02AC417F" + + "8AD83568C28D33A117C632EC56E7C453D619F516C653CB40729614111DC474181E889C77DB60652B" + + "558224A4A9F6D23ECD3178B190619752B44D8BB1CA7166110620FFD0B29D3CEF7E252911EAA96435" + + "E2925906972BAB086073167A68AADD4C3B5B6F26A2B7459C9EA8820815E538C26B572AD7E2FA0B25" + + "65FE2320DE29E2B993C14D7121152A982FCD929D4973BCB69045E5018D37B65483EA6B689BAF2A50" + + "16084263518F0C77ED5260A63EAF066A4FD4590D22CCDD2C5BD86DCD58263CCC177772EBE301EECC" + + "25CA5DE38CD40F2D6FFB56BA5FCC4436306D89626DFDDAEB6179656AF9E6CF72B87EB3B2B532F867" + + "A8D83B9A03594606129C70FADA67A7EE3DAADC5662C2F139F3E29672FD20138FBD32601E9E853D81" + + "B42F80AFA0C631DEE874D77C6B306EDF242ACB09662E5C678A4E4042FF6D98F346B064219C786FDF" + + "D047A4ACAF8FFBA18AB7696E9D86521B9001FF0310B534540EFA908EF99C6B696217DABAB806A3AF" + + "EC6F2BEFFB017D31D17F5FCD2971F0B16228381DD8AFBF06D049F2BC0FB3BADDD99182BDAE7000DC" + + "FE76F98B6098D78E7FA454C914B3BF525246A0EC766220067D2E9641EB0FF897AB8E349C5ED5252B" + + "3AA73BA547A1F2EA5215DA19A967E2A51686615077F1B17E91F223A2F6DF00D4DDE7F5C656CC79D4" + + "9E386619AA99D820881D757799149C7FED3BC30816B6F0C56A332BE63C7509F5AF754787F17F00B0" + + "75047C79D2BAD746B2F2D104413702211BFF9A9F6E54FE45B4CDC2FD35E098D1FCCE00114AF0517C" + + "0896EA85CEE77FD7A346AFAFFBEC4C92914DB050B93696222EE6BE72FD5869C7B1D5327E63650DA6" + + "ECED0CAD84C3E4602BD1CABCD98C2C90698DAF764DC4CF2B502A90C45468EF175306515C87A9EC32" + + "038BF5C3E3ACCAC51B726ECBFAB957CFDD417106857E14AB5941B1021847C3C98347549D43E85885" + + "476A28B3B0C727CF745A80134D20F7BEE105D65B6134AD24DDDBE7EA1AE8DFCA9F6AF7E3ADD4BC3F" + + "E2205E607FE76EC53F09266D79B65F9B3DA1D5FD42ECBC2F382EE91C0A984F34653D346B8613C6B0" + + "0CFAF4281EAA35CD26D5BF10C85ABF04E75C2D852FC46CF3F8D51E037F27DB7F85438DD9DBB19C4F" + + "89DCB809222009494469EEC04870097F316032BE259F22CA5B3ABCA53093B022DCABAFF0B6C6239C" + + "AD497272AA5D4B15AEF2A4ACCF6ED7E7219E97BA81276DC7DDFD2CA81228D2D7001099EF619FDE71" + + "C567EE8EB092C06498E86F09579E2D8E5C98F89F918C9F1031911EA1203159BFCF2DC9162E577885" + + "92B3F63CBF9C2228F7863482775B3A9626A3CEFBEAF019863F8529486D387DC0CA0D8765AB4BC01F" + + "52E687EB4F333AA55BB75A2C6085C06C02FB57B67CE12E5C38694720422A59ADCB0F3D799577CA08" + + "7B251E744C89CA3026DFC4274422B8337185D1CBE4956C9E7D91DE578D2C496F2C9034474C5BF762" + + "B5443D7E12AE123698FA20851BAF234F0CB3FC608BBF55D65081A6D0534B339FFF5045D978689D08" + + "B9659A4E2DF50E26D7F02FF7992C9F62665E5129D3D274B92413CE061C5F8711D4A971779D22786C" + + "66BF9137C80A0A51767EB33214846832995066BD3DFF234306F5E86E097F9951A4379870420E0D9C" + + "F8892E7C680D9DA71784288269056E31E0461E23FABF5B134E64E5182654089B35DB8F5C2C9E3181" + + "45506F37ECDBEBCB50E4122D59C1417D0031911BCE5C74BD468D5E58C9E38449032292C80956A2ED" + + "E437D3B122834F8DC42AFD541F939F489B953BDD52CBB72430230CAEEEDDEDBC664651D169C8BF68" + + "1DABCED06CD9B6DB28F2394ABE928CB5DC811DE1AF426E68C66062BCACC8C4259D89CF691EDA7A5C" + + "AF413E03C6977CD3F154700DD7C8CBAB75F5EE02C2E18441FDB9772A6014CD77214EE57420AAD951" + + "84D003BA14DD99C90071ABBB56F5300EB8822267039FCE9446E198E50317883305CCBF1798165FD6" + + "33A03F5378A528D9724B30E972B5785BE5D8BF1538C033D834DAAD83B0C93CB90AA22CF5DB2412C2" + + "8D7ABBDFBB5ACCE600A350CFFC3FAE7BC9EFBE6062E970504AE63F9432891EE568F94578BF6634C6" + + "E8B20BC64EDABB33A5B45F73B47A5526C80C5ACF9D555D568E3F2DCDAD0FDC0D8C107E9100FEDD34" + + "DAFBD63AC567A08CF8729DE0699C262BE92FB47249D79599413F5BD4521CCE9EB2A3DD22C2AAF60D" + + "F11BD19F8E00E937D56F6623B9170A9639E576D5EB2CC71DBF3F881F65BD9D19143C127320AE05AB" + + "F9FE4E9BA6B375B700C5DF5DD8C395E3C083198DE3862963ABB3C4AEBF6B4205C74C89A4E33F50F6" + + "CAF998C55319B1A4D851C7A18F20810418CA6EBFBE22C712F4236F5EA847735E532705A5E87CE069" + + "E04B9AC5B2BC4FB31391D1ACC7942434FF09C078A5AE9FF0150EF9A465BE3B15B06B9461B7858E8D" + + "C0DD1997C1B75280AD76F2556EDBEB977C597FAA146C14C39D96D6139C0A11C07973D1F54C48954C" + + "A2157D3305B9556A597C257CC7E49C78BC6DAFBCC9BD80C8D9CB8546605467A93B6D2958C6B956A7" + + "1BC0E262D4E583E25A5D1430F4A045517C4DFC331EDC8B639A5896A75C934E6AB49339BCBE98DABC" + + "DAC2C72633ED39E865584B188BC6A4B176E2E282B76ECBDE94166A1BA0E741B287F07DB57B8C933F" + + "8A4B02305402C5726E3F0690994E9884AC9EFADB93B2604EA6546C2744B3D96E31C4C76300ED9AE2" + + "9B8374A6931350454756C833B0B9AF4C9294B152C95EB5CC4DE75BE8F44AAA008C86826D4BACB02A" + + "3A1535738499E8BA7CAE942006C51DDFE3CED2B47C90722EB3A96D2414AC32F38F29DE6D86F790AC" + + "D8AA904BDC27E67D8412EECC22BD47BF06FE2F309D13C1402FF2249CCC8D9EC8FD8830118F0E0114" + + "3F5E112D3288DBF2AD76481806F948D72F51FC0EDB30BFC3DBDEED61E18D9AA935588E078789033E" + + "456A76D7FFFBB0EF4C66A8F846CCB387BEF7AE0E9737B08BE8A4EA7B487F27A9BED1711028A7E0B3" + + "3E7FC14E310CA91A90907F38F50DFC7ED5E525F100B218D6901B7ECC93035BA3357A5DF5B0F27E03" + + "3653A92A8FFDD49651083B27510B405D8A586C91EE0FE9D501EC5ADBB3F160989519E672107A9D22" + + "A46E163DD3B077A1B7B43842CE6B50C1E04EA8D6489943B1CB3F4CABA4E9D6E5AB5AB190D63C0D17" + + "6E5E093A131CA8442770D68FB71D8406E580F53EEB56C870C311B3FD666C1B8AB426B16C9909A83E" + + "E1D76B5B7DCE7F20042A802F8DE962DB509CE68774099E938662296C85BD63DD889DA5C04250A06D" + + "9F442B2A96F5F6940859666FC8C9DE04061AC834377E7F91A4DF14538C93B8B97A9BAACCFD08094A" + + "4C86A5DFEB000000000000000000000000000000000000070B12181D25", + hashAlgOid: "2.16.840.1.101.3.4.2.3"), + new MLDsaNistTestCase( + nistTestCaseId: 50, + algorithm: MLDsaAlgorithm.MLDsa65, + shouldPass: true, + publicKeyHex: + "299E5B4CB6E5BB7712A9F867C3FA7F24E582D93ABF5C178A676C498B8D94AA3DDAA82FF7528E9C43" + + "BB6010DE12823D7E8BBCB57B4CD45D26E41494F22A53C2A881937D9EEFD8E50EDF1D41318AD7E9D9" + + "FB7BB48D0A22970346F6CAF569C6D9D6E3F643051E24EEF9B83A7E4D3B693BFD49F8F044C9FF08C1" + + "4367D89017400D7D179C797FFE6886FDC0832E48FBBFA5F735D7F5B3D1D93E1428EE503AB12A2F25" + + "6606965527B8F50A1CCEBDB515900E26E571BD3D0AF48F0007E294EC2ADA631ECCAFE2577E43AAC9" + + "E6B3230408AEF3DD2784ECD2B84603E77C9B21C88175F2528411D9118CD40B34099624D93E17E525" + + "7D837A0DC7B5C6F2BCBCB31F81228A8E8F86BD6614F3FB615B2DB16D7D48AC9DCB9A1C5E76F2D6CB" + + "B1D6243A5955B5C16DF46FCA532ACC896AC3E58362AC47730317EE9067F92529B7870CCAC343DD7C" + + "3DFB65E45E9B95AE5C00E1B8A3E5EE687944253911E608816EC90D4EC4D210AC3051006EAD425BF9" + + "DBE6ECED39961CBD00238336A45A6D44B38011AB5341DF573A35309ED6131F6E20EBFFA20318490A" + + "2289F12C994726E4ADB6A22F929F180A4E5AA7655F11A12E7E4AB3F824DB1916D68A7E4778ACE59D" + + "DDDE9AFE79757EFB9BF2D32C7A6DFED18CE2C94BF3F87A1F0761258371B3022651225387135C463E" + + "ADDBAB8E9E7C0C14B7C846527A915AD3811655438208BBAA08239A0BE275900E9123853E7EE55E63" + + "2FCA8D34B9474079BD08A8D38B91EE02343FE95406D2F946ADDE3170E686AB17A02B8D50C1F28CA3" + + "6135853B15EB31DDE456AE7920C4ED2E54060BD16969520B731BD6C34CE7CA55F23C791CF3D13072" + + "6C18CBB62F3AB0EA28244EC89F64E9028776F34758E3774F2F55F6B583D233CDD2280CB65F4AF1E7" + + "7569B7C7B0767917F1C3D92DC6BDF70BACA7FD4623E8D1E6E58EA3FEAF05A1BE7C1283A85E8CDEFE" + + "D1EC152F3FE127B32AED8C5EE9785397666F35E1568EDD64917F9E5BF9B83CD58F4C46ACD47FB159" + + "814E22DB45441BD63BE4F081B77C9ABD7BA40BF9C3963A0967F68F153B2472B17E793047442EEBA9" + + "1456B54821EABEE5445E28FE8A9B510082F29C5D56E42EB1ECC385095B4E035B01D07F8F5F89044E" + + "602FA045B7D42A19A4A5F44EDCE4EE03D8D9D0D8CB52397263508422B3EBB5DD8F660224D3B2367F" + + "3AFA6054F1EFA4887F85F8DBE430333A4F515E059D38AF85C9B8ADF3ABFB4CB8201537049AA5D8C7" + + "493FF4473160FD941DE9E1F1E4633E8AC4206152D07913945413AFBD2EA10A8D22EC9EF793756A83" + + "D1D472F64F48ABCD64E151F6CEB7B527CB93C76F34540D4C609C3AF102118B0DBE58E82FEE23111D" + + "A3D87708F37820FDD10C0448923CB3DBC0066A11A231537C88CCBA3E29517BD699DFFAC4BD8ADAEF" + + "426DD70342A8655C8DAA8F41FC3C6C8C1D35717BEE485D6601A5D3AFCCDF601790D4978E9C528DBC" + + "5BAEC855E26A753DFFF996BD6908A26C30C5DBB6908C8D14BD1A8142649954FA2F1DFD94D30BFB23" + + "E0E49C0819C9CB088CEFADA32955E7E1892217005C2064667EA86BC4B88EC3CDAAA57BE053BCBD02" + + "6EA951C5B8B07781D8033CBD725F81153AE7D8526E8F713D120D563706500240BBDA4F6C7F71C89A" + + "9B7E73CC45AE0C471516729771FBF8D80410FEB8DBB52116CCF715FBCFFC4A7537829A0E864D4858" + + "35F79E3D43DE186DFF5BDDD4BEADD5B07D6885F3704AD6B1BE81896F31710B5B5F90CDAE14B2280C" + + "210F1BE45B6C36E2887FDE4532FE8B36C91784FF56785715EF57B0C6E455B7CA1BFBA7C5B6D6E94C" + + "3D5FD7448DD84B697DAF1DF2C84BA47F39A633B52C666BEDC0F4A496AD5E07DC01182EF21D5D618A" + + "22DBB85FA40AB09C837537260383271FEC35974884380E3CD0C92DA7A3496B5780E5110A67389157" + + "D32C4FA714063678B9EA8640318FC8153977B514728747EACD22950466FC17039D85C2C8DADC8C3C" + + "AFD70C8F14A5793EB27CF8D4A6FE3BB7E8772FBB4FC57C50C751CE6188145F04EAD8E04122114FD0" + + "3D469A639FE04411C998436A6AA76C35588D428EC57B925B83B1412FCA0B60D99177DD373ED88DBD" + + "E7F02D40564948B6861FE9F65401D9B136C18D4D2BE5855550E36FF37C3F5832217B62B8016C5B22" + + "AC0016911D5C092EE47ED0F0BD52CBFA39FD5BF7B87D502B39F0E7B96ED32A31EE0C4AF019BB45E0" + + "DBA203B21C5443D41ABA078B7E07C02EECA1245AC57C3B480FEE441A1093593013C04A1E0292ECB6" + + "16C90CF06C09D5F564CE172810DBF547B5E5EB613F9BD2449E8A98ACFD5044FC505EE7BFE4F1ADB7" + + "F596EAD86FF3A4C21AB874BED34AEE2922B9817E3BB0C4C363CF4137570F1B268BE2984E6FB03BED" + + "16DD988A81A17EE432D565F1DFE08C6B7D1E980BBA1BBD71121926A1ADC944B15762DF210E6EF3BD" + + "F8A483606CE5B472FCB1C475BC711483565000D1E6C246F53938CE6F325D8CDB459B8AB8FF825C81" + + "CDD0A13847A5235FED7AA58E2C9F0873965AE39EAF073F3EA90326A85165A10658796A014B061ADB" + + "9D891AD194F48562708BE0271BC5C853A481C7D05AE49B5E50497F944504C0A098628383AEC2C8DB" + + "DB6860B015BE0B377A6F66F23D7CC36C4B93D6C905EC1A5292AA9A11A9B088ADF516707FF1C5A96B" + + "DE1EAEB4BCB5F270E3C1749A345DDD670A49A17C43D8FB0BEEE4E803A53FF74D4C1797BAAFC91079" + + "93493E91FAF9F327A8C4FECBD78B8A0EF153BD69659B0FCF7258F6215D218CB8", + secretKeyHex: + "299E5B4CB6E5BB7712A9F867C3FA7F24E582D93ABF5C178A676C498B8D94AA3D3C44826A39ECD5FC" + + "4ECF7DCD79617DBA1A21F2A43C7C842A6616CC4F7DC15EE0AE64E5E5C302D90AEED0C40D136F4CAB" + + "53EEB562A763A1BBE98F7E0EE2BEF359D1D1EA2C27FB3B2ABCC1A5C2D24A6B5D69995EF8E74265E4" + + "2A516119CD15B9985637204623845382858158474175261375207082000650048265521365815727" + + "64528137115002036806637445522426250026653370671436378334002467076017460565085028" + + "54788535112160475547323551875452220234571342542174833161401242426376640045171258" + + "52686383880430682331881276014847841302308601143747088162873204244458856031588534" + + "64662855758075136726448118267671662038010776627887014257644544115062427005131210" + + "42521082541248404653205463784786527346028382242776707347010263848138364111143081" + + "73774301247640342808517270313651626137334614770533455630010623378415671230745153" + + "25242006050402877011517486887815048640027820715203711442268747316567683802262343" + + "44606778070160027815641455288520543366300612861150182246281470135414550033064825" + + "85067158608080081122843274151558508013861051280413044225822117685763457353713187" + + "17330142205320550316874323571834187762404280583017763671000472525385568605255537" + + "86837415185818547210173415163051125507822851764473013002873031843481878028722285" + + "27886876672055061062854518666067203435530663020088801750654620205581654152664265" + + "67326731025475867563832428714037486456618472486786576651066781205616700327752274" + + "55887644464484861624140106204385881412724044524450032861325556437304754565214332" + + "36548802572566033804156075210125467512865303185386678272023428325126457604510817" + + "17001112743152375855271252870588816161081538416051037745074184551251218307180475" + + "55700382262242014428364685645845868235845064162400871666462460785605576471153252" + + "86604831407322785417030261530056714460406765616876106172840567314806528781408135" + + "82157284105328867274434512842578137653361415874532051522208650068453500448561257" + + "88166713368733030130358630411352884835816744466643252375771137175853567058661353" + + "76858381378172310823058622827312160156263436751622362738653067431276726506343881" + + "35771472648212088130026241821048233340010300571428687881320322474253466153413315" + + "76355120067002731802457484836471387084560605276322140518862865146113567482357825" + + "78705026017380854114050650582333461315400584878207400520000117236681307337850875" + + "46712330224162081132564202780251251016717238287856708030816224018573006525421762" + + "60285245518630214571316823457646846084528333124208360631533622808501682242207782" + + "70283318711632351221463403373233148748457174782724421531588688477302335571704720" + + "56632158657831123246740637011327521555015310151565520037645700203344016220188773" + + "60641774833827121642522456380753333766757234515476063613866341083251367416022130" + + "82105357707125527642604247077336067386081745803164072587332040887838641318767328" + + "66133816226132128746041568372774177102337115553530156828672445841237127206132783" + + "73720034060214835480372857131508736538070857554386577401113062450557807424810722" + + "06605226463743717818650638427385027657701022870208302855134636852384728802122306" + + "56056412540616377428031812030181467477146415421075766530534548366777670451413581" + + "758616867572337260745310760738889621D1A6357CD851D3B03C08E00CBA6B9EAFF5CCE8CBA5BF" + + "8287B61037A8DE622198A90471282BA32C6A92159E105B3E28D490BC6619BCF5C26199A02D7E5C12" + + "1EE7012941981DDCB23D57E62A47CC03A7F00AB262680EAD68B4FD4FDB916E61CCF1533F86B29242" + + "3D6FE9DEEC91CFE77CC45CE878D52962E7DF442953933B6C70A0D9D0FEF94E08283163102A65885A" + + "081ED1AC061384BECCA1C0A5B135BAE2FDB9926CDA862AFCBA3276AB41050C12FEF5C410D54E75B7" + + "49B37C2475DC5BAC73A848726BF0EE4F2751AA2C759C4605FD295BE6BA1E9EDCBB9CC6CB13D7693B" + + "E9C12F2CDEF83396A6137F8F68BB94365F27599C9C6D4DB974BF1C49AF6D1A8A8856815B3DC26C56" + + "7975F15ED45F79ADFD4E474654534416301FD3B8FB4D0361D61F523378AB8453C56FA661C3CAD9D2" + + "33A708A8871061482FC18AC6A781441AA25D7D9EECA0211C7D6AE737FE16533C5F4D126D0F0A549B" + + "4445246E67BDBAE0FF4EDE37580EB68859EE64C981D18D81545511252DE245844ACA7DD34FC7325B" + + "2E5E499EBA297E4472224ACB7467BB968A474B0AE1CF9B801826CE103D96250450B3F4C1F7807E39" + + "50470A01AC25FB6A3AE3D54B678D039AA089CB8C470DC508E1978F33BEF7278F9EDFEFC3FD98AA78" + + "8C5B173006E733E90749CADB13833E5B7D05F9E673E3C5A4B23CCF1E7D3CF3E0DB87EA20F1144F56" + + "087491670FD7CDDD8413734992BFA5E1B53A5CEBDD34CA77C06689546CE1942311B3031E87EE75AD" + + "F03575E377B5B9D203C3692BAC7CFD2E3CCCC45DD47F86EA5CFB739CE5745762D9540ACB1054AABC" + + "620C75097521E03E120DA586EA0FF1F9935605D1B65C13112B2B8BCAC5FD34C14669B791C9CBB806" + + "84D2F22BE0D9226022AA5F253DD0A320B7A5C894D41F6376F044C84578E7D162CBFFAA73D08DF7C6" + + "F9B3EF66B8CAED7F6B61B57FEC4D88AA823B96A45FB22C302765B0FC072D537901CDA62EAFB7D55F" + + "C84B93FD9ACDD66B704B651D1B3595F37E0E429A36BF05D00C8E09AFD0314C5E79847D00BC79F95A" + + "D679FAEC0476F311E067FC75A77D8ACDF093C35EB5D30A9BEB771730C950768EC9D85F057405FFC2" + + "D0C34AF802666ED106DFE6FAA89C5D17C837B6BFF96A339F638E95EFD2ED63F6135237579A07DF2D" + + "2D41EC6291D1F8CB6B1973C5A1C85ED99E047B8B79DCBC619AA4380F43E8EC113A805C3C1824CC80" + + "096BCFEF92C77D3890401117AE88A2E5C118E36507C5D7BB6A8DCFB54F604FCE88BD52E72A1A7AB0" + + "008EFE57F808E35A5C8DEE2F8B5CC6E923D4EACB0F1994BFBFB4DF534402D93A5781A61A034C58AA" + + "634B7AACB991B396484492CD67ABA5028E7677F9F334477B4BB699C906313D7506E662E55B083DB4" + + "ECC67EA6BC61DD785CAA0625516EF976740436F0C13BEC06FE06B822E2B1B6A2B7B16F6060F5D36F" + + "F01948D7EA60663370DD1B1C3D866BBD1C775ECB41DBA90A8E7BA3AB2E5A99E499E28B7E20C56560" + + "D68EC46104D8E906193D0C3A2FDB9FEE60CD5D8ED898620571976C52BA7BD3F5598FC53B22533DA9" + + "5A2AD16406B7B5297E404F6F5CD4F35320090757D2C47F6BCC1A00F7E57EE8F8595A061A48D5B5DC" + + "D2A33107A92D025CAC8B8C461DD9AD6590A7B5EE260BD5386083B093DB114206BF5661F687F9D208" + + "E8CC3F6C79EDD7AE59610384103A26A19571FB5F5C2169D02A3A4152F015310248FCCC27A3848B2D" + + "2A72614DDDB2F2155E1E01B264696C166EC4B68D8A3983B5B2DCF7CA612A12D33B6D858197CCD07C" + + "0A763494F266797D58D58A9E1E23CE0D5154075074C8B865BED58C57E85BA20C66C9EF74CFFE1E78" + + "8EA500FB5C15C6C5AF3982712BF48E1D48F371E9E00669A7171299C92027DCFC3F48C3DF513836E8" + + "7CACE92C624175530B20F43DA9A7AA7E394D1A1EF27C9AFAB0AA7FB6732691B431B52A72D446F608" + + "DABDECF36E93D01CBB08C2A2CFB9F5DDAE5282025E6B48091A9973056DF441C3FF34ADD023F9B942" + + "570F83845D9187B57D14CCCBBAB758EDF943DCB56D802B014C0F4DF1C84DE2C951ED0817455483C0" + + "42487EF60D8360A2C5A23B81D74EDE0E90D854AF96113A4210FF3DDCD6C2A35B111689120E626C0E" + + "9D2FF1520ADBE16D3B9B6109EA649A030A8701BF527FBDE44EC18DF4C3BFBC7B30603418D8888953" + + "27B7C69AB1264D0B4C0DD898617948BC4AB97D3118C6F0EED9BEDF31F6A46821186C3C2BBE3AF9FC" + + "11276D4B1386377D7969398BFFCA758A280037342125F011BFBF834E9FE6324E86F7E63DC84A748F" + + "6D4423A88976F74DF906D0A22B6E3D443708649D6A0E135D98AD7DE986F6E2F40D999A12EEEB9875" + + "39A3ED24CD7A21C115AC5696C5C52D9F084A7EFBBA0C4D35534FFD9CC11A3F7CA82B9B7A45207CEF" + + "CCCD0753D1394BEA2B35399E7FF4349948585855E85E0751742F5CD7BAD9F8C74A4EB6FE075A5102" + + "846C468C4D56DD23D426737EF6E6919D39E761C4734894A3F68D2BC4DC362CC19A28538281F7E9AB" + + "E6BA506EA201AE49D020A8135E8A17794F2BD67FD7203635A94C47955A9894D45A4C2431137469B9" + + "FAD87608647DD986A21A27B26209618D2C8D816A646240FF0E8F959907A5CEF057301DDB8E0DB1A5" + + "56B9DF9F696E81DC8CBBCE407D44AAD9AC525258F8EE4F734D6125F51330FE806547A72D6A6CDD0A" + + "073C4725420D5F2117D78D3629F0D82462BF20EF0A4CCAD9566A5D3D08088278ED38AFDBCE838C3A" + + "59E421E76EB354462EF2B643567FB3126A75854B356F698F00E88489C137CB0686CB982B3428AC65" + + "105909C148FAEBF86366D7EB603A3B89242272793F6F9F311FF0D8F24181FEBAE42F1501597BBD28" + + "7B04069F5B3B2115820EC62CBC4F3A604785C88644B5E8E91E62AF7A3A764701457AE5EA42BD2CC4" + + "4BCD864E6E923515A3FF5D2B7FFA03B1719D88729A990BAE99527E57C2AFDDA1366F297F5F1F7079" + + "8F3E82F7A529440F6B22FDF3E313FE8AB83EFBE64071A7A6ACFDE1018C5E8C4D190B5D16A2450B9F" + + "D4599C94BE5C28E65E635C6A2013B150126F691C1907E053C822B89DA21705D9595D53BF7679A578" + + "C52EFEE0084A1F65417A6656658050A6EF2BE8A2E568BF4D38D56395FDD2289993E392A0C6E8DEEB" + + "958AEFC3D51C72529C85A7A3F5BED9AD56606455529912680C9711161C9CC896AF2957D8B9497997" + + "810479DE290FA474C47D8562ED7E68D49E5E86985AB773D90DACBB37DB140AB166C6A00A5A5ACBB8" + + "E40FF3DF15415CCCA2AE8693578EF0F37DCD12513D270A6A86FC0F6B29F850C423CA71B587B17800" + + "DB6BB6D17215DEBE8BD282A75D35C6FE6902AD0172BE3BCE6B903D1FBA1AE812235029F8F14D71B6" + + "A9F4E8AA92D407B682D01DF7B8787C8AA91AC10ED7E1805796943B74E2FB3D1F3B3F61F1EEEC090C" + + "7FAB920CB485A01EFF4DE6014D83DF19316C5899B964E2B90F0EE2E244B4A00E38A8884D2247294A" + + "CAC23E8D129C140B472999618699893E77D41837F1AED059E5E009F848411984", + messageHex: + "088025587F3AD6365DB131079D53B93BD6280DCE36D33D4721C7B5BD8504B21BB02CC3AE1C0406A1" + + "4835301D7BC3E64C275003594E6C5BCB2E425D85DC1F6C8DCFACCB849FE18BD9815B3B929F6C8A7F" + + "4C92DCF29182C87BB0628FA8DD87FC83C8CF89054232DE034295DB16E70C2EBEEA3B0CD9A2345D59" + + "B10DB67EE4CE6E5C71239ECE2A75BA596B7F26EFDB7A8867E174774CE46EA6669DB47AFD8B498369" + + "84B790707310326187F047499BFA0D2C0B42C86837F214019412DE5DD6424AB2C9C1E9E8A693AAA9" + + "DCAE3EF86F3B797C11513FD6FC4C2B6DA036041EBA0F10C5E9B78414771E7E4A19C4B56360B43899" + + "30986DE70733694ED6610724DEC36E92129EACA8D4A9157E394709669B01CFA75BE3E129A1226495" + + "6059BD8C9DB791222B50642F5B947C12C10F0A6CC9C9A793EDA5DC6FE69AE276CD083D50BBD78D44" + + "B3D2304295BC4C3853C8C38499329D9DA979632BFB44F55B93F9EBA8CDCFDA8593A49E6667510D51" + + "D0D8B4DBF57570B9B00A1F965C21E851399793A20D1D1007A3B9FA0AEC4EA7C90FC04CE4962EF327" + + "9CF9C5DED67E3E8EAE8AB50E1A1D111CBC4A0AE99D0DB376E8F6149AAF96DBEEA6AEC01E39CD52AE" + + "A297179FC590BF245BFC7B721C99D55D18FFAB282CE026C6297A9FDA426C1837BC2783726ACB7694" + + "1F417BD55C05684588028A52050ED5250A826A3B24DE65D6D2D87785DF5D5FA251B1370106304894" + + "B5C3B8A742EB1034AC62D0CA6EC74556438206A5991D0941AACD3D15438288DA4CD8036A35A859D8" + + "7D11A3E99E0A708FC77A848E0A946DB82DEE509CC38D46504C6ED4DE570CD1C711113906D6362FFB" + + "6901A389D2D44921B75A7607706AEAB6187920CD05DA906A04566354B52412A4F5C006AD445EC96C" + + "3CDAB8E876D61D7465EF2BE8DB24BC6FAFE7E89C4086FB7042EDDD8EDE50A64362FBF2C1493F51EC" + + "F2A4DAB1945591D24FE5FDEAA22B672F9B0227C8C3101940A0BF3D6CF60B55ADD18AC7A8B597726A" + + "B5A09EF89046039F68E9CC9FEC2377BA4C8F4807BF4772EDDD8E31A6CBCF1868A114EB3ACB65D0E8" + + "C6FDB469F9323B03309378CD00147EA0DB695E602FCA9D1C52C6D12826A84EC55D481B3DE84D573B" + + "EF617068EC6B2E733C11E3192A2D31E23B9CB7506D2A64A1FC64382F87BBB2BE82898E61ACD8B90A" + + "163F538A4A4A299577A3F99A0CDAC47DC21D40A57545B3909B2D6354C3A9853437C32B32A826BF3D" + + "0AAE743B4B4DEBE6DD510B320CF0CE4172FBB009873444ECDE45E8F7C0A2CECD504D964487258B4C" + + "36EA89079664791FBBECD477F40F8AA1F2FC60D79A21D16659A196860F892E4672A51812D536E93E" + + "1C82199209286FE7D3A6CDB56CFDF14EFD5E3E7FA395A1D47EDD9F63F65E47C0B1CCD48B70CEC598" + + "21391BB15DAC2411080E701CF79B0BF10D8960CEC09020EF572B62900FF95D6D7B351AAE86AF5DDF" + + "AC5FF3174D9EEB135CE485CD3B41CD3BE8A260BB8BD071FC26BDBBE2AF68D593579C0F8ECC0991B7" + + "E6ED6181F6832A3718C9165C42B57BBBEEC020DF56D201BD667B516678E605FFFEA270068C5FBC46" + + "9C12B4B0253B0EA9028774D208905A57F4EDE1B2CAC749CD7A3C98515E7E436292296FB029F6AB47" + + "2E1C2EC1B3803B96F3CE85D0C24E700CC3DEA6D1833DC53149285244274D2679BEA4013AD40CAC21" + + "0E1B8E23AF8D8BE46D96FE4F7069EB2F5702CE5FA249B181F2355D4E33DDA3C22E173B6E6C1C3417" + + "88F48ED9CF18AF1CF2341877CEDA38498AFA40E3A514D9FB70CE681F85DE63707A9D3ADA933C7C33" + + "1803620DD913909636C04DD08DAEB4C2CF21154C4BC71F5541F28B5F706E0AD7CACD925AD7A91D85" + + "1BB4E7A534A56205FCAB499D134701AB5D39B6F698AB4A1D668175F0B3B16E19BE28934D737D8FF8" + + "E9230BBB8C705840BD450B45C2DBAEAE015A22C39D4C290766D60D6C87BFF1697E79D2475A4C7788" + + "44133CDCB8D5EFCB951B0C64E60E71BB6B660704F89D53FA22C41AB2A743CA0DBE08D10F07946D6E" + + "DA060ADAB9132D992C798A25593691162243712643CAD29FF6C57814A79D35F58B613A8AB4753D94" + + "EB5E7C79E3C0D3361D78AD3C8AF8D01490BE50F7A719F7A8F36DE52C6CAE8FCF80FB1F14DF635E47" + + "BC202D9E462863708EA7394345BE8F0A725BDD41078F564A17F465ED695EBCCA0196B537246904D0" + + "AFEDBCC3F9A6C4E6E989739B2D5FDE725751074BF9125E4A6B32E90AA57894E5F70AA0E501AE9C1E" + + "3F5F00C8A927FCEAA05AAFB84EFBDB50D3BE7196C50346E9511CC22A4A7ECC07095647D5633108DC" + + "C9AE0DEB62E501BA34EB64CEB5A675863563FAB204C699AE45129D50B6103B388C273C3A8A7B4D4B" + + "CFC7F0E32D1219A7A7FDE59E6A950405E89867B031D18124CE92E0CF4D1C841A02644708CB8146AD" + + "C2CE2137350ACA6CF68A560E9650AF16CFBB6574BFDC76C8341AA83401FB903FA6FD00E0E750E033" + + "06A0ACC3E5B935AA9849035BC1EDAAC3AF0988153DD10CA34E3CC7CBFA4860D2172661699F25D2BD" + + "30E6050E9EDE7B6EC9FB294823F85A670A4BE9B77665919E58A13A3D5C73BED852AB0E983917EE37" + + "F33E318CE7B8745164BDDD5EFE24693E7F3E268C166FACFA871001984ABE25E7A9E7DCDFA410DD7E" + + "2E50AC096E45E8534358575EFE981FD01DD69CC437A2A210C64BA3E677AC97D69D24253540CAD023" + + "D4383AECCFEC334DCE548C3CE77AA35485EDD33E69BD8C7E45274B31E6ED24A912833FDAF628FD9A" + + "8A0CA4042BDCFDE8560C236474E2A714133114CD86BD5A7358B718E463FA60A951472110D29FB059" + + "F4D1EF40617D612A68A3D457D14FE2AC1D76A4DB35F2BA464C84E1D50D0FB7E888E51D686977EAFC" + + "934ED71D40AD2E331D2F1F8988393F123A59B84B79F5793FC01504FF8300DC3D002C157504F49F05" + + "D05BCB874E78FE8DE5A06945B5EB29A8C3DB12E0B2FE8EE9B76E0286C625B2A39F6D36A29E3D1BD3" + + "F6B6FE11E993AC03B3DB9AB7983F7206FD69C56A4CF443E4B252D961EEDC845E93AB2024058C527C" + + "D94E7B0A0964F578CE247F229CAE7F16DB049E3B1085522EE6A41C8EB8412B7D8B6119CB0A1FE850" + + "8DE9E7400B6A02AF3AD865310ADDDEF21A8529F2B58362B5658B8D9E5DB9EE4135A819EE786CB40F" + + "96D1111BF7910818FF7785F9601EF9A6D85FADC07A98814BF35CC212F6DD699F7E8911AF2A3A1512" + + "4B0737DF05E29EF8BB10CCE10C3399A7803C550CA3532037568ADBFE17B4B7A441BAF31440018849" + + "6966661715BF2A5A882863E1DF56CC3E1B78E18D2C075E2127E1A1378D22D0E41D356370923CAF37" + + "18070576D6DE86E3F1803610E6A57ECCD7F853C4F742618E9E39BF6539BEBF5288C733ABD3351A7B" + + "A69879EFB06E1EDD9A9C2F518E38FE4BB2D9ACF0592C7B6B70E67F04831969064AE2FDF58D14674A" + + "2A1992B5292F3808CBB6C43D3C655DA48E070417B848F72C525981C640CA017717E855B6D00A7374" + + "FE384C7A45BB5FCCA93EBF8F8B7E3280D062BF9CA4364018300AF89B3106E24E978F96EBC8C78F11" + + "F526FD81E332810F8487BCB3580A0495231541D5CD55F3A6BFA3C20C8EB7078D1618A7A9CB642E72" + + "DFC5F124ACA1F1599C25A2D054A52A9DCFC9E511A560D575AC69554A63A1BAC6E5967AF7F2C370A5" + + "B4686D642CB3F66B620B4A862B14095ABDE3E71D46A6C10A89CF844B118DA81A501025AFBA935994" + + "879CF025AB439669E28C849BDDC0B5DA1727F786487E075230F6CAC17EEBE6427FC5DEFC80D83280" + + "55CCC918E0D9111AD2A39AA1D6D85A659870FEDDC4EB36ACA46574EFDB887DB2C8CD5EA2E4A0C32F" + + "D48FADB4978AA7F3B5BA84FD8AFB4EB46EAEB8A308E5A97F57322B7ECB0F1F1D6E89D813A0A55A5D" + + "087CD48507D5E4F44B2AB204BD31B8ADA24D59F2E8B06F8A3F8CD36FEF9ADE21B276D4C1924CCDB1" + + "25132E3B995FAA41F8C8AD7FC60CD3DD3D67D1D58609087A664B636872B1754FCD1FFEBC8EADF111" + + "625A79F814456C16DF4772089C9AD123CFBCE98B710C9B72C1C2C43322B325B06F6E70572DD8374F" + + "D7D5750E2436119152216FB35E617FD2B2A7D14B9444EB5455963FAE2C24453F7047EDF1DF4D1992" + + "0D59770D087B47AF1C9D7C7217A797C5C6555B3DC91FEBCA2F772EA5119C6F2E19E9F22C09B1AAB1" + + "D408CD17EE74B69EECFE8D4F7B337C008581BFB22C1BB8EAB56AE7CE4583C353A5D7714520704BEE" + + "295BC0C986249801B738B0CD054F88454EED883A63DFF9ADC7137414343339354EC501B56106D73D" + + "A54AAE3F318B6719EBA57959A69AB42A1022CF5E623E4B6678E1596D6874EBC8462ED5170A0ACF97" + + "72D752809AB117A8326A294CCE1E6C7A62B9490123D9F03E25130ABD43E6953A6E9E7DCFB9AE1FC2" + + "E37C4759B311DB51EC18FEA0443E35EFA60C2EBA73FA2579C4DD5DAA70589361598E4059C9974B54" + + "CE7DB868605917CB48ED284C0F795023D610F1FE65AACEA4815FFA5C0A7EDCCE593D33C41EFB8AB5" + + "DBC2543EFD14C054EB4AD7A565A4920141D763EB0FF28E9D2C2661D0CD3B6EADB657A2F7AC107CE5" + + "4A094F991B08F4BA0E01008DA9400D7DBA004F7AF90B5E3AE3F3AE5A5FA00342640D2B1C70499E7C" + + "A05BDB2C7652A164B10198AF53E0F27626BFE2B9849416EA2D76DF4AA5BE7F52B0A35AEB8284FAC5" + + "AD32EF758A31B84457D0DBF09B4E1FFA475EB070174E97A07722E10B24494702B07D08A38F5D48DE" + + "E6F7993C5FF6", + contextHex: "", + signatureHex: + "F1295FBE13D1481D522E1914B92EC2A57C30793579DC4B87ED9E39785A8DE74F74DCC1671CB5AE05" + + "E44197B9745D0E6A68E789DA80A478D255BA71B2D93ED727608F059C9C834C7B9F1482A4D51227E2" + + "2478A103096E9C88BD81D1FAC65C5C1113C49149EDCF4450FDC441892C0DE37A7DDFAE56F23E51B6" + + "EFB0FAB3787294956C952270218B74686E2A25F8248D4E4A619453AFBFCBD59366200B8AA7F9F503" + + "B75A061946936E642ACE96B78E698D8B4F760619377F20FF5906DBED62DFD7E25030D41F9C4273C6" + + "32432CF3F27C7843387614421B815C19AE7107A259FF177806D2215413F05E33B7E8DD2AA660CAD4" + + "C19F004886900D6D3B464572DF45A4CA62B8A8DCB85176694848E8825B27C598363456889ACF8824" + + "52B242CF82007D6CE028DE61D68544EBD09CB571480DBE3666E43F207427D137DD99582CBFC64AB3" + + "74E410FCE17944B8A732E99A26F0DDF564FDEE71F33DC41B815E4A409017073686D8C8599FDD0DE7" + + "EACE83FBE9EF2DB74854715AF0DCE520BCEAB6C3415F4856E9B581BF8EB84658C26C418C150A95CE" + + "6568C6196481AF2296DA3593569D1B785D522E17945F125205F9EB675CEAFA334ECF6424C14D0792" + + "D46411AA3D9828077E46AE4802B5BAF4BA895D256AD3405528717FFB4E08B0B746E016B31400EBD6" + + "D086A290ADEEA8C225DEBD2CC72DD8A6980315272A9EDC1A02470CF7A19ACE4E472284B37987FC32" + + "51AA7DAFC109D18D662900267064DDC22239F47B3D7615549B0E48BC8365C0E4A779E1E4A8A79B7F" + + "42749F7A10A715ABD21D6D02B5F33F1064BEE0BFC7408B06DE8F9E191D540CA8F8758E817465742C" + + "D5B8163FCA9DE2FA1AEDDD2E9A06AD0D714ED9F5D1016ABBAE537203B5274900F10D78E118C97B34" + + "7BCB16B3E5B353635AF25B33BD5974890EA0A9E46E1FFF1FF77B53C95D543DEB443E647C6AF34DEC" + + "BD37CCD9D1473D3E72C76929DDCF9B7D7659203BC291B40787A94C34B00A5A9149951F4D72640762" + + "45327E224A2FBE3022609F832E04B66E1015EABBD39684C6A2E7A01C553FFA43D540FEAE5FD1AC13" + + "F77F720AE46698FD4ADCADC3C0533A40FA5B28469B52CCD046AB67C010CBEB0775491EE261809479" + + "DF853444EB1001D9557958A0E812F65956B8AC6D55B7ADB89FC46153AEF3459FEAA7B72CC67963E3" + + "C8C6ECC7E2215C8B7830ADFBABFEE7094EA1DE4912942DF7F3E6C96F7898CD3BDC78D548BE6C86EE" + + "F6B8D8CA934EC650685C018201E7E3FA20278989A2E69C7F4B95CDBF4AECEB5A8A5C1FEDD4764938" + + "C1B1E27166D4550434C2B1FACF8836115D865ABAA90CD057D5E0BED7F015889C33DFC4217B809CB1" + + "26E9F5D81571C589D09C00E24EAF72BB353D9C25E5D0F1F4DCAF74AF48A484D97FD91FD36C98EAC4" + + "F8EC6C773C5143194BA3BA79CF9EF4ECB3ECCFABD91AB002AE815DDC9FB6B2DF2D16DDFBA704C564" + + "ADAE84AFF9BBE92CC2B50A2E363EF43323EC949AAB7FDB47415DDCE7A4DFD1E1978374699B6AA911" + + "85056FAF7B9E05BF3BFFEDC39901B35D54E7BCE57938CC2D66DCC871FF4F15204CD68B295D96E824" + + "A8D6B9DCA456D83B3629BD77911D66EFF0E45A09EF0EDF33052EA8FE4C2CD45C3E95F184883A2097" + + "703F5BBA0AD3AAC10BA9C9A9C1781C26031828F5ABFED261FA4F1CA72220E895D03F453A507AF0B5" + + "16E155C911FBBA9B9397E3DACBD8226E8C90899526BC09BBB0FBAAACD24DAF1BE128CF8FB6CEFF15" + + "76E2B1654B1C77B748F86F2F6AFEF5D8911E51F82EDE2C0CD7F4E4FB6D9302236B3405D3D54FE840" + + "6C1A479202AA956679A8A3063E771B2C239FC6D7140A2993DE6225A542B4F12077A23BF3C1BB27D6" + + "BB3E17B6D3CAE9B2BBEAE35FD9461FC7151B6B8E78F517CBD03BF9F14FFC093FD292FEC3C3E0CC30" + + "DABE714FC289FD4212A5171E0D28BCCCB62A86C8057B020B5AE824581270ADC34CF298F7D3BC9895" + + "277C3CDCE821EACD41188DD483BBAAABE4D1F5E7DE1733C3625E5DD37989997A98CA3D4D32C2FAB8" + + "D0B6E2BB018697ACE0FB1CE289C265B39270A3582DEC02C85A245D9177F4FDFE2AC9D14C166127A0" + + "8B0D97179594C81F86F3ACFBF4566DF5FEFD9C460822C13DA2E38470D4C4091AB683710E0478E335" + + "5063B2ACBED8D712A0C38FDCA47B4977C64E22ADDF4B2823FBB91EEA85A5984E2C7F6B8BDB12DC2B" + + "F3753558C385E8C065EA0130B78F734C1FE30F734D44B724F3C7D7212B3BB08D2CF33D490FEDEE2E" + + "F9DAB3449C2092178BD9F7600391D4315290DC23CB0820334627DD73D4BA92C7821E9A2477C1C76D" + + "2F26DBD356F24B59F0D1B388A943940CEF5A1D623B223939554CA2B9517737592FC1D608F4017AAE" + + "AF54E60FB6C7691595C9A10899CB7C5BCCC4C70AB0F195413447373D50F61846F38FF583FF56FE98" + + "AB626F8AE41FBF90EAA9E597298582BE1153D85922AD62D108135E2FC79599A2BFC75D6AB966E915" + + "6D2F74D342EA644CE3CB066E8E38832086A495F5D8D98FED93FC81BD1BC99A76B787A9C978FBE82A" + + "13D485A331733746E8FDA46EF50AF951B2FA9D815D68D447DDC840AC2F5930E255A777F90582A70C" + + "BCC62B26ADE1A6A5BE291A13E3F1F5168143CDA5BD77B364ABF852ACB5E71486C6A014EEC99DB688" + + "8FBA8B27B280FB28FE598ED1BC1C5F14AFC94ADF8C7FF63C25BF84B415CED46DF905825649F07AE3" + + "16045426BB7191C27BCC98CB6601BEDFDDB6414BB9D152A16604096BDD50949FE7A04D811C8B354F" + + "7D9EE1999854D0ABC5482F6E1D9AB7B56A1336FEE0DCFD3130749CD231D3E6C99E600CEB86CCEB3A" + + "EC3BF55979F5850483793B22EBE26E9AEB0BE63FE0371183FA2BAB83D57EC5140B9A0B952BCDFD4D" + + "6B05F69BAB51338C2F03F6C4BCE4DD2F7EEB1CC0072DFDF9DDA85FED0A09F7A6A81AD147D9154A7B" + + "3328C88BD9EDD2E67C9471D67F6AE25BCF66C9A3DB4A41A341F46301E5EBBF92D522FA6131045881" + + "0A4E38095A31AAEFB6A84359C3A54B48B5BAD1A72570D03B136EECC55678AE34B200A4E5934C3785" + + "5EEAB371DD6B4024BF05E814D087115DBE3CF0D8057CE6CE12F90423552BE51843C5E14F62C36F79" + + "98E7DB248FA3C0D7C0D02E7A23AC8F2CAD0375F1B2A59DB4B462A5EDE8C8B85F0705EE0B8FCB231E" + + "61B62B2C7B7F0836F463AC6E0187BA9B2ECD70A568DB84003EBA9159C9AF6B325188DB2112FC31BA" + + "A0393F89DD73834F11EF86B15257C6E1CE2D780F4DAC6C533402547AA5DFD8B4ADB6CC37E0D88484" + + "6698115D152D5EC008C2504ED31695BE368FCB5F4F2812F92A6104A665FD5B169D03731D12F552BA" + + "23BEBD0E11EB53E3E7742159809683E8DA227DD3A519F31D847E92629E6FCF4AC5022D28F72329FD" + + "68F856FD9D94846F495959B5C726848C071A7FDB61CD84DD879179458183283F5810990582EE0CE3" + + "A08D94D9E3E7BB842C600B1A759DA04A9391B925211A484D5BC5708D01944CDDF9469FF453357927" + + "51D2F95DF17D6DB27B09B9ABE9E373C84F10907940A3EA70D6217BD20D6EA0703268496E9DCA6293" + + "3872D468D1953D31EEE18260DB9475BD909DF3526058022BEE65CDBEF699C09E2825AF221313F145" + + "9EE2DE4C0491FA4FD033B425B8E892FA136462CE626B6B1CC45CA9C83BD95D1D3B1A6A7B6C82576A" + + "C9D804169EE72F21C5BE250F78EE94FAD12870A021292F9F7693C435B4D5A3BBCEBE2EAF7912B81A" + + "F4AB349DC053914D0679CF3D3DCF6A807F75B58287725D33BF217FA149DAE915ECF56EABBD009188" + + "19E1BFBC2A6E22233CACAE6F86F02F797CD2315540DAC191699749DDE2B33495588A5278429AB782" + + "D414BFECD68BFE0BC43E9A8625103925BFBCD06AD5517870E9F96D0F5618F2D49FDB54D0EE06F3FE" + + "4675E0650A672E9759604D7A3567C92584175ECDA0831DB993964F0862B62C333FA8079653C02A7A" + + "1D4E5BA9848B37382478661EE6797A52CF4A8E316C8ABCE6B5B60967A88884B7182926479FCE7B6B" + + "8AD8095D062F6BA5AC55CA920F980F5FF86DAA5F84285E66730541D4A6DEC03FDFAA6D42B74335DC" + + "C33496A043E076D2408E425F7C7A9041011673B7D29B8E976BD189A32AE402CB67FBABD16EF92977" + + "189E4717512F1F9F00D6AD5DCA689B46DEA041FF2CA018406A1DE759DB717E180A4EF8742B3DEF6E" + + "4A35E884508DC54471369F3FA49B517F21FC764E70584A293F8DD0036126781743B74E9291157537" + + "F06C76BF2450F995B26CC6BB9A4FA8C7F7DA7DD2A6200AF80185805D7983051E0542F843D8F542AD" + + "61EA8C5E60A887DE5B0CC375AE5BEA13D2F10AF490EEAF2DD2F8461CCFDAB667DDD51F8FC8967A6D" + + "78E6A20BB5EF8906489A00285675903A17E4AF5EAB2DED4A177AA7613F64C6B335F4787F1CEFF942" + + "EEB5DDCC4B7DBD74C3B0435FCF27B880B0B425AD4E1DB1FB82DC74879F4FBC52CDD27B53C3BB2500" + + "CD9D8AC70944FD2F3730C909E145A130D4D6C7529F994D65996113E86882FA5AF08D24F450ED3129" + + "2D78E6F202F2E3CE5EF4AFAE18BC7E53F783409CB0109A279D80149DBF9C601824D3252CD097D64B" + + "F1D628815DE34B0B455C5D778DC0C82A2D4C556B7093A2D4E710144C6E8DA5B1F50B4174F8050B6D" + + "77F1000000000000000000000000000000000000000000070B11191D22", + hashAlgOid: "2.16.840.1.101.3.4.2.10"), + new MLDsaNistTestCase( + nistTestCaseId: 54, + algorithm: MLDsaAlgorithm.MLDsa65, + shouldPass: true, + publicKeyHex: + "D8D1170517D75DB90659838E13D45E98ED20D1961D98AEC16D2F10C51DF289E7FC4ED97D52166C8C" + + "913E7CE9D2CA02AFD7791B95E8F2919F7487F9F1C6B0FE2133E2227FC405FD890DEE8C1B79114C32" + + "9A7C3DD341D137810B67C84E9DF50BB9EF45C267F36432C371F19ED69A2127F1A7FB02DB0DF8678D" + + "48EAF99196DF46BD1A2BF5A0F44BC091DCDE4B9D9FD93987AF0842FC74A7F8D8D89715909FCB2A85" + + "0655DA6B6D93F5F1323C1B6E66340DB8C64874E2D8CDE17393FF26E575FCA7CC7D032F40D4D74C92" + + "D6BEABC726ECCE599F85EC9406DF76EEBB0A4170B3F846021A287E174DA6BF729993F093A894372E" + + "3A4128D7A258D0B48E5B5C5A9782CE1798FEEC2D93D3FA6CC96719B6213D862CCB614DC302D1BDAD" + + "C00D411FC033F351569EEEB15624BBFF1D2839AC7A9EBAACE2D2B3FE33D96575AB75485A82EBC98C" + + "42664E0B342E800107E02EE9C3F3F32C43AE35EC2CAF6E6D19F3E1FFB92724471E503E08656C0C9B" + + "F748F53A4EAD3995E8D2C612F77E07C2BDC47E40FD6535020C4697EF89E4DFB8AEC763EB426AA672" + + "65D3B675431D1530628A43420891492870328432577F7EA98EC81ECDD5985FB5040E85F167DCB42B" + + "D7B90717826D289B22C200FB429EDCA53963A50CAA6854296C85E08B28ED2C3486E4A73ACFE47079" + + "0093B022E08E773C6A45C7A1059530CB20F8A351EB64A9130DD520B318F356D3F2A7202B44E4CA3E" + + "3C6188BAD5F4651403E3BBB144D6A126F2D1BAB9DE7A0E3088AD0EABC5A80DB3C12214F32613E081" + + "434CD82705DF56E31EADE0641F8DFCC1340E30AEC50A8FECA999FA371F2BAE7123C271CD69F03DCC" + + "827678CA18619F10BB2775AE6E1C98075E6190B0726CA980834B799F5817428EDD952E5B78D8350E" + + "3A04ECCA5DD00BAB8D5A4E028E1782B90B2789CFFC34B2F69120B8C74DFB3501EC6B7E5B2F33170F" + + "6CE1AD03FE6E4D3FF205A6537FB27845C24FD0B7BC988C0D264B873599D10316C72656654C2A155A" + + "91B831942F7E9C6146843FCDB07642287787297A93AD322E601E92C3793885E3109BA9F578CFD449" + + "D796B68276BD91B28FDBD442DCB65E330C95FEEA49CDDD5CFF8BA7042C571DEED98FE569EB584BAE" + + "F5A535175C55EDBC00B73B43369F9916EAD907E012027E3E2301D9D3999365B1822C0BFB007DFFD9" + + "F94900AA5D6269EB65CBC93095B6D6E42D62DDABABBCA0651981BA7FB77F8FDA1F953B7EE04DA90C" + + "43460F9D99E0D407EFBCC16E2294209794624FE7DC589E1ED2CDBD23FACDE396E569863C23A21CD6" + + "BDD4B14F716AB0B33419E54ABACB50273B3952EE226AEDE6461FEFFF01B4B532FE2382D7444974DC" + + "C3BD86167C0B62788DB741B446F9928B06EE26CBB66BB7886EAAECE5EE4525AE44201F5D962AB674" + + "4811192491901879BBECD24CCD96320FB63E47A7F1B1F8F8596054912F67658C9FD1B2D9DAC54244" + + "90072BE75BB90F677D155B997854FD23C25373998B6EE4E6577CD0191640F583C510B4F3A16293D3" + + "B6A7F23398DAF50C822E13E27BC6C119C89D7ECBC3FBE41EA8D50FC664D9795F2FAA3A5E37C72092" + + "602A34903A02C02E8E14B99CE045C07DB648AB5F88096B5FCC318E5DFE912B2ED3E46CEB9B56EB61" + + "9C5F418DF303B87E6FC0EEABF6529479901849FDFA88D5403E287ED1A837618EB4EB91D850739177" + + "595F9CA0FF76D7038CB80187178A0BC6228E7CB10883EF4E06F2DDDA6AA9DC2C517588E82065C161" + + "0C73E2F745899131A6CC0ECE27A37AFEACFCCFB10D5BA7DCFA570EA9B970B7CC154298C2BC8402FF" + + "A281F9BC8E0E8386DD9B639F62FC81C6FF96DC72AE8BC0B31806F2DC0E956CA666283C4BD55E9733" + + "9F1D05EF5E03D84B1B02A1CE434BE9E674E69FC2446123859A8F1D8EAB672D44C014EA5DD8840CB2" + + "69284F2CF832DEE4A3F5CAF5F0A27889C65BAFB922023E9CBA1A322EF382CE54EA3C005C1C406A3B" + + "D19F4B174AF0F40E938664CAB0ED4597953FC843DEFC9E273E91361DFBA69768A5C1DB721FCF0695" + + "97209E75B5ECEE51B75381DBDE8DBEF3778B422AE68AD04A6E5AD27E157FA425859C26EFEB28F412" + + "B3BC56A4F7574431A5FA4999E7656D80FAE32D47C63C530F0B8368281C1D37E9F53E3BC56F66B4F0" + + "77ACC0D816C48414CA37FA30440849A6C0ED59FF917436B678A1CD8C0503155144C96DAE1C74E883" + + "2B5AB171C990FB51C77849174B27A362447FE90C368A1734DB076D73EE040EAF9A883AC9021A9B2E" + + "3DCE6D3961473C03BAE6184CF067BA8152D41F61D9B2EA1C92282585F6ED314E19BD1A30734AA39B" + + "695CD82EE1CBC9CB2456CE414AD8B4B7BCBD6F0DFA0EF4F3C40E9D1CFED52389A82A6AA2463ACD73" + + "51A59FA69D31A4F9FF4199800EA6D3DAD06C59D2C2F8CC45488FFDE4811D8948C00E5CB0086E2B87" + + "55ED5D1EB730F552BA814A3644C79D408D302C6E8ED41AFD0BCDEB170EE6F4159C2ADD1623B84753" + + "F91A3E52E3C4BD63BE63FAFC2E12938B32332AAF7DA8D8D4CFB66296738C5C5A99E31A6F09910470" + + "E1F989E396112746672C8150D5FFD44164191967549A9D5A3CEC1C29FE7B6A6C74A261CA93A461A4" + + "C005B461FC4B0E529C6A4D70FE43B9B6F18856EBCB4E75143C7B53ADDC1128BEAAB1BE86A991FA0E" + + "075EF10989F7F93436274086C054DD92F2833132E4F6B73B279C36D88282C38B9FE6A643BBD056FB" + + "AF35E2E86E3080278BEC572C6F8D0110A83883D0869F71A3BEAB9BE9DED19310", + secretKeyHex: + "D8D1170517D75DB90659838E13D45E98ED20D1961D98AEC16D2F10C51DF289E7D87A9837F3D23E5F" + + "A8F2FC061D482317B190FDAE090A90E2DD24E47F08D32AE02B5DF93C6D2AB9241CBB66A0182A7456" + + "19869EBCA9F62391AFDD4F05883AB7A13780469CB9A79900D579A51026389789E2D652FD9E87F078" + + "B93B6FCD089F01757246336823472484508102701722278723310125787350541442753233403202" + + "54506422128241104410687661532405227363472078720852341550223800371825041500122803" + + "44505064461540307650585802086558834554575437274862300143425107285544612767111275" + + "53505345175884245550104417526730543838826266228246713332005583625500855618555421" + + "66753562840173366600121651418340086333613230317121166663205001767744532650255840" + + "26554282871044241656010082614285510417118768343068417152005745055048251504548366" + + "68870680083483622830538262045784317667380183870131337327777324226162604787425258" + + "11840370372485760673370362440772222723070872644406872662213055558750878263562545" + + "16227733084054645636357058464375167035833628433301260583303336224040815830073646" + + "56606412684014148321582574862672737052810331374520358866617734554673521374132764" + + "85814037772337560466645424212021005581064368241123332200888543300715416242535605" + + "77634710381137288335344084881540522557112605437583041611506646820164236686748706" + + "67780620483216187133648843542644015221123211060514001337046208718113463465012450" + + "52782308810511004864380102407113154628434723044542074031237786885376645306857706" + + "72205737588746600575280337512440204235775310645128028028281116372713340485654045" + + "65666803241865245170186025206082513888023807163650441681370786724845777648247063" + + "64327447466625051066434755605172060614125885166378108253150545808134620443262585" + + "46073167773718263073587676063424727415018661262808351882028641457522658876442747" + + "06642676054864717611565247158258404145188331362288477174110551068881671781676881" + + "86242872818833055561312536557065501826783684447482042156527674243508127030256083" + + "10684451177046566525468256018436757557077540570204801651205700266877715380146242" + + "27456865280777805223863575056846544471250810512374245063767578456618254814131371" + + "42448837507686585411574363073788231186221517141208774525657558554642813550785847" + + "06656310542154841227655848778328740284614723605147172483432234684113235634270825" + + "61224016287133233602707682807066364008540784431478154631024535325223781742386858" + + "12280374288654568023161724437338653037227685205055076422425020533278411228548000" + + "72370512377587843372816025414715157702408276631556713464647704371572401265458068" + + "20267238783818711653655603640588835166121223657362553241618472055788100731518654" + + "66818186771184372426362678387554006037321483733400651487548414232712758854200606" + + "47708046830675658022617585818056210467165323481138518512011438057118333132724006" + + "02123536037844558381477153083312688710560377160078402544822770303686101746142261" + + "05282430134107420016417363820051553018635684754121268748333216637661081285805487" + + "52680162247183627068740307343176608024013767328503508740151380731356374153515372" + + "84045035421803714234526124415737764234844518835454864446775825331368372445343344" + + "40236220220834017702184873733641621823368306573076461714312461267188320786564040" + + "1541235047834600215850605561176161CE0713693CA21944A2178683E9A301A006131B719A7D0C" + + "465F915141E86B2547398A1731DF00755E6D39F0D43CA0B78EED1F21823A8313464DE41295A1A49F" + + "A4C18CB6FA21C88FB4ABB5195721E21BDB8A746EC5CCB7DC2A49EF6F712110000BBAC61F2B59FE78" + + "66A04DD68140C040901CE65E447C8BD04B1743CC342F5CAC9B91ACBD76F5D9BDBA36FBC003A81AFC" + + "4A37307A9AAC181064CAD0A27901C63A64E1993266AC96702A65FAB2A1C01FC6290D247C3504962F" + + "334547C2CCAC18A1EA08C6E110ECCA2A58E01AFB1A872A7F1CEF5ACEB55FB1CB930DB5211EF6EBE0" + + "74E40C47670B7FB3BC362A13150F9449881D21F450DE11165013D32C1BD8463CBD2D338F8B6161F2" + + "9CBCA3C9BCFF7826386749D6CB1294E7D09001FC56BF70922BEEE8CF1355AB098E471F2338FBD6E4" + + "11B4BE28996380B741D8CDC1BB3666DE9C50DF9E6E2E57DD17E5E18893BB002D582DA721068B07BF" + + "7A135EDD6CBEF0E920FAD8DC20214BD7A088680260FEFC64B1338C36353ECB59D304F24EA27C1BFA" + + "DA2D97991FBD59F869B98D8D2E9F66E465C370B0FCF02242CF759BE075A0B02A6CA6D4534297FF5F" + + "B6CDE68C0E23EC0F6B6538FF6A568E36F13F8345B0647BE5BF61436192288F87C2C790DD7200DCEE" + + "4793339A6AE8BEB1DCCB55E01C3D12149CD283C12713F8238E277F31D76B8AAA23F7DD152044B6E5" + + "6A12DE47B2B0AED5088943D895BC1EFD6B370CECAACBA126293608446E75981108252E5BD0C476E5" + + "D6B6AC0761ABA0107A92C59AF89A704E544B1D9556B34B5619410DFDC84A058EE3701A1E29238B20" + + "9840DE96B032B7B510434CFD84CB10930B484115A0A9D55D6C3F82B7D71DB8666E8321052F1A3ABE" + + "6BFE9EFF900E370242B15A22A3CFA2A1F723077D553D0412F6EB762CE9D70F6922FF9FC76D6F7EA5" + + "CCCAC689BF652166FF781940F570A337F0BAC84A8D11C87AC0DB5CD6BAB8FE68F1B0358486E97CE5" + + "2BF4429F00B80D94119198DF385CD03725EDAE8FBA1CC29712BB7C79DD33941AF05C383A6B340A76" + + "A4BE1F5D92FACF2EAFE4BED7A59ECF7595B8ABA0211E6F509A44E34DE5E0F8E8424483CE6E99D840" + + "324501002E47E0D56D23C522E57BA4C8C21CC2E7865BE3BA0941EE08B120816493C5FD84DC157E9E" + + "8A0775D74AA56C7736C9079D96DD8E4F1651FE26B4AA0A7C89C14AD6ADF4995AC6426427BE4383A3" + + "F471D69F1D4CC0DDEA62FB097261934A38B15C4A87E06E2DCE0273677AF54CD07C96D66A31CDAC67" + + "4B23F168361D64AE4F7100ACEDE2E993471A589199002FB43B7F32142BC7D10525E9F6B0B07DC967" + + "5BB6274FE9CE4AF49EE5FC65CA8B5FE1776622CE4395D073CE0AD0D0D589EFCDDD5FA6C8438B3FF8" + + "90A16B4EC23E00F2642E6F85F387D4F57FE84397CD4361727854AD4E403C168CF225EC2A478EC94C" + + "5B7D08F8274F491F0F67850C11A76F59A224C62FE183A63E3624C5245A1B2E80DD7026568392FFF4" + + "A192A33851344783DDB85060675E63E5A66C3329BC4ABB8C9844F82D8D2D64FF83BD9ABA3B966389" + + "5F50AF97546B5A86548D24DF95C9C4C496A23209DD9525B0F17095C4B4EED648B9D639D569EA6E7D" + + "F66CD386CC8B54D60AF4BF0C8C215E8FF0A73D86B2B2A9443643243C6AF3E1B0749CF572DD0E2F00" + + "7F1B3646451F423DA79178B0E7EFB7BF55B9DD7B0B1D04852CBACC20CD05D7DA6A0F6D56D650DBDB" + + "2DCB3F4D97C13B9E430F5101F646DD4DD4BA843843AA4D3062FA7A8551E7B51720056C8117ECFCF5" + + "2473137D16DCBB389308BE07A497402C15F92A6F88045D7426117AA4E871D2AD75AF1C0CA3AFEA81" + + "38263B7C30AE1814836F06A63033F2940249F004D41EF013DBF0EA3DFEBE48C1EBB76EC4674B01B7" + + "221CC581384D183AD6FC285597607CA0194AF84FB8468A58E23A96A226F238B5FA9813F5F50DE473" + + "EDDE1FB74206AAC695402AF9221CA47AE922FC1E8CDF5AD538EBDF33119263FD7A5FA36159454278" + + "ED772715B3C7CFD325707324542D62BE36023F565BA822125A6FE8EAC0A664923D0D696C875CF409" + + "9772A8DAD71E0FDD07F635B667906BB5D66A554184B43654AFCE82DC3ABBEF6811B7C5689E6B5734" + + "4E800B117C8EBB00B0EB75DFE1601BFAF3C1123203C130D7CF6B8EFDA3873AA3081F784D104D96E1" + + "3C243EA0ED0AEB17155387CDEC1ABB71C8177ECAB7C5E97B2239FDDC650942BB28AD16E181EE9763" + + "CB67FF1482742D0B0770DE130C491CD3DC6F814E68C727D11BF9A7CD4C92915F0530175F9E6BBFEC" + + "D2D0F2790A0877F3143E7C2B62CA13B6695A5A50ACDE961B06C392CBC5C501290579FA8A03BA22DA" + + "D7FFC0F8E2EDC1AB6826305B72C77709592E88134C0C685EF4ADA192370E2A42178B682953D8CA0B" + + "4CD06FF5953134A47C180482DBEFED1BA32B5CDFFA8C2C1FC185E7F9CB4BCFD83045C1243F981960" + + "6A8A0FA359DFEB64E20CDA7599E50E8E7ABFCEB29F6A9154ADB4287B2327B7C200D9B7D7A9E2ABD9" + + "AADBE10EBAE2AAC66DA2A95221C206777266A72D85FE2FA685B6AD49F93BA9DB3DA026E13B7E7126" + + "914F4BB7DC50EBAE14DA262E8922979ACC7463A10C19BD09D0AE70CF57AB0876D67A3852D91F35E4" + + "9B44AAB0F8949471506415B13BA28F7CD14273965EEC785935A7D15A82FC8B810A19A0B95463B564" + + "6A3A442E5ED6B7D73A9F46D80E93D6E05DB01B9FE583A46D22D5565B405E55EFDE09A876D8E9BF3B" + + "C212640BA102EEA73B5C78DB407F708D7F690F4333B876D4AF47013348CE5ADCEDE5F056E32759E1" + + "9355EEFF94CD3A1DACD9CCB11736A1325D1B4FD6A4B227A9D7E4E2F046462659AE639B33F1606080" + + "6B33B54E02978FB67F87CB8359E74AAE2BA5F232276828F4DEC027CEB80487016DA0D343EB73C001" + + "4FA874D02808A88E514D4B2E1EB9253402F862C9BF9EED7E640D32E3CA8BB00CB5232DB1FF082577" + + "EC567D0A7E14721A8034A69CBC2AF4735A94191F2E41C46B59CDD626AABE7FFC9C1989D3FC7EE7B1" + + "F1ACB6F44877109AC320CE800E8DBF395A9879911E88ABC4B8FBAF64C248CDD1C4B40DF86DEBBC13" + + "4C7C3CDF897B50E63C9A2BBA8ECCF2C72B80B907570D17B908D57B7DD1ED60A9781F02BF515199F2" + + "27583B96FEA864F13BE0F1D95B65571AF9930B4BCD74D0A0B04A7A7E7FD957B772CAEE40B6F4EAED" + + "4856E7FA5739B56E0B8AD7B8AA0EF456E73BA2972A032F944ECE48912BD0FD7DE8CE7CD7FC31B89D" + + "9C0E321952E2886101571B0A4E80BBC0A614FA505A1B66BF21BFE4BC1BED7D128413CBB4882188FD" + + "5418B54F797E391266469081315EA0C4D2719088F9107EC93BC4F0F0F491C7E2A5891B7ADABAD07B" + + "85095EBA160C742F5352C23B9C4C49AF6161C56EBC1FC5B7A022957AC4BE8C5145D57709C5B99C27" + + "FAB42831BDF29854CED09B92C173FA50EA4552A17F4F778DD6FB5F2194C7BAB93683C3FBA6D97EA3" + + "1D6D3568233DB53A695C6548325E3B2E83AD3CD91F250F92311B62DC7E499407", + messageHex: + "4EEE5C11A84AC5C25154DCD48494A89D61061EA10044892355D2D4A8C90077D1BBD07F03608B0817" + + "7A37E37A11D807E45D39D59A1E9D96CEF2BD9DB1613FFA34CEEEAC8B7806D637A03C3E97127BE0F2" + + "8436E8C43445BF675CF80A37C2A954B8CEF5F5F1CA8B1A45FD0ADFDD05F2C7FCF45F5BB6F8C82AC4" + + "DF7617934CD341801A4389DA77D451DFECE08C5E0A9FDE738C560B042A6FFC57D06DC61C6B062589" + + "68EA7DE3665352FF648525F420FA31A592829A715DAA6A9827EF2DCAD3B66511D5AD583B4570F626" + + "C868AF95072347FD3799D2D018FA36C125C2545C791A68131A2C1868F7693F6553B26C946C905A7B" + + "4CA7E43BCA803DED1550A584D649D834FD1B25619F94A51CD59D5155E84C12CB472AA6524F652F40" + + "8EB7FC9D851502A40755E07F5BA2A5F3F933A1FAC0CBA512ED2A9AD8EEE08ADE9B810444889E4F77" + + "9712218E5E00F6E1039532D943CAC192FC853BD58C99B729E33F7F5184A8892C0DE5C4825EA29729" + + "002672A50A6E1D1AD388ED11CB5D5C5B957F30F52AF608753B3C4761E5951AEA960732E9F54CA913" + + "35AA488D1EC4695546AA17788C2E30331067F2B38252C41B150CD534B2A206ADF8BC245B2918DD2D" + + "F0C9B3AAB030F66C3BE58CFBF9A1D0590572A6FBF1591FF954C8A8839A6C189C63EB5452ABCA8EBB" + + "07C78ED19C5B75A040BEC742B54118441C5F743EEBFE33CAB628576F421117CCB45B3C0A9E3B59C9" + + "079482CD36CFC5BA5A9664C396421644D12C0DF5247D35C28CFE117AFB73DB81220B81024305F6C3" + + "1E7BEC77D3A3CAC6D5387E79BD7BD48996C5D22D92E436470E37666109EC7D4FA6CA71F906CB875E" + + "2BA45E32BBE9B8896D8AEEC0549D8E9075F3425B02F66A336B396375044214848527CA2174AB3A50" + + "926957731FE8890A40763B1A4F0C86F5C5D2DEF53A4BF2C5FE0EA8DDA7CE06B00D926789EC300649" + + "2F9EC1F70712922D0572EF7A5C48E2FAF244A42631B8A8016D422DE13A8C68B54D3B3D1D46E509A3" + + "34DA9650D074F33A74A21554E554846DBB08DD10B5C7079BC2C0EF5082569D0898897BB625640A4B" + + "52E3A942282A753C8BC074E3EDA12CAF90BBB4DABF461E1DE43D7F5B91102D2FECCBB1E277985776" + + "9AAE96A074824517E40CC65393F61604C520DA7FA110EB2161E86633B911BC570E47D0D64AE33DBF" + + "BD206B7D318F1752FE6AF433EF66BE6B85E084B14202375089F8E2AB48156FBA54CAE65F7C7102E6" + + "9AA835F162464FF1F319ECBA9E918AA380E7EE3475B2FB345C577A3F57B285719B2343CDA5B83878" + + "2C575D434ACB11CE0A3D1201E29D09DD75DBA99BBE7C48515D3685B05F95E092E9D1D17F8F700F05" + + "F238BCA003E2A720D3A362864A2249FED6EDB459D00306C7DD15E48ABEDC80D861F4BD087B1F3E12" + + "9056B3665DBEA7CE5C8F5B104971F9AF4137BF41F537768709C045F2F0A58E32FDFECBCAB247FE9D" + + "57D9C235638A98A6E6ADAE09523C105B2066AE5B5CFEA81EC4BF9AE218E05DEF41127D059397EDB8" + + "1BA1F199C453F298E0E4AB103740AFD5DF55CC5142B448D846725D44D4F140CB76E59C0BD3877491" + + "11DD9761B8A4619E5652F6D363649DB8ADC52038E50476774563B498DE0627D62930B5DF6CF59D67" + + "AB42494A68852F2B7E7A12FB5D9EC2C7BD0456560B0CE0A09D5F59938F1B33BFC17ED6A7CB337B9C" + + "BAC0A5BFA6C53582C445FBA0B55EE681EA147EE421E9EB233AB9C19320860CB9A40CB5F28ECAB51C" + + "447B7D7A3F6D798211F72ED8EC20A86FB2338A5BE179FD41C03B0D2FE1F87918ED6B04CA599E57C5" + + "15A20D1EC8CCF4B13B96EA07E3A2874945D71897328E251F16F7A5E0D1E4069D3B6EFE68C24319D8" + + "D240BD06178F10924BD6AE5F3B9333130BD062E1A5C6F2F99D0197F435D21FF437542A66A231EF78" + + "D94AA6C4DDA39FD262333BE237502DFCA660370608EADDF29B8C03DA66964747B29A32D2C29859D5" + + "089FDE12C5BB803B2E90FCEA78A1130B1D695D3679A7724146019DB88B5C8DA24AB0A81BF5FB5CF8" + + "C37C82D8D78D485052BD2F503BA485B0BBD40D21B343B8B169D378C1F266C94CB998DBFF582D1554" + + "2351FC430DF675C2729B81BF4815919E7CDA05ECE26CA24F003C46B166F84B3C93563744E1348B6E" + + "BF5A2D94B5CA89FF4A41F7A46AA8AA5A96DD779965351C9F303689D115DBDF737E6F958CC6382D78" + + "D5ABE683987B731C274D20C1A70ADE54E6F4CDE2425FAB30C58F20DDC5D1A8B69F1EA4438A0394FD" + + "19CB30C10CA5029E4D5A5E6FEECC967AEF71872C798CE8580E2C66A9A92CAF4563BBAED9D99AA14C" + + "BB996AAD29B7E206C84D703949F8B9C8A4095BAEF1BE38B8078826D1D25FC75FAAD02432558C616A" + + "DA5868E1E4B7CD898C8138A1FA4C1DE0CBBF3A8B21BC5E312F55F017824549DDAA56FA0F9F037841" + + "14488E3190F7B49BE7A6789E690CC0D56807E55DF9E2D21AB3C998AEE80587435EA498E292C63814" + + "B2E9F95460FDA64304E3142647D7E6AD2A20F8C90B6685E1FAD99C1050C5B87C2E2C34DF8FFC3BAB" + + "92A4156DE6821CFAB4E9A84A436740E6C989509CA839E71A50FBA863D29A96D26B3B304C4C4E6A4B" + + "75444937DF0878D790067925CFA6E7C3F062BC51CD923FFE208753BB3ED1EC42AE1F4290FDD87C0C" + + "4C76F61198B65ABFF76F1D3991196BB8D4460F5C15C44D861712DC2965DF330E9B4D6A384A144430" + + "E469808C5704558B49A86F30E6185AB6AF4025DDE73E2878FB753DE6A4B4604477F6756F7BFCC63D" + + "EFC3688E572F83D9340FEDAA58BB2659D9FC891D42444FB136C75F6AF28EC59CEA7E990D98017485" + + "93802BF466970BD66067FE4199B1BC89D1008FCCB416595F035341639287C0D73D23CFFECD20B2C6" + + "9314814BEDC9F02CE22B9458D8B2A8627EF915185D9EEAE1B2EB0A8ADE9EB46658687E5C79D85918" + + "6C9F027D6873C348ADAD9D82870A2E1170FA2447E15CCBE4A8FDCB9CFA55101C7C9C238CAF5BDBD7" + + "33ECE6AA835D64240478B289F4D5B58F2BB1D8444AF634945720E0EB2F33892383181C97ECF79681" + + "4216922FE9683C5C8853C0397F5FEF4F83D3A11ADEA63B96A79CF131313DE2EBEB57A43A46B867F9" + + "3ABE926ACA31BF744A4ED4CEE382D9E650D8E75161771B1ABD8A6B3FD4399E58A1849CB88D8B6F8F" + + "ED53A94D58A07656967874E410087ED77720F639C1ADC8F39B2C6F59D9705FC4BCF859E04E923AB4" + + "C42CEC9C2D3A8410DE7528EC502B884734F8DF93553A838315A11E95195D4C9F0C476549F4FCEB7B" + + "BFC4935CF37466DA8E733D9B3147FB2976E19818B544D472D21B61B60616BA719311DA5064FA64AD" + + "BAD3DAEECF1EBB6DFD6C60AF6E7F8C9A15F757572220AE68620CBAEDB5F995D790069741DFEA692A" + + "7383D6B57F1C7E4DFE904AF9D2F4B45215BAD838482EF0D421E0CCECCD8B2B5FF1294CD672C4233A" + + "45031BA6CEB7B75DF365CC0B495B53BF594979A357C4511A3718B08A51A8B7E2C522949CEE4A1D9A" + + "8324B11EA56278A2B39E7E29A6E85DD99F0AF1EB513B81A483726DC2FD075ED872208BB59EF12428" + + "0402C5D34C3A5433E491A44D2390BA0FD94F0FC98B7CA47971CB64FB1C426B4457147C0C4A5AF393" + + "3CF83FA281D0A4D61BA7F709357B3D800F102D40CD902C2334251DC767D6B7D0594545C8FDB48A9F" + + "0C328C48669F6A74DCE3E3012B4DD881C13C560B70B009A8F05DA9A0F01963F212598EA612ED608A" + + "318D77707EA72E02E536E160A69CF99AD89F35C62A9B02545361A95950BEB8A39CFCA7694AE14725" + + "23D33CF26DB653BBB2DE64CB90FC87D9F6C251C5CC51D621294F17FA57AB783D6AC5C2B175F816A5" + + "2775AB27E0E1F2B4F6FF15C31EB2EBE684B1EB845C7B315E0544AD82B17DD80B857077B7385BD315" + + "D3737589097E821748742E4E049C159F2DE382B3F6C6286C881E41A0C9335AB3FFEF21711A5F4187" + + "F8A349D9E9612AC71141EB930FD304F5E590E84B057ABB914E18B02E6326E119769186FBBB0DFC71" + + "6A471B85C5A9CCAF1E8498FB78B7197F9F04E7E5D3940E2CC6B13CDB8223797D8B61031FFA5B9635" + + "FE83C37253A7CAB26C091F358A88D36D6615E05CDECA33E2F7EBA3436A8689BE3A726DA6027441A7" + + "0D1AA6B60570682FA56DA58319D0A76C2AC5E6954FD8CC12C024A6F3B778DA0B98FA2D85375EA7DD" + + "80F31B379849E3E065251FDD80DAA13A9FDD14AD4EE922C1A43ECCFDB10D924AA2676FF0126CF0D4" + + "D1F5DDDA397F4965F7DE92C9A84A45F0E42EA4881EB4D643FF595CCA40981932A6BCF794DA06EF48" + + "C6EAB1875092A3FF31AF892B9F9791C989B7E129C81050A966E25B4C4A77A06E59431FAF7E60FAE1" + + "8225DB90427F150209420B7A74498CE69A30E84A7326240C40CCABB4999A0C9531567254F7EAD94E" + + "2DCE726F84E03A05F7B94A8AF52C37F579D27A1CCE42D17BB1905BAF4E84A0E4BBDD77AA1B9EDFBA" + + "E879F76B16BD258C05C1D898CE952CA4798D0D649B227FEF2560481BB93CB6526B49B1FAE74B09BF" + + "F4F6D2CD73C54403F930E7D1F04B049A74DFB61F7C1983D78E4C5E139925D5605FFDAF9FBCF3CEDB" + + "7FC5353C14449EC95D4A20BDAB68BCA3968EC142A1C4C92E6DFB168E1461E5959D628839BD196650" + + "8EFFD86254435B758CC301A1896B3D07FFF2567A952CC835AD740107DE496697304AAEDFCCC820C4" + + "75ABBBDD9692099E69668223B0979A3CDEA42B7407D12147A09734920AA76E811606113069A7D9D8" + + "E908D8FF90072E65DDB8863A4A36CA87DB2485706BF3A74166132BDFFC78F565DE75ABD258FD6B26" + + "07A085B1E8D49441E60EA85E0DB84E95DB30FCFC2D3605636A6F0FDF78B19683839228BA88827263" + + "0F591602DB5FD4EE542483EE80EFB8305A0E345B38A39BFD1183BEE1A6A3B95F1F7DEBE66760719E" + + "CA478214AEA7074173CF5D42E191E0FA3F7E634CFE9E35D738329688302C00B75016EC199EDB7B74" + + "D0BC7FDC7AF291B5061B126718C2B4B66021EF291CD7FDF3ACD8357347E71652E57B0EB25596F828" + + "5C", + contextHex: + "F2D11E8B54CE7B5BC8737BFAA82209B9F0F3A1142B8C9F79FCC3406C26FD816F717A7F7DDCD0DEA7" + + "157539A09C87D2DEEB3B11B9F38D63724FFA5B337590D1011417817A00F4F401AC95A28FFFEF7457" + + "F6B5FCF8FF9586F2F58071D1D18B3CB705389010DFC894E734104E7A8059F3C1CB2DBEB248D73AA4" + + "28604395DB2912FB1022E8F2B04085B56744CF3939AE5338164DFAE3874CDAEE2A4051647EFC2C04" + + "498829D391090EC61145FE22C564E479C5C192072D5B8339F67AFCBF0696FB6667959E1E2718FAA8" + + "55273F", + signatureHex: + "3A27B77C12BCD14DD019FC20BA9B6EEC335EF936FB0EF5A1BB14989A956A3FEC964E922788FBA1BE" + + "04306FDFEA49DE28254CC2B4F10C03E629F100FE5D0AD629B3B1826A6270CE8884C0B81AA4D615E2" + + "8939C3B37E4AB23436973633994A47BFAF8303E970706D6C36AE579AB83C35816CFBF27D410A316F" + + "0F91C2B485AFB6CE49D004CB8FC152C22D2A33BC549EDDDD57869D72F9B5A7C988E00FDD0789403F" + + "F637D97B008423ED77F0DDD1CBE2E368BE2AC9DFEA7844E909EC337121035B070276E06CBB4CB6BC" + + "1614E8515F9C77F0746BD631486F20B776D787DE4485F8AD2C4C0439D6005FC04621BB1477EFF510" + + "A6E6C408448520E245378CD3842387229E7528D736FCABD166DA52A455A91308F75FA5831FF0DD94" + + "424CB0110F3F0C0C518B914F0CFE7EB718545A9C358BD890475A26AAC5580B21431B9EA23FB78E49" + + "CCC0C9ED081EE6AE71782B18CB644588FCDBC3A682748A377EDE7C54004434771B92E1E70CDD0781" + + "874AC9A4CBE6D34DE905698C0742DAE92524FBEC269B60185A3D584AA4C5622A1191BED6001A3155" + + "1BA13108666E53A86E990839061D1485D0BC7435824F59152465AC9FAEC29E3F7C86657D263699BC" + + "0B128DE859D0EA61DBCBB4513511803583220B03BF50D222EA2F5B0FF4AFD4386D719406C25CA48E" + + "C574EC0F50E2292D2EA7FD644C5C9DBA508D1E61783D2A16D8D371A6078051498DB47A1EED8AD353" + + "1CE46029930EF1103033E3D5023EA751C4829F499C5DD7F14403E970C0D8F4308271BBD2B3AD4B9A" + + "401A1431A40EFE1E55D57B8E9D50BBEC0A97CF77647A24A295E403A61219B0F14A9E1ACF19E9FC67" + + "D5989B8FBAFE6F3E21815BD3773C1BB938BBE46F656BD367FC76520B4E602F620AFA28853182022A" + + "B50BB19429F643B3A44EB0489619B21487F40BBF2859AE6D6AFA8DFF7E03D61AC169F81AB518F70D" + + "F8E2992814081E9A1E70AEE6E4641390E43B934BC413105D96975ADDA5E9D964E7848BDD80C6922F" + + "8FEF9643BC3DFEFCA2EA0A377C83257C28A7102092B2CC8EFCCE12BC6C1F2CB1A2DAA38E1B68BC44" + + "8EAD258D1FB2A879DB81BAE35D97921A31C888703BB889E13F2AD0F28C17165C2DF8FD9F727529DB" + + "618564DF296169A3BC8F5E2D59FB3F99F7F327D1B211699286A0C735ACE3795297861C90E98BEF0E" + + "B51F9B2BBABBD48C84F8AA979C160733E600683E2D4CC9AAB535AAB81672C943F1D731A8EFB9A794" + + "A0DB65832A09FB7BEBDF873C00033FB87A3083027ED9A7966CC21BDF07A578B71526A37993D126F4" + + "E7D1135C41F7C764DC022C8D85C6D15F00D82D1A58FA54771CECF5B776A383151733EB9DF06D5C82" + + "D3DE382567BAFCE418DD7E588C85A9A0049C67466FF086085CD4B58D4BA0A635E224071775D177E6" + + "593BA6C07AB44F2B50A95DC37E48E629CBD4A98D18DE4FE89DEA87AE57AEDBEBE7F976993A500957" + + "EA53B4F03C17C434FE00037DC887A5BD23DF1FDFECB149907AAA6F1EAE60DF85C52FC2BAC9EB6081" + + "7D8E4B5003399DBE06215AE611EB1BCC5C76BFA246FFAC218AD0EBED483A6C97EEC7ABC87B2967D3" + + "8892BD531182CAB76B5856CDA2A44470FC995A3A6338D572E9D8E296B8CF0C714AD2FC2FA8C3B69A" + + "0573551457A909A96BCEB907A1D8B5ACC4434C3488A9A67C377BDBA7BB3B79E3CC4E6817EEA761BD" + + "4864BB7F870CE0705236479EECB00EE3FEF275769B5AEE68930ED1258BDF9B607DF57504E3DB4EE9" + + "2CCACADCA44E76AD9FD69647468F6FACB21BD44B258D3914422695AEFFA06AD0FC0EB505BB419ABC" + + "2E69316AF4AE597A7ED64432BC6034E66B33E75FB2DB956B23F33C16A4EA9C23786D138CD62971AB" + + "5F231851D6EE3D10F387740F77B8E833AB982E18B5320C943888E07FCC6CC37C81FFBC73E2C8D34E" + + "BC68E334036FC58DCCFB3E1D70C595C99412C58D976451AAD92814AAE900B22392EBE4320482E4E3" + + "9BA34C0F95BFA682CAA3F5061521CA301C70CB3D87A81B76B7891EB837F01FB68EA92F66A4CD1441" + + "608911B843A3A1C71CF5014725CF355BE91E03C8122FEFE99267AD9B32DE812545E0ACC04446D92A" + + "5BDF2D8BDD1B96F82DFE77BA0BEBC179BC0F69B47878A298B86FAD2318D29F6E7AB5A04C49B2E0EC" + + "E8B0B6C54CF272CDFCA40B8273DFF299CFC4B5CCE3789B5DC559801F46F5FDFAC61E0665054E1253" + + "453406C912942B0F21EBD68B286743FD4D86405696B566FBF4FEE72C11522D69784C9624866ADCB5" + + "09046B5DBA187A536EE91769085A822C48AD87FB45969D0FD929ED95BF21552786B5005D34F650B4" + + "CEEAB8BA7358BCE4CAB03344C9F3553EE908942BC0AC19726E82F350C37E7CD258F44A977C599C3B" + + "1AD33E38397E8F9EC5D142589733843F585D5743610F12D8945E7BA05A7F0B30D8353C9FC120D96A" + + "64338B010B53B900EA63EFABF5C80D98040F9E83E1C9F1AC361A0A3847C2713E31E5242D44350AB7" + + "67F6696503D47D3933C853597517F8DFE5898E5E08E5BA7D9FDE622AC5B623CD7E20215DCCC6A293" + + "22E848C15FAB76582745D533B1E93CE2913D2A5EDD45556207EEDD5CC7DAC81CDC1BED265C5EDD47" + + "45BDA5761C215C91D5B9B6F32241D7EB44D541D516C30EB8F72E298A36A830B2A26DDF7721EEBFF9" + + "01D55FFC124D497423C286B682CB3D0BE82A9F86F3C64BBC95A110FABFB0557E62DD196E6D4E8DE1" + + "F65C1CC0F6CDBA0185D3C36C17A69FD486CCBEC54B05A6BE7924C29A1B32E6317B65B0D6C14131E5" + + "03971C23E0AB9C8439D6F8EC7345825745D3F68AB45D60B01DB15CC04019F3169F6D5421922CCA18" + + "6A5B2C0B559C793DFAF69A20ED7D9573E6B23CB1F64CB7624FF0DE31EA913F86CDC798BA7A839069" + + "9EAB3B017F6EC2B0C265F79430A47BD967C3CA65D28341F9320B092F877AB7EE16D57522983F4643" + + "8FEB3F9D329FF0CC8167386C065445E765BEA3488C20346B82A47535A3F9F6CEE8AE3EC1AEF98C62" + + "B0774E06FF8D4B019A6CA6829C90412D81401035F7C92EFB946FF0729B832F52D387636910DA3204" + + "FDAFB68EC77E299F03F84D2E80ACA19E1AA0DE7A1E4FB0BA87162AE3B654D52DC0EEEFDB72DA3352" + + "23177EAA550399EEB58210415336E04D033F12E7874F956DE90263B6F344605A5D49DADE119975C6" + + "3E4EEBFD8746EAA8D5B8B703AC339BE9663CC3151AA4F4E142E32C9D14C14064ADEAA4D4C635D33D" + + "AE572A1FB1A988568264AC6F059C30B44933A6DA1D0BE809751306058B9A4C87AF3EE8AE276D6174" + + "AC515E82953B02EE2CBE2C057C3ACAAEFAF51AF289507413F16CF266519B69D9658266F2C73121D5" + + "BCF036D2F02AE675CDDEA66F50D26839B36D9056371615D6B19B3B6B05AAA491EA4CA6A90A4CC85C" + + "817A5E1C6524F3EFD02392445300839D14984CD5774B0E282DF9F2389054426EC5673041220522EB" + + "EF53A88257FD15092E8AA44C5A25CF003565B32A287C89772B8B71A23F325035FE37ED7BC8E0F70C" + + "0A07A6AC642EDF87A354EA970B545C0607BCAF1A41DF7058B7E88E47714292286C7808E631937E11" + + "CAA5D2D60625CA5EBA29748395E4A3235F2A32D34CA294704699DD587C10639BE2791678501ED3D9" + + "BEC3B8D98B5EDC2161200D27E1DBEF6A745F06EF96A7E992303A43C172F338531DCD395F2F61CA61" + + "9C3C076BBE17D782494FB750706A5D778FC47C5F3CB1C30417F29A681D20DCEE404AD0E9E48302E8" + + "1385373792165E7AB4DFEF1EAFC2E010C2B01F9E138AF6359859DABBFC26733A54F14DE77AE2B8BC" + + "DD29F17F85DDF2E188DE8E34CC6123B1AC65546D866921468A6C4729D99D311D375D73C5ABD7EB0B" + + "E73600B998FA286F00ABC09F1206C217BB99E026554239410202A5AED459EF18C0919992B95E3293" + + "069F3FD3FE4E08CFD61DFCFAE34D9D8689E59A335BDF16F15D75BBAE5F688BEBB8FB8F17E390A3A8" + + "1448057966A97F81784A26D530796431D23811DED5A40029A7A3CD6117A17C9DF63BD5CBFDA216D0" + + "4E7B682A4F6080F0393D6F6AC0DC9FE0A33F5E1153093CD2EBED21A9FD503C42E7B41A1BAAE9E395" + + "CE1654B5E54724DA87B7158A1947E51C0AAA60338F639A754C6F007F70A6078887C85C67E2249FBD" + + "3D4D9150FBCCF57FF8BF1DAE5102AB7A1D8ABEAB54B646AEB743803A6312121444C913F94BE8B05C" + + "DC7A9BC68A6F9FDA5402D3F51F2A1809A14472909ABDC9851E51AE0E4B4348873F4DE829087591C1" + + "0D49724FC333A01396C07555CD0E5D58F2E69352834CB319E28F40DEC6A7E308F659B8624E7CA43E" + + "E16127FCEF23B276FADEC6C622C57A907E29D56CA0AB5400ACF0DBF0162DC8DC1CB5E7E0B6166219" + + "AA233D004C1175A31E8E4C48861D4AAB05E2584F17C7974D2FC64D031A942D92BBC833DFCBC99A7C" + + "0D4A461751DDC203F9A742A967850871755CA16949BBDC10A367CD63B582E38A096A3983D94040F5" + + "FF9EC19D4B9222430DEBC7BD4D3F18C48DB32FF50B7679DECBD7822F68BA804B67D02C5DA24A8E4E" + + "80F53C1996891AF21006A032354A7AE38986D05DEB3D02B15B5999F398826CA9C60E8D4D5A2F248E" + + "AD9110B3C93980C20B142A6B85A6B9C8E1323FA2B8D2F14F6370A11A2D3547686A7E92FC334B6878" + + "9697CED3F81A2782C4F100000000000000000000000000090F131C252A", + hashAlgOid: "2.16.840.1.101.3.4.2.11"), + new MLDsaNistTestCase( + nistTestCaseId: 76, + algorithm: MLDsaAlgorithm.MLDsa87, + shouldPass: true, + publicKeyHex: + "E4C74427766F1AE8399213E114EFA1EEFC7A85CD583C28B38EDFB5AA2351698ACABF5487E7B721F6" + + "D15D5A60E0D0B629C663D2EF7007CE21C574F3F01A1D9C7A9A80E4DED8B3D14E3996C9FBD4018390" + + "2654B951FCC79089CA2564F30E0437E6EB237522ECEB16ED0ABDB5309EA3C4EBA264A76E4C5CD634" + + "545173284D871528993F7A6187BE78767AC8CAD944896C7AE5AFF07B8CACDF9D9C7C0598BD72CDBF" + + "A379976A180F107130E4487E99F6CC4B5BC0C6D5FD109C7078B1AE30FB38D4A8F5367E137506B5C7" + + "FA7129523211042FC50641993A7114A545103BB8E1C3E68A89919F2805DECECF86E6E1D0CD617EBB" + + "DD7CD49243CD6AF51ED6CFC3B15A49EC32EDA032557235C60ACAA4BBE46F1F170FE461A6C2BE440C" + + "AD47115583D648AB7A4BC6C5E66958637AE62B774969B8CF314B0BF37D87906F0C51E6C7D8AF249A" + + "F5948399D327A2AE6905ED4E76E706073CFCD3449C630C00E558169DBEFCE3C05DD978ACD869938F" + + "08DFE4325085C85AE22B6189A5AE2850BCA9507FED706CDEDDFD2CCF01DC7A3DABD6269632CAE077" + + "F7FB02B28BD448993EA54FA9CB8C73DD40389A47925672DE35489A6E2416340B0DEEEF33D47B87DF" + + "D2A6FAE8D01304DEEC1CD4EB07E5DEF83B3A903A9FA87B1E4BDC4FD458AB816FE0B3341C601E1552" + + "FC4EB20DD2EC9C19ED1C270F0106191F1B588059A93F0E1094F691A0EFE0854789BDDA36CCDB3F73" + + "DEB7A79B86EB91B8950486E5E7CF10559CC73007B95C81F16C8EA013AD9AB8560B266021BA2B943C" + + "A4B95ED75666E1E4EB2152697DCB8FF7B1E84517109261530686D6EEF29C1F08DCAC499E7684C33E" + + "290BB4CBB94A9FD98C519D7A76CB9064356D969647EE067CE3488CCD2ED30557BFC8705F7421B657" + + "627FD488D6B6A0436BE215145689A52B451DA685B336DFB1569BFAE80AF901AF735EB0CFE04E2223" + + "1C9EDE012AFEEAB82CC3154BFF723BBA2B7857AB8519841EFD40D9D2398AB09793243309A9F9F017" + + "892D8380A173BCDD7F0A4E3E490024E553FFE97AAD964A85E8209D6A5C7C6461A7753D4B7ACC2A50" + + "513F6BF83A53FFAF3DFA4778519C9F823865193B5015007D34F9128E291720203442EF012CDF0206" + + "56762351149D02E160180F9EA33BDA1AD23AA53837F73EFD58A83B502E395BAC9DD601657E3BCFE5" + + "D3C041A42E619E95950B893E54CF0D58F1B33004862500992AA95F909A956CEA86886B3E1702CA9D" + + "1CF137B49F5195923AF79EE564380DEAD809EA146A7F652759FE145797F2D50649CF25BCA0465D0D" + + "19EA9B72A08736AD0C30BA4A0205C6D9F2F3E679E9CD85EC12922E39947059B3A8570C9DDEE7AFF5" + + "0CFAF74D2B0BB1BC60A0B1D677AFD560673B5B0A2F30F2C1C225C1A0BFA9CA4638F246D055A033EA" + + "A9316A3C1DB11F6DC73D8EDA93A98F8DBF779287F0B4C6C55936794B20DA2D647CEB6DEC5453AEFF" + + "93580B1AB7FDA81E54B055D80F9880B33E41C4DA4E98FDB92BCA1D2C9FF7CC123BB223D27C5CE2FE" + + "A7A3F2B0E82B2F02879CE0898709865F1B97B0FB0ED6E159938ED9F8E7936A561330FA37B56B94D9" + + "405CDE8C939C195781EC524A9CA934E09D9F649C90E1914D5DF7C34B42225205B9884B3444781A33" + + "9252BBAAEA9D446FA0628F5979B14B2881B702713B9567527B31400209D5AFEEBDF7DE4EADC14988" + + "06A75B3D148B9CD55E0DC677AC9AB717012478C64265078C7BF57E2002F850BDE33D06AF93858191" + + "22D2C83043956C162F704DCF54036C86506931BAD39F90D55AB6806213C0FFAAE59EEFEC9BB229B3" + + "FB45A4E4E61E8BDB5FFBB7BA5A968B6370AA057CB1350EF01BBEF2422AA969F12CB7B8E48BF5A0E6" + + "D68C9D41EAB9B362D13BA35EF6144D798DF2BB28257434B54EFFB725BFC6B2B5BF951EF305CFFFE8" + + "24242D462FE42D88C093CA2CF2DBA8B1035F7FB87F5CC5F78B336769B75EBD850E2F4E3FF3DB9DEC" + + "60A07E718106ED69142A1DEA5A48460104414E0A4F49FC6C91E74A33B1103384BF3496524A462D5F" + + "518B1D731ECC2A6B8549F440C7A432EC0755693E37C2908123CFFD63A456DF1ED3DDB98F776E7C83" + + "3B0C59F448FD106EF784B2F7A78F40DEBE53D6B11DDB5AC5E73673ABCA690590CCE37BACCC07BE3B" + + "FB9329CB6221CEFA156267C5B36EB1FFDDB89C719441978FB8236A9636EE739CD2B302D16EB7B43B" + + "5C9B7CA6A3B94A6C3B2B4731D54E743F951E794B0B775B44250905CE3486868CC243D3AD4DD092DF" + + "554EF8F1F05AB931C030F571F6E5B3F7B911DE435CD8E68FBB377B6E9C747C9F07075DDA3C4CC962" + + "7DDEF56D708C349566059DE1EC48D56C936EB69C727ECE3BAD5FF78C44697862CD5C6D867C2BCE3C" + + "FB8DBE266ADE6DC5DA84C5864E1162B82DDF5241FA2DA159256B63AE43E134E0A0B7092E65F5B4D3" + + "930249E7A1CCE3F9B256B5722E7FBDF2EB97220F06DF0F4C1D2514D47B5342747481E12973B7AFDD" + + "E12DD7CBDCEC9457E1A3EFC8A430310D8BE867E41E629C43A31490655EEF6CC2C5314C796DB673C7" + + "9321F4196B1E0A754310AF055AA2A115BAFF19A1E8B2C7D364A738FE10E02F34DF0B3E8BE5AE6485" + + "AB150B1D9C281F59FEA0CC862B77D613EF6A6FF97A137FCAA8ACEB6112423FC47BA670EBE6A84BB0" + + "AF8317A052A549023DB61A16DE79A064898D38443059C5B4C8641A17C38498F5144CD5BE6CF07A7B" + + "2904EDB3AE8A714EB418EF1DDD638A971FB9C4C1DE9BBB59457042FBEA021F2E9E979B38977F3EEF" + + "B38233352FBB341F492BDCBC1F3198E0ED186F21EF544C503E8F1F3B2D995904B4B9519712B669FD" + + "2070B00E97A258917675602D21CE21872C5D5CDF1656D5E3D023CBF0D43BCBD0E0BFB0443B5AD75B" + + "A5A2365AB0AC68C6366DE97D00B02BFF452374698754CFD8E3EA08EE8E75ECEAF188F4836A52F2EA" + + "4FB3DE06797BA84A757B38730F54D64814363F8FFC202C7729103E2537AB1CAA5A129E96490A85CC" + + "9BB8973DD03289B2C70412C40E9EC2703570D9DF21957C80C907F081ACCC1108D0D0CAF5D98DD7E1" + + "4EB073581A07AAE9A9656C86F258FCF2CAFB29F9319A9587AA745FACF46EE16AA5EAE11CBB141537" + + "3AF84BBE15FE6356188830A95A18D4C17972D44A0B41D69C5E8D60288A1724D5F20FAE974B79EAF7" + + "B1192CF08C8CA5A86027A8C18374D40953DF41B07F483E33064FAAF1082EC09A8C483925148239D3" + + "E03C87952B42B8D3E9FA8C9B83E906948A965A3EF7ED64F1450751960364CAF860009C95208A2A52" + + "7AC1D6F4E8B1034C2A23F83AB67947EB11C118C4E751B9C65889E1A36313FADBB4B953CCEF3C4D70" + + "69A983EC501243DC36A9C4F4B0F97568D00CC98372E5E2657236741843D016BEF2CC6A4FA3F19B80" + + "563C2E9E1648B567236916421AAE4A1F3F688E543C0AA149380A66078EB82DB68803A894E005B8EE" + + "F86126717FAA1D159786CA57C24223B6A3137BAEBB160B9D537D8252BC9D0DC406EAA1290216D831" + + "9E921B22470D20004F490B68208E85318CC4038517B590D9B4686C920EFD62BAF447CD142FDAA5FF" + + "29F633709608E4C4CA7BC4B6900F3DD8521DA01BAE3F77D92F4EF83DDACF64EABDA1895FA5BEBA9B" + + "D043D7EAC831B96C80B8DEA25427012FF87475BE31E64A8E4AD51B33A9A7E0E9", + secretKeyHex: + "E4C74427766F1AE8399213E114EFA1EEFC7A85CD583C28B38EDFB5AA2351698ACE6A58FCB41CEEB5" + + "FAE2B35CF9B911D3EF4122D15B348B7F9DF8EC3A1E63128FC0505689327DB78B4D5F15ED0B102DB0" + + "4C9992933B40E51AA31A8376B4CF3EC04E3CBD3FC5CA5EFAD9A674E9BBD5B916F0069023993FE67A" + + "D91D2508B9D5FBDC028771E1026083228EA01822D8242100405090086920C861191068D4264A9C26" + + "90608201C1402D5C880D5304260A01000BC5010B900D0141050C200CCC880C1C06896116611B406E" + + "9102125140025B18310B406E0116894326520B232EE0309121278D189151008864A0C2818B1620D4" + + "2205112611CB94200204261933208CA0085410659A844C1B26610042901A236248A45122248003C2" + + "042305720C270AC2B85024A66D99C008D3322D0089415C482A09334D0024650C2832C21491C80610" + + "CA9204822029511868D2C024E3464C9C3465E1A28CD8244ED43425A4104A20106958400C23974481" + + "26851102064C160289182E22093294380D942861A10065643871524062500484134444084492C396" + + "71DB1401E20006CB240E93364A8AA0099B169210416C9346650302090A418EDB8861193165423822" + + "20946083048199042A24B44410B16D09238A09A0451A26241125661AB78C13060C01B5041B888502" + + "052891C6700B29264CB4414484851883309BA4298AA631031786CA180C0BA60148B48C42C46C0924" + + "881B448098822C43A4611029029B0642134326D1C671619248CA3204C032058A94845C120C943486" + + "40425291401110C92D02212442064E09432002A64C1AB5700496099A82496444920C9100DC222021" + + "094948A61143080058402C4B9691A4C64808C84848244EE4188122842C48208011A9800043510849" + + "8620A96811010899844CDCB20D8124100B0752089484129241CCB06900C1115CA26058060A9B262A" + + "C21004901480C124891A868C14B204049109C9286053346A1B20420B301119C449DB2068D3005203" + + "188C52368500817123A14DA18828031822434062D2142810B00948C69112A2800299411AA2700803" + + "0543906CDA8069C314820327842105921BC34513B3250CA680A2A88DE22888C10031A12244622201" + + "D814661C011212054C0C374942000C114590CC342A19B58D582410CC365224996123374583262519" + + "C80921A508938051124382D3C65099B84961326C51300E0939204022609B1229A10240A1348E1836" + + "3002B765224602993669D2B42444C07108296DDC08319994051CA42181808D22C48D531431D42064" + + "480491D2084DC04282C04611C1209020280E0C858463146C908600D3A6680828708CC2714B324C49" + + "3065C024919C00410A8604142772608649D2C264DC129024296A1441685C082219B490A494812401" + + "6A1286695218865C382482124460A88500C18CD4B0011A348A01182ECA428840421081B6105B0630" + + "239104048145030306C032841931804C94911A3002044828DC8008632250D03008A3B41014063151" + + "A86D1B00298B9071A1C2690129268494500A430904900D24A6802320218846414A460A0BC70CA1A2" + + "2094128E8B3286598865512401D916914C20700A200C4A1826CB403191280924139298080DC42002" + + "212131A3868050044100B8098086048430425A068508430A4840604A48860C058A9A0860199084DB" + + "282A4B225123A94C48282421C788C0324DC02841134385DA482C221046CC90011CC2511306061983" + + "0123182A84422A4B382D9808311A384D83448918C35141803018B13140426EC8A48092C84D222464" + + "54A44C02974DD9A83042023022257292442483C449132888029984112624DB388E04437244428989" + + "3850091042CA98294CC68510B2091B15285CC2618B244E90121092A45001918441362892C429C938" + + "6D230622E28231CA004562C44DE43808D3360D98048EC3484AA4444CC40489A0086CA4C8250C0082" + + "4B040D0B4065218040E3184D932025C3184049C80DE0844D101720E0A4400A42429A8821400286DA" + + "168221356AD39864D3324448A8711C442121372800C38103A140D038089440726290054C948D1815" + + "324346440C20720B338E134569D4C4404C3606A4087114C028A180451B86210200000901404A3600" + + "4248688AA86050106C1C280D404208021892149388D2964C4A280923C32013032153886913A4058A" + + "304603346D91062CAB7D0530355575FE30CC2AE4CB33B96AE5D78CAB628567D6186AF7F1B3343340" + + "4E99F27EDDD31CEA558F8D08FB56F988F42B82DA4323CF6242904B7E323BD070A1EF53C1BFA7239B" + + "BFB267087CD84A7D0D07080CB78E21B5B5383D37430D4A440909EC9B4204FA7E3D803F7B12BA6604" + + "182F83C3697E371B66C26C838AC7709ABF291614702C28C76AA56572A86BCB847636937E51BDB21C" + + "0E2CDE3EB4538A74B2B8EE6F1B450FE4FD3A133070FD553FB1703359ED16DF294795E5E83D3D6F2A" + + "E02CB22DE95C27F0FC71E3808DD183E50DBDEE8BA8674831EE0D11E457129BE1E0B329E58E949B60" + + "E3E4EA912532A19F0C0E83734620C40643EFFA50D57AA2E9A77E068EC7622F6EDAC166F29EA79E31" + + "1D649ABC1FB49FFEE2FCB3B796976C2075B9F9AF1A6666D4375B2765CB256B3B176B043037D21951" + + "415602CD7BBEF45420B16D1FE46426680FBB3390CA6E5326A9BBBFF832A7FC807D433E6D8F74FD1D" + + "E12E855A99CE92980367F45B7B942A5B82DA50D68C9F3B01382CCE728E23FC9DD0F28A5EED0D33F3" + + "8E762621CB72C13CEFAC0D3A7E307A30932BE826C292791CF8CB97D26E7EA649E176936C5B83E59B" + + "3F61EC22A81A5066D5FA0A339589EE2A3787BA4218FA1E48BAE5DC6DFBD4308805C00CD75742ED4B" + + "0288B17173B3BCC3262969B7C9DB160F30D67E980B0EA82F672B26ECAD889B4186C241012BB990A1" + + "E985FF295E58DE29DE83891E098A8A7D13293253C624E5A96F02406CF8CCA2672B8686701869D201" + + "1F0C0C2232FA623DBCE6510E8DC315E07B4239B460F484305E279284D3685F88BE1FF739A0ABCA1A" + + "9D37B0073A5A9C1EEDE959D1C60832D76DFA9489AA9CE83B1926C63595FD259718194EAE08A44316" + + "60A22E96ED4AF2D57A53C1B2830BA8D43F2D02BC0B127330BB5B884DB08226E1DD780D1706692B14" + + "1B9F78390C2A1A06E8531C42D5217D9E3F954783D5D3C29C7BC10E9560FCFE4853ADA6D0521E407F" + + "2DED05E9EB1D21D4E3E4AF6236EBF7A1C6B9FA134D8CEAC0AF08441BEFD234C0F0451364DA091EDF" + + "0236B0130A19AD2342743D101B1E65C0C8871EB7AB0809159B51F8006DF7A52C3232F41116454F2F" + + "F4155617B1363C6619E90E58DB0115DDD3328F18DD2B79658C5CEBCFFEF567EAE45F0F4DD7EBD9F5" + + "E35AA1B2A249806ABF219D5BD4A8C35C3839DE08E71C7529A81FB26668FB6CD5B6C9BFF124DACD65" + + "03101A08455463457C1F662B14B6624B66144929F705C493DFB31F958FC74222494A178325938BD9" + + "86515559DC4627A6FEC939B143D3A3F35A8F81CF1A270D293216501CBFDB487EE658D41711A2E814" + + "5BC44F2EA5D2BF5915BAB9AA0DCC4BD673C6E940D2DB83213CD1318ABA084111E70235ED681B275E" + + "26D9943F3689E4F95A9C63D4746FE29C40B8645A55A1E84C0DDBFEB9A6FEBB76E3F1372988D9DE57" + + "1EB064212C94B2976014D534FE22605E710F70E0C09176F984AEBF35790F4B0F7B358C0BAED5D8CD" + + "BF9E4EB12290AD05D21E06942DC5723CA5ACE04B3F03F7AE4E123DD5C17F1CFAD9E5426A4982B519" + + "73B2D7AA6B6D53D81C2418587D9A30C96ED71ECD89635DD505586B8E2FDB272F485C0BA3F1F614EC" + + "DA695ACD84B05A9184B5CE4735D1F3396DFC1B0C22A661500FBE7B1E70CA8FBEF308F52AABC6C6F2" + + "3780A78492380BA5530557E5E0DB5771A487EF5D52E30D8A4BD95547B71393557D5E2CD8B4FC880D" + + "C134786FEE49289622E07E17E47B558729DF90D253A0A5E4F9424773C5728956E3EC93F4587F171F" + + "8FB05CA926D9FA107C91415FD94E51F589B835249F6FE73586285815D4953125D84E9D232BEC4824" + + "6ECFC3F0A7820EC5083373996C34C9E426AC6F2D198D8D948BFB4F08666F31E3FAE432C958F8BA86" + + "E50BFED87609260667681D11E7CCAD7B26CBE423213A6A4DCEF1E3390382EFACE3A31DE2CF63449B" + + "F1C8A0047A8B8DCCFEBD59C24BA64443AA2F15100D63B7808878BC7A5967493B4B95911289182229" + + "39CAA0AEDEB420377FE92109F3FD55E1BC424EF733BC3D9A96E109DE92BAD505C538670EFC6FF794" + + "63C54CEA07A99BDA33F8C5ABEC7869F651016C15D8182D1E7BD3DAF3CEA41788CFA918D7424F62EE" + + "20B16CD719AA3BA4F288A87BFB38D5620627B030404ECDF0350543C27EDC7BEBD4A93AD4572A7971" + + "CB0C8513D028639B746E3CE4B79284143A821D0FA8E425DAE47C3D0AA22BC6970D864D822933AE3C" + + "E3F879A62AFDA627DB44EC9850CC0456A27E361A409F82387EC11A6D06BF27DB302BB81BBE7BCD07" + + "D4C9DBDAAD912EAD63ACF61C8FE79F48B61F9F192E4718B08842FE6698ACBFE8E9375BA488BCCE2F" + + "14093752518A7DA5BF894CFB008FA5015DDAF63F5A2AB0012BD5DA894B12B83DA0D518E2D860D21D" + + "0B1289B4E3EB8BE9D1319B17D5179C5A33F6B5B10C287281BD1B50B8465EDA86B88FF81211F9E864" + + "FF4FD9E34E5AEE5AE7919638C151E0FC9C2C5DFDEF276CF0EAB5D6ACE6190BA94017806C4A113A68" + + "78ECBB27DAE7B4C97D5DBF1C21339828B52F658332B822B32F6E1C0FD6362B2C0BEC17233DF772A6" + + "871ED286E6488F6E253DC8D50D21B002F70B9C1167ED68046D65F6F95AF1854E20C8807347CA3EC2" + + "8073F7D7126FE614B758795E4ED2CE612B2EEC91AD43887220FE83BEC1A1707CCD1FC1652CAAABAC" + + "07857653B07103B86EF42A2D35BED007C9F8BE5532DDAC62BE7FCC9F0CFB1AB9FEDA3141D68CECEE" + + "672465A8D2FF42E3B2AA3827B0262EA31E1FF7782052E1C54C133068E300BA29E26D45353B63C8A6" + + "5F6C6F7089C5F86B034E9393650EED4CF4849BAB63605DFBD8BBBC3382593359E052B6CBAF69A13A" + + "3E9C6F173D7D27F79BD0D8CE269E267E363F82708DB6C7418D2E863C57FBA7F640BDA3FAC032D1B1" + + "69E2D48E2D4A715195CDF4AD8AFD215DF4647B05F2C645BE804B013C4928823328A5FB21832161FD" + + "7D89FE685EC5FD533F43B71DE3B214CF99EB750EFCE2F5792CAE12971FAA920EE3D4C13D03B0A09D" + + "C6CE13B1DA3F804A1E83B1E936DD6D63A83962A13EBF492F1EBB6C1330A962EA92DEF4EA6C83C2C5" + + "51E4F9DD932455C2ACBE2EA4EBC0ABCCEF29D59AB9E3B5E268A9DBEBA3C518F2BD26B1D3C019C532" + + "5456BC4849D7BF8346759E63DEA1D0BA93A1591EB9A983BBE79EF9BB4AAF255D97E26B2CC1B47E6C" + + "6C02448E32FCABB4F86FE1B228F0796CC29EACD3765B0906FEABA1131D2123A508043E0C2F887028" + + "871CAC2C416C580ABA66E99498714E6E1706AA90506F78B23947EDCA9312908F69BEBF0F3DEF44A4" + + "EF049F6341B13CAC0B25729CB05AC68B762555705F7F51F96F6C0728F19FDE49E82D6B72FBA1F85F" + + "F46B06B207B3608FEA19C223EB082C302E6F3BD5BB1A7F379C777095882B1C4F256AD3E542FDD212" + + "B686B699E42081427AED5902AFDE1B5A5F10787681E8FC9E0CD993B251BA0173C5B64F91856286CD" + + "455D55A879AA1622FCD00E7D92562F925A43E7DD9E0DD242B3876DAD45FB1C05EE0DBBBCC6C4C174" + + "C171AEB44AD996C0E6224F2FD326EF3C84538A5EEF6661CF9D5E131B69A57A4406B7DCABCC95CEA2" + + "D364CAEAA96C5C0AB4186A01F967D9D4B6FA94572B1BEA08BA60A4B554988D492FA285C1AD229A75" + + "736DFA9940661A5F70CAF7C204A4EC5B6F61A9C3255B86F16645CBAAFBDE33ABCBA6D1A6EFC13ECB" + + "CEA8F042287AF2FA800739FFCBD081863FBD13186E47BD2A74DFFE2A1584B72978AFDF42D2A4BCD1" + + "173826DB3E3935953B5416B245C0E0D50A6405D5F245AEDCBB3ADAAED0776BD1D17215EA45A79CA2" + + "82CAFF8D625E099C91812F827142DCDBF0041AD066761EF5F77CF8FD1685990A4DA8809FBC4CE014" + + "15F45246E9193C79D62301F135DDA3AF45453B145D65934016D5FCD417211F577ECBB6E8B95F9606" + + "917972DD5BEED9D847B15A41AB159B6811B7FAB300C1539B37CDD6F72B920141C6108E20792D9207" + + "E5BB99BD2FC99D32B14AE83BDF0865903E94CF5F0C3DCE7F78DC3AC8576634CC34669AC846A8783B" + + "478793609C78720890F8E1C0612C024813CF06EDA8EC84EF9D38A626C568D2AAC2AF1FE0681F800F" + + "5489657079779E9B77DC7C0185E22D3E1618C71BE175FF59C5F21043F499CA487157F5DB169FA3C9" + + "424B9D9BBADF2DA7F271F97783F0E411AD76593FDC97BC1F4810A0FDC37B34985D41F856AFFC936D" + + "F29A35DF19D74968CDCAF404EC3C439E327691C3481B04B207D8EB35174D63E37E5651F5ECE8E1BC" + + "1699EF5E3CE1C7B7ED42BEF2DC6C961900184B5C899ACBFBDD3490A7556368F548093B96DC98D2E6" + + "4C1F64E8162E5BAEE0A45B977CC742579281CD90D8B9DAF72B4F4599988F6BC69D6E6BA8BB48A189" + + "0264DEA858114C0D679EF426DDEEDED8120F48CF07FBF516ED2892020B0EC96FECFB95E767037834" + + "3438EF737B047EFA3F3A8C1A8FA6C0BB5260C3DBBB4338A32EEE0D24E4B8D602417FE0053B6C7714" + + "485CF9F070297046568B98BBBFEE565BCE6C6512A3A974DF85E98567B8B454EFBA8F5A1E052D0DD6" + + "7D451F775601A11834412DF3C799000490D97D2472C311DF7AD0A17695B2853E6EB1B01CAD304DEA" + + "1DFDEF09A880D8A7DC10DEEB02CCAA351751BDA69A0B660CC58190426E3C97A05884C95864037446" + + "0752D578C5A6050B241A2F17F6053DF5", + messageHex: + "9A2C094188667CC328F9B4F22B2C8E0E44B3A5BD0CEBD2ECDC393A7AE68ADDB33827FB13B8DBDA10" + + "1CEF7749ECCB440F1827A707D0B116953FC21C637699B39F42A0BD703BA736EBBB766E228012AEF9" + + "9CB113992A2054F59837BAEFC695868A11F85B9BC4E1C02BC0D22725A6AECDFAB1E3F8FC23C5989E" + + "3C8151FCD2F7BDE29B14D14E0C5FDC94AD365EC3BF9076E9338DE68478219EE34668FAA0756E621F" + + "95E6B51C9801889768701EC2A8DF073722C76A341653C95031694F94F74405CBF806A3C6C798B19D" + + "C2FCD84172D04C96FDF1E57A3A5B2538AD7DB5499E4A9340B29092F47505290742A4903B8C77CEE7" + + "B2EEDF8A85B75C8BFB18CCF1A0F342523864B841B7FF84DD7C6A3296E62051796E553DE19DCBA56B" + + "D14AF4F9E2A571743B765CDDF13D3CEFCF7C562A222ED6EF12AF9612687DC99442AA7EF4EF535AD3" + + "9454C5BD1063280567A55E6660E715503FE34D3D7806C800336C411942A4952DE3B611377E15D35F" + + "EC0F18307DFD0184C3C19984813D89A68B44D2E3C3151580D5DC64616CD911D868CE7A02AC544406" + + "50052F58246A0A47187E1090ED3B2E6712C584C203528AF319BDEF8B85A2249BD4BF1FF27C27455A" + + "9E67B3F6CC2A95575A00A4D1EF18C670F8AB7F6AC5A8AFCC75DCBA83938967B69774DBC9C2829E98" + + "28B434346E9A778E43B37BE3DEDCCF793176796AC3BE0C8E35126B67A70923748E5D479422E142EF" + + "467E41A0179CC902DC82D3E5F72CF66F495616B189BE0D84539380A7DFABFC055C7097BA2D56E54B" + + "C3F525B58E77070E05263F1EE69E60DD396FF6FDE88DF80137615CFF3BFC968875FC4FE99C46F449" + + "916835D7AD3466B970D2B7C4DE5B4713DEC2FB82C199773BFEEC524D57D0B0F033D55830A1D6C433" + + "E31D98B2389575C849A7B94C37271FE998D6AE71674AD70885EF59542391BB980F32AAE0830F12AD" + + "5DBA972FD836E08D297CC15C6ED3658DFE1BC14A42D382E1D6928317B4496659331D44CCD8D52347" + + "3A9B27A672922A924A5E29E96845CAA2876F04FC7D1A29512234EF9965AFEC27042A900C750950DB" + + "8E0032DD9A888D23B6A97CC5FD2872CAA89DAFC36EB9927C3CC472F668804C03340125F0E5D1EFD2" + + "F75D52F82C29EC7721F98DC20D85DDB3F017AF8A5B858008A2A9EEE9A094C3355FBD494B6D8394EC" + + "4FCD7CE989EEAC23EBC584A8074F8F40A8BF7BC0163B459DE216B0BAA9C97974C0B7DAEBC629C71D" + + "690425E531A54C1077F214E6F854A429B84212510C162811AAB54E54600733BDA57415BA64FDDFF5" + + "67BCD0D1DA242A0F0B3AF2F9E76D927EBF8AE3119AB3CC48C4EF0A2363AF63AA3CF9BE9E95E79B8D" + + "C7E9082D4FF8ADB0977869C8A81BEF265A66B976B2F2F8136741F2941E29F729528B2D89DA27AE7E" + + "65BD165CC3CAEC2E8EDDC88D10ED19F573E254FD76126DADD52D92954A7D0322F3CA63CBE76BF6BB" + + "3F69A78CD7CC56E5207707DE4AA148C988FDC8B9862B9735699F5A66D33A6D7AC09E9FBFDCF6AB9D" + + "E719C0E1B26DC24D31370654E6B65ADE28838283693DFFE159B94B0CEF79008F52AE70E10AC0B8EC" + + "23C4A4D21BC6340BAB8E39DC85FE4B57FBCBA26B59E511D509221B1AC2066D61600881B594FAACFB" + + "25A4F2014F0AB16EC932E8782118F4A57939CCC8C259B09E9088E6376C148AE343C3844E8A8B0ED5" + + "EADE7472A4FDE9473FEECA1FDDF0BFA9F37D8C5DDF9B4C3EA58C760B6034944358A9B88203A31B1C" + + "E5C6D2B9532F70B9CFE4831ECF667FA2607816BF1ACF0E12A81D4E4DA98F8E769C5BC45F3EACB6BB" + + "4C90DB6E473C61A6F762119219B777A92611660AEBBC4AAB52CA5B300D7705710A2F77927934240E" + + "273A0AF43AE140F78CD1D7431EC1EBC32254A36B4B89E101564C735AAF047BFD5584CCD7806CFFF5" + + "36A6BAEF795BBE7E8A2696F4327993F4118A603AD7779E47C0509EDC4075EAB948D5E4DE7DF38CB7" + + "874BD14D4B3B4DF4600C4D6A2548CB1B8538E2051245C95B74E130806DF3005EF58683A292237FA3" + + "55B1210AD15E9A785552D27E52813E0BEE6371CADEA3A582171EC9C0C1216D57B734875050B7BFE6" + + "AC0E231376177DBE4745C4FF7B36D7DC0272C29144478779654896D0408550B263ED01B67FA8F4D9" + + "B00D08499AD3A04D04C7D6A16A22D3AEC5A3BB6AF12ECC508F5ED21B84DCA4D9132CB418F64D1D20" + + "B388FE0CD5E01036098693248107066426FE96B7F353D603D4AC817A59DC3458C73C72F792F24E26" + + "16C66E5AE0788594A70DF42AA6E45D257F90FF240627FC77E1739C069BAD711A293D9C50785593D4" + + "D187A2555415CC64430DA5040D7763B217E7B0734C561B496248407249A03225940C9C69DA135F91" + + "E7E95DB7F7D4636AAFE5F0AB7B28E06DF17C69B3A7B34DA0C49CD870E1139808922B9C2DC30CC6CC" + + "FCE8259641F7C26D7D7D7C721BF1BD831621C3BDA06052D57C32A23D965EEA6EEF85A5653764C288" + + "5A79D133E8153A3569328CAE7BB551A14D5DFB037F1CE74EB16588562627B6A2D03E73F2019F3277" + + "3522597DAD9CD377DBCB8CED0793C7CD6BD2D31B8D7057C3B0394B4E2D2C6DD94B029647E9532185" + + "8015C67EEA66DC1B8DA01F6F797E7ACC6943D0CE21548CA1497654E3AE556D8B424D99073DC10680" + + "086CA3BACEB750A0E6459C57DE63D21A1C033FF1E7E488315AED26C91E6012069AAE32F46FA9A588" + + "683CC83786C7786817B7684FC7A12F3A6112637340B8DCAE7D221F57CCEAD285530693171FEA43BE" + + "616682FB0E8F28BA05FEDE412EF88FFB54E721C986DACF99B277DFF05B35394053926CCFB331959E" + + "ECA5319B8385FC32F6EF4D582A9751CD36352CA42D155F379A62C62B2A86EAA13F4B60D7A805CFDE" + + "1B0D05BB6DD3A21ABD97559DD2D5E94C7CDAA05364173FFCAABA2CCCB10F658BD3FE791762DC113A" + + "B52A426A82945C6B1812E60D91A3DD952567987E0E57450001D7322E40015F63E731F641AC646342" + + "393A24F60F6663062DBA19C140F96CAB6CEFCFE5D795A63C09F674F4A90B4F3F28D8777B03B2F0D1" + + "BD0AC3E73E685A5B269F4DFCA38C1AB0B527A9FF382110F1A157299A55934BB9EB7372F2465B63B2" + + "F6AC16BAFCF1975272CC0E4E6CDC4530FC0A42A11A50083D5A49ED3ADE8D7DC47515DC7D520DFBE4" + + "F943EA5DD1A503D9AE507FC420D9C7D22A68C7F8D690965D2ADFF46FB5F3817CCE637BE12332A621" + + "41C3CB74EAA8A469849171D389C94774250E9077C6459D7AC56A6CC4434C649B3C50C11D05BB6BBB" + + "57BAB5536E47E63A27BE2D87CDE27203E1D1305663FB243AE5DF1A70046E3353955E5938497F4BF6" + + "C0D0BF6886497A56C0C58C380F0119B1F3FED2B93DA70BE626B4D1483832C96D0A40577DAC1838B7" + + "9857180F555A0867A6926B12ED5536184E6B81BF0113AED8D5E2921769C0435F11BF0F74C05952A7" + + "74D35BE70B9F509D57C13DF0784977A8CCD869A8017C3B027977B13DF28ED98B5CF90979BB7AB13E" + + "8A9494A4C2BDD7C2FC01029AE5AEA17D4C1761BDDDDA31EC6500AD4F0C74AACE734E56A3FA8819DB" + + "358F17247A3F8C094816ED6549248DE1378E2CDC980C5214267DD971B8EA933A7DAAE26BBB697A91" + + "DD465B5E88D04B4DC00E8D8EC2978617FAD28EF5D0694FA474753695724DF0C51CEE731E234CE6B4" + + "72AADB078F08AFB33F54B8AB2F978050647FAB6E85BEF79B161C96724BC66BB37EBD8C51BAB4241F" + + "E4BC536AE906E1B361BEE48FFF6572FFFC96BBB328947093BEA1B2104BE10F490EABD4F8BDF432D2" + + "D0BF06BB59295530CED833CAFD33CBB8B4105E1BD8B172687A3DB9549540D72F60B9E7F34D25A31C" + + "BD8BC2BE498987C7FF6A389423928BB7B254E0FC4612BB90967C5485FBCB22EDA582AD646825BC5A" + + "3AFF6751D16DACB43EE2BE7012489E6BF02BE305E4C1C767BC0A02D047CA9971C4F345E57DACBB7A" + + "823847C232DFF7A752F52F0297804D7FE4E4FD8CE82FED85A5F04F0AF0F1601F2D7B863141AC4CBA" + + "96EAFF34503E6213FD35D6DDCBE8F5096A886E7E998E9251298040F9944AB5BBC2C975DD38570E14" + + "6FE898824289A06E741B7CF6670E830CC7378C5F52D1FC96B719676B576924E77ED68C1D9B5989B5" + + "DF93CA91E16CD42A35CC475C3F8DEAFB0534DCCC3F7F013FAC5E633C38B9D90F94CBEC3DCD02CA94" + + "E6A7EB58A8D045E212C5D674691E81CCD09793AB01BAD12125F02D846FFDC1DCA845EBC14CD2D73F" + + "0964F709DAFEFFC2505C3A8EDE73D9D168382A7F104F4709CFB17368E1D2290A26721EDA8C395950" + + "703DD4B706908D1CADCC9375DCFDB1283F8342344E6FFF2413411F6C8F879EFBAD077DC177868D12" + + "E5C2D7E1F63C4C46DEAE622B340657EDFF4B3D94A372DE85AD89B228448FD6A1AF773AA65DFF7051" + + "D5C2DF6E0D4C845F30C1514E273C89206835E0668E2109BD1C6F77B96687AF509965D12C9347BB8E" + + "F0404A4D4DF3102630A12E0D5009B6A6EF72B5C8DA75A07A0F9F413863B9C19742307045C8F82FD2" + + "37522E0602BFF0DA9D34E654DEFDBE608512467DC547795EA731CC40E454DBD5C694C598D5258D55" + + "1C067FDC1868C80E705499A3CEF667FCEB042C90140CE11D11FEBDA70C2EB41FB614742C446462D3" + + "C1E04CC571ECD4833CD1C78A4544699033C4407A3C8AEFBD190B8FA27AA3CEB28E71D47E9D15E152" + + "79F931FBECCE2B46B6EED01217F144965EEADA533E4D7D6DCDB358708A207F04D6586B80204EA7F3" + + "5FCEEFF7119B66E7E15E9E1C19B8AAE57A514993C28A14A6E6E2AE7DD826F5FD07F30CE832F7BF16" + + "471BFA9EC766E685D544A7154BAEE76BB622EFD1B2AD02DCFD6683FF3D802921679541AAF5CBC8D6" + + "B3602BDB03F2638AF34A685C1927AB88C5F06A903C99E50120AB08AF38DBB51F7E08F85D36C8CD67" + + "F6C099238149CD6F447A85ABEA46DEABBE62A3D15A594B8D6DEAA5E697F0034A9C55D61B45A363C3" + + "7C63098468230923EE8F4D3A136ABDCDDCDEC7E50D49D34EFEEDCFF46ACD3A0B9CB63B1727276B35" + + "CFB22F6A3E02386B4A41E97FAF007AB77B30ABD458D9D61EF98C3C4CD5070EC65E77E587004E7EAA" + + "C127CE41EC3497D802101F35EDC9ACB53A30B8BCACFA931883D6B447D87DC89A66989D048E114FB1" + + "48E846681F919C12BEBD05C9E8E4435F2C5D523BE6E0C149793EC789DC6A733FF9A0A1EF5ABF75D6" + + "119A2899C742D92D227A6F01514852EAD8A1289567AEACE657CC0BC11265DA9C5EA48438CA99EBA2" + + "D42F378951CA0B0562B455345CD47A96D2F333B2E4AD5D5A03C1CC5D4DB49E2DD68469E2447FD98A" + + "7EEF6E6FC0DD5D2B01D2ED69C7C2273E117B082B558AF4D0231612B9007B68BF5CFA740BEB6ED60B" + + "EC22E74285C244E93E6A5EAC3F3685F3FB5ADE97E94A4EE914722B0BAB65A86F284761DB7DEF2A02" + + "ADFB044E657C3287061F7193DEFE534DFD6532B0C4F1E442B8C32971BE8C136CEDBC953D974B4E47" + + "23EFFC90A8603251B91F67915C18BE42389B9AB3C4557703B019F3104F0D6D65F68EC882341DDE52" + + "76EDC7358FC385E0CCE54A05B144D6EC7230AD87B2A93E8155F754E2F98B2883A14BF89A41EA345D" + + "A0A5B98E8EC25C4A70C20E5CA17F9E6F870920C32126868673D9C70E8F47AE808D4E065018C68A75" + + "BA750880129C5C685A88E1EF6BC1ACA7F6D254193817C0794220F8FEE8F8F769F98B84CDCE7D59C8" + + "F3002550C0F0A1864CEF480F2F84013F43D6FD6B64506880D8A2E00C47F9973FE2849D3A5603503F" + + "8B5D4E5178D00CD998CCC765BC3B4D903A7C5311302DE39B40C1DF3C5D9A0C0A3BBAA7B1E1A3FC2C" + + "B310392A94D700C2C0FBD4620E8CFA330E2FF475FCC0E9D1F75C3DBDFD0D8C0EDF629D2A60F2CA35" + + "36DCFC476C03667978A5BF6DB1DC8E513A991C5F0D379EBD424066740572D8CE9DA6518B11246B14" + + "BB4AF59CCBCF4F46D7A39D38C068DC88670E6CD71722C36D418A3C012265F4D7D2DDC7E9C006CBAF" + + "187E97C8E01A59D9A774F106FC3EF18334B5A3977E67C46E6C7D531A4184FC5815681609A5F823E5" + + "22BA68E6D4605526F7096EBC5FE1172E873DC104FF7B94105AC5675264E98DA272027895964BAB2D" + + "825295D694571E7CBB7BF2339A95E79A50FE32808DD7788DE002137D5DD3AA7A705B99E616E50E8C" + + "45F52ADD766DA4867FD66940C61C881C39ABBCA2E46372E55869A03F1B6770B93EF89C16F3B2399C" + + "A5F8E0D0B803E4119AB54E869F4D85E10C1E90B00A497E60A62143AA2D23D187325CEF69447E03E9" + + "19AB8999C717DB81A2C93AC53A6BF89561254EBCECFEBC234F159D7BCE27AA46E3CA1B03DEDF86F5" + + "DD2FA8E947219DD0D7BE90EFC4E7B335AE68794E0CB9B14BB281E6D73BD053F21513A39F336A8BC8" + + "64AA347F725DC7CAA257D332D19C0881CEDC54D3E9017A0B3E034D8CB1558D819A4AEA143B7F2806" + + "54D0D9B6DB92F662A055F4C1EC26134EBF6FFF9A641C9A7B0DAFC5C7FEA8D7C39D40FAFD50397B3E" + + "9EB1A94CD19A316012E9BD1243C5474FCD29EF57D1941349A1C55C1D8726377C814260AB6B68A5FD" + + "06965C12F17889F95E812387B6FD81FF5D14B4769738F66FFBAF8ACCBFA6D0F0B1A5555294715D56" + + "3CF4567E95332C0C0F20523B5856A25CE9F1834FCEC5EEB5FFB8BAE20A9120AF500DCC3A94E0607F" + + "FF5992AD5BCFA96B875FE3B420AE63092EEA5EF5B22B66A2CEAD0B02C22ABBCDA5A4FD32CF1C9F5D" + + "AE6C0E7133EF5D5C0F8E6550AD0623FD8C61CAFB2D57D896D017A47D0A7398933A0BFBD528F20499" + + "A9395A9AC08CE54A2108A567B0DA69A9423663388806966A2925DC9250450532C97AD597011ACD34" + + "502C84A0DDC1B9169E4B1B2E24CD147ED05BB58DC03576A6A9832869F107F55D6588059C8566C5DF" + + "B39CC7C6EBAEB5F2E4C69EF67832BD56C80907A2A16DB3651206DCDABFF8456F512EC07D8B3FAFB0" + + "26CAD6A46D07644262C595CAD6160D731A53059B5FDBBCBB6B0CFDDC741F1B5DD3DEB9AEE0CDB917" + + "A13CB57BB4B07B4F0A349DA79D838FDF78B771261F057E1841497B526618A8B7FAA21EEEBB3473DC" + + "321DE2F3385DA64E3020C68984B3BABF2B70B0278DAE6CED27D50444D1BFFF3F41F6DADAC5A988F1" + + "700800D205D08DFFE6F0ADBA74B4D30CF7A89CC14F175730F2CC5911B2A1B0D82B24DB61BA6395C4" + + "96535B29EFF20B9B088D7B7682B4164C69BA369A94235242199DAD7F4FDB99731E1F756563C1EB29" + + "66EE3505E3C976D8A42B3D54D6B3E30BB9BEEADA1C72893E925F40F98CBB77A60E0D4E782F0C0104" + + "78C9F1D91A2CD25E180120DB67F937B5666511E5CEEFA296045780A912FB0DD99A52D45327F0A3A4" + + "440EE82E517CFE8FB760733DE69B564D1D19C9BED1176C003072576689EE16DAA3F780243CBFB0CE" + + "1551C07EFC3E4CF1B85E423DCA479CC43324EE014A13E077DF6F7C328D0FAB5F5794056DDC9F241F" + + "73A2796A66F54A1F2A0D34E71F07621BBF9C1E205DBF9332C8A9331566C6D2670C0E09AC2E9F14FE" + + "90D9F1204173098BA96B34AE07312D7C4FA8097BF3DBF91B2E765B28920C86F34B25528B3CE2DBD2" + + "2427F05FE200DD68379BB9B5925F23E3652D031D452DB29ACB16AFE4996418085E9CDB17BE5E4932" + + "93A15545A65209FA09EBF054EB396FFF3EAFBE2B3370098DE15F079C5A2DCE5682EE56B42CF14989" + + "42E255A3F2F967663935448DB4CC20EA568236F0DB4BDD5F8EE24E529FA835833C72F7545B600F17" + + "50E3E8388C5D38D041F65D617486FC3A37B0030111B849216ED1EAED9C62E0B3E4AA77D785140F91" + + "E45F0BE9C9A354276094B63B13F3C2C7BA6E4D9CEF1D304CDF2705C9AE5CCEEDEC17F5D37F048FBC" + + "6EDA0ACDAFC0DAE97425345402FBA8D9328AED5960C3016B6166FCEEDD36ECEFC2509898F763D7CD" + + "80658CAFC73054E805D3096BF3520C06720130868D5B4F00D5FB8556E4AEAC3CF6E1AB6CC9746C91" + + "EC8A492D36C1EA48A77C47A3A0CDAE2CD2552434C240724F00402DDE9AB382B9A5D0533C872156F9" + + "30479756FDAD7D23BF451F4B2E126240C6D14F8CBB1A8F3ED344501DF06E72F2A05347248139204F" + + "CDE8F92AF255FEF6ED44AAF913F64D776C18901EFC4B0CB86F11A02D094F8471CA63830892FC5763" + + "634D68FC26E2034180507405ABEAB251F18B2649B861445641D1DB1738CDC7E11E3B09AF9CFD4496" + + "5B598F4DA6C643A57BBCD559DD759F6CFD05FA6B785F9B0F9D1ACBEE902E0DC7E503BF58CE415B3B" + + "3C5377D3DD64FBEA2A99DDAAC429991AB15D8E010180F9F28FB3BED960CA05DAAFBE9512794C6C2C" + + "1CCD6E89209D7AA4DC1F22D31C0AFAD265F1204A9118B79923FE473ECD7639D430AB0CFC525FE3B0" + + "FD4FF1176329D8F6FD6288B3219DD729C9C1E9044D77F3CE3785FCF501F735EEA541E86842815A0C" + + "0294B6C145715A2DA00EF4874D88F1E5B83499BD35DA8BB324CE257BCB7738BE48368C3F5DAC02D1" + + "4332D08DAB59BCCABDB3E07A40A2438ED4136E48429E5F709CA0E10A52AF9999AED960796960C793" + + "1667192BE8D45E2941DFEEF645B1AAA4AB39ED73ECD331D7DEC94F9ECC846DC20AB4FAED420BAA89" + + "13CDDD84867762FE782DFED722D24710545C36935E72F71F63756EA8B022D1A911104534E3853315" + + "5CAD10C3A4D137785CAA1014B4BB9A5901C10AB98DBFAC88F0A2A85A4BA4BA6470EB4FF9CCF9E06D" + + "2EFB675CABC24BBA6B90D89EEAA400ABA7DCBC843E6674C407BBD7007506EAD95FF45D8D6B5365AD" + + "26E7C1BF68C22048EBC4FFB6D33F628C89D2B0117071A12D5040600AECEB70A6938FC3A1F3FE97B7" + + "CD477117333B1AC0FF4A79DBF9F93DEA88B5BE0079EE905DDC32F2EDFF61D703AEA90BAE5C2AE20E" + + "40D9F87C494CD8867DC302CA014561D9F5CD41154A5B99F8C6C228D27FBBAE8B7FC046DAC7862B1E" + + "473C4999599DC6D77B8B690AB561CE86B4C002746B20C2C65D5C68C81DDD645FD8F77618E24EB8C9" + + "3793F242820BE7E78863B72BE50315BE552BE81267FD6A6ECDEB159D4957E96CEBE77780DE17F245" + + "6ECFC6874B314AED95C06FCCBAA4B1AE14D159745156B74EEB035D30F1AA7EC5F7A3B619AC7F3F27" + + "5F67F400A5D56F4918682B5DDCE9E925E972078A59AA5489C015A12AEEC917402E365D3A7CA0C1F2" + + "8DB7DA45343FDA98CDA5E2C3C06E5DBDA171A166C7FD00F2AE609DB782B6CACC36C7F8B668F6FA62" + + "7C6827EEBCC5A1CCEDE0F1476CF7BA866D433C2FA25701F5939F89613A4B9D92B80E5E81836E35EB" + + "8F3F0E83AB5E6BBF2833020689B371DAEAAB5DF2B0300BFC639CA6D8B7E3BA7049C5E21332EBA0F1" + + "913A914647012F5EE615653EDE7FB17253406F4C50FCF9BA794A07B91257F04FE93C7161A25F3DD3" + + "E9F6D5B09E34BA517FF46B223B8A2E029C34A585D41855BCC6037299D03066BE63ABD67EFF96EF1F" + + "CFDCD16714B6535CD64192091DA07EBF75D5478D53892D505C7FD88FE604442E3EC22553D8CB910D" + + "91C623FD80C23D3C3ABC8243C42DE2F52FA932A5C3E422F93F13CC5ADCB87CF8180BBB367E5DFA8E" + + "249C7308FD83410A1D020C54C3AA194CFCA25B7B5162D8ADC580C7053700F73BFEF64FDD301E9B9A" + + "8E1DBDB5664178E011F2367699F884747AA327991ECF27DAB873953C8A2A3F3218F474D6D65351EC" + + "1AE5D55FDBAFAE9432DA086F51B48F02F49308B82E93C6E7521126488CB74E8213784EADD21C6EC0" + + "2BC4CF501291443F3C018D24D565656893A87B4970DA58012B1A0195F3CB0382B7DD1E93FC5990CE" + + "5A9622E4B9799C140D4279D69E259E4957CCAAA25F9ED55FE6479D717A72AB0C7F1A6F0E24AFCDD5" + + "BC6034C92AE9C9554F9806A7650FE8C9A54794874E5975410BA3C0687BEEE25D7310B148687AA67A" + + "CEECCBF0B4B6B03F82EAFC070D41E56EA99C44D16497411A89BB5E154E6BB3A24EA2C834C81FDE4F" + + "752400BC086B18D22500B31C1DF41D9720930F9306256482A6057226130B6E5CB961C5812E62AE98" + + "4E653BB2ED5AA7C0C8DC3F367B97B13AA62E1EB604673760B3A177C5B5E67360CA8B2AB85F0BB1C5" + + "BC778D4B6C21FD30267A67A2C27824791D9ABD9F2064385627AC5879C8D8B50ED1E12E28E055FB71" + + "409729ED3C9B0C2205F390141983A7EB9F6DA068923EC85068A43ECF9B296CADAFD722C74FD8C4C8" + + "14EBB890281DB30FB0CA514C02AB48635F79C50163200EBD83B832CC9258B5F1B9A313DBA228C92E" + + "A5A1EFA9E6EF66E1A4B51F04CA7E6B27C65AB8F14B58B1A073383B698CEC197F7E8F7FCF48D5173C" + + "AA7D2544F8282AF50CA0C7BBA747BE2571377EFE2C115FC9FA182DF47478C78E156039097E22D8F1" + + "37677BECB61397AB84F3470F632D9DE487A367D01A615D888C7DCE3FF34219B947E12CC9F5E66D61" + + "E84756D100540CE3A02D4C97DC1FD3633171D2237480F3DBC548636F113D11D33A43F0EDC58EF95F" + + "A043C0E71EDE02AB513D0607BAA8A5D9351B60FAB3AD2661146A75DECB25A037788DCB1A5A29F725" + + "42171D389E263EB022BB1365C671EC6C5D1A10150444C26F75A52DF859C7944981266B9F19837C25" + + "7F7A238D9416DDA68524E1EE72794CAEB636BC1A4BBE2B4549A87CA31871903E09838E51F379A631" + + "C078B6840CDDF1FECA8411AAC285A90ECC16063A479D1F3BA8EECC64771732C7E07EA0F4CCF75B4F" + + "E3C44137AD392CD6E80569264087B0616D827C682DD4C20CBBBEE3EF5C9113353D47C2F8FE8CBE25" + + "56FA393924EE86C46DFD85DF2D9897A5BC40C36B5F83D0223E8D14C64B1E5EF262A901C47A7E4C7F" + + "2942722DB352C2510E0D165D7E20CF58BEB3B7706DAF07E02A3932F0EAA5B3D29D428C2EDB8FD6F6" + + "FD827652FF882C949AEC6A2D51E9C1B6714EBD8948C0D4856015E5ABB5694429E1085A2F66782FE7" + + "C27AB1BE2A13E883ED42981FB8B7FF58B1DDCB2E70EF0F4BAA9441396DAFF8096E7541471985622B" + + "43569AC5B5EFBD2342C7DE5E819D5D04C2CA448C3F2BD987074D0F76DA411F8F3B4CCBCDF3D215EF" + + "218165463600577DEC1B8938159E780F248D97CBDEDFA4A70E155FD81B491F4B03592BB83BFD149F" + + "19ED557EE82DA49B25E717121D18484C39A0444B9F706B429A7266B9399EF63B9FB5E4272BDD4852" + + "60FE49868BBABD691364563239B454FD15815C318005996F6DA3CCDB825CB190D37D00F46D80C3F6" + + "A3E6BFD30D64DE6C906683DD6E1CD061F3B7074FB16150D23764971821E564985ECA4D50668C2674" + + "F27E3CD22EE8F46A9522D9D21922C1F136266033D9D1EBCC39B1C662866583CC892072725287F897" + + "9770EA0CB19E4A252DD4B6EA59AF9565F08E5A26808CDA7F", + contextHex: + "43010BCD636118A44112FDB468BD11F628FB61A136C9A81EF1287BC4120021A87C2222E3A9BDD0BA" + + "445CF0B95985FFE1E78781E49AAC8266E4B48A341C5D0132CB5639679EF97EAADFFB4DB92F8CD27B" + + "5C97211333EDFFB68AC1DC2767B0B5921520462C015C79099BB5D19A620C27C1DCF2E5D2EF175212" + + "833AC418021A5FB195B0C5574EAF6E4169112A86FF83F04ED9DF42C7614B42DB7794DB6F9EE31AC6" + + "3BD01D53", + signatureHex: + "2B9D85DBF766C5FEC48CDDF96CBA0FCC9546E48F2554E3CA6C7206A59FA610561CF82CF62947FEC0" + + "BA15FF26173DECF0A20EF9B7BDA07BA09AB053C96CC7C01060FB0CFDBA3451AFCC894B90C0655887" + + "A4C272CCABA05C2360631EF3D3914D67E5FDEF1D1DF4EA55918DC7F46F354BC91AF27CAE2C510F31" + + "CA027FF1FC6CE44156A7A66B80F9166479AA72120646F4F7804E89D17598678DE3C21A4651027FF3" + + "3B6ABEAC1A713219382231CEFC7E77353D63801DC47D05691D5911E0E4C2374E76782D39D8858AD2" + + "FA91BA0A0DA5434DF2B33070272B492629285220C8175424226AB8AFC4383D902669DEDDAFD2D8C3" + + "9F15C3B48EA97902FF1CB318D3373CE01006A5F8C1DE4E0ABC9347F5F97395962BA4A7F5969056CA" + + "0682EB72AAEEC5DB3FDBE5627423C87EFF97616630368666C09207E24CDF708F295D29D6F98955DF" + + "9984F6761A208F9E0F9DBF305C27CAC470CA376BDE41BD470E34D43F3A5D0A8DC0671B52C59E21B9" + + "0899CD9CBA9336F9F98967CBDE0CB6E4FB81A24BD7FEE49EBF66F66C3A3234FF0A1DDCA6E064A442" + + "849DC7D676302D609C56B0D9583CEDB2EB1CFE6CD54F3BB547C197961E2EBF0E1F22D2AFABD1EF00" + + "F03452FCCA4DFD4BFCAE13CF429C39D9D6C40BAAD9F64E80AA394E9E71D3A86EFCE9350975E9C57F" + + "6B6A9CDC72D5FA246643707767A9403A7A7E5AD8462A18034EF2C29B44B8D12200B56698D9510FB8" + + "CB4ADD3F6167103BE0A09680C865E8EC2CDEEE9D894A019EDC7230F1874EDE01098414495E12AF4F" + + "A7AE724DE8D3F2D08221DC095BCDF53F4EED59C0A9172F385955592CB199E455675E56F3E1F102F5" + + "63505D5C516AC4D8428EDA2453EED7E72694F3D5E7FF5A627F7595E8AA63179C57E6D4070CF7B6CD" + + "A70E582AF863273F9E64EC1955C0926BB54CFE5B8BBDD8F7533920CDD6BE5F63E57DB212D2E82545" + + "C393E0A8D1730B5F0E9400A28F5FB58AAFD6D008C311332476286C34C4AF4C328F7FC15773313DAC" + + "42B7983D0DBA27C0F88D5EEC24DEA9E44C5514207DFFE765887A16BA7BBEF48A10C37FB9476DD773" + + "A9EFEFACDB0935218153190B4F1FC5D27C13A65DD4AC49FB2824454462C662A77570A420245C118F" + + "C5D5C0BCB42EC0A72948333894B23B8004907B0BE8B212CAC8A40D35235597EC5A802721A1A5B719" + + "BBC6C38F1DD4524A4D72E22CE84159B407EB98195DA9D089997E0E5406A212B8B2C51071D718F668" + + "694BFFD3AD23D4C91DF7E585CA402DF06CF201907E96AF6D6039986DDE39C8496CA532D2390F9BC3" + + "5BE4913A4774980BD472302180B2825D692B2C4A133D29B374622C61E69B187249BFE7035AF7745B" + + "F9FD17861CD5B98520503A14B1CE48B2DC8E2574B3BADE2D1DD8A7FBEBE3F16D01D25F3A0BEBB44D" + + "7C2A88AE52C2B14C209A82BBF45D0A87DFF33489879D387DA65DA301F0703885B22F2B6049240370" + + "BF0688E33C22B912A6105EEBF175DF1ABFD0AAC687A19B0F38A8A2D950A583A9A913387342CDF6B1" + + "044357159D1C46F2A7BC2DCFADEA911710EDE71DE423789B4FBE3DD928ADF6FB6CAC438A34D87DAB" + + "0798BD27382C8CB1FCAD42B8F57BB0C8EA0AB41A73675BECA732408DB2AE434377C3B75F68F69968" + + "BFDEEFF72CB39F295AD92A691CE383A973A54F63B97AB6FB8CFF680E0D0A74A13D9D8B99F5E63AD3" + + "F50E35342E3EB4384945C741E5384608B8CA677AB8B4ACE7D74536C7012F1A193064FFB8404CDB0F" + + "16ABD5DA2FBEBEF534F843D3E53B3E0133C0CD4D00CD657A4D164940E172DED25C7E3F9E593A6C9F" + + "CA68DCA94075EA6B623D6E8B1F7EC269DF439098025CF1E0E6818106BFFF643533A40F864BDF7594" + + "2A80333BBD5949C6369268E102B80FDAAD711033D64E5D58B7871C618D58B56B28A294FB8D3175D9" + + "9606FC6E271C5D3A81FFB0CB8A0002D40CF1A05C29F90A58C6D15892670D5C579AE36040A4198DAC" + + "00B5EA9707EABF63B3843810D79BAC5D7810102A11125CA1FFAE1F89CEB3FAC8FC08A036F8FEAFAA" + + "9C2BDA6C6B3C1EA4742A88302A4830B12334BB35B381C0ECFAE3B1C241D75C30E5220E65802829E3" + + "7D6F7D633276F54BD861DE04302C4B4F74724AB7697BA32D01EA3F7D0AF2675D2AAEC67DB039A7EC" + + "425C7A43F7D2FC741407F5834B073489990C6ED54BC6E0C380DC6FE7C4A4F8AC173E276EF139ED31" + + "95138D649D0C17399376BB00D49460E141A50D8E42DE39FFD9F3396A077E70A70C87630E3C84AD34" + + "AC16926E149BDF9179B9BA11DF7C70970C6FBD30120F798D03AF0B26FCA4EB9D92D4B8E79EEB3C6B" + + "F9FD0D172DCF178DD954B926FDE572BAED627476CA16CF51820A54BB79409EA3205B0FEF3F9C92B2" + + "0B1AE2314CD6DCDD9049AA651FE360059450D0E4CF2221E6C9BF95E072AFA0119FD8FBC0B429D483" + + "267D74BDBEB235315D3ECEEEB3C0B4E1B00F7AA9C8AD120460EBBF5A1A1654695C9F3336C630396B" + + "7DFC81B9042009BE6199BF9A4B251C427F57AAAA8D9376526C409C736575C2701D6529892AB3653A" + + "5C48810470CF5E41FD5EA60895E134A3762412739E9E9C7D101868EBFD92B6CDE7167E88F0D62D7B" + + "9E38DAC76C5E327B540B5207B0B471D13D607B7C96FD5E99F375A8F8CFB6B65DA97272AED50C0B30" + + "30F671151A31363ED9F17343273D5506DF1558AD05C84A3C9FE94F23521AF15B87816A83FB081B95" + + "338A4B248D7E4DEDEF5152A6099178178623FFE82977F039CC0D8FB7DAE7BE3C292B4C2A7C070EA6" + + "AA1B2177984E835F493303B43E4EB6BFA55C73AE0DF9CAE64A9FEE88391164EA580A42C1801A8AA3" + + "83C51C6485692A1D64925E40AB060E9EA92E1D0888A0C02D45BE4BDF081BAB074E8499FD1DFA67F7" + + "9BDA200F3C4716500F7261A832BD926F8862B43C0E36F0836477AA48778936C436E0EE6C8E5B337F" + + "AEDBD4AA3996B8E312CD50159FFBBAECAFD467EEF79AFB632610106D3CD631CEC6E163D1903714B6" + + "F49E3743495FD417EF612230906BF11DFF6E9505A7E475BD9A6ABC2544BE055131E09B2B26A90AE3" + + "9E339A66F8C0188397EDF5F819960B15ACC257901213BBBD0349E45E9D92A99FD24A19702967B256" + + "466FB8C0AFE96CD4C4AA259AC9EB8760105F031528B5DD42DC21213DA66C5F9B69911A3EAE6FEE43" + + "BB271616BDFD844BB7971FD962B7BA4D021E011EA56C8727028ECECABE72F06EC96E7F969169FBFA" + + "E98E8AA9EC40EC75AADA45048C3A1E42FB4F95B5AF565E46616DC7EA9318019511D26CC5073BDFA8" + + "EEA619AF22891B8E34AE989C558CDB8556C5E2394E18CB24D8CE3C7A4C552EFA1A894604AD067EE2" + + "969F21788DBF31491855EF38A9F5830FEDFF4B786FF38549BEDFCBCEE94B30CBC6C7F50B54242F5E" + + "00D6D38FAD6A86DC92EFD7E6288C96020A0E58929CF9007830958D1B02210957F091B23279408810" + + "4D11F94616E449A343C96597925C52371221D2DC8D6CA8EF841FF2F91691D1025F1662A619F6A921" + + "23FDFAB9C10EFFB165B63B243EAB6B3C5446ECD1BCD9B612C91405DDA87175FD310B52706DB8F15D" + + "061CA04F763AA79D0210C6F3A3726A05D81A36C2A8A8F5E747499A38442A27F7D5E2FBD20FC82AB2" + + "438095D7C0A9A6A7A71630FCF60AC34A299A27474EA2A12B6189460C3C232C3AF0F3D3DA76C2C37B" + + "B74530AB1AC95336C1B2AEA230CA02FDDCB38B8BAC939B296C1C988BE2D59EA7FA63907F6F015765" + + "A9893524C0D302CDF1332AA3625E7F4F8CEB0A5914D2438700DCC673AACA7310865348370327B1E2" + + "EFEEBA4EB73D727C2A68B4EA943C8009344564C11EBDD1317ADBE4175CF28D9C73BF47C5B21AB4B9" + + "8DA0AFB8B25F067DECF252EDDB8CEEF29C01E27686E0C7AAE02914947E2A474C6456406F0E2CAFE2" + + "8629B515CCF7BE2F65E300CF58885B38D6275954FA2623943D4E9F9F790C869A22C3AC1CA19DA9B2" + + "13671D2C0EC0BA3F51646B4F108FD3ECD870935159505F54347A539D04EB4F26A4F1E6AC2904086D" + + "8BA350B9C3A7BA47473D7897DF81D7D96D8721A6FAC536D5656920F62AFC9FA0F921892A84010A0F" + + "848B55D9F159F9A0CF26A6FAE23714324CF996F5AEA6B5E42C9BF4F1B488AE9A39031386BB178D68" + + "C3E33947E1312E215222AFC21AC1F575FCAE4448183CA7E17A897CC1A16F0A83B794219228561C32" + + "7F1DB47682264006B7A6236EF9612F235D586CE9E4975F6193D03070B98B9947FA83085089B43567" + + "09D07FA2DFD216C13B58D3629397DC8A34C38DF3508AE593051FBD366507861BF3F4BCB7EAB72183" + + "A55D7D7C676C20C118BEF8EC686F1CB0F6C01A623F63483BB22AE8124F522DFD5E9AF6FFD1902182" + + "AA989FC0857B8BEBAF9A7DE45F72D4ACFBCCD08A82AF43D552F731BE5BEA6912912B1EF56E56BC7D" + + "54DC8AAEB94F5D1A31F1578253D4E9025146F1F32F5DD7E2B8704A909374858BAB4755A7A9851895" + + "171A9DCD70A2D41178DA2F6C1A37A2AEC26DF5E9FA2023E3115B3D4118D3EBE9E6F833C1B9585984" + + "30711A87FEBE9AC94744038F8AF68A37F5944E8B6D3CF425E4C8A9BC1303D8A32B4152F37E925469" + + "B4A1307809776470EDFF5E1E099457349C6F42051ADDDA9DC17B2A0EA5D2BDB11D320350C8ACBA44" + + "8F95A3B68FEDC8C03E89818DBEDD9689932C61E71559E61AE85FB8FB5BD07D073DE44B1F691F31A2" + + "C89364FFB63E024D766CB19918F3B519A2DE1A948DD57CA0EC1C2DEFDE027468D3DB047F0F5F5879" + + "D2836F998A8FDF6BD47902EA6BEB0B42F269AC25FCFBEEFD70CE46103D1EA38EB55F964B59E619A9" + + "EEF69193296F9B3441C6881479C0124AC280C12D60B32E15C2485C3DE65D0421999E62A2B2DB2B32" + + "680362E49E596B837571580D4CF141BF726247BFDD179D360F8EFAA91927E6A1F122343E9FBABC47" + + "9046C4F80BB866BFB8A1178791BAF8D2905EBAB9A82790B9AE1340369ACAE23B69DF7059885B73C3" + + "420449CE6754E24C0C7B1F51B63520A89D795A93E3373EB4E70A1C3F186FF3184F76D3DAC9499461" + + "E9655057295813023853ADE3B6ABFF412D59915B4E589F9F85BA0578B70B8F7D95DFD9DC2E59817F" + + "B0A90928DF766DF7FF7E33F9E6DA737E533E3B824292A898F10EAC94C4429508507CB5D2FEE80CB2" + + "ECD8297E5A9D1294A38D4E71958968AF8AA08FE88CFE737A9FC5177744C7E4384F3ACF00A7519381" + + "D8A1BC62E3EB5DC1F1A4E1437D30FC245FC64AD86C52985697EB6AD202C1771D8E28D87945B24D8D" + + "19778DD25AE739E2F0942E5BEE0B607B74F5FDBB2D1E4FC4DF2F631F1D331C30DA7AF0332402D7B3" + + "338FEABF624F735CC4EE0FA3B07D9E85A74210AD166E998AA95F265D7E8557BB7A93139F68E57319" + + "C7BD1B0C92D1D7F23FAC77BB6F4806E557F1B3F331464EE0272EACC6CBA3BC1514377C53BA4D0478" + + "F811E20869DB98CC3C6C0B500B9CBC11D7BCDF3D5D03650C698F8E4AFE0A38FD0E6D9DFB63A3515E" + + "69767205B090C44C2B980DEDCD060902A4BE42618236618081C0A2EC33998ACC5EC55A2C9D5E6CC5" + + "F51FFC2BADE947E8F801654DEA99055B5A2819FBD33D8A051CE310D999F76476B518580D9F0E25D9" + + "E531CA7EF0A020C185E508218C6DF9855954CBC84190CA84A123125FD90BA92092D145043155E310" + + "259F946A41E2D97CFB23436BF6EE4817360364CE705EC1A452393E98FAA81565FACB46143BCF1101" + + "C94EA20549FB543A3954BA07D67D3B82BD295C8D9A2622C061D79DCF461702A371EA68753A0717AC" + + "656F479DC8F273D9025C866D2B321333540DD6749B72EE7D2697AF5EEC45E43BE5B8A648485F48D2" + + "1A79B7D8E07DEB4B5C4EFE2128F2BCFA063938E8F4DA5E9DCB25DFC7C1A9E1E607FBA66FF3268FF5" + + "E9333CA93FACD4398FF2647FF48854FB46E71328ED1ED5515BEBE7FD9CB09F0EBB37267CCBA21A9F" + + "725B77276B8BAE0CF0BEA62AC40B1EA31FE2A3D2DBC4D1A5ADADCF035D659BB13C8E631CB97B583C" + + "4B98A8DE3127FCBD460E786E2E36B6E0B9023713EAC02EDB55A4BE8103C9DA92B6F16E1AE32159CB" + + "1C4EDDE2C9C8A2653F0DDE34CB5302DCF880655BD1432E167D74F17598108D36E4F2B3F8070E1DCC" + + "1282D5CB16615038FC13C93C918FA5E30751CEB954193F0EEACF1BC04A9DE92B5976B4DD5342EE8A" + + "02CD66B8541AC5A7CAFFE0AA4B0DCD4C9F051F157747046206D996F9BF632CCF089C16BFB6ED8528" + + "9ACACA879E23E04E57DD475B30C57DEFA069AD7D4AF64F1B5DA9D84C02D187FDA01D4BA110295A74" + + "4C723A1FB7E7D4C33BBA89ED3B4BC175180EC11A864000C00066291CF3DD412CF8D6AFF401157F6F" + + "D8417990E5C18B3AB1A864347E58C91682145C65F80F848ED59993830889295293B31610B7757384" + + "124EBCCAE3B33F95D2D889EF07EBC649116BF398271A43FA176CA4B1000B568DCFD2D6EBF2042223" + + "374294BCD6E2142027526F8189E5F7065B6396A9D2174CA8F1026494A3E5EBFA4A50566B9EB0D900" + + "00000000000000000000000000000000000000040D161F25293037", + hashAlgOid: "2.16.840.1.101.3.4.2.8"), + new MLDsaNistTestCase( + nistTestCaseId: 77, + algorithm: MLDsaAlgorithm.MLDsa87, + shouldPass: true, + publicKeyHex: + "5E29FF51B7F949BBEBC18FC21104C1CC71BD7AF21EA56A8D05D7AE859A38DED8A084A51DF3E54735" + + "BBD6D10CAFB78EEA24934DABD1B63AE8B1365387293394D32E488D6BFD3694B044A27893DCFCCBAC" + + "37B506E3E38003414691312C2240368C09B1AE2C9035297080BFA114E706978F481D2CF473C15553" + + "95D06D3B0A7A11885B15EE67240B307B318E5449840098933738567F9346B4B53F665605D8D94672" + + "3320AE02EC958E2C82A789F6A28812F8D8426556259C44A8F17395C2827C8EEC6E3C6D788DFCABBE" + + "EBA0DAF3FCEF7541D00087B668ABD7C11330368E271D7E79976A5714F7937037CDE84D872B880B10" + + "159E619112FA1DCBE417B11B3679D481E1A1DD6369208A0F9AA6FDC7C14D5C64899BC18C60444E0C" + + "38BE1BB3D0A2932BB8F0E4F07F9638E1B2FE09F5FBC22A06CEF0D9EA911DB3EF5304989E7C6ED2E6" + + "E16FC47702872D4EDBA2A36456D835EFA43E5ECBE6C56948EBB1E8F4F69168DC068FB18BAED40567" + + "BC5CAC2E194839E7281253BD8F3807CBA9E0FF4E43D7CEF746057698A3D945DB9DFA0C0F32C026AF" + + "D9801D459E98DF48135549FF0885AF2C5863ABA82EEE0542FB65344865144B88998F6671E6634966" + + "CCC6871635B77932E039A0FE441AAB8DFC499B76CF0127B9CB6CBDC887C6BBE3DAC7E5E502108261" + + "14461858F00782BF8D7E28C4546FC5D12E55EA6080AA7131FD1A11DF4D96F94A875B55997403D371" + + "B030CDB61E96C098D73681C205F9596940B739FC83C7C5EA61627B6807083827C0F7FB647F423FE5" + + "0E59C4DD21CA91E3DF6CE3C7D001598058B0CF438DF01B02FFE0F4A56CF19394D256F7FECA0A5788" + + "1A4803374A1AFB3AC88604F8A74B1BFB92E6132F812E048F77A05B9E562AE8B3E9EBEA5BB6B178D5" + + "CBB7CB2718D8A21D5B31EAD87AEC8C81C75E296FDD952C0679D0277F3983705E74AD524C03CC040E" + + "EB2DE0B8411438EA172212018D4D17FB2D9FB7E9E7044E31EDFF536DA77C6260C2ED55525ACC76BD" + + "BB9319FB7F5D64170F1600E862F55C9AB8A602DFBAF21AFF187BD41AF1DBE5FA88F1DFF4C9EBBB30" + + "0EF03B3CF3B9B62FE0B406B860D946957B44149B32F5061E941A5F18FEE1033E315BE099F75C81AC" + + "3B779F5A24C237EB9AD3610194EDEFC296D1ED0DBAF634E13D2678C89261B92DCA0F29EB258DD400" + + "67D681B6273610D5562A7BF9892C78DC4756FDE7274F06D49EB2D3F097F64D3ABCC6BF9AC765D995" + + "B0977B66AC36443B829CFBCF34894BD719F14651A2F34919C11921F3C0C96CFC110F6F2C7DFF9DB3" + + "45F7BF47B3B60538E6ED9C712CE50DA29A744BAAF8F4E99B426183C96AA465E4BE994C20A8D46870" + + "2127D1E48B231E6B35E0D341954D27114E0BB16EDCFBD7E4A6BA1AE4A55AFD0255B4E43153F20BE9" + + "D5136D39E86A53D9E8B70C4809C826FF934E564A06F97C50392CA86345857D6227C0A56121AFF503" + + "CC2506CB4BB56A301340AD16A60736F2689F74F6D88D7A00B01574644C7FF794AAC34505A3D7D0DA" + + "7D252C526D9570A8F18C8C8845266469BD3D67CA649420A8D80E831E3D8AAC8B0974CC346FEB8058" + + "648275DBAD206AFC0FA235F4721428D4BAC46728FE05B5BB6389A39007321F23E4EF198932FB77AA" + + "59BCD4442A6CAA6E29B08C529631D5A2DA7C13C68E4434E77C7ECDA560FE7BA2F14D07602B6ECE15" + + "9FD58EEE41AD3CC99B0F9196F17262FFC388035C300289475CD6C3B5E9FAC7F49BE3E66CBDC1E08E" + + "BBC57EE4B6588685492DBB8F561E0B0A875FBFC9CB1757815FBE3892F5D18D55614BC2DDECFAF437" + + "6E818228D4F9F48ECA598CF8152D0329451F771975596ACCB46344FEA8DB6881D63B42DD2D1AF0DA" + + "94F18B2839DFF0B25B9046984EADAADCBB13DF99D58953837E2E65F0B104322AE19595BE2D2E0A0A" + + "58BC46959E873731447AA2F9E947C5A5B453B25EA81791B0D92EDBFE54139D90F4A31FBB120B55D3" + + "55F9EDAEBBCB0171643AE4BDCF6E50A4E912B42304B2969CD5A41058F719CF6373595D38B5604E7B" + + "809EF7BF0AF20861B7A37FC6439608F93A78A697C4ECD734A11FE07EE39EBCE9CC8DD1DBAC109DC6" + + "0F37ADA7DB533F5B515B630D626899A3452B17EEF3812C4AD2525DE18D3C3855E39D82C7ABE3FA18" + + "50E2D3973E27C6C67096DDB919567A9D7B11A55EB501C0EA8141F2358EA0C7C1A3A3DF79727CF3BD" + + "819152F743E72DF5441DD0A429137D345456526C8779B6ED48496DDE0D15FD676CF2BA1054F24364" + + "2BA00D68B85E67F523354C0431A5EF7AED398278D83FFE4DD6B70866BC79098352784EE16584C1C2" + + "7DF49B6C14CD686F89A1E79AAE9C75C242B6DA821A00B1355BE79234363A321E79BF98DA710EBBEA" + + "44D3D3E496E4B90ADF8200DDBD0257D07FA79531DEFBF960F807E4DD78C892E9404FEE39E8329FD1" + + "DD45A1AE4EACDE6263E258887A03B9FF3B4ADCAC7668BE7AB10E125A6FFDB94272AEFCFAEEAF4DA2" + + "87695F8354AC8B32EBE3442F34937E382D0C8F8F49DC1D4069D5D8B3488C38CCA638403FD6DCF702" + + "A5A8EB589B42E09846C0A73DFB9B738F0441B677638BE1820BDF9681248EA9AEF164EF341374A2E9" + + "B6B82DB4C11E557B976D398E35B7F185F8080BB50670F1BD24DE6342B3EAFD8EE35F242024738C29" + + "AB68D5A8EC5B3D9FE8DE399A8E73B7F35DF58349229553E68625C6BEC443D603F4C0DA64CD5EFA81" + + "91122C65095D2191E2A432E1738C8CA1121F59234ED6D13D4F1315958D13EFB7279E29290F6B5DE8" + + "135D41900A2386D157199A1E29C552D72D18FA255C834B4913FA8D0166E0F5DD79B7313CD0C893D2" + + "5B4F07E8E890057319EE0298B0FFBB647EB260EEB53191A71F85AFDD48BF1E967AC5A74D47D4D535" + + "7DD088C49C2969B839E0240438A6B05117EBC17254157CDE4216A5FA5DF1F8A2B2A6BEE3A41629BF" + + "6B186DF9DB43AB7DDFC5B93D4CC94F353218FCF06EB12CC0DA39BEFB8ECF461372328A27E3007931" + + "99F0E583ABC11328FF172C1EF344D250ED86E7D51FDD9A503A032622F484053A47F824D938EB5184" + + "01DACF5C4EC09CAB6BC2E0ED3E1B1D8654547ED2F04B2FA3B60607AF7F1FC252074152A6BC843A2E" + + "1F58C0DC040D8E389F5DF6CEB947322CC831DCE86C9B869F2073494C9189BEE2A87BB885EF4521C3" + + "3838911510F14CFA2E36B87BCBC5114D1442D6173FA9ABE48CB6FA9500AAC19449C042472A38CB0D" + + "717FCDD02936A3864AA0011112FC577AFA8EC761F355A74AFFE672D222F77C6665A37E187089462F" + + "706C334C67E3BC96ED6CC4B2B8F22D335B2A21B4869F1AD1D46692B1CE3768B318843D3DA5A111B6" + + "97EEF0B9A9FE2871F8B02CB490812AAC20946C8FC64ECBF42F90BCC409116A58EBB79FD5A19AD530" + + "7EC2198391F208C497007007C95C1577B16093FFC0588C1622F2E726E707D2CEB96E7DD153FF3F8E" + + "23CCA246CB2B20AF2027CDB9A4C7C42BFC8E44F0AB14AF454741E662E094E28AD4084C92FAD9350F" + + "281D9A311EC450C25FCC6AAB131257E1E8F41DB5B01A4164C143F65F898A9629B2AEB91CF1165023" + + "8E8FF64ADA357CA7DAB8F734B9B1B488FEF4A99732159476179E4CD6721468677A70F0545764B479" + + "CCCFCFE83F413F28DC40D9FA2ABEF335370D62CEBB33F74067348969372B5C6F", + secretKeyHex: + "5E29FF51B7F949BBEBC18FC21104C1CC71BD7AF21EA56A8D05D7AE859A38DED8EC9CB51898AC5C2B" + + "264AF6B8EFE8AEE2D079427EA698D5F695C2E573234F82E508DA6F6DD8F56D5371DD26786111F687" + + "7F2DCC896D7C568C5BC78D7A48271109FCFB8377735AE0A3AB196DDFCB338575161D560CE57449B1" + + "E10FF148DBC12693A496099134805C12801A4002D20440A0204DCAC46D08331163B06D48C20C1848" + + "8A4B9488C03461DB408943944924220483A08910A5288C08018BC820A3184AA046861102918AB86C" + + "A392111930499040440820910A17901B146A54242008810458864020B2514C1411C21088D3381294" + + "264A412660C3284C190184A4B260882462622232C9C670031089814244A42232121329202240C826" + + "62128929D2B05003468883048818A50904A94DCC905148264088082C09192E0C46080A1229244929" + + "93A668D38470DBB23081B6011CB085043825598808C8462CD8487244368C9016720A440DC8B068D8" + + "90849C9271C2049183C010038005C3006444462854288AE1A04860304C12A54124206C8C080259B8" + + "10DA468203464D0BC9211B29925A4671C1820808A50850988C1B0025E1100854004A50B631038049" + + "1BC64198286618062A221521C30802C488700805528310718C44209A4488922092890824C4C68908" + + "282523058D12425142424A8C308A48989154C0201B2544CA083123A76D191244C080451435651293" + + "290487250904041005648C440D12302920158858824064B60013C68081B88822B62908C88458B444" + + "08C448A08065492280A1126A494042D2B200644269404640C4088C10487283046CCA200912267109" + + "350D02090C8A428C044465599885C2846C1B012591246C43328C58088551C004C8226A1338084982" + + "310C36850B258404A07040140943B88511862804358958025141B2611BC10523C770529660209389" + + "62383218186911A94514014401C40422A681998628E03610CB082D01A11022316091308892320D12" + + "378EE1184101901183208260A02151306E9B4804440252DBB68C9B3441E290204A342893460EC382" + + "510997851C3791D02822E132328A941113332A248224E3265213272812268C8AC48503B85158282A" + + "C0860C941051E00865034481A422400A3560944002C8A0506304464106114424258900860A8161C1" + + "48024498710BA90954A449D04860A32606D832814B944C5932915BA89062204688C464D10850D100" + + "69512422120591D3346023958920424D60984562388119A929529449212612E002415CC804D2A44D" + + "94026A23024CE3A4481928424082050B942913144E03002082802013A164CA984CC8424C888851A1" + + "422D51C224142648C1A4219C8201DB202CA10225A446314C200D04C6640CB2659B066614872444B4" + + "2C60342121998D1887808A448603986810A66803B749D386411A8444603470924460CA866C21A600" + + "1CB16512452ED1406262280E113421E0286E0120428A80501A008511C28D02C0684B38859A282EA4" + + "040EA0B42564A204E402720245048136905312291C348D1B241152A8081A178A1133829892254118" + + "6122268820364D24466121491298984511256663442921104084C44400464D02064D141220D4140D" + + "C14662E2963101118293080DA2064024921198305109840C9B32624280905AA64C8C86495A408C18" + + "1911CA1605A4865120A688D404521A425102486A5AB48980B265E2B8609942241229255C18919320" + + "484C4452E3344C0AC111E23052D3A64C22C160C9963000A55198B4090C4210A2A024C238221C2840" + + "41844890A440E1964D84B00DC4B0810A162DC89268500052249748D4220C6002221C26125C442D61" + + "042A82360821491052085240224413A38C1C4370D8C4081B044140064D8482882409261A13500C39" + + "1018125208421164409261140C51B020212902E0841020238A218589D110089A2085139284981651" + + "5A06808CA46021387250922D83443222B9695A368580068CC4128E48086C5934025B280E62388E84" + + "809110B22054B2254BC868A3824D4938904AB22D98C044A2124E23C36C88228022C941003421C8C2" + + "6449200E10806C0002281C4050CA086E43802D98166C9AC4458288814012891C4710941420501086" + + "8A966D89203208271154042060040610166659184A58066849B64161B2091B97851BA88C2045859C" + + "486EC1B240E20040FE1B88BD4218ABFA18D01964D9EA6852C520CD36B24C3D3E15A5C7B4C0D5733B" + + "E4997E3EEB9EE046B7E3A374CD1BCA03C639248D68D037E7D53EECD8B1021BB810190FAE8ABD8EF2" + + "A27273D8CEBE76B5EF8C0E6D6B5E4F34F1BF8AE0EFABCE39520BCBC2CD962162965B6B86CAD9F28D" + + "979BC01A4F9D9E6B66F0851C19142A16F50124F2B34CD38404C723227EE6F4D920528F07632DCC21" + + "0D69472DA35C177E63DF44659024805D186B6E36CC6264CA50793593EE3DE9F21EE56137A7317001" + + "AA8EA0E4D10F695A88E7EFDA5D7EB530045E1635ABB346D61352848291EDB7261B689B6AB948CBF7" + + "48C9E60F795B7C1724D36D0468F461C8E8E50B253C902B4BB54B33356C0B984B8529538CF65E5C98" + + "AA3A0460B698BEC9AB8DB31023A52A511884EFF696974E39DFF418297CAF19178C004D877931F6A8" + + "1B78F172A265E90A12701A0115CC6B8A824C63ADD43719C9BFB0508B272ED86724C9849ED688AEA6" + + "7EC14B1CA8DF467236FBAE28155A62633A8E120BD9FDBD4C41CDE65C3EB150F16C70ECECE8BD5A10" + + "8B5B852BE2B593713D38567CCC670A7CCE1AD381BAA676A6811967C0ED3354BFEB1859E310901E14" + + "5EBD25FBD7CF52A13C4E2F8E6ECB900C35492D60EBC6851F05B904233D14CAB7AC2707C482E5D7F0" + + "BF3F92EB535EB2343D031C00CA0F6B17F00E3F0D9CF748ECFDA70785AE49C829EA2960D10E0D9D7A" + + "463FFE0EA81811124193B0472449A2DAFE5478019E16868973709E404B1C2187258D591859F20A8F" + + "4D3019B187CFD9CAB8494BB1B679D1BE6182DC9E9FBD4CEB1906A3247845F840FAF1C0ABD7F897FE" + + "2D85E4F7BF658A73EDB60BB0708CC9C3FA8A88008E856AA429C68C8FF477F755CC290E122AEC194C" + + "C68521E2AD4606381FF36D15912B7C31108BE8CBB055330E720E4F995BE8F4966CFB00117F153BB4" + + "EB20A9244867E24ACD3D3AFC5CD00B4F8260CC671F01A0842706CE2DE132176C65EAD11C89BD8687" + + "B8991E9AD063EFEA7AAF5F9B1EFE5DBBA6D041911215E7C0A665D16CB6CBB73EA9C1EF7C835A8F65" + + "8289A08294167468FA47BDB67699788BF99E16A267D9370392A212F4D6E26E959676C85CDA063B33" + + "7CD989E4A7C3E9FB50A9C207AE8BF2B5AB340BBAE4D80BB38C2CEAA3912A5FA0AB47EF36E931D78E" + + "D4C19FE4C82414685484C9C9E4DC220E93B309457FFB2C7DBBFFEBF3ED610ADBC55A0D40BF8DB12B" + + "114757E7BB54F34712952E2525D154A8EAB2DFFBD26A4C6EBFAB4EE20E15B8506A2A502DF6721FB4" + + "EFF7D457FA45F7145B690376EDC2CA49221DA69F6A7EDDCAA4875ACA1F0387CE2D2356C13A15BAF8" + + "2EE368C6BFF70C9450ACBD0562B0D9D3A66BF183CD3ABFDDC6C2FFC0D910C53E0B31824BB6B59FC3" + + "47D905BBD6AD9D7C06F68A1AEBA355A94AA62D370B69E2C6217DDA39C384AA97048DDB165E88C2B5" + + "65B7B3F5310FFC9717940A9CA8DD5C1540282334C902B4D136AF87666736435891EE6342B9025420" + + "B7B68BD72FC432EBA6AA09F3D72D00DB842F49CCBFA2FA741D0F83C2257E207BCCFE4AEF99EF7E23" + + "7A1F10370B2E2D01F6460CE2C0921D6E373088789C0463999FEE4D4BE572CE3BC60EB5B8B2137FD2" + + "C2ED51117AE4001ECFFC7297F577CCDEC02E045DF763464CDCA40EEBD7AE513C4F5078FAF9208196" + + "BCEEB634ACEBE72907D8DC7AEF938798F672E79326E950CC352DA7310B30BEEF95591E725F5D515D" + + "328387993786639443820DBC8F4D0B3E1B965E782343329D3AE7BED32E7E5998F96EB9B7E8496E97" + + "26F4A1F92B04F9DC6C94AB6F548D09AD85EC485655750B45842A2360D0381BC6666122B0FF14C921" + + "908ADB76E0CFC4DB3D4696CA97551F67D07A0D016FBEAF9EE1CE7E87DCC910D5380964AD5618DAF8" + + "DCE317A5A6E3AA568390C35E267DEB44791A972154899B6BE563F5EF4C7603A6D3D7D5C5730CEFDB" + + "1097E1DFE91DEBA887A31914E2930543BB09FE1F1658DE76E87266EAC439D1B30C61FCC9B388C364" + + "F7A679FE704CD31601C1692AD72F55DECF79C5A349E651057A714DDBC1BDC3E19E559BF455406107" + + "A4B626B6CEE0FF322D42B296212B5072582066580CF2ABC08532E1CDB92C30236D626D9AB3F75358" + + "8D1852D5E1F85528C16B82494F94BAFCE8D871AF1E7A854D24DD93DEEDE0F8DB7444A125B10BFD0E" + + "700D2715DAF9165C11D77DDF2ADDC7D78911308A1C948C324812C2FD613F406728F9DEE29E0ECF9D" + + "C7AFE95811DA65CE142A6D204CAFF2CA34225AB3D0F3C7B722F70061EE99C75F60C804C46B4A710D" + + "9C60080A9AB0A06CA2E3801FD46E5C115D087DD0A65CD5BCBBD839FA64EA4742F552790C0AA453EE" + + "4709A8399E0CC5165976B01FBF192CF57754F276A2CC436E8ED6461C153586E767795AC850E27205" + + "D3A2AD3494ADABFAA1D15181281B83709B6B118D0BFBF403B78BCCE5F35997A3A60ACAD897156275" + + "53B5D2AEE3438DAF008D01D71954CEE5E5B8F00BA829C3BCEA00A7A1EB75B28CED2AE0F4506D7003" + + "C57AB97FC35DBEA1EA79AC004447F2636866CDAC0FE35536BC6468AC6892E800106C032488DFF0BB" + + "9975A3798D1401FB4DB2D69355C1A7B43D6D86350541AA5A18B4FC9CC6878D2A14BCD8D97EBC1902" + + "3C3E548A459697E05FEDC3D37F2983D5E388C4D8033FEB6741973A2C17A8F35A88CAEA9B093D205F" + + "EFF41768BA6E51003BC3DE6208098FEEED00281F2BBA75308FE7363234A517E82A7349191CCBF7A6" + + "B92A743B439E66F775326F0759F4BF880A912267F6B8C30D9502548903524456974CD9010E179B8E" + + "517D29CD02D9D624030F798E1D48B7C4467231DE5ED2E31B4A1DABDC33B4100351957CD81EA9A1A3" + + "BD49590BCCA13C2E63975164F264957B5632ADD2AC8C4BD03069B44CE949F262433C7748CF24B5D3" + + "9E25D3AF1C72E788FD8F33EDE6EEC364403CA4F4EAF664022CF4FBC0BCC86EF73BE371E906B32BC7" + + "0B92D53B035F6401B24CDDEB453CBB3F6EB8F9D1E7B9D4678035DFA5977BB91B7BE8434197D5CE55" + + "FBC3735A87DBDE752D714B15E07AF3FB7A5C002C0E6028342DEFA7FF9F786FF29339FB779ECBF2F3" + + "DA26650121BFA31D02DCFB425D6DB2216F33F29F3C3869F5ADB2B03004767A088E11976F36FBF656" + + "86E936858A6AF43D8C7EF167AF747BECB215351F64230BC8BBABCE8ABFC8BECFA6AD3078956D6787" + + "39C4EA1666E43878461430EF3688378835FD08DC940447D3AB5B6C33DB803465C3976C2774EC5F3C" + + "53C95E7F41BA93503043F9D379BEDD2AADAE8715ABDFEFE5C5E03C248C748FC28834A32B27E6952C" + + "09FE3A9A4B91EE38F9C10A4DCDF1722E3A34CE7DC1E2DFB50B52086709817DB5CF7EAAF9CEA322E8" + + "6681E48151D6F5B316768C3026B070057D4F710CDB38BB5A159EEF4DC875D4CACCF30C975F9F7ACD" + + "D9AC5F86109C45CF33883B9CE77CD231FAA80214DC384AEBEF7FDFD8DC24911192A451F91A027D06" + + "8ECCF27355969259CD3C7D468B52495237A4E2556C59DCEEC1EC975BBBE8DF50D9A0F01362177F65" + + "A7C1F9488E1C7AF207D3832543A1C33F4916C05417632C9A4A76F0D5952B4FFAA651CAB9B4F07785" + + "DA348C3FE7E3347F7879E7E47724915E98E5C6A4D4A25F2B991961E70034E82216BBEE8CA3990C67" + + "6B82F85E4F946C58BC9B9157DD68EEA7156C98BB59CC8397F07948DFDDE28168BC14216E22C496E7" + + "085CEC93688712C38A04528B1E51107AD2905F8A5BF68D29D9399D5DDA83DA4A804AABAAB1A74FC1" + + "FD49D2AEADAE98BAA5EC95AB3956D7C9ADA1B44D223C48F74B02CF01A788DD36E8FE9CA57698258D" + + "E3DBFA2C3EFB55FC5349B3D41C1C53BD3220CDE4978658B4C663D5DFD3B8A896A74ACDF69ECCA62A" + + "2B49E8FAF238A617E01BC7C35A9EFD8C627C972479371E62B54ABF535284A68553F131B3A98DC279" + + "1C36387EE1DF0E96DFFF1EB0EA5AFBEE2F5B278B459B8931523C00CB324AB60215129C8E9C33B904" + + "2B0CCB303199128B2C292F6B1608853D4DFD476C6BC6F0744E3D76BA6BC045A3E71C191D5FF9ECF5" + + "A7F88A5ADA66F4C540D8A9749EFA0AAF27076F89432697BFD0CA5AFF38D41FA539EFDF5DFC50C8CC" + + "D319A236DC68F3F8F4625BB3E3DEDB814BBE963A27056105F76E1D4B1ADC878F4B7AD8E12FCB1AA4" + + "78DC431FCCC02AA53AEE24903985B5CF1AC09931F29F9F1EEB2FE02BF9F9BEA1B7E3895ADE472343" + + "BCA741B3E2CD00F661E5A1EEB131DD6DEB779001CAEDF61EEE210DAC7E94161C56D545E6FDD5C3A5" + + "78AB985C77C456837D7526AAE13A2F040C0B3FEA4FC63AAB1276CB89C247AFC09DF522B1B2F46A46" + + "9E17B872CE7477240008EF4B7A91091CA47DA755BF366C73E52F6B30651303924AFB74A3D1162FB9" + + "C7AC2215616F1D7CC13065A92B66DEE8991E4C4B677418AB48873DC1D3836A9E9FDB7642AC7F25A0" + + "455E103D2B87A0B62D944F8D88492D0226E2A63BEEDDE4FBA01406C659BC58C570B5A5665F3BC871" + + "A1320E13D21762C206738BF11CD7874244E2E4F189BC290841B36F4E43280F68F50C4E689CE161BC" + + "62ECF6E8C994B3BC4C77FCA52CA1AA25C387D277B6D2B4AA1AF66A8D992D0A9F552D5A4E901C2BAC" + + "015DC3474636DF3B481A0E4DF3AC64807B20A0BB735699E3FC181078AFCAC600761CDD0BFD6CB840" + + "60AAD2888003578DC8ECD26649968E4C", + messageHex: + "3970F1A45BB86B4D3C88F3E3916347DBB96EAE363FBE5909EBCDD4BDDBD20679E5C3259071A96AD9" + + "E13D7F61A1877E0A1FEF5ABDB87EFD5E01624EC5924D8ABBE9956B106E67CA132B66B53D1D5B6C39" + + "92660A668EF00F50D394F73CBD963F967A9CBC0EC011712A55E8ADC7CFD1F3F99F0B5BD1E40558A6" + + "A32C21E09120FCD92E840E11540B45EE38EF6CE796B37CF575895CB96F6D1B89AD101A0500AA19C1" + + "CF437A4CC66882FBC4CB3FFF8F06B6BE32228AABE1CC1DA8D0D579D70609BA78EEFBED4D71AE17FF" + + "353E868C16EC5F27E7210FBA2208BDBD90ECFBDE68B7394B5856ECEE2D9EDF42DCADB49E89AE94CB" + + "B4E28F405412CEDBE91AEB51F0F4ADE9DC0F3AABB81309766164CDF1E3A6D77C3DEBD315A1165A93" + + "01A401371540A6AA9E9745612AD1B787F73056AFA6D07FEA520092979F4B802271657D709A01A7B7" + + "1473C16391297DCF8372602238CBF87E159B38BCF8BB1D5FFBD68BA7A03BF958528E7B9E4F95868A" + + "BD8A53BCAA7CF9FC0D1EAC9359F9468F1210F817B43A59D72F0B9E31C8059CC12F91B63F4B2F70F4" + + "EE3FE2FA122864F0C043A4EC56B61B73C99EEC1B70E83CF018BFBCBDEA06D3B6FD4FCECFAE23751B" + + "270F1904F6B580EB4EA0451FE66D43BD0F911D88448B00DA489AA1D7A26A140FBDD389B4A54B8136" + + "470048EAE11C519E26703AC23233EFB0C3BF5077ECC8EC978B273B380C6A2D495350BC333BC49998" + + "118D9F8E029F36F90C951ED294D487043484AE7AB4632CC5FF3C61692CFB46E291E44C73CC201C39" + + "A1EF9B39302C85B5BAE92F82A62B7D5E016CAF1ED9D8E9A7CF4EFF1A8A41ED630755A531C12E31AE" + + "5B3A4215A3163190FFD6B5BA84248F47215D6762DBE0F0FCFFD298D8BC7C34B626344268200A0537" + + "B1DAFA7A3EED36A02D61ADF6E558E29DA26220A84DE26BF951F4A7BBC4BCA9CF544DBABD7E935F1F" + + "7BE6BA277686ABCEEF0624CAD959846B98790E9E0DB286E889237C9026D2A4C72DFA02D24E03735F" + + "93B46D4AA533F3D0DDE18F235B8D1A7EB8092AE9E53E835C51CAFDCC2A624D289C692C27303EF1B4" + + "0D62CFA92EF5922AC62D349B2B10C8BFDC9D8897E70033AC8BBE19EDB8E0ABECA456F9AEFE5FFADA" + + "61E4CD5E0ED8E6B656E408DB2B960A0711CD0828D0F30F938B427312C61FA4E479B42DF107457994" + + "E6E9E1C774362F1868C0CEA243738E8FD6D4A3886CCD9F37AC7D125AAF73C7DF6F4C9C5E83E5682E" + + "CBDFDF665650618B0EDD64CF24E9E0834764ADDD64FAF8482625F2A4FF9C6C3AA4C7714C50E79B59" + + "5A7654A7BBEE0462F19BFAEF200DF53C2C304DF2A9BC02638420BE294BD11E4254CDEB5A36257873" + + "179C6001FFF15B62F0BC1E6F29EF2746D08BCC34621CFE529CFAE07B70E6F94B9F76E2D102D2EE51" + + "5420454923BB3C35495B40307018EAFA6D63D4EE42B0833606422A652470A111BB3D4D4C176BB570" + + "E8232CF31CFF8ECADB0742A4E3AA8FA26D5CB5D92C2458754F5D2FFFE3C602AF07B898D152F092BC" + + "1B568A7DE6F16EEB3C3012191BBC2980F57EE4AFBCA921658528955295CCD38075D19655A54DF433" + + "0CEBA8042C87D89D0A2E9D2570088DB1AC2FCBDB257BD7E5353EA0F35933AE93A455B8495BCD9550" + + "04BACD6DB108BF16C5F08854E19989C53503D2C1D7DC57D89B4F2E301E52A13583AC74AE400DE908" + + "0077D0B10B4AE2D385D79CFC0218FC79680E7A9B11BF8D95A1949EC46D0E9CD100D5DAD455C0E615" + + "EA3FEFACE843C92270E2BCDCDEEADDDA4C2671F160CD1374838440CC3B6D5B25EA5985EE9ADABB13" + + "86FE9180831F5540A21541B1E5D16F702E8986A4565020026240FC342B80F08DD757C3CF3D42FE0A" + + "28961D5C6FBE65E78DB06E8A67936A49CECFC2822A7DD7BF71B16F4BB8FC219D14EE37C19AEFD125" + + "C226B2023F613F46A27BCB5EDF13F85F57B74B41E3280E3FB3AEECA7DA0DC59A2EA29522DD2F77BC" + + "F25373C63CD44C019512CE5F89FFC758498F32B71E329A164207332B148E712617D441AB8058CFE5" + + "660BD9742407A261CEAAB14F558E9134FEF41F0BBAB20C6F86F3672B619603FBDF8746B066980B61" + + "13EEDE21FEF8197E00A3418353AE6DACBB400D2F69B550ACCBB0476F0D91D7407873BA285FC8AF93" + + "22D1E0B243CFAB27F753423DD883D4CD163DE9AE8C3B4FE1558453FFD56500FD7EE5B33E8266EAB5" + + "5ED4AB5D732CC4CB728F8D5FC52E79D50F63192E840AFBA2B1B56A9D4F475DA49DAFDC06115F456E" + + "B2D70AD107B1B3E9830286E00A88643ADABCBDB89B77A37C6195107917FDD7964323B6E945D55F6E" + + "6D0614F2C4BE39AE28F303E9F6889269C14FA6671F21EF98F44B9E44368D2EDDA5B3412DE064CC07" + + "FC309A0695CCE1E268ED7774B20521AF34F55690C635DEC3FA98B5D76BFA5638C3596C41D0238D4B" + + "DB6579155129765B8AAC28379C8F6168726A2A2218BD47E203C89D2961AC5B5C2CF320279E512E25" + + "BBCE94B3DC59006082CDEE2C80B93FFC8C18667F4E31291F5F05909DF0E4366097ABDC57B9D4FA6A" + + "47EB5A8ACCBB62BD91110CD5B1C5D098264E87D7C3484BDD58BAE7E376D00D99ED18441EC9506EE7" + + "DC54E63CC18F1B7F8E5328C76DE7828C0924DB3BA33E11774DCE64CC445EEB4F16F5BF46D4550233" + + "F58B2188485B6751E4897DB59F85DC9B9ABA91C3C2110AB0DB7123D439671587D97AC07FDAAC32DF" + + "9127DD4E0FC7C039C9F9ADEADCDBADB60AFB347A3AF979C2D78C7C5FBEA69448A46E9F70C714AC10" + + "EB5DCDB32AEC1355D97E266EF4D74D3197A463BBD7AC9797ACD7D6F0318735306A2951882A10673A" + + "47530B563E401F7B5ED0F7FC4516393DE5F8C491275AA9E5D564AF1453AC028FA0A8D111EA7D8F70" + + "69FE4ADA6C0A94193DA5342CA008E31964F6D3CEB0887AA9AB6406DA3077E31924649A0B730EDBA8" + + "32609DCD55ADF4A7830288CD96B4D50309BEE848B2C77ADA7289DA94AF661BEDC36A82858C846894" + + "ACB8A1AA5155A3FEF94A718FFB9E12B5E62951BD41A06025ACDA233AB3CE4D7B4DE4E7C57C6003C4" + + "471B350F8BC8C7E6A43654D9FFB679937D1E0B551AEA1A2F59FD57C385B7EB3A025173BB34DD43B8" + + "2F3E25CEFEA779A5A86C7C679B0616BAD66AEDCF80F725C9045280795B2100FA85A65C31A5F19947" + + "CCD7BBAA80EF8D83CACEDC34D7C95E8C6FCABF97EE467D6417FD57298AE189B39EC598DF839494C3" + + "EA6FBFD88618F7DCCFE6122EA5380C64B63F3F15B378F38AA7624DCFA52E7281F964CFFBAA34A357" + + "120AA17D6B3116EC943D0DF6168D28BA6B690C2A6F09E771637D60BB24A1A2C43555A2DB325EF3B4" + + "8CBCD88CA0D5FF5920F49D4DF8D9ADB4E5D4DB5FE5A3A86CCAAECB16E648AE08B705031CBECC453F" + + "DD455FCD0E6D72016C8924E166ABB990D99659E614DD9F7FC1ABBB6BDB193E0AB6420A9F34810324" + + "94E0F385C870B37271DE35FCD7FC81E7E5934F129207E25F0FEC521A1D2B6F0F9330E296C5841210" + + "BD4D72BD794DF7085C28CAA39196557676B80ADB8171C0E49CAF4ACE04DD10AF36E0A8E87D591819" + + "C8D38BDE0F0BBEDDFFE673D53349F06635F0169167BFDBE706DAAF4F74545DEA8E3E2471D7F5D5B2" + + "40B18DDFC51689E52F1C3DDB43A657EC4562D3E4BEFF8E8CC539ECBD2F208372CC5A38BEAB204ADA" + + "BE6D4E02E122237AFB53925A68A10C797039FF0FF148537E1F1FFE67205340D7BD3C85CB78FEC6C5" + + "49DD06829FA291CAC15912ECF808164439C601A8E86C5701D632FDFA6BCED28225F718078D8C4520" + + "C7E6D47855160ABA36F1994A81ECBC61E4930FE4C359B095D1670302C34C36D3118394A5CD3C95E6" + + "16C0531B64A4EA28F9DB54C36057A35C8BA2B4EAFD217B890DFDEE6B15B63C3857703B67B53B3786" + + "5200233ED643D100EFAA5B0A75EC56522809579B2A3D281C192A0631579206E7AC29D75373A49365" + + "9919A93ED356635DA193FABC23E3B02A5396E369A86A1998E82E60D84AF8E523C67A7FDA677CB3FD" + + "94AF9C702BEF160C02214B59C759DF19F410BA8653F70D3E0325AC39F0B24B9FF0AAC388840DA8A3" + + "B5B3D05736E94872B36F8DB31BA4A75737207DD392CCC0D279824310CB938881C3D62BFB4F455F81" + + "F93F05B085C52134BA8F1C0C8F6B79E1AE1F9D966B41B1B82013783DD862E6542D0D3F0CAD6EF217" + + "18AE527D4CA8953C13045D35998C8E384BB21F77DC3AE30C0C68B524A78DE50C553722F97AFD6B3F" + + "8B5577BC6FF3BDE331E79A937B474E3BA8CC7BB8E820918BC0CD295670C01FE6459ABF2B758BD988" + + "219E443919A6DA7E8E93BA9AE3B1D94A80ED47497BDE817620B33955C5DCCE62665F69C26A127908" + + "16A435F136409A7FF0840744EE3FE78A60AF4C92AEF122C384F0DA7E31CACE883136886269E1256C" + + "46E846E89F535340DD9B8C399BAB3E9F079ED35BADE068376DA7974180C425ECE8E73DED902A6257" + + "4B875F99013C30C97809278FCE0D5384D5D71202AA9FC83C348E75CB74B6A92F2EA16901643E0E80" + + "A942E049015A7B5EB2B1A33A5990F9B488C4D710BCD90B595329E9496B063679116C92A45451000C" + + "9E32A47F0FFC5818EBD4079AB720ED3BE6359A026619905631B336B2A8E4898F5E8F30A915F18EED" + + "2B5063FC5C672D481E3A88DDE15F9BCFDCB9719DE984684ED16402E5680B766F127B6101E96D10A3" + + "51203611335AF4617499B58C61A1698D524D696D0A7E68554CBC38D5C10F699246D23E5311BB9C3A" + + "D10D64D160C32B4B51231153FF5775907348CCD095C56ED86B164F8CECBAB064A069C4800FDC9D18" + + "8CCE9B30E8D5A8955F2B0DC21F3DA4968E73AEFDDBB819EC53F928A7ECD5BB810AEB0D395CFD4B1A" + + "142B4406A7035DC911B156CB5EA7049908F72D33EFBCC0A431B4C67D06B547E43E0DA5E05121E480" + + "2D1764AD79ED36D06813EEA4E18A27B90B96288B848BE1755FD0B995786CADF79C0EBE1676CC3B5A" + + "404A08E72AA6B4F7A21D4DFF18808FEC2EDB79B548761B71FB194B9682C9D75896410B13770F51D8" + + "85010C93DEA910E7A440E04E24D19B4B5E80F77C7F39F9AEB12BA82967342C0E299E87E3C27AF1F2" + + "95CBCF7B7889833F6B7348A41D7A770CE4CE0ECF9CA6B274BC58D7A81106BFA72415F6F746DE7CC0" + + "FB45D01AA8E966004698EA812115078CC21659F5497E843B8DF18D847BBEA5CF5030E5A333758B15" + + "4D212695424C98B29971B5EBADCDF0E0E8038F34FFB4216D2E2CCEB9C8A1FE780106C23A5F6D3F1D" + + "258C389D2BD3FB1EEAAD4531ED8C1C0F5B86038169BD3ED20FE1BEA9EBDA8E2E347DC01BC37DF431" + + "AD387706740D59C0AFAE14EE9B739AE6A8FC1A1F05A95661B4BA3E464DCCBD6F749FF504A3E6CF29" + + "00C352423B43E873C30EE881ED68D0A33C1AED43375A8402F0503184E75EF4907E0788D54C937CA2" + + "FD75A0D1CFAEC0A523DC6297774D3189999FD5B7E5E6E964E0B72FAD0EF47F9EB2659168E31EA2C5" + + "08166BD0C2D448AEB496CACC312E078FDE84F07174C8BC8FAC246CBFFBE61F646B06E6ED76C7E8D0" + + "28A375CB832BC31E248D4E02830DCCEE04E197ABA470522A614EF7F44D2C1D2D86737F41B7C17044" + + "D011304D1081B363FB331993F46F44A7E52D8CF470932F55DB5F843671C8221E748C1BE8183757EE" + + "4268887D81F88C0BA9F009DADFE4D1EBFA4984686FF6CB84B19B8B817AED98EE076BD9417F2A9E60" + + "C8F42C3D4DD4BA000E96D6B1255E5A1BA908A7205855FFD62D57AE99E5DF81D1FAAAC7C911758C58" + + "BBE4D67AC4C645B505BE2001FB980A8FBE3EB2DA2C76E4E5109B776B145FDACA09A2B863E4BD14E0" + + "31DB0FC9C5926C7116DB29EB4096FB7447BB38D8A677901487E594670A216BE72AF37027EA2CA149" + + "731EE2A47461B09E09C2854FA43FD3A203FAF666DBE090F9809D4DF0340437CC0BDD177A19930F7E" + + "4C70479A1AEB8478E3A52C22F9AC268B99FC3883DFFC0E505D9F3B29B7B7482F1CEF13026B29F5B9" + + "202DED4355946C4706CF3261C32B6D5F72B3C310A5A4A5D1E982B665F42D5BCB5DFCAE4D5B810420" + + "AFE1CE5D8831B2D355072FC6F452B5CF7B49C45AB51C28D52CBB9276FEC366A27AB8625A73211AAD" + + "DC6B821D028787EF72AD10C2237ED8123B427EA3DF8F3ED724324E7B42277C8B0BE8D88D2E6417AA" + + "5F71053D9A8BD4C834A582F0AC2695B5F9B1811931E66178EBAB4DF8460DB7BE322ACA75443888A6" + + "4B7F62A4A0673659E01F9BE6224AD429E64A762331204796492258E37F76D49497A463060F48C261" + + "CF7E198EA301E08B0E49EB19CD204AAF8571EC62C805D8FAAD3EE803D5E373D26443447BD0CD0836" + + "8521E9577182D37FA738E9821A27A513FAEA5CAB3766ACF7A15D9CA1A0F1E86EF4078A6E19D2E40A" + + "EA1F6981DB142F01E5E56DB93CFC3D0F8F0329568CBE9F10BAC4974A288AF967A398A774753BFBCB" + + "B3295F4002A3338B52B2F8123988A29294DFBDD6E0E32A4525705C6F878FC2881663DE2F5034F077" + + "9A772E52CF1FD700082F0438C4112F9258B074F21ACD038005C8311188AAC1981781E70F7682F59A" + + "62763D8A0FC751477467D912CC07F88187A4D5C5B93A7745BA14001559A3FA32C341FA124F8A25DB" + + "8DEB4B00F07CAD179640B370B5B8DC5D898D1535A2DF33C068C98F7A1E8EC23A158A7D959701D2CF" + + "49A3F48C6362FC52BB19A111C53A650B80E201C24CF6BA8ACC17D2B10A97762B9EDA6F08EAB4A269" + + "8CDB70D9198F51E73B882D0D2C71AAB8ABDE4006CB882D2CF2BAA01722A193AEF02D34F6AF66690D" + + "1D9E3A37C368E63FF191AA7E629396C1D21F3F829C6F8676C0F17612B19C49565DA39A6249FF4B32" + + "3D3D86A817539F6740E593F9BCC7B0B70083370F9A247D7839C2D201FAD6A66518FC4A4D2787FAF7" + + "0111362E1483182FA49439F065642E878BAE2F114BA0787613A87CD5F6554C3A749C74C8AB082769" + + "D41DA1724DBA0D95D140A274C16E9475DAE2363CEDEC4D460786AA72FAFFC82D22F180DF1552584A" + + "E469C1449B54C11F0F6FC874364A5A54FDB7C5A605F1FF92853EC8828DA3E5A2566C8647404BFDCC" + + "2CB064FA924D6BEB740E82FAF4AFB76AB1028F9920EDCF73695AC2A135CE6280B2BA55BC5BB19514" + + "D7E9705D164EFD190EBB16A3CBB087826CC0AB276143D4E46B9949F2C8C625C8A55A4AA8703C3315" + + "8224E40AB3CD19FCAC1E82817A3A6F2191E19949637F3DF3C5CA70E5AC33A1EF412562D16466C604" + + "E2AC7105B9EB931640F6DB112B753AE4F5497079D2FCA81D243C6D0D51AF186DF2C5BE9E64323C36" + + "4443E15551C52BAF33B4807CD3B9CAA14BD538F621D75A224C2DD657246E9876C643329C9EF4F35C" + + "328FE4ABD1649AC91CE30CFDA8027977E0804945225D3E175F52E16D82E68457D2E1F89B4E3AA296" + + "72F9B46385F8C8A7B1B583224CC63D2A2A33E573FB0DC2D04692F570AA2B2D63A2960B5F88694B45" + + "C6DC7A45B7CBEAC852A2C67C9D452C7E583CCCD13E8E832CFB3AED368F8FCDF1AF83B9278B1B0D12" + + "6333FF2D57299D90CC9BEF565AFBC97F040661C4DD4DFC51D01EA53BD5F819489326CC070E87335D" + + "FECB838BE19E0F55BE8E20A564A039303A0DB58B869C5C5026D1F46A50880E24ABC665167E375F86" + + "A92CD73148401987901D8F1CACDE2364E202C24024B98196C068E57E28CA4DCA2A616AAA003E52E9" + + "111923D21ECF8D91448DE1CB0189E813D7D8709A2A2BA0B4EFADEB397068F2C3CDC4CA0DCD586F31" + + "0310AAC97F3D78159ADA12F3021FAEDC26F12A8D0090A2EE576008799F83EEE9CB72BAD808C7A61A" + + "3BECC912564923D63E6990BB423AA4BEE9B2902557B30164ED693C26F6EC45B6AD6DC8A44E8BA0E7" + + "85602DA0E7DC530799B0C54D7E53870490189EF730A9366B0A789896423D6EAEFF0E78DEB8927D8C" + + "616DCF2C58502E45030BE2BD3AA0F6FE3EE5336568B47568DD1D9DAC998B0F73D6D89727A775513D" + + "DD004BB7A64CCB9DBB116AC7055364F99477A2A98D0C464FC28809063DB210A9AD39B9CDAE09E07F" + + "C62BB9DFDAD2FCE0DED5D9B81EFE7797CEF9C186CB92C975F14499023443CE6D2FC0A705A3144884" + + "0FD598072701ED473BED117D7710406E315DF322560BB577DC00B90C45B384DF7638970C01FAD2E4" + + "67F00EE9BBAB6EE9CDEDB828F3BEBCA6E19901F9E6553749D7CC28E5F90D5BEA85E7E113B29711DE" + + "F9A0627DFC5CAB9F1E901A5CE457CB4803C081CC8A68892F6AB5849E5DDB37FCF6E551B29E3B0A59" + + "98B24E833DC69F0A853FEEEA9307C44B5200B807B544526C14572284625188F2AB15D44EB3DC3022" + + "BD3AE3B0484C53196AB304262DB66F6D0101606DE85D4468EF3636E7212EFE5727E5BD24B1536E74" + + "C40BE1A6BA7729E2FDF57DB13457087B5F9403B6C018244B59BF9E56986C637EB294C4F1D8A3FDF3" + + "ECF7FF467A5716C63C569114D2200989FCB94AB86B16DAFD3BF7094A1D45D1F0A9D5D7C9A22105A3" + + "770A6D73699F76BCDEE236A993A7C9C3C1A16880FB8ED0A9C9FAB448DDE76C3363DD6034D99C9FA4" + + "7705D8EDEF9BEA5D1EB4B10E556981D73E460F0843EDC1B7D026457E05E77873B0BDE97D650EF0D8" + + "03F7369E9F3C5AA85C651B520F4F6160823EFCE074EE555453514AAF11DD3D59981E57A54E43F6CC" + + "06B96C5A3BCBC4FA6DFA5AA36889F75A9C84E295096061C9C0571DD449CF5BDDE164696B48F1D935" + + "E6531073A7FDB0B6F3A174AA20D7317025B54C1401AB4E7E6E01A01840EAFB102F036D3AD1877E0C" + + "6C1E7F974DC9DF827DAA5644020838538DE2FA25091CD57238C274FF5AAE1A7CFA4E1D39FEDC6069" + + "27AA35155D34D3A302C7E8EC03795A89587E73AE32062CB2BFB479D5AB3B1B76CEFD9F64A62EF0AC" + + "70A6068761DA307324C97519522E66C70EDB434DE0434A094E4AC633ED7E52CE97C6DC99CD3B8E03" + + "015A19F54469C194318CE3F8FC88724D40D4C2F0DD31CD3DBEBA8314C29853F1D43FD653908ADD10" + + "3AA365BBBC11881BDA9F31212D6343D7ADAA80227AFB3896479F0A84A34DEC72F5EF5320097BE73F" + + "DCFD0FFA2E9A91DEC479A07DFDD3008DC46F36A3506518EA9A60BBBE4108514E277DF57A89FC057E" + + "435BEABC3886D2B1AD95285BCA0EBDD27899F73418D439AF36D803D084AE22EDCA00B20D38918491" + + "94D4927BB787272A4D7A29ACE9D07EF669224DBC1767864010E0E3F1390B4DA145E00497CAA2D184" + + "941B370BEF33CDAEF2EC198533C971986C5D1E880BBC45858518E0B67E71E282A7818588FFF29D2F" + + "69EFAE7F90D3BA25978308AD2479051AA437FD8D63369DA06CA958EDEF081C740A430211D7E9BC83" + + "A543EC1C114F2B006F75911C66A8736B0085694C565F69839F1AFC507A749035536435D6A19E25D6" + + "F5AF4D598CBC8F07937C85671F0FE7DA1A8EBA372620B0BCCE1DD8F5AF07E886EC895B3D3A83125A" + + "5122712A305E532B5AE5DD8A24126051ED88DD9E16E02A04A7B6C5733B41C0F818DF4986729D44AB" + + "BCEFD6DA0B8F3CB2FC977EFB7C2B399AA9E3C8750A101A30BFE91A61C45CE86C8359C9507BD3E86F" + + "2CD083567180E132400DE25B09C804863F52ADF4FF68827FEDF07B5D5D7AA88B3FD13D0F975A826D" + + "DE1ACA47DCD65DFEB627CB245F274169DF1AB0F4EDC04C0A55BF3166C6BBAE0A760C1C41D2629A9E" + + "E5681DAA85FE4A703804CA4565F979FA5B9CA976744267D4D25022AA987A6DAA6015ED67BAA8A6FF" + + "36A6A92E90815A98B6B5BC400CFAB3D3D0D8532CFD8117E2325BC6BF9130AF18DCB671281637AD26" + + "7C1F2BB05CA00526D57F976AC183B5A7CEBF653EA7D6B8E16519E012218953684314AFB228E6A198" + + "996E964A121431BCC992B1699FF03B2BD25396FE389F946CC9AA7FF2407E398028052FE2028B35FB" + + "1719B2B5F61C12C207EF316266CA9DC85099D5471049D57B48A786B2", + contextHex: + "ED25DC1B30FAA7CB48DE2A98D5877E62DEBCB4CBF872F6ACECA28E04488CE7A9DCF5D777388D5C0C" + + "94E769C53E0B1084C366F17469D5F3C49D15A88D063CB2B2A469A3E60C41C8CF311DA1EB3793C195" + + "309440FB3E8C1280DBE3B9015C8E2935D2A05900A04119036230007B56CFA85616051C30728553FE" + + "69442826452AFF3299F7BADFEAD79A4DC5B281918B7CC40409FE2C5CC0C32D8D8044D73B8EDEB6E3" + + "C28BF81BD3B1554262DCF39F12D343417FB604FB0EC1BE91128D913F19FD29B9529465CEBD44BB0E" + + "F93A1E7E54", + signatureHex: + "3AC6D70214449B650A63658FDE06213171F68B7818D2A3E5F958C6CFE0359C7042BC7E71B3B95959" + + "344346CE5959E7D637BFED20D02E93C48A1E0FE0F13A1947CE76C8292DB59057074705ED53ABF501" + + "CA4ABB4D4F77A9EDC1DBF6FB62EF66D07ECCD8E11132CB4D5FB62666613A4457C7DEAC54B9D90D72" + + "FE5628793959CAF9B82C84BB97C4CC48892360A5FCE4A982070923BDD76AB17BBA08DBD5FD2F46B3" + + "FBEEF224C541CF837D202B89DA6EC3A3456E2C5F3CFFDAA87E055147102B45CB79BC4C6E16D8F613" + + "4B38381680EC926C10E255EC1379367D962E87DBCB475E32D9422D1B111FF4204D55D4C676C6B6F5" + + "A77EDAC5FCBAC4BA793628946FF06AB71A1189AFA4C6DA8A968ADEBC02B282C8C3B74C946CBCB12D" + + "18906070FFEED88A7C02B6096F3693468A112A6AEDC783EDD567FA3C6572AEF99B72B9C42B3D8B82" + + "8F100CDFD6FCB7EA900A20A7D5730FB9B0E92C53BF83486C304AEA57CC82BED980FCBEF0220DE680" + + "C7EDA414CC6A498FED069BF934AE14A9E319BC4476025EE856BB43384CF8EC2E639A1D9FB4BB0BCF" + + "9CF6C18BDCED8CC58E08699AF0B62DAAA0F5162AD7BD7F6C8015338DD78239731E09D94BF1F70E02" + + "E7977A491640DE68259F2BC2C0EB4D19497A7FF377E332A58F623C9301AA3428C3AD44DB17B2AAB9" + + "635F96D72D41206D3AE184992F929B1F7B69ADAC88410B4914513BF1C657B89E522E0418BCCE5B2C" + + "C888F7BF6DB2F27A187F04CDDA68D3EE5F2C320BBCA14B448A809D0D05A05C37551197E8ADB1E237" + + "537E14AA244117E5EBAFB1642685EC4A1C2117C6F8E56EDFBE04CE9A67E60D898281487F7AB3B31B" + + "BD3DEC924FEEE1C17D8342203AFFF745CC1EF4BA87F6B156CADA505149094ED7C922F3CAC264AEA0" + + "4DA4C23F52918C38B9EECDCC145F804B6C146CEB0B265EEFA24317930563EEB1FABBAFC4449FFDEF" + + "32898A17194FFA11A0C1777C5D2F27952DB5D90BDDC96640C538109A97C3D6BF6A86AC8AE0EA76BC" + + "922392C9572EAF472711B8201057556CE4B1B9928B610248F8D92C37B34DD6F8506B9060475AF033" + + "A7F6123777AED15EAE0CB4DFE2EC8667007F9E4AAA146F79F890380FEB4CD6712E8D18B273EDDDAD" + + "128DF55FE602215BA79BD3B66F8EE62D1F253564B93704CFC7DEF1256AAF03D01345FAF64B8B5AFF" + + "F3D46C524848613EE66BD73554EBAC51D505C08413C21560890EFEC98AFB313AE06DA64D15958C24" + + "8818D029FE8022666F508F73FB3A1B24C4488AB143013C077F84A836322DDABC9D04CDD1D1BF23BE" + + "36FE6F9A984AC7D37A8852ED2967DF6A8189DA0AAA5AE88F3BFE646291868A41F2102697B35785F7" + + "71CF5788441367A6DAD4196281366F367734083705FC10E2523B83C67420FF13145019862049DF58" + + "4DDA24EAD01CB88321B93F646C46C9F89832080E90644BE4827E50DC3EC3BCA845B51216844EAA4A" + + "0100842578898ED79625D9F352FEB48641FF78C4AFA5C8FABAFC9FA5F979854BE9A657FF4B98C0AE" + + "6D8F50DA33AB1D745E71B3BED40496DC2D269E22F1465BD74B2EE3FFD9EA6AAC19001FCAFBA7D4BF" + + "1FC3A726D29E8DBBA033C2331B325E933FB2FD725A6889FB0DD2194CA7EB928EB3A9440A100EE04A" + + "E353435FD1A7AA434B5D86594F630EAE803B90037A21E9ED58EDC713E53FB25AAA8556C3C6A208DF" + + "A3810BCDB77570086F166C4131C9C027263E99D8F070601EA90D99D9ADA0456A6E95C75D12DBB536" + + "DE4F3045B469A7DC8DFF2D5F12B4DC829E9DF19A66F19BF5D3CEEC89861F8036F977C4230EA69202" + + "D20EAF372900699C193002D19A79701D26BBAA8C7389D22C4D66866C95508E98454248CE1DDCD0E6" + + "2BDCBE4BA7FD0B22F76E2F1A235A946D7FC704D7E280692429665BCA57F9196FF620384E4B63170A" + + "33AFE40E03893144619EBCD499533DA935850B3C02DDA5A7FDCDE093035770C04EF776CBFF01A540" + + "E7AE1A84EB0D863EE320E7D135478814703828C17E70DFDC937BAEC374FBB3B921CDBFF8D99D3C24" + + "E2B53B198F2EC36753DCCDDF63B4FD2C800BF1D4D3ED4C78ACEA9B37D590D4C2F713FC35A492B68C" + + "EF85271D636620A06155DB30CCA08DC2608A2AFC30D492738B84C34E7D5A1C56C12F6269E4105FAA" + + "18DE515C5213FE1BDB99779EDC56A4A9BEE1E586B50C41ACC2670EFFF2AA5C1F35599A8DD5070A36" + + "AF89D58D455CAFF3C8A37BCEA276A3C4890FE5539E3F7921AFB30D40CBDA555662894EBA9F90875C" + + "52AE6AEE97ED489A0A32B962F902A2F6C7FAA70F34B16EF8693CB36F59F13AFC1EDF3C7E541BE00A" + + "48FEE767C82FDEF8162E7C33C9C1CAF29D1AE3AC98A6244E2D4D1638AB58DAFFC208CFA06BCBDD3D" + + "8D46AF358AFF920EE8C27D1F0D05317356C0F1679FF5C5094BB8E90EF26C8373610AE55BD13C7B36" + + "68E47B07FB7958F2B2DDC688C67A6969112EDE4AFD8ACFA98D9101A5CD4958BE9734A3D0DA173D11" + + "676ECFF2F517C056650E5C50D6028652FD670E713DC9163183E87251FAA8BBB8EBAB65241589B2A8" + + "CDEF18B0A61AA136B0240FA2166441DCB9AFEAB1D29B5FE375DA04BF8B874E954590881252A7E5B6" + + "A123A1B55DBEA0625B502D67C015372765BFDE4DC2E70D53DA105E5885CD5C6E98A4F4DCF0152DE3" + + "F6360A7B16F5332FDCF8CB3E5BED5E1B2A5197A8FEA3C90EE2D0B52CB203EE4A8FBB144444B4B9E3" + + "D1E6AB6824C85C062454BC43FED12D3DAAA46F1FAF61961DE696C5C3FC59A234E4349D222B7CFDCB" + + "F23BE757530C29EC79EB5A3037577715A7EFA2E5DB5A80426190D7535BAE608950E21771E28DF748" + + "D5D381BA61F10762C11DAFE6B60E9EDE069EF739F9017E1E5F4C293F20DC5905E1237795C26F3AFB" + + "4B1BFEFD8BF269EA4F040E428EA34F7B56660F6D9E2E42B01D5739FCEC5A69BEDED1C078D0EF4F8C" + + "38E23A113A0277517AF651530EB11FBFC6DC728FCC6DCDA578E408D60AE137ED07C7F50DB9C3FEFE" + + "16D43166E30C949AB9EEF85A4BA75A858922992802CE91875CF0FAC77AE67164A478ACD1C0331FE3" + + "655A9FE7260C8A6F45E24FB2AAE9CC6F1BE633C37D89CB93B3D22F7499CA3FE890AC879E45D37E6D" + + "C3CF4F8EE7F0DD065B3FE4AC8C95625B5283F43C723E173BF245942FAFCF25B10944C900F9CF9DE7" + + "D358654231B832C03DA3747DF42B5133EE593F6AEC68DF9D8CC5EE00D124E02C0BCC9DB5E5D1C398" + + "A49AA03FBA8CD19C476A903871E467499D6ADFD7AB82F1D8711D61DD0EE53C4A1F26D59718C74511" + + "9D47B501DB2E8BEFEB0EB2DAA12E93AC444799DA3B71A9FE4B5E1FDCC8FB1F7CB6EB3A9414F56958" + + "85CD1E5095FF21DEE8232F54C2D78C5224021A34B74DC0C4E60990A9ACE32CB9AEC27F7960DC0C53" + + "2AD050BA4605FB13EB3BBE45FFE1E418D656D011A3DFBA42BFBE283082DC89BE6555BABFA8A7E63C" + + "CA8BA3F0438974361EBB6AEDCA3270EE829818B5212E60C5DF3B32FB31A9C55A945F64EC59DB15F3" + + "8D2B89A4D902334459DA6D71C68C7397CABCB105295C8BB944B32C0CBA3D9AFDBC7D143C6FF885B9" + + "046D1011FC7D91BC52CE8879A473278267CE231FB88F6649DEE01306893E7DA3C53E68561BDACD7C" + + "1FB972CD45F152C28C4CC7AA77354E3B69637347934C1B4D5721E01884785937D15D47BEE985EDC4" + + "5541B2ADEE2B0366DC9F8111E4A00637D9339F66F246B7C76C46F3B0A99E16F2354043459AF6C461" + + "E1E4530CE42ABBBEDD8D26E103ED02FAD56544B81242200C35602146409EFC62EED9F234448AB613" + + "9EC930B557E9B573F1B0EDFFD361F14D0432FE7C211E74B94E63B334F57827920FE2DD5F5E09319E" + + "BC89859C61ED728D8D1C661BC0FD62FCBAFE0897C377E1CD9A4BD9399FE5DEFD8DDE3BBD23C9AD5A" + + "7C0AF492B85FEB2DC3053BAC84E73C83DC161D3B0B6B01C5FDA59FA4ECB8F7001CF84E5384F9F7F2" + + "9524E2CA90CF1DF90AEEE56E179ED9BBC29243E91691D12DA3127FFF37F4E7BBC25764D70B077E44" + + "4C4D26AEA0995B0B65D8F2495BE03D30A5D59FAE7379B3F5C75CE6167A3339D6AA64DF74AF7CCD16" + + "08D570B3AB05748E515935FA089D79B947450D3C327E56BACEE82436345337E3D3045E3BB8C0437F" + + "D9EE2BC78C510A8D735327E53801D39245ABCA8166457C1EBA9EDAD3D73745B2F9C07C236E794205" + + "565C5C7EAEA4079F2C297D6978DA50E0BB272D4D19BCF0CF2C6B75A8A92077984F0931863A2D2D6A" + + "A2E61DD28F82953F60E0CDF801D30F4C2AC1B6EBDB888F084FFFA05C42E32F772A511C5177F24F62" + + "09D7CEC79C7023BD51E620D6822687894E6458D36360F3886ED0DF6168DF7997927EFF5E02E7B150" + + "A75A7C89DE9789108AB1424426502121EC804BD576EA553F3E37E5EE24367118C8FAD7704E167318" + + "599DD126230DB79F5E924BAB27AE63E29A0EF56002ECEFA234078BB6ECB0C43F2717CA1E5C444852" + + "36CA914B735747A390D2B4F29E28A67B992E1DCA8A75AA374E0F27C035D1F74A630D1C3D18BEBEF6" + + "9D9C7124CC15B37B4FA2C45D6F2027AB51EE000A6660DFE3E4B2C9F8071F3C261F51A2ABBACE912F" + + "4411D21CA123B667BBE0FC36DA8B1D9BC52B49EFA22C9BADB6AEDA756C774E354F17A36E28E87658" + + "055CEA599BC5D7C415065615C3854E004A6603EC713DCBB70302E2BE2E690F7DF7592E374A91DB43" + + "50CC5968997601A98DCCEFD3911F330A0C968E6F1C5939ADB19B3B3B2DA7C72E8025C1C9D48311D1" + + "AC255F5248FFC7E5134FB34B672C4A3D98091EC4B5A0D5E3942A3AFA1B84D6D453F642ED642F44F4" + + "310D4500CC4D7D40F2708CFD97C1A10579E22427B1F1B921D507BF2B841E5B1C748EE4A019343AF3" + + "F0144BC48170FD53B755A8F0E744882A18CFDA2501C297780D115F4FE0F76F3CD96613F94CE44FC8" + + "E1D4501A6A2C5F24C274BA1D7D56227235BD6477288945DD1809BA94E60D170488CC3AE45A884B07" + + "11ABB43F274654914CFAE959F075A3A721045C9F403CB8B5F9488992CB26B86FFA139CE7CBAE4F77" + + "70DBB45C1F30B2D6CFAEFC38CDD9B27899A538002F9A2AD1A72DBF26F8DCBDF24C79F8A81B56F9A1" + + "47918C358810887A3BC666DBE99C1D9EB7FCDB56A125411B098D443A9F73E0A124013D175BBA96B8" + + "1A8A72AC3E99EA031D5D6E8148BA413DF23298F11C586F6E24A349899A7351E1CFEC92792A18E159" + + "A73836A8A0B667CB2FE54606205975C04CF8B62397EA1035E94CE1832BA4CCE93CBC18A8D3B37126" + + "4C384FB3072F4F5DC6168E399D61B510D2890BF47AAAEF87EAC608646917BD3005F077A726A16F6D" + + "C8878BC9523ADB3AC9950EFC09343527756210A6C08F048F86A443585411D21A0C39A123C800DE28" + + "EBB6691FBF5CEF26045094B5C7F112E24FBB4FCBA37A0DED1EA498997A89F3EC7306452E2BD93586" + + "898ED9E952291A4659F164366D06D1AEC2E588096B1A0B22CF6889382B37BF62F0503A36920DCB02" + + "1A4FEFCA480789B09C730BBBC8482E8FAA4640A5FECADAEEA0DA5A62B15438463DCC5562ADF7EA14" + + "3B4F8D5675CC3E9205CC913E7C8C18482C4FE0EA4553753B7A4635B5408BF7838A2140FB1451E640" + + "5E5F5FF630EFAC8764BC838D4CD378FC87A43361A3E6419811AB1B3194D23B7E17B54FE5851EAC8A" + + "CA0CF8B930AD8D52F9E996E8BE415EDC2CE98D148EE135031D0DDF40F39E98BBB9D8375196E2443E" + + "D9755BE04FF609394770C933CE69140114EAD533980C9E784D2B107F0084F86C4FAA32BC49CAE22C" + + "D0D295EFD57375DE94E6E65E66DE907705D77935C2C53EF9E0D3038D1913A47ED4CF936168C0AB42" + + "0B6B028E2DF4C90E8483770E0DF839504E28A3B8A757BE21D1435079C4A337E96F8B790A0F579BCB" + + "736BE95A96095B0D244AD85FAA823A5FAAE7A66B1237D8744044DD44A5B6E57C32A277B40436CCD6" + + "5416339107A6ED1F67414B3764E416B7EC555C28606F29817BE2D048C2EDB9AF45FB741ABDC6F9CC" + + "4A7A148F363585CEA8339330DE82E389CD85D3C278D0AFDD9F7A32A43C659CE977BC8C50759DE147" + + "678DC14529296E05851323F5B15600B0F3B18BDDD77E81CD016C8CFD176F53F26FC3029509D12C8A" + + "CF5D7E1DC19FCBC250D65119DF3E680E9D8A02D5FB3C28037BEB50A3EA82AE8DDBD8FF8083089AFD" + + "A4712EC5E3963D2CDFBBD4923132E20CDB2D26E9E25866D92BFF67124CDDC8F514CB19EF98257BBE" + + "889DB537F814A0C57786CD9B57A09CC633366B646F77DEBA94A990817B2BCA48BF5AD1603CD5F325" + + "12ED8A95836E5129232D2AA014C3D0B724A52B13187A99109DBC897B4664737A3FE95BAE1B364651" + + "01EF9822BE2E228D59AD30AF4E96A990E020159249693EC72CA7B9EE44B0BC5F8DC8C872DA25EE10" + + "CF4609A9428D9E0DC9C2AB4CEA2B8C7042F509FF80CDD8075E6D939CA6B7BCD5D7E40025282F3031" + + "5C81A8D0D1E5E9ED37878D8F9091979EB1B3DEE1012A8CCED5D7EC1A1B34418B8FE00135456786D6" + + "DB3C5D010D24598591000000000000000000000A18242B32393B41", + hashAlgOid: "2.16.840.1.101.3.4.2.10"), + new MLDsaNistTestCase( + nistTestCaseId: 78, + algorithm: MLDsaAlgorithm.MLDsa87, + shouldPass: false, // modified signature - hint + publicKeyHex: + "E91AD8A5149C5C54087A759F86EE3D6D58ED7D1553A8B92A78815DE62CCC00EC144577F66A1D16C9" + + "0359A0C7BB385AA266706509D3066265D1929E5AE650ED003759EF818495C8FE3BB7201A4C2DBA26" + + "C240E3A9063E68CC323A61D56C6CD0822EC1FE600D3F6B21F8E73403B4EAF682B752DD95A0339ABC" + + "66ED699B70C3A59602930E6539D2D5BDEA2ABE71943764F273BD4F239C73768ECA2A8C5A10CB1CA5" + + "04A636C008FFB3F19CB5B503D32746BC6B2E1641AAACBF4788E1C793447DB21767914A2661C4247D" + + "A0AFFC41B1EAC4F508D808C5A2EFC8A7E66BEE59838F9B02B888FC2F3D81495B6D7430F9B066C61D" + + "B0D1C4EBFEAF424CB6FBF86001B5DBB2C85FB1383C10EAF7FF6EB6E2D6D2789131B3117B9B86C622" + + "A4C9D2B37EB360DED425CE4CCF52E788465393EEAF7B951B1D1658D8E07C48F4A3C82C25A950DF9D" + + "FA24767E5E6ACC076F11BB617AD5DEE86627A411188CEC730021090668F789276DF8E4133815EADE" + + "245886189F1D2B3B0191AFAABD9F93883D3B393339A0DB7D4AB5620E2B27F2C00B124451A94C3187" + + "E3B4EA6C9332A67B78A2647908971116FBB128E44B74BFCE360DDE417F7A2AB191C10B04FDBA83EC" + + "5F459F3D0CD724C82C3C894AC592D29081ADA6A948D2C576E326CDB8FF70E62E9431F591E35A7F57" + + "1C02CF6E74ACD32E17A1F70FA23CF160D3AAFF86BA8CAF3C0922453F72A876BDD0A771107D214147" + + "531E3B5F194C3F6981BBD5F915CC08BC2ED56A00636A1EECDBA2852FC5E23FC7ED85DCBDB0E7CCA0" + + "6D2523B5AAE90E000A5D81DA1245654DAECD2ACBB40990CB53F535535C23F077402DC7D5BB2EFB14" + + "02E763DA2C629945183AB1A59831C061B0E8FCF7D03DFD45B432F7F08FB3A24DC9AE65A527CE8C35" + + "3D577648AC8056DE3A63125B0F6B5E38EA93D3B6222AA595ACD06A53D85F04C4B2BDD39DA3FE7E39" + + "65F9F9068DCA77A5E240DC695AAFB8B5B050523E2D5C401038306639345FAD21A2F74A4ECCC40372" + + "7BC5AD932937E860A2778A0FDA890C0E021A06964F3D96B3B863A229333E38F5B35B916A55E89EDC" + + "04645F212C0D22109FF96772D40F74C6EF952059ABE866F98A175553C3961E24D5ED00381C487EA6" + + "EE999AB4C5ACD90928C3FB6A21DFB5A03C58584EC6435F73239F57881C633784FAE040CF4C0384EA" + + "FCF7057E06A4E261945966B2C6B65989D3EF42B42F714A23CA121820D02D4D6B63A67877436BF7E9" + + "4E5338739B4C80AB1F0147EEFAA30862CE1866F92D7D1432E93286ABEB23959055C5AC2FC52FE47D" + + "2DB896BE010ED14D512AC05EA6D1EB2AED5B05A6E2F6FD47143E8820699534C0F4AC63B0DCF311F8" + + "39D42478B28997663A3FC0822507C3946F3DE45263EB9B74B9A0D4D83AE1922E87F86801F92504C0" + + "A62F47BED921CB9D1E23EF785F960312014828307E203707058758303C53C67A06B4A56251F59C2B" + + "5043CD38FD01CFA19BB012B4B0481B274267FF864A52F945AE490BB3000D498DBE948E0FB884F851" + + "D5F91135783AE78EB5F10AC965F41F82B1A51DD0AD456A21904CFDCB5B666B964DB657E0FA4365C6" + + "AB4AA2C862B11E0468099483A2251C837C95E2CE587005D2FB21A821C97641D7A930E1C7721BF171" + + "1F324C946C5CE5700B5B422C0D1A6EE1E13D37E9249A72BBD000A2A46E78B51706D0A49A6AEDEB89" + + "539B76F55F4B81A6583FCE226C5C4CEA4C39CC8A658F2A301B2BE6E3EAD0EE8A7DEBCF320FA3DD00" + + "8E02CD79AE2AFEFAAFF74DB608BAC9CD6FE26C21C84874712EAB9FBE6E056268F1CD677F94E9BC87" + + "01E773619D38333FD92AB281BC960BA2B62D045E53A38FB82BC5201DB642D00C01E5FED3B7F96D3E" + + "015E3F1B2CE61C4800C227EE33C9A2B7FB3039B9733B442FA5D80710328D13990DB1F487507D09B5" + + "EC34E0BCFB8E082A846264C434E3AD4FDCEE21BC8A2EFF7D3C8D4DD8637E5BD0E98EDFFBDED9BF42" + + "C9B550F6246E7FCC42668E71E510A9476CB5DACFF0C8DC5497BBD00FDC3016A497835761BF798CCC" + + "40F3E97DC6FEE1D47533349543476058782C25E31F66AB894A715859A932F093BCA863645A05BCF3" + + "CDC8B37D40D2192C3568E4BAEB24ACF20E6F2AA5F02FF824C69062900EEA9ADE41BEAAC4700F8260" + + "B330C025323D53C308571F7C3EA3308811F2FE285BC3432BD6BE948AE9B98E4A0BBC1F4A3A7D13FD" + + "E3DC75037A6CA621CB47C5586C63E44C6F1958A2A49A78E58C9A2BEABD7E34E3A0102503BD470523" + + "8DE385991AF392BF1BD79C3E5F9F509AD18812C939A83EDDEE8957243F3AA210033AA3F1686A8870" + + "06AA4A5021D0A67D1E55BDCD9B93076ED4013215CF78B83AE470E54AEE1778C0B427413DD3CA717D" + + "E30329BB06DC5736756E8C6B047CE3594245C0753CB71F5BA9DDA7401B8F976933C80E7A2E74FB8E" + + "CCF8C516A0B09F2C1454B445BEC17E9919B5BBB11EAE3683A73F73159D91275EE114128EE2DACC83" + + "4AE961A0FAAED69594C5B0DF53326490C6FCB72E24881153F68A7D03CB7F130E913164E5270DBF59" + + "130AA4E49B318E889BA7983F023C0C6D858BD01EE9DBEF8088531D12A18C8FDB2AF6AEF2FB0695F3" + + "3B3E3BB6878D37D849D7637403DC7050950968895F5CB664D0EED9803C95564CDE22840BE630BCCD" + + "1B4BF5308CE63B0C7859EFEA4B79E5137F3F382DA541D1406AC84F277AF6F53984807858BE60A071" + + "1FBA0986EC8E777E65B6D7E04A0F93905FC6B7B465250FB69B00BB6796075A1ABFAE64CE9613497A" + + "2566FD2C548EA63DCDFB986E369131B16823528F7E93528971EEACB4581DF90A6A2F68A03542C6BA" + + "8617936ADFF36A9D5EB731B2B84B4E9BD193FDFE556989C2113B75209BF8D47D32893B61185BD1D7" + + "7F6871CAEA32099D0978664D029BD49AAC8280A5E0BA30CFC536F8A2204B6998B70C31D90E4313A3" + + "200EA92F6F555FDEB311884AE98333CF47D6E403F0ADCFF4BC6C3E2799E0E60CF7676FDD469856F9" + + "FA3A222C221259D4123E39F283738E9965B18C7935ED02B506A576F784468E21A71B989D9017475B" + + "234EB506AAEFAAC039075723E91F0F7DB6078BFF3D61DA8EC7E9806D75ED116D7A5AD92F2276977B" + + "543A38512BDDF2B042277EA68E1003D9098D7F3B127B4AB6F26F5F5B8B8EC9BF4B78D2D3CDBD26AA" + + "76F6B4D89ED9540FFD6E359D8ED92648EBFFC32F31CE52070777DD815EE9E30A4C7E516736D58816" + + "6E5B70A3B43F0CC08E5B800488F65738DC816D36E9259B5CE88253295B7FA01C6592D259A2BCAD99" + + "BBF169FBB0711D84ECCF0866A6C42D6AEC9E7870D6A09CEA2A4D41373B09BFD45B60A49FBEB817F0" + + "1D56A75A105C8FF8A8F89DA7B11482D5974E967C76F8D279AEF20D10D37B7FD0B300F4F9C79EB9BF" + + "1AD9C028F251E3C6FAB6F2C1281E495F0B2909F653F67F3D13264BBFFA5D6CE9FE8FC81137B2BB28" + + "E12822954679BA39FEDB7F27CF2A57921453541B6A87D78DFAC843D29363343E6CE7DDE672201C66" + + "754D5C9D1058139812167DC688A2DE496F2BC55BC5D339D1232C981FFEEC6B2F61B2B310F7342ED2" + + "7A49B780FA101BC8A9FCA5BBD86E51F596865444057C9BA75C1684008FF47D502B3ABAF7735963F4" + + "0601C3939DE1B099FBC58A41D02EF20A264F7DFCD84A5434772A5B5F76C74531", + secretKeyHex: + "E91AD8A5149C5C54087A759F86EE3D6D58ED7D1553A8B92A78815DE62CCC00ECE9CA23D2A91ACA84" + + "AA45EF54FCA8D31097C7404F3A0D75CE968CE3E317BFE5F0240F94B4E7B7667BEFAF4ABDFF611D92" + + "325C7F0E8EE0948BAEDACAA0C4C25CAEF334BB88A3744FB1E8F9C82D5B4B2F6D1C03F927ECFC8D63" + + "42FB88EECBD2D1BFD33490CC346A242590E30629DA904D60303094327060086E04C2280C82305030" + + "2EC0228C0A048ED98444CBC66492989151004993B66863B00CD8808952A42811B41104A008190349" + + "11B3696404401C162A01292A04373208962514306422482622B96099A64064B08D04B8480C35629C" + + "C62104192683127058A48884102C1907420A458062209124268A8A40116104421C190E9044701937" + + "50A1024208450454C28C0C886193040A939664DBC6891C4869C820409BB021C4C82D59A68CC9B601" + + "D1841180866C62246AA13429101946C29640DC426118A02C5AA02991080ECB206003C2688B142C02" + + "458E88400644126814051044C62CE344000B04911A128463B465998089E1142D4B9890193284A408" + + "84193064994626242740C3961122B7488B38842033020326521CC88D0C999192406504C78CDC2871" + + "E04604E242805A964C22C92D61B42941968C61C284E1302112252550262444960953C8881B096984" + + "2645CC0065DAC680DA1669E24462484060DA360219320961448E0B00660897250B814DA1A8810036" + + "2A02166D028430944290118145530000DA424C5C380C421088A4962C5C1286981660144860224064" + + "D3262801248888988144428D9814500C83005CB2059C8805530830122120CB344809C51189B48C08" + + "B544D9A27021A12011306E09134E0A337299C66500146A04108A59B480D1465118A96C0B37710002" + + "255306268A44651CB9300B35840B134A133811612624D1108E10166C22A76D54148A8AB010DCC228" + + "043004A4440C01B388D1B03022A46092107243364E9C32915216708B944D1A0462E180441B338563" + + "36401045010A3444138184C08045E438091A05040B3240090464101380203725C1C86C09366C10C6" + + "8561A26CC2026AA408668A86509B24521B32508C22300AB98D51802892044A50366D8A308D22C140" + + "80C84822A7494B40454A420210452662380963422A8230665B340944C8411B476210310981169191" + + "940C4130090A208C5480881139510303898916200BA21122968CD9108190B0702332912305254342" + + "4964183250B630A3307022038423A08C01A7850B330E8A944423128D420851204309C238009B8851" + + "A3346022100624040522B18841108821A444C4C46184184C1CA69024420694222948909108858413" + + "248A618284023845E4226523322D2218109180488B825121C4490B138C2087718CB828010044C998" + + "0148A009C20452D0484624036243044DC0940988182E9C126453328282A68161328DD29664500861" + + "4BC86D9A228203B408C93862DA80704A9668088008A21224903886D19650618225218750614248A3" + + "3280C38070094208911626D248440C34865216316416845C466D1130901C219022910CCBA645C810" + + "9222334E24C52504C44823080A0AC7911904641BB12544369119B240CC26288324409AA045241600" + + "13B341C2B405518404D4200288A005229820598670D3148641422522B98022305201344CC1822518" + + "2110123952D0242E1438014A146E40420491248E8C122944B44C23046483B82D23230D0499011910" + + "8A0CA60D931665482692D9A86DCCA66D5334429C90282149280B34690C156E80068CC2C02014886C" + + "92246E0203440B980D0036108C1461093946028071A386040815026226650BA48D23364552B22963" + + "266C61A650629200DA14485B460648A085614820C31230E49004E3120504368C09126AC3804D0114" + + "25A006051242919046841235125944319A146C14163150022E14A528E0328E5B124D13154804006C" + + "9BB61083822D23B52918A951633048DC928CE448890BA010A1044D23C22C4124455BB62510470422" + + "137244840114168A1023041A9000040108C3C8914B425022870C88140C641090C406900826480817" + + "6153105113310E4C10604C0201E4080280301154866D0932240B96689180414A885011B2209AA44D" + + "2108495AC888219164939210C4189212A94D94004A620092E3960D8B44121A903011B9480219504A" + + "2626D11666C436721C39ACE293E09B7DEAE673C87FC046A1C39FDC1CB38EB0D5E87AFA792B052EAA" + + "6DA2E5CA267A577F7D6EAF2A0D085D82FBD37B774925DEA517F83A91EAECBC31CB521E0430972A0F" + + "D12AB4DD5BBE4A93C3EBD82888416E89D746E74BDC88C35838FE6C9DB5BF06254500E175C3FB377B" + + "6E4A60EC18BC896F0C012E97987EA7E048E8EA82EB451BFDBFA9E58E179EC016267649BDCAA14DE4" + + "3B44EE7D381FD73B345B1F91D5C4422DCFF89C91289994FC01E7FCFF17D74ED037CA70D63B752A76" + + "949D49D9491E3FFF2C6D63C23DFE64B63E0E1ABF86F6BF107D38F7381D2725060CE014668C98BCD3" + + "EE1E7CDF9E9E51C8AE0C44DD979D5C38FDB8D1C43465AD58C1D4DDBB4399FAC4D2E2268582F53DD9" + + "40BBA130FF3E2315BFBDA0D7E62EEE1E82644705E5692B9E802BDACC837CAC9A11D6EE12703E056E" + + "3A6638546EA069299A307E501DE179AB929362BA305B29C1EB9ABFA9E82A5BACA4449D09B9F2D91A" + + "7A9E093CCC6B239D4F456DBC904ED8E718B1887A5548C8B93AE755EB950D1E7904954FC7561DE1CE" + + "27FEB8BEA09EB20F4143A76ECE3FE75D01F636C7315E7E80EB4680A41CDF88B545C7BB63CE6735C6" + + "34CB28B3FAAFC8B2D94F837FE69913B1161DD69630F4BD862DB395503BE363D9A6E855CD3D411B8B" + + "50A4C0F7AA90F3F5E6D94979B0693EBD115EFE96748EF079004355685F5B002A5E56B23C57012AA1" + + "87364F1C78DE2C5BCEAA29673A3C0AFE5D45690CFC4F33188FED91CACE3A79CA12317831398F8154" + + "68FD8B10AC382C837135A5315B139EE0BC654BF5282303301032B1D4FF6425A4FDF82FBB0658DAA5" + + "3ADBE2CBF7A826C771ECA727AC191C936A6172824F1E319AC52F0B97875719A622F96164E859861E" + + "92A196E3459E3653CBDB15E051E9636796BE3E9A327ABE48402B52111E1C079094D0E26366269E94" + + "ABF4EE231DAEEE216E6E14DD71865CB75B271E46825ED6E666553ACD016C29B6E6A0FBF00CAC93A6" + + "1BBA6FB3E23D8915129EBF99C286CDB7D0E291C37AE3C6696B3F5A2D96AFD68E3BB8D18EEE64A242" + + "0F390F46C3CAA7E02B8633F67A36DE80212AB66FF2F56B8860F2E013F282B0FFF5B6CCC791982682" + + "C1D8ABA88EB35E130175222FD22A68224FDEB801D054E5B780FF16F10B94FC1352DDC88318397D96" + + "9E3DA587D100B8362A42FC4A48A1B0449197A4A6CEE3F70CC957F9DFE7934A389A055A618A452732" + + "299D7C51EABF2F4069D22A224C49B5604A48AAEAD7F4BCD979B10926C1BFCA8482A03EDF6329DA53" + + "A97A6FFBD1ADE63D760409136AD85F62DD71E0CC10A5E94FFBBB4364FD55E047E9CD58282FE5D019" + + "185F010B9D782019F60E1CCC9B0D1455351DEB5514EE9227D26144AD4DE01F4FFF2C8A91F85C17C8" + + "B2BB716A11CB0E0C15FBEBAC3F12456CEF86B63D3466AEC6A7DF13241088F0486AA05FA49B50B7EC" + + "2EF79A9F2495647D4498DCBEF0A54FCC0FD632BA662BADEEBA5545CC8106803A07648207FA094458" + + "892FE667F60A43CA7166D91B374C69FC32B79C2E3D9EC0ED77828502EF78D1E5E0E01CAF03F7CF06" + + "1643D96DB8B2632DB2F5AEA56DD50413B5F2BF578D4E7A78A1433153F7D2731B9EE5F859F15B2DE5" + + "5A15F466B12FE94416B4C400C3E31DE7914D905741076E7982648A1AC0DD3DBABF69B51914DF3C71" + + "3FA1D7E3F0B1E4E4845B9ED559D04B327245812AFBD0C37F77B5C6D84BA08918DB72D1CB58FF0F28" + + "724496F6B3E3ADC7D99DAF3B111A3F2F525B032B92845B84E501220A48E05C93B6CC347115D2BC60" + + "43610920A1BD607D712CA9FED2F8BA2FF9B14719F05D699C816E58D317A505BD7F70AE98AE3630F9" + + "D954425CE2B982F541A90484C5413B64B20AEF2028511241D68A0390D581AFA37CEF6951757A935F" + + "CB87D306618DF882AAD9AB61CE142323BE9D013C34574CC61669C6A4CF07DBFECA776A1F95784E32" + + "4D0B810004EA87104F3043EEDC638CFF47B40BFB8B56A631CE91C175E7A2C6F50C9F3283EB1187FC" + + "A1F48F3DF6D71C52B017C236E74FE0356E677E08C7CC6CA0390868F712D00C10DA19E3C4CB5DE2E3" + + "784082166AEC5935A5EFD79482FDB120243258CBC58EFFD4303EB67DF096D0EEE4FFC286F3E6AC9E" + + "5616785AA628D63F487B11BDCAF391678CC3B92AC7ED5C3DC63084F2F542150EEF267337C9EA0E15" + + "0A37D6B818E403582EE27C981906794744AC46462780130C6ED8673A3AAD6712DF007F3BFECA6A90" + + "B8E6228ECE00AAD3308959D3EBD38154E65ADF5FB1B854FBF656EBE216146FBE2F8BF0BD53ECF793" + + "EE2CB9C207E01F3EF315CB0B21C9DE7DEE30A3A02E1B8D64F16DA1162362D24B831209776ED8C513" + + "A1DC6CC9BD52632A1377040A90B2848B0601CD6E880E9ADF772897C9249BD24F30223678BAD3A012" + + "73E2A074C5E4817905D04C7D9A335C1755A2D22E0949646E006231F54CF7EF436C2353F28BE3C451" + + "D21DC866FF027913BD3A42366B7C4E7E905B42D95297CD476C537F5279860689FEA4EBF5DC355B00" + + "B6A58FAC089323738FF3A71FC7B7CCBF9F0FEE0A5448FCE15E97CAEDA78398C976AE97393FFFF535" + + "D2AD75FD69C837ADFAC10D8CCA111630AC3F12695022E472572DA91CB30AF43F30238277675F7C3E" + + "1E1C54FF89E6ACAAEDDAA8EF8CAE3BBC6EFD27C5FC949E48F892FC316C381C272192EDC5D2AD5D5D" + + "F73CFAD1BFFB8AB9A766209272DFFF9EB739753F77C5B537B40C1EE49C15E17660121D08DD3D330A" + + "8EE1D0501879AEDCF94463B494030A4EF206171E15E70E2450FB8EAB8C5862A61DE4B2FCFA2D21CB" + + "D24982EAF8050F20F63BC7D6884D69D28555F704080DD88207E15B7CD08C65F34CF1827B8212EFEE" + + "7170E3715F21D631A2CCDDFAE6DBC9A4DBDF4100072EBBE839E3C9CF1D619858C2757E1465486AED" + + "BCD2C8C96F10CC261D6A107566914FE8E14DED4CF49A256C62448025D4912F9D79C415BBE30960C6" + + "26C7CAAD5D8F85879CDD4EE6FE2B2634D290CAEF883BE7F3186058CA4E72568265F1A36350272A66" + + "8972F4599E7741AB8ECBD5274BD441EFFAE4BAFB2A9813EF36EA7529169326646B1B4CBDC77FC0F0" + + "8091D75D5E72F3772E7FC5B29B90ED6A36DC8349D59626ADDD15708BF77FC3EE10E1E288DD0B3B4A" + + "3C62E28BC9B844D37B0E401EEE3A74057FB8EDA5A2B38E75087EF7F0CD4A5A3D37221FE9311686D1" + + "2943039CA5A2CCFBB3D7CB84AF574F9D17761A11D6DEEE8D77BD32C45389CDAB92368576707ECB6D" + + "93634B67E8DC817D900BEA8F87B238A405599B77F71AB37594E09D94706A5EC2DF6F7AD34022130E" + + "778DC7E4CD6EB6391046E024BB5BE605BA711384775BED578C95E1D3FCB7412FF503188FDB209837" + + "F24D4B01C0103EB9C099FCB502D4B7744C2550B4A7CAA7A7F981248996720C59C33F616FEE5F3A90" + + "E80ED0221B40D5382B1E1B0FFCF4D5D1A5BB339B6255E8689B4408FA3B5E543629EBC8462D2F7E06" + + "55F856911431F12C61DC75ECC600FEB113654CC266996983473D5B7E26C511B805820D22CC065C3B" + + "A55B56E6182156CAB0B3BAFC802779F79E0083C4CE404E91BD4406FF43C6FB3EE90C18A8CAF5C054" + + "FA5B8A116C8E6A474C870ABC4D8841220A202E75770F46439AAD7CA3A81E7DED4BB1AD13C29917A9" + + "AEDC8679ADB98A155A9C147262F4FC7E6EBE4FC71EF1C5F871F26EB1C76E92AAE43B63D186ED33E1" + + "2A3CA832AEAD48782FC25AEAF0E35FE92A64D905FD3E1929539CB237E78264C8EB0A81E2DF603B64" + + "21D4DABA7FD68D89F9C2A8F2C6CFF0C1F6610BE50630FED5571DA8D8BEE6CBCC8DAC3D4D5BD701ED" + + "F39B653BF30DE7F5D4629A58842CD9313262B061D5E3264C5DF22F534651BA0419EE44D1C2E4C9B1" + + "DA8121E333E5F6D2F4E5590BA12ADF6A5BDDD79D417860795A0C3903491EB43AA6623AC8E4EF7734" + + "6B1EEA7FA1DC23C499D4662AAEDA62C343BB79A4E9F40FCE12DE0CC8A923C4BD0FE3D739FC883572" + + "0A8CE8661BB3433AFBDDD9F51E7E52730D725CCA3260A901C4371E2A8575029F9F84C16679CFDFA9" + + "0A999E2EA92A26E170FFFF09D04EBA55F985B024C7686B04386DD9A91244414B0200FF858203EA53" + + "0735D3EFBE82F7C1A0B77B0B5562E3E0D6E6FC7415CC32474D25BDAE06727BB912A724ED2CB8AAFA" + + "E825C9EC11DB0CB08FA1BC3CFDD056A6A9198D2C20F4DB55043BA7BB935AB503A184C0A97958F5DC" + + "E61AABF14A8D463C8C86355EDEEC6EA532E07005256C15BE2260AC543F51BB21F64733B59C0FF0BA" + + "D26FF0DF20C0EC17EEEA831A8AC2BB8212A53FF5F2F30C3CE64D1AF289382A26B20196BE14CFA3E8" + + "9A37EFAB17E7ACDFE7C555AC2EC44DCD8CC1E735A790D5757C59E6F5133AFBA809485F6F7BF195CC" + + "9052E6F2019C055555B0A32AEA887D09AEB29BFC5B0A7FBF14DF95F13850FCFCA2BA26A4C4A0C472" + + "AB54EE2E60A36E650360DC742B307A9554CB7B6E850607CC7FAD05BD660B57306D630E7CAE6C85FF" + + "66BF579D55B3CD038F93B065EEB79F190EB1092951B0F9CEADCEFB59F4EFCFF273368AAA0D70023C" + + "5CD188CE361163C08FE27B5AACB9A4FBB3106B038FF4DF522DCC0699461AD9FD75AAD4E516095277" + + "BEE49E282B029D6BFB7DE5534A7DBECEEE019DC9D6AABC224611E0D0688DFF61BBD98FE9EEBD749C" + + "495C611445979BDF344B8EE233C7D72C", + messageHex: + "FBCAC96861F3854661B8FCC3F787DA14058447A0F2F6BB8B3EFB3274986EFE738E67CE68E4872793" + + "B2E2EFA413E8710EE42CBA452D0660C933ADEF89873729505C10AB6896BE41BFC974A752C0EE392E" + + "84B9ACC2BF5B843ACF64272546F1085935AF934D16F5C890EE79A0B141302E5BD3367A8F915F00EF" + + "5DC25E5E4F2F386A25E883EE490D65FF493D21BF4BE1FC2DC377557F5B2E41B89EDC5A7CF511CE10" + + "38EB933E5DF2D229B6D6BED2179ECCB83E53701D407156B926E0E11C371CD60710395D189A3B8134" + + "9595F1B2E768997FF99198CB19DE4996032D7ADE2668BFA789A53BB11DC64AD71F8AFC89085AE6A0" + + "BF0785F6C45FAD4BEA7BDEE412A0BE921FF90CCD0858877E885C2AC62A3312E2128C7EE5FADEA195" + + "734409A545D233495126BD1A3DF82D3DED7FD565F42090F42024B746E90FB8DC1349C6369674FE5D" + + "C11FE7BA273206C9D368F5B3BBB4DF3A7AA0194430F56938E1E44D43C200A6E232901AD45A0A943A" + + "68E73B534899C1608D89373D5631EEDCF441C5BC6D6FB10EBB3D4D7C156DC3B2DD70751FD15D7AA6" + + "A0BAB3730F621F800C30421EBC71AADE060DB0C240621B40FD469F76B1FB0C3660822D174DB81C6C" + + "FF8DDE30AEC0F97DE6271ADD94DA28CED1012C2BCF1F0DEB60F0DFB5EE900621EA459C6830EC4229" + + "726F95BFE66D273F381CA754D906B29BF60F1DF0EA6BEC7CE7014ABC1960EB7955063281BB04FA7E" + + "E1C921DB0CED223501B5C91C66972FA5F150C3E1EB090859F8B441FC3CB451BF2B84871A11DDCCAA" + + "E236C521BAE32E97026F350CC3260269E333B9D998046CC7D783FF942E3114275D8707EE72EC8DB1" + + "8EDA00A97B29432B18B64C26042A32EA25380E4794BC710318B13507511B1F2F59BD03CBEE92FFE5" + + "CB94519F342DD8938F580A921BE66E", + contextHex: + "CA65B11430103D42799F6D2D5C1E8D7A8CB90F263A6C833FE35E4FBD82AB614BB3417893E5883B8C" + + "B289E0322E08B17A0BB923ED44008A42F9969C6C9DF0CC5AD29C360D989833AFA65426C5AF7CD680" + + "CBECAD4F0633E7E94F112C1937E2E1D94F90AF04887C66B80829202CE9D95426B0D44E7EC91BEA81" + + "A1BE8AFF513CD9C7810F9F03A38654196B766AF0B489A8D9107E5611A962E8EE93528BDD96D22F73" + + "1AD5B591B365A507E5F7E1B2097ED32D9C21D181AFF39D37A15268488D3A114C29746F88B644FBE2" + + "000604469A8940FC9B1917A81E59E7895E6CD5AF47A50DE93E7B3C4A7A6F46B4CAF0DB977CFBA377" + + "01B0EE9B2450C765BFEAF7FCF8C5D2", + signatureHex: + "FA3CF2DF41245A5C292059FF14AD5C1597FA314FE816B3FC6BC0F6FEF6E9620662D42369A980508F" + + "9AC3BCCA6C7FEAC2A6D12848B777A0F7DE879D6ED37AFF460FAA136D4A9EA5E060ACB047BBBEE090" + + "19A360C637625E9A8B4584FB8E5D564A5A91D8564C93403B3729334DBF64160A23F5111C80AAEA8D" + + "742A287A14FB13526FEEB6D906C3101AEFE39369EBEC218372292A1A90C7908A056B59580B9BBBEA" + + "9060AA0DF7446A0E0C93BDC6D62AB9D66379052BF2D10EFC877B18C7F9C7EFF9F9F4B5949F53CAE3" + + "403787C1CBED4F996D911A52604BFB7E6BAFAB4BF839DF9488ADFE56C13CB2CB8F982770CBF1EC02" + + "D5FC7670D1974B5B52697BAEE84A7ED2FAA9421BD51EE622ADDA081F33BCCA65609E513FCD80D3E9" + + "41FF67836D2CF4FD29293219D7522DB8EDED578247BAA62A367734FFE586CB0E6ECD10E41624F610" + + "7F6F8AB7C6C0774E567C343D46C284AADC787C77F4967364CC74DB0EF5BFD6BB3449A02BE569549A" + + "CE3B61F41BD21A432DCDCD01C85189727280A0F327A2CEDA978D5CDF122C91DEE41072C8124C5A7F" + + "7B15DE7B98DD6CB67262F74EB372BB86CBDDFAAE0F5C312A48AE86AD67E79FBDCF74C1EAF36930DD" + + "9E97DCFE24B093627084086A91A21DE839326DD361C709D2EA7348C70E2BD4D3409F4F0DDAFF8A36" + + "D589F0B4CF1F69BC7F3798AF6648133D3052A7F43899715724DC538E8A9FCF93BBCEC520B2230FFE" + + "F9E7468BAFB6C3AA330E8C648360F4E4D59485B4D623F4E24C91BDA570F772DDB5A1DF45DF677970" + + "8FC421427347C109AD6E1472DCC1B0718666DF6F96528B341C228233C46A17E31A1D04D8E4B4757E" + + "7EE097C39D4CDC3F6EFF0F6D4EA7323FCDC36B4731C764D78981D0C77BCDB3C64CFF7AB6CFED7582" + + "E6EE0ABB1ACD7C4469A5D09B2C3C2E992398381EB6907CCF8346F492DD8A5CD4844B4309F9B94006" + + "ACDE9FD67A41FA444614AD33DB20DF6D08E7E94D6294C433FF99289E9D3DBCD3FCBEABFBB5098A3F" + + "9BD61CE7661BA2A15D64BF43187E622B562E0776F0A334E28346D73742EE343B9662C3C90A0E62DF" + + "504BB8D8959B671DE05FFF70CC3CA18B3005B9A23C8D594D67950E3BBAC16392840ED2E5E65C92DB" + + "F521A8A13F94ED98A4F8811291D65C876BD0DD1D7D09B724051F022415DED1031214E4E0E7FF8E2B" + + "DE8B4B007F71D5D38704E3E1A37FFBCABF509655133383DD5462FEE231B861615ED13EB375D775E9" + + "9FD06A08C23E2672593A42433AFBE6E27AED2D937ADBF3E64C79D58EFC23D22D8A2A2D82ADFEBE9F" + + "1BE3A814F11FE9C2A3B0DD5682B9052DE0781032BA570F654FD5D3AA3372BFDB16DCC02FF8EE21A0" + + "A300A87891267CB181F972E6F4A7BFDDF6B775E8901964D3CA8964ECDF95558D77A4BDF983EE5B74" + + "D28A3E8BD69E8102CE7CBC10B19C94334E2B40C2C33337C3DA0654CF02FEAEFA5020AEC116434A2F" + + "814A964327208B65EAF2F14C0D3B81E028DE4EA5ED1FE32A5FCFCCCC30E14408D0B85C6DE48550D1" + + "43969AD5933B1FC78D010A00F7A1D6D598A213514E9CA563D5A5EB13313BDF3E981A1E4A71B1BCE3" + + "652C2826E96CCF5B819DDF0EB5D0D824C2E230D9457318E248D92EDD99B1E4B08EEDB74DC175BCD8" + + "10B976FFF51AA459F5790E74996A34821E92B513CEC3DC96003B75A4AE6A1CB4EA0A72CAC6FA7207" + + "4FEA55950ABE427C5CEEC6E4257A962CD2438B31190AE3C89440C8E82F29F86065A447DC89543041" + + "E183AE2F7AEB5B3D2D7203FF578E36A03D220A0A8808A2819EBD3FE8D716154245C5FDA9F61287A9" + + "FDBAA8766C0F90FB0C8325DC559C27410BA9D8C143B2645762C1F6E879F45E8EE4FA5D922D05FA35" + + "5A15565C015BB4F64E915283BE6B9227F1770D331E7862CE9DA7DB3EAB7A0FC7E0A94264D1832ACC" + + "D87BFD24811A6308AB5DF33123DEBAB262F3F48A0042AAAC0FDD0991C0E748A44277FD16499F3553" + + "3B8D3F1C93D6805FF7CD2E2132FDE1E1081D569AAF44495FE08E001E1F5109C407EB3E3FF0989FED" + + "5825DA09D24A87FEB1B805B346412303B76F893FD27B171127B9A6BA6E7406FA6FA1CABB18533025" + + "19C0A40F00B8A8BEDA45292C1EDE80632F668BA6D8A85E78053775084B10F4A85E8339290DA8618E" + + "DCD3B45DBD7B68153F1B0F63F64255558E84EB4DF57173E517CB30ABE9F4F703EBE60C3A5E2A75C2" + + "6480772E35898ECA6B7D87E7DA2D853A24D2773D8E635490EE5D85DC7D1524936B75745308AD0B8C" + + "4C3CF819F8A83B92FF44A04A28700831D4DB659122981E15621D46987E04B59184F201368C74333C" + + "1912E38F5C88DAB4E2667C8D2F4FAC5BB88A990F577628A93900E44095D5B52FEB24D1EF0CC527B4" + + "B4E7DE297513B5E6E16973A4702895E1FFB0EC92CAD17CC33183859C9B824998FEAEE58CD54A47A5" + + "BC6F0869E00579E3B07AE365536C4D90F8BE55DAA815D3AB0E33962012B38281F7E9CC711D890666" + + "07D5EB61E0B9EFCF19FEE16049A39132D0B2A451471C60D31B9F8711D651AB7BF09516EBD5A26D0A" + + "4357687AA83600B596810F429B230EAAC473E8140537F849F8041488A3185F26318FBF69A58EEE19" + + "E868BC13942A0F4D392E7BABBB9305FF4FEE367D445BAAF582B308674296FCCD6467152F8CC7C6F4" + + "7A73338B612E1C2053151EDEE514A3D42CB6165C9535152BBA3864D431E24921D3DA09919CD062A0" + + "6B79F183EC30A0F989DAE25356D3E182F58FC3B22BBB8D1AF828B54C915A52867B7241701D47A495" + + "98915E0D3E8A228B29CF0CB2479A59B3987E7FC2E994824B2262578BC140FED5D5DAC8D49F61061C" + + "4C71FACA4B65A24517E376D2FB3F1588D22834FE4ACBC7B4C9A1C634EB9DA12F7EAE4F6822D8D56E" + + "7B1DCA8B15446BF2BDB9AAC49EB895A6114916E5891244391353876F176219F81B3A893D8557ACC4" + + "83989F0C5175280EBA080C505499B9F7C015303A1F8CE338A5BCF1C7E6944578C478277AF3EA91EC" + + "6EABFF505F6A9FB8A0AFFCC21C64853FEDCFA6210E61AAE31049A8ACD92EFFD6ED39F6CFD061BA06" + + "B64D80040058F371F3DF744D6525EB26CA297F475A4BBDAD979DF05D40974CB1001B6E3609AE6F39" + + "BAD7215E7D7B0AB5148F258C704A2BFCBCE92AA3BCB95AFD7E05C7801A0C6196525224B93C9C995C" + + "F641ABDD9B8EC4161345D20480D775A68A6EBCD16319B1985B0A8129F6A42152A97F3B118A65AE6C" + + "0B1E6A7A379B05828B208B6B3E1C5A1ACD8C1C4411C2BAB8413A016BD0789E0FC99606E1358312CC" + + "EEB249711F836EA949B053D9300DFAF46B1DD72A132F6575A0902568143AC31BF13A46B72E51EFEC" + + "84C0514D3DCF68DFE8F69A7AFED34351398D2E253F583E407742A6F63902CDBEAACB3C07ACA35D3B" + + "C84542428927B896F9EBFB7942BCA673F843608039023EFD3B0D381783855AEA53BAF32BB80CC2F8" + + "B8ECD72410C29C9D5AF44F4AB518A2D4CA0DACA226D8C62826030047B3043DFFCA796A1C69F6E918" + + "BFFAE755E186738D82BA1E44C880830A329D4CDB7A0EDBCCEC0224F2C6829607957419F7FDD8F87C" + + "6E8F25B55008118C897D4DCFAC2EB43623BB958A4ED435337B91173FC7F35BCD348D44F28031B209" + + "72CE708C33098E51112D89060AD1275AD77BB46EA33BE68E3EFC0072985E6E83AB68733591117FCC" + + "2DA666729C2F29929172F4492C4797311994072E427A631F23AFB9F3D52DD41A55DB510FECF49530" + + "25AA0E5BA953D3FA94B115CC8C7B82861787D915BB913D52170E21B79AF559FF099E6BE3DF6A02BC" + + "6D62C58F2593E626BD0DDCBE7836C5E6B07A87A8A45A291377954004342CD1BF87B3536CF8A7F9E7" + + "BFA1B23032C91705F239BC38E7307C62C8C886F5D237DB6CEFD1EA3099C23F6F66512D7E107D6308" + + "45A03AA08F7ECD145477F4777C988203F5A10CB81BB42A13700DFB3063A1086626ED1F7FBD6F4993" + + "6AA646F8F6E4A89FBBD58ECE8EE6DC832572C8DF1DB9C080503905EF3E284F874E51074A97DC1414" + + "A602E64D3F3E9E8DAC7FDA5A00251BE263BA82D8168CC29C671EFBE81D0F0C01123E800463F62E99" + + "DEC8D6D4516ADF553E42C44E1F88C9352D1FE98210DD8C2ECB0E101951F9A0E155B5724ECD1E29AA" + + "878C22F01E6EC943A6605D2D8515A6F5244EB42490D2EFF18FB603FCADEA74B62953CDA79F857391" + + "0C1D13DF84D576C7FEF889CC68BE9A1A41E1854A445FF1A14BED2297CA14A8188323FFEA9F475D0F" + + "7E65A19B2C59F9E9CEA1523C12C2DE9B34A3D5FE7DF033A7B9D68CD48C3DE4A322C1B249CFFA9CB1" + + "9276AF0E0A53F2E1AAFDEC8B6ED7E44D77B854F86A9FABE1E0B7E324521C9B3CF6F039EA84786C98" + + "299D20EFB56A6FA9B58760F7655C98720B3475CD0A7D9D9733600155FE79596AAC927913B1F9CDC4" + + "11840F998EE13421C9C69740A8B27A979688ED87B6C22EF84F50B38CF3AF8CDCCC30887E73E30CC0" + + "2EE0DD47D4AFD103734B38F621CE700118482BAA5358D0579AD3A03BA9A95373E4F2586F05E77B4D" + + "2DC9B1D984560D1BE9D3494E663FB8D5E06FC5A7EF0119B83A0B5D4604F79ED924ABBE2CD3597BB5" + + "FB3FDE5CA5CE3A7F66A1CBDD6F95FC54AABD292CCE8AF3A6C53459AAD5934033B26755BD40F127E1" + + "BD993B78E46CD887E1B12BC47784BA2EE966405F3176C7CA9A9FD4379F734ADDB12974B6E37ECDE1" + + "EFD82973ECACA99F903902D33D64CD2750D01FC87317283D7D2D3FA37E596F3350B4A6C44C290095" + + "BCFD2272B3E3B6713DE25AEFFA96568C98E208D62AD77796A51D4D060FF9415641454877E9EB2446" + + "F56ED7289FE753D09B70467E37C3C2F49348ACC404924145CA63C7359B8790AE92D9C8F02B107D0F" + + "F4221B7BBE979439800F4878EAE214EECC91189CEEE94C750D539EDE688B4AFFF7C5BEB1FDF4EEFC" + + "F5E576E89AC4122F4305ED531232B5146E2D18A03B558E9487767EF0F614308A8AAEA8F22F20F9BB" + + "E44A502EFCB2326AF2946C4D978B1ED04EEC08EC636EC1EABD2CCE01ACA42CE5D7EABFBEEC7F8998" + + "B97CDE055CBABB070D4CCB8C2FA3EBE5F3ECC1DBBB26C8983EB41C53901D40E2F6F8B85D3D4DEF0C" + + "B430A56659CA46D57A19E55FECD5E4E64320668C2822528585EAB7240CE0359FF20B83AB9969A33F" + + "D02DB7C710A829FEA73D20563109F46380D9077DDAD5643B2F9B339B22EB983843011EABB51E1EE9" + + "0360BA757E102BFA74F722B9462C95D2225C1EDD1958E431589F2AB77C5568839E5B33D2045C5E6B" + + "5B89023756E54D883CE3905265CF5426D38134759379EBAC8207A7464152055E9E8870B09903901D" + + "A7B24CEA76104F2B6088A3E3F31A0A2D806D17567347ED01750B49A0E920CFF03C6BA72621617008" + + "FCA65521387239B85C8FBAC38CA3FC29DDA2C94D0094939F0F756A194B8A553ACA6AB82FBBBC09D1" + + "F343C37D5F40DC5C3A49AA3A9315A444EFA271BB5790E1DD9ADFD587785ECC848CB715152210877A" + + "EE3765508D4A6A9BFC2A44BB30DB95250B6A568EDF8C6EAB5F3D2EC60FB3EF1128622203ED8D58D9" + + "AE199BE9AF55E724F1BF441A500858A9833ADB3657D2C09866CDA4EDEC19486FAD36B407C3292030" + + "BC5DBAA404FBA5616D6968B2FA7947DA31F9E1A63111491972051C3F2AC4CF42BF7D6230E6F51459" + + "33B6FADBD720A9E8276531CA5A557371A7EE74305F03F283C1312E2020562966F92D41F67175F9BA" + + "2041221882228810921D87E92A792F14CE5836538E95C5E5957C83C2B7FCED30C62B46E2AA8EA099" + + "AF9604F8B3F35CACC6A145D2CF4802067DEC49ED9D932A29A61FE66B70DA6F7508E6853D8BD48FB0" + + "09252B2EC07BF2EB3966278FA4C4D906052A900E4B9E2F2F5253FB8F897E2C6E0D6E148972217354" + + "2D0E89168192151934BAA713F8A08A253D3E0FE5FAFD2482560426A19702A52488F6858D6897CB58" + + "922F0AEAD88F41C82B5502B1EFC587914115F924178C33600AF3F3185CCF5346CE899806A7B9C410" + + "372331CE6DEDA58CAACCF68AEE8C5D0018F97C6A61AF128BA6019AE18A47ACC1F48E034729470704" + + "679656078304212AA569D56A18E04202B75DCF734231169E8CAB2DF7195E3A1672A5328473B5CF74" + + "20632DE878F4176A969518DA03C4D2993D4474022B7151A2A37C32CF775721DEC827896A92F8C213" + + "AF7554BD022F7A7685BA10908F89F64363D0D6E8FFC059572EAEB210B68885299C6A802744D068C7" + + "7F3B5D46BADBDA9A3619DE6881C4F5321366BEC98996BE53E478B1E32E5DA19694FF6076C6EB69DB" + + "8B59CCA76E0C2C36C5294E749B55B50010657F074C7EC61FE3D0647A282E57A363972CB27C788B63" + + "2B63BA3E1821155904F37C6A691D5530ADE880490765A1932182ECC3B77BDF0F58304EA092267C8B" + + "56F649F01A05E0C2A5397DA5A456B414001C3AF03329903D49B1B6B9EBF21035516484A9E4E9F53D" + + "4775919B9DB8C443696E82BFD425B1BFDD043038627AB9BDE53683A3BDC9E5F90F4F5CA5C1FC0000" + + "00000000000000000000000000000000000000060F171D21293037", + hashAlgOid: "2.16.840.1.101.3.4.2.2"), + ]; + internal static byte[] IetfMLDsa_Pfx_Pbes1 => field ??= Convert.FromBase64String( """ MIIbUwIBAzCCGx0GCSqGSIb3DQEHAaCCGw4EghsKMIIbBjCCED4GCSqGSIb3DQEHBqCCEC8wghAr diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaContractTests.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaContractTests.cs index a335511933c354..b08e714da27bd9 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaContractTests.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaContractTests.cs @@ -134,28 +134,20 @@ public static void ArgumentValidation_PbeParameters(SlhDsaAlgorithm algorithm, b }, SlhDsaTestHelpers.EncryptionPasswordType.Byte); } + public static IEnumerable ArgumentValidation_Hash_WrongSizeInputs() + { + foreach (bool shouldDispose in new[] { true, false }) + { + foreach (HashInfo hashInfo in HashInfo.AllHashInfos()) + { + yield return new object[] { shouldDispose, hashInfo }; + } + } + } + [Theory] - [InlineData(true, SlhDsaTestHelpers.Md5Oid, 128 / 8)] - [InlineData(true, SlhDsaTestHelpers.Sha1Oid, 160 / 8)] - [InlineData(true, SlhDsaTestHelpers.Sha256Oid, 256 / 8)] - [InlineData(true, SlhDsaTestHelpers.Sha384Oid, 384 / 8)] - [InlineData(true, SlhDsaTestHelpers.Sha512Oid, 512 / 8)] - [InlineData(true, SlhDsaTestHelpers.Sha3_256Oid, 256 / 8)] - [InlineData(true, SlhDsaTestHelpers.Sha3_384Oid, 384 / 8)] - [InlineData(true, SlhDsaTestHelpers.Sha3_512Oid, 512 / 8)] - [InlineData(true, SlhDsaTestHelpers.Shake128Oid, 256 / 8)] - [InlineData(true, SlhDsaTestHelpers.Shake256Oid, 512 / 8)] - [InlineData(false, SlhDsaTestHelpers.Md5Oid, 128 / 8)] - [InlineData(false, SlhDsaTestHelpers.Sha1Oid, 160 / 8)] - [InlineData(false, SlhDsaTestHelpers.Sha256Oid, 256 / 8)] - [InlineData(false, SlhDsaTestHelpers.Sha384Oid, 384 / 8)] - [InlineData(false, SlhDsaTestHelpers.Sha512Oid, 512 / 8)] - [InlineData(false, SlhDsaTestHelpers.Sha3_256Oid, 256 / 8)] - [InlineData(false, SlhDsaTestHelpers.Sha3_384Oid, 384 / 8)] - [InlineData(false, SlhDsaTestHelpers.Sha3_512Oid, 512 / 8)] - [InlineData(false, SlhDsaTestHelpers.Shake128Oid, 256 / 8)] - [InlineData(false, SlhDsaTestHelpers.Shake256Oid, 512 / 8)] - public static void ArgumentValidation_Hash_WrongSize(bool shouldDispose, string oid, int hashLength) + [MemberData(nameof(ArgumentValidation_Hash_WrongSizeInputs))] + public static void ArgumentValidation_Hash_WrongSize(bool shouldDispose, HashInfo hashInfo) { using SlhDsa slhDsa = SlhDsaMockImplementation.Create(SlhDsaAlgorithm.SlhDsaSha2_128f); @@ -167,15 +159,15 @@ public static void ArgumentValidation_Hash_WrongSize(bool shouldDispose, string byte[] signature = new byte[SlhDsaAlgorithm.SlhDsaSha2_128f.SignatureSizeInBytes]; - Assert.Throws(() => slhDsa.SignPreHash(new byte[hashLength - 1], oid)); - Assert.Throws(() => slhDsa.SignPreHash(new byte[hashLength + 1], oid)); - Assert.Throws(() => slhDsa.SignPreHash(new byte[hashLength - 1], signature, oid)); - Assert.Throws(() => slhDsa.SignPreHash(new byte[hashLength + 1], signature, oid)); + Assert.Throws(() => slhDsa.SignPreHash(new byte[hashInfo.OutputSize - 1], hashInfo.Oid)); + Assert.Throws(() => slhDsa.SignPreHash(new byte[hashInfo.OutputSize + 1], hashInfo.Oid)); + Assert.Throws(() => slhDsa.SignPreHash(new byte[hashInfo.OutputSize - 1], signature, hashInfo.Oid)); + Assert.Throws(() => slhDsa.SignPreHash(new byte[hashInfo.OutputSize + 1], signature, hashInfo.Oid)); - Assert.Throws(() => slhDsa.VerifyPreHash(new byte[hashLength - 1], signature, oid)); - Assert.Throws(() => slhDsa.VerifyPreHash(new byte[hashLength + 1], signature, oid)); - Assert.Throws(() => slhDsa.VerifyPreHash(new byte[hashLength - 1], signature.AsSpan(), oid)); - Assert.Throws(() => slhDsa.VerifyPreHash(new byte[hashLength + 1], signature.AsSpan(), oid)); + Assert.Throws(() => slhDsa.VerifyPreHash(new byte[hashInfo.OutputSize - 1], signature, hashInfo.Oid)); + Assert.Throws(() => slhDsa.VerifyPreHash(new byte[hashInfo.OutputSize + 1], signature, hashInfo.Oid)); + Assert.Throws(() => slhDsa.VerifyPreHash(new byte[hashInfo.OutputSize - 1], signature.AsSpan(), hashInfo.Oid)); + Assert.Throws(() => slhDsa.VerifyPreHash(new byte[hashInfo.OutputSize + 1], signature.AsSpan(), hashInfo.Oid)); } [Theory] @@ -412,17 +404,16 @@ public static void VerifyData_ByteArray_CallsCore(SlhDsaAlgorithm algorithm) Assert.Equal(2, slhDsa.VerifyDataCoreCallCount); } + public static IEnumerable AllHashesAndLengths() + { + foreach (HashInfo hashInfo in HashInfo.AllHashInfos()) + { + yield return new object[] { hashInfo.Oid, hashInfo.OutputSize }; + } + } + [Theory] - [InlineData(SlhDsaTestHelpers.Md5Oid, 128 / 8)] - [InlineData(SlhDsaTestHelpers.Sha1Oid, 160 / 8)] - [InlineData(SlhDsaTestHelpers.Sha256Oid, 256 / 8)] - [InlineData(SlhDsaTestHelpers.Sha384Oid, 384 / 8)] - [InlineData(SlhDsaTestHelpers.Sha512Oid, 512 / 8)] - [InlineData(SlhDsaTestHelpers.Sha3_256Oid, 256 / 8)] - [InlineData(SlhDsaTestHelpers.Sha3_384Oid, 384 / 8)] - [InlineData(SlhDsaTestHelpers.Sha3_512Oid, 512 / 8)] - [InlineData(SlhDsaTestHelpers.Shake128Oid, 256 / 8)] - [InlineData(SlhDsaTestHelpers.Shake256Oid, 512 / 8)] + [MemberData(nameof(AllHashesAndLengths))] [InlineData("1.0", 0)] [InlineData("1.0", 1)] [InlineData("1.0", 2)] @@ -462,16 +453,7 @@ public static void SignPreHash_CallsCore(string hashAlgorithmOid, int hashLength } [Theory] - [InlineData(SlhDsaTestHelpers.Md5Oid, 128 / 8)] - [InlineData(SlhDsaTestHelpers.Sha1Oid, 160 / 8)] - [InlineData(SlhDsaTestHelpers.Sha256Oid, 256 / 8)] - [InlineData(SlhDsaTestHelpers.Sha384Oid, 384 / 8)] - [InlineData(SlhDsaTestHelpers.Sha512Oid, 512 / 8)] - [InlineData(SlhDsaTestHelpers.Sha3_256Oid, 256 / 8)] - [InlineData(SlhDsaTestHelpers.Sha3_384Oid, 384 / 8)] - [InlineData(SlhDsaTestHelpers.Sha3_512Oid, 512 / 8)] - [InlineData(SlhDsaTestHelpers.Shake128Oid, 256 / 8)] - [InlineData(SlhDsaTestHelpers.Shake256Oid, 512 / 8)] + [MemberData(nameof(AllHashesAndLengths))] [InlineData("1.0", 0)] [InlineData("1.0", 1)] [InlineData("1.0", 2)] @@ -510,16 +492,7 @@ public static void VerifyPreHash_CallsCore(string hashAlgorithmOid, int hashLeng } [Theory] - [InlineData(SlhDsaTestHelpers.Md5Oid, 128 / 8)] - [InlineData(SlhDsaTestHelpers.Sha1Oid, 160 / 8)] - [InlineData(SlhDsaTestHelpers.Sha256Oid, 256 / 8)] - [InlineData(SlhDsaTestHelpers.Sha384Oid, 384 / 8)] - [InlineData(SlhDsaTestHelpers.Sha512Oid, 512 / 8)] - [InlineData(SlhDsaTestHelpers.Sha3_256Oid, 256 / 8)] - [InlineData(SlhDsaTestHelpers.Sha3_384Oid, 384 / 8)] - [InlineData(SlhDsaTestHelpers.Sha3_512Oid, 512 / 8)] - [InlineData(SlhDsaTestHelpers.Shake128Oid, 256 / 8)] - [InlineData(SlhDsaTestHelpers.Shake256Oid, 512 / 8)] + [MemberData(nameof(AllHashesAndLengths))] [InlineData("1.0", 0)] [InlineData("1.0", 1)] [InlineData("1.0", 2)] diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaTestHelpers.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaTestHelpers.cs index 1331cc97e5c5a9..ff1a4ffabff88b 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaTestHelpers.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaTestHelpers.cs @@ -406,16 +406,5 @@ internal static string AlgorithmToOid(SlhDsaAlgorithm algorithm) _ => throw new XunitException($"Unknown algorithm: '{algorithm?.Name}'."), }; } - - internal const string Md5Oid = "1.2.840.113549.2.5"; - internal const string Sha1Oid = "1.3.14.3.2.26"; - internal const string Sha256Oid = "2.16.840.1.101.3.4.2.1"; - internal const string Sha384Oid = "2.16.840.1.101.3.4.2.2"; - internal const string Sha512Oid = "2.16.840.1.101.3.4.2.3"; - internal const string Sha3_256Oid = "2.16.840.1.101.3.4.2.8"; - internal const string Sha3_384Oid = "2.16.840.1.101.3.4.2.9"; - internal const string Sha3_512Oid = "2.16.840.1.101.3.4.2.10"; - internal const string Shake128Oid = "2.16.840.1.101.3.4.2.11"; - internal const string Shake256Oid = "2.16.840.1.101.3.4.2.12"; } } diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaTests.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaTests.cs index 4650f3e5ee1dcf..50f6fddc213b16 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaTests.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/SlhDsa/SlhDsaTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; +using Test.Cryptography; using Xunit; using Xunit.Sdk; @@ -48,50 +49,7 @@ public void NistPreHashSignatureVerificationTest(SlhDsaTestData.SlhDsaSigVerTest byte[] msg = vector.Message; byte[] ctx = vector.Context; byte[] sig = vector.Signature; - byte[] hash; - -#if NET - if (vector.HashAlgorithm == SlhDsaTestHelpers.Shake128Oid) - { - using (Shake128 hasher = new Shake128()) - { - hasher.AppendData(msg); - hash = hasher.GetHashAndReset(256 / 8); - } - } - else if (vector.HashAlgorithm == SlhDsaTestHelpers.Shake256Oid) - { - using (Shake256 hasher = new Shake256()) - { - hasher.AppendData(msg); - hash = hasher.GetHashAndReset(512 / 8); - } - } - else -#endif - { - HashAlgorithmName hashAlgorithmName = - vector.HashAlgorithm switch - { - SlhDsaTestHelpers.Md5Oid => HashAlgorithmName.MD5, - SlhDsaTestHelpers.Sha1Oid => HashAlgorithmName.SHA1, - SlhDsaTestHelpers.Sha256Oid => HashAlgorithmName.SHA256, - SlhDsaTestHelpers.Sha384Oid => HashAlgorithmName.SHA384, - SlhDsaTestHelpers.Sha512Oid => HashAlgorithmName.SHA512, -#if NET - SlhDsaTestHelpers.Sha3_256Oid => HashAlgorithmName.SHA3_256, - SlhDsaTestHelpers.Sha3_384Oid => HashAlgorithmName.SHA3_384, - SlhDsaTestHelpers.Sha3_512Oid => HashAlgorithmName.SHA3_512, -#endif - _ => throw new XunitException($"Unknown hash algorithm OID: {vector.HashAlgorithm}"), - }; - - using (IncrementalHash hasher = IncrementalHash.CreateHash(hashAlgorithmName)) - { - hasher.AppendData(msg); - hash = hasher.GetHashAndReset(); - } - } + byte[] hash = HashInfo.HashData(vector.HashAlgorithm, msg); // Test signature verification with public key using SlhDsa publicSlhDsa = ImportSlhDsaPublicKey(vector.Algorithm, vector.PublicKey); @@ -226,8 +184,8 @@ public void GenerateExportSecretKeySignAndVerify(SlhDsaAlgorithm algorithm) public void GenerateSignPreHashExportPublicVerifyWithPublicOnly(SlhDsaAlgorithm algorithm) { byte[] publicKey; - string shake256Oid = SlhDsaTestHelpers.Shake256Oid; - byte[] data = new byte[512 / 8]; + string shake256Oid = HashInfo.Shake256.Oid; + byte[] data = new byte[HashInfo.Shake256.OutputSize]; byte[] signature; using (SlhDsa slhDsa = GenerateKey(algorithm)) @@ -249,8 +207,8 @@ public void GenerateSignPreHashExportPublicVerifyWithPublicOnly(SlhDsaAlgorithm public void GenerateExportSecretKeySignPreHashAndVerify(SlhDsaAlgorithm algorithm) { byte[] secretKey; - string shake256Oid = SlhDsaTestHelpers.Shake256Oid; - byte[] data = new byte[512 / 8]; + string shake256Oid = HashInfo.Shake256.Oid; + byte[] data = new byte[HashInfo.Shake256.OutputSize]; byte[] signature; using (SlhDsa slhDsa = GenerateKey(algorithm)) diff --git a/src/libraries/Common/tests/System/Security/Cryptography/CryptoUtils.cs b/src/libraries/Common/tests/System/Security/Cryptography/CryptoUtils.cs index dc417e392d95b0..dba5305cfb5ed4 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/CryptoUtils.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/CryptoUtils.cs @@ -5,6 +5,8 @@ using System.Collections.Generic; using System.Globalization; using System.Security.Cryptography; +using Xunit; +using Xunit.Sdk; namespace Test.Cryptography { diff --git a/src/libraries/Common/tests/System/Security/Cryptography/HashInfo.cs b/src/libraries/Common/tests/System/Security/Cryptography/HashInfo.cs new file mode 100644 index 00000000000000..7e9b8de8efc9c2 --- /dev/null +++ b/src/libraries/Common/tests/System/Security/Cryptography/HashInfo.cs @@ -0,0 +1,116 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using Xunit; +using Xunit.Sdk; + +namespace Test.Cryptography +{ + public class HashInfo + { + private const string Md5Oid = "1.2.840.113549.2.5"; + private const string Sha1Oid = "1.3.14.3.2.26"; + + private const string Sha256Oid = "2.16.840.1.101.3.4.2.1"; + private const string Sha384Oid = "2.16.840.1.101.3.4.2.2"; + private const string Sha512Oid = "2.16.840.1.101.3.4.2.3"; + + private const string Sha3_256Oid = "2.16.840.1.101.3.4.2.8"; + private const string Sha3_384Oid = "2.16.840.1.101.3.4.2.9"; + private const string Sha3_512Oid = "2.16.840.1.101.3.4.2.10"; + + private const string Shake128Oid = "2.16.840.1.101.3.4.2.11"; + private const string Shake256Oid = "2.16.840.1.101.3.4.2.12"; + + public static readonly HashInfo Md5 = new HashInfo(Md5Oid, 128 / 8, HashAlgorithmName.MD5); + public static readonly HashInfo Sha1 = new HashInfo(Sha1Oid, 160 / 8, HashAlgorithmName.SHA1); + public static readonly HashInfo Sha256 = new HashInfo(Sha256Oid, 256 / 8, HashAlgorithmName.SHA256); + public static readonly HashInfo Sha384 = new HashInfo(Sha384Oid, 384 / 8, HashAlgorithmName.SHA384); + public static readonly HashInfo Sha512 = new HashInfo(Sha512Oid, 512 / 8, HashAlgorithmName.SHA512); + +#if NET + public static readonly HashInfo Sha3_256 = new HashInfo(Sha3_256Oid, 256 / 8, HashAlgorithmName.SHA3_256); + public static readonly HashInfo Sha3_384 = new HashInfo(Sha3_384Oid, 384 / 8, HashAlgorithmName.SHA3_384); + public static readonly HashInfo Sha3_512 = new HashInfo(Sha3_512Oid, 512 / 8, HashAlgorithmName.SHA3_512); + public static readonly HashInfo Shake128 = new HashInfo(Shake128Oid, 256 / 8, new HashAlgorithmName("SHAKE128")); + public static readonly HashInfo Shake256 = new HashInfo(Shake256Oid, 512 / 8, new HashAlgorithmName("SHAKE256")); +#endif + + public string Oid { get; } + public HashAlgorithmName Name { get; } + public int OutputSize { get; } + + public byte[] GetHash(byte[] data) + { +#if NET + if (Oid == Shake128Oid) + { + using (Shake128 hasher = new Shake128()) + { + hasher.AppendData(data); + return hasher.GetHashAndReset(OutputSize); + } + } + else if (Oid == Shake256Oid) + { + using (Shake256 hasher = new Shake256()) + { + hasher.AppendData(data); + return hasher.GetHashAndReset(OutputSize); + } + } + else +#endif + { + using (IncrementalHash hasher = IncrementalHash.CreateHash(Name)) + { + hasher.AppendData(data); + return hasher.GetHashAndReset(); + } + } + } + + public static byte[] HashData(string hashAlgOid, byte[] data) + { + HashInfo hashInfo = AllHashInfos().FirstOrDefault(h => h.Oid == hashAlgOid); + if (hashInfo == null) + { + throw new ArgumentException($"Unknown hash algorithm OID: {hashAlgOid}", nameof(hashAlgOid)); + } + + return hashInfo.GetHash(data); + } + + public static IEnumerable AllHashInfos() + { + yield return Md5; + yield return Sha1; + yield return Sha256; + yield return Sha384; + yield return Sha512; +#if NET + yield return Sha3_256; + yield return Sha3_384; + yield return Sha3_512; + yield return Shake128; + yield return Shake256; +#endif + } + + private HashInfo(string oid, int outputSize, HashAlgorithmName name) + { + Oid = oid; + OutputSize = outputSize; + Name = name; + } + + public override string ToString() + { + return $"{Name.Name}"; + } + } +} diff --git a/src/libraries/System.Security.Cryptography.Pkcs/src/Resources/Strings.resx b/src/libraries/System.Security.Cryptography.Pkcs/src/Resources/Strings.resx index a9016f2f9d3f3f..0d545c33b0d2eb 100644 --- a/src/libraries/System.Security.Cryptography.Pkcs/src/Resources/Strings.resx +++ b/src/libraries/System.Security.Cryptography.Pkcs/src/Resources/Strings.resx @@ -178,6 +178,9 @@ The certificate is not valid for the requested usage. + + The specified hash is not a valid size for this hash algorithm. + Key is not a valid public or private key. diff --git a/src/libraries/System.Security.Cryptography/ref/System.Security.Cryptography.cs b/src/libraries/System.Security.Cryptography/ref/System.Security.Cryptography.cs index 43a2cc487c6468..5e945c446a2ed3 100644 --- a/src/libraries/System.Security.Cryptography/ref/System.Security.Cryptography.cs +++ b/src/libraries/System.Security.Cryptography/ref/System.Security.Cryptography.cs @@ -1962,6 +1962,9 @@ public void ExportMLDsaSecretKey(System.Span destination) { } public byte[] SignData(byte[] data, byte[]? context = null) { throw null; } public void SignData(System.ReadOnlySpan data, System.Span destination, System.ReadOnlySpan context = default(System.ReadOnlySpan)) { throw null; } protected abstract void SignDataCore(System.ReadOnlySpan data, System.ReadOnlySpan context, System.Span destination); + public byte[] SignPreHash(byte[] hash, string hashAlgorithmOid, byte[]? context = null) { throw null; } + public void SignPreHash(System.ReadOnlySpan hash, System.Span destination, string hashAlgorithmOid, System.ReadOnlySpan context = default(System.ReadOnlySpan)) { } + protected abstract void SignPreHashCore(System.ReadOnlySpan hash, System.ReadOnlySpan context, string hashAlgorithmOid, System.Span destination); public bool TryExportEncryptedPkcs8PrivateKey(System.ReadOnlySpan passwordBytes, System.Security.Cryptography.PbeParameters pbeParameters, System.Span destination, out int bytesWritten) { throw null; } public bool TryExportEncryptedPkcs8PrivateKey(System.ReadOnlySpan password, System.Security.Cryptography.PbeParameters pbeParameters, System.Span destination, out int bytesWritten) { throw null; } public bool TryExportEncryptedPkcs8PrivateKey(string password, System.Security.Cryptography.PbeParameters pbeParameters, System.Span destination, out int bytesWritten) { throw null; } @@ -1971,6 +1974,9 @@ public void ExportMLDsaSecretKey(System.Span destination) { } public bool VerifyData(byte[] data, byte[] signature, byte[]? context = null) { throw null; } public bool VerifyData(System.ReadOnlySpan data, System.ReadOnlySpan signature, System.ReadOnlySpan context = default(System.ReadOnlySpan)) { throw null; } protected abstract bool VerifyDataCore(System.ReadOnlySpan data, System.ReadOnlySpan context, System.ReadOnlySpan signature); + public bool VerifyPreHash(byte[] hash, byte[] signature, string hashAlgorithmOid, byte[]? context = null) { throw null; } + public bool VerifyPreHash(System.ReadOnlySpan hash, System.ReadOnlySpan signature, string hashAlgorithmOid, System.ReadOnlySpan context = default(System.ReadOnlySpan)) { throw null; } + protected abstract bool VerifyPreHashCore(System.ReadOnlySpan hash, System.ReadOnlySpan context, string hashAlgorithmOid, System.ReadOnlySpan signature); } [System.Diagnostics.CodeAnalysis.ExperimentalAttribute("SYSLIB5006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")] public sealed partial class MLDsaAlgorithm : System.IEquatable @@ -2002,8 +2008,10 @@ protected override void ExportMLDsaPrivateSeedCore(System.Span destination protected override void ExportMLDsaPublicKeyCore(System.Span destination) { } protected override void ExportMLDsaSecretKeyCore(System.Span destination) { } protected override void SignDataCore(System.ReadOnlySpan data, System.ReadOnlySpan context, System.Span destination) { } + protected override void SignPreHashCore(System.ReadOnlySpan hash, System.ReadOnlySpan context, string hashAlgorithmOid, System.Span destination) { } protected override bool TryExportPkcs8PrivateKeyCore(System.Span destination, out int bytesWritten) { throw null; } protected override bool VerifyDataCore(System.ReadOnlySpan data, System.ReadOnlySpan context, System.ReadOnlySpan signature) { throw null; } + protected override bool VerifyPreHashCore(System.ReadOnlySpan hash, System.ReadOnlySpan context, string hashAlgorithmOid, System.ReadOnlySpan signature) { throw null; } } [System.Diagnostics.CodeAnalysis.ExperimentalAttribute("SYSLIB5006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")] public sealed partial class MLDsaOpenSsl : System.Security.Cryptography.MLDsa @@ -2021,8 +2029,10 @@ protected override void ExportMLDsaPrivateSeedCore(System.Span destination protected override void ExportMLDsaPublicKeyCore(System.Span destination) { } protected override void ExportMLDsaSecretKeyCore(System.Span destination) { } protected override void SignDataCore(System.ReadOnlySpan data, System.ReadOnlySpan context, System.Span destination) { } + protected override void SignPreHashCore(System.ReadOnlySpan hash, System.ReadOnlySpan context, string hashAlgorithmOid, System.Span destination) { } protected override bool TryExportPkcs8PrivateKeyCore(System.Span destination, out int bytesWritten) { throw null; } protected override bool VerifyDataCore(System.ReadOnlySpan data, System.ReadOnlySpan context, System.ReadOnlySpan signature) { throw null; } + protected override bool VerifyPreHashCore(System.ReadOnlySpan hash, System.ReadOnlySpan context, string hashAlgorithmOid, System.ReadOnlySpan signature) { throw null; } } [System.Diagnostics.CodeAnalysis.ExperimentalAttribute("SYSLIB5006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")] public abstract partial class MLKem : System.IDisposable diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Cng.NotSupported.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Cng.NotSupported.cs index dac7973d4871fd..470ffcc4ea2a0e 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Cng.NotSupported.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Cng.NotSupported.cs @@ -411,11 +411,17 @@ protected override void ExportMLDsaSecretKeyCore(Span destination) => protected override void SignDataCore(ReadOnlySpan data, ReadOnlySpan context, Span destination) => throw new PlatformNotSupportedException(); + protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + throw new PlatformNotSupportedException(); + protected override bool TryExportPkcs8PrivateKeyCore(Span destination, out int bytesWritten) => throw new PlatformNotSupportedException(); protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan context, ReadOnlySpan signature) => throw new PlatformNotSupportedException(); + + protected override bool VerifyPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + throw new PlatformNotSupportedException(); } public sealed partial class MLKemCng : MLKem diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Helpers.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Helpers.cs index 8c1b0c4de9ae56..fd886f71ee3244 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Helpers.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Helpers.cs @@ -469,19 +469,23 @@ internal static void ThrowIfPasswordContainsNullCharacter(string? password) internal static bool IsSlhDsaOid(string? oid) => SlhDsaAlgorithm.GetAlgorithmFromOid(oid) is not null; - public delegate TResult SlhDsaPreHashFuncCallback( + public delegate TResult PreHashFuncCallback( TKey key, ReadOnlySpan encodedMessage, TSignature signatureBuffer) where TSignature : allows ref struct; - internal static TResult SlhDsaPreHash( + /// + /// Encodes the message for ML-DSA and SLH-DSA pre-hash signing. + /// Algorithm is described in FIPS 204: Algorithm 4 and equivalent algorithm in FIPS 205: Algorithm 23. + /// + internal static TResult MLDsaSlhDsaPreHash( ReadOnlySpan hash, ReadOnlySpan context, ReadOnlySpan hashAlgorithmOid, TKey key, TSignature signatureBuffer, - SlhDsaPreHashFuncCallback callback) + PreHashFuncCallback callback) where TSignature : allows ref struct { // The OIDs for the algorithms above have max length 11. We'll just round up for a conservative initial estimate. diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaImplementation.OpenSsl.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaImplementation.OpenSsl.cs index 89ee47691b827b..d53a9e7ae8ebd6 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaImplementation.OpenSsl.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaImplementation.OpenSsl.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; +using Internal.Cryptography; namespace System.Security.Cryptography { @@ -56,6 +57,28 @@ protected override void SignDataCore(ReadOnlySpan data, ReadOnlySpan protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan context, ReadOnlySpan signature) => Interop.Crypto.MLDsaVerifyPure(_key, data, context, signature); + protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + Helpers.MLDsaSlhDsaPreHash( + hash, + context, + hashAlgorithmOid, + _key, + destination, + static (key, encodedMessage, destination) => + { + Interop.Crypto.MLDsaSignPreEncoded(key, encodedMessage, destination); + return true; + }); + + protected override bool VerifyPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + Helpers.MLDsaSlhDsaPreHash( + hash, + context, + hashAlgorithmOid, + _key, + signature, + static (key, encodedMessage, signature) => Interop.Crypto.MLDsaVerifyPreEncoded(key, encodedMessage, signature)); + protected override void ExportMLDsaPublicKeyCore(Span destination) => Interop.Crypto.MLDsaExportPublicKey(_key, destination); diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.NotSupported.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.NotSupported.cs index e28ff314915001..a5735d0959f533 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.NotSupported.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.NotSupported.cs @@ -40,6 +40,18 @@ protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) + { + Debug.Fail("Caller should have checked platform availability."); + throw new PlatformNotSupportedException(); + } + + protected override bool VerifyPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) + { + Debug.Fail("Caller should have checked platform availability."); + throw new PlatformNotSupportedException(); + } + protected override void ExportMLDsaPublicKeyCore(Span destination) { Debug.Fail("Caller should have checked platform availability."); diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.OpenSsl.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.OpenSsl.cs index fb39868c21d33f..98b565d73a03d7 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.OpenSsl.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.OpenSsl.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Runtime.Versioning; +using Internal.Cryptography; using Microsoft.Win32.SafeHandles; namespace System.Security.Cryptography @@ -76,6 +77,30 @@ protected override void SignDataCore(ReadOnlySpan data, ReadOnlySpan protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan context, ReadOnlySpan signature) => Interop.Crypto.MLDsaVerifyPure(_key, data, context, signature); + /// + protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => + Helpers.MLDsaSlhDsaPreHash( + hash, + context, + hashAlgorithmOid, + _key, + destination, + static (key, encodedMessage, destination) => + { + Interop.Crypto.MLDsaSignPreEncoded(key, encodedMessage, destination); + return true; + }); + + /// + protected override bool VerifyPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => + Helpers.MLDsaSlhDsaPreHash( + hash, + context, + hashAlgorithmOid, + _key, + signature, + static (key, encodedMessage, signature) => Interop.Crypto.MLDsaVerifyPreEncoded(key, encodedMessage, signature)); + /// protected override void ExportMLDsaPublicKeyCore(Span destination) => Interop.Crypto.MLDsaExportPublicKey(_key, destination); diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaImplementation.OpenSsl.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaImplementation.OpenSsl.cs index 773d7b5eb5ee29..9005114c60ae90 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaImplementation.OpenSsl.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaImplementation.OpenSsl.cs @@ -67,7 +67,7 @@ protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => - Helpers.SlhDsaPreHash( + Helpers.MLDsaSlhDsaPreHash( hash, context, hashAlgorithmOid, @@ -80,7 +80,7 @@ protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => - Helpers.SlhDsaPreHash( + Helpers.MLDsaSlhDsaPreHash( hash, context, hashAlgorithmOid, diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaOpenSsl.OpenSsl.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaOpenSsl.OpenSsl.cs index 36db28b7b8b175..4ba2b9f24cc055 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaOpenSsl.OpenSsl.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaOpenSsl.OpenSsl.cs @@ -87,7 +87,7 @@ protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => - Helpers.SlhDsaPreHash( + Helpers.MLDsaSlhDsaPreHash( hash, context, hashAlgorithmOid, @@ -100,7 +100,7 @@ protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => - Helpers.SlhDsaPreHash( + Helpers.MLDsaSlhDsaPreHash( hash, context, hashAlgorithmOid, diff --git a/src/libraries/System.Security.Cryptography/tests/MLDsaOpenSslTests.Unix.cs b/src/libraries/System.Security.Cryptography/tests/MLDsaOpenSslTests.Unix.cs index 8ad67d9a8963dc..a53110a961db8c 100644 --- a/src/libraries/System.Security.Cryptography/tests/MLDsaOpenSslTests.Unix.cs +++ b/src/libraries/System.Security.Cryptography/tests/MLDsaOpenSslTests.Unix.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using Test.Cryptography; using Xunit; namespace System.Security.Cryptography.Tests @@ -128,6 +129,11 @@ private static void VerifyInstanceIsUsable(MLDsaOpenSsl mldsa) byte[] signature = new byte[MLDsaAlgorithm.MLDsa44.SignatureSizeInBytes]; mldsa.SignData(data, signature, context); ExerciseSuccessfulVerify(mldsa, data, signature, context); + + byte[] hash = HashInfo.Sha256.GetHash(data); + signature.AsSpan().Fill(0); + mldsa.SignPreHash(hash.AsSpan(), signature, HashInfo.Sha256.Oid, context); + ExerciseSuccessfulVerifyPreHash(mldsa, HashInfo.Sha256.Oid, hash, signature, context); } } } diff --git a/src/libraries/System.Security.Cryptography/tests/System.Security.Cryptography.Tests.csproj b/src/libraries/System.Security.Cryptography/tests/System.Security.Cryptography.Tests.csproj index 6b8fd48ffe8652..c9de581f8160b3 100644 --- a/src/libraries/System.Security.Cryptography/tests/System.Security.Cryptography.Tests.csproj +++ b/src/libraries/System.Security.Cryptography/tests/System.Security.Cryptography.Tests.csproj @@ -479,6 +479,8 @@ Link="CommonTest\System\Security\Cryptography\CngKeyWrapper.cs" /> + @@ -119,77 +120,8 @@ int32_t CryptoNative_MLDsaSignPure(EVP_PKEY *pkey, uint8_t* context, int32_t contextLen, uint8_t* destination, int32_t destinationLen) { - assert(pkey); - assert(msgLen >= 0); - assert(contextLen >= 0); - assert(destination); assert(destinationLen >= 2420 /* ML-DSA-44 signature size */); - -#if defined(NEED_OPENSSL_3_0) && HAVE_OPENSSL_EVP_PKEY_SIGN_MESSAGE_INIT - if (!API_EXISTS(EVP_PKEY_sign_message_init) || - !API_EXISTS(EVP_PKEY_verify_message_init)) - { - return -1; - } - - ERR_clear_error(); - - EVP_PKEY_CTX* ctx = NULL; - - int ret = -1; - - ctx = EvpPKeyCtxCreateFromPKey(pkey, extraHandle); - if (!ctx) - { - goto done; - } - - OSSL_PARAM contextParams[] = - { - OSSL_PARAM_construct_end(), - OSSL_PARAM_construct_end(), - }; - - if (context) - { - contextParams[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING, (void*)context, Int32ToSizeT(contextLen)); - } - - if (EVP_PKEY_sign_message_init(ctx, NULL, contextParams) <= 0) - { - goto done; - } - - size_t dstLen = Int32ToSizeT(destinationLen); - if (EVP_PKEY_sign(ctx, destination, &dstLen, msg, Int32ToSizeT(msgLen)) == 1) - { - if (dstLen != Int32ToSizeT(destinationLen)) - { - assert(false); // length mismatch - goto done; - } - - ret = 1; - } - else - { - ret = 0; - } - -done: - if (ctx != NULL) EVP_PKEY_CTX_free(ctx); - return ret; -#else - (void)pkey; - (void)extraHandle; - (void)msg; - (void)msgLen; - (void)context; - (void)contextLen; - (void)destination; - (void)destinationLen; - return -1; -#endif + return CryptoNative_EvpPKeySignPure(pkey, extraHandle, msg, msgLen, context, contextLen, destination, destinationLen); } int32_t CryptoNative_MLDsaVerifyPure(EVP_PKEY *pkey, @@ -198,63 +130,26 @@ int32_t CryptoNative_MLDsaVerifyPure(EVP_PKEY *pkey, uint8_t* context, int32_t contextLen, uint8_t* sig, int32_t sigLen) { - assert(pkey); - assert(msgLen >= 0); - assert(sig); assert(sigLen >= 2420 /* ML-DSA-44 signature size */); - assert(contextLen >= 0); - -#if defined(NEED_OPENSSL_3_0) && HAVE_OPENSSL_EVP_PKEY_SIGN_MESSAGE_INIT - if (!API_EXISTS(EVP_PKEY_sign_message_init) || - !API_EXISTS(EVP_PKEY_verify_message_init)) - { - return -1; - } - - ERR_clear_error(); - - EVP_PKEY_CTX* ctx = NULL; - - int ret = -1; - - ctx = EvpPKeyCtxCreateFromPKey(pkey, extraHandle); - if (!ctx) - { - goto done; - } - - OSSL_PARAM contextParams[] = - { - OSSL_PARAM_construct_end(), - OSSL_PARAM_construct_end(), - }; - - if (context) - { - contextParams[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING, (void*)context, Int32ToSizeT(contextLen)); - } - - if (EVP_PKEY_verify_message_init(ctx, NULL, contextParams) <= 0) - { - goto done; - } + return CryptoNative_EvpPKeyVerifyPure(pkey, extraHandle, msg, msgLen, context, contextLen, sig, sigLen); +} - ret = EVP_PKEY_verify(ctx, sig, Int32ToSizeT(sigLen), msg, Int32ToSizeT(msgLen)) == 1; +int32_t CryptoNative_MLDsaSignPreEncoded(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* destination, int32_t destinationLen) +{ + assert(destinationLen >= 2420 /* ML-DSA-44 signature size */); + return CryptoNative_EvpPKeySignPreEncoded(pkey, extraHandle, msg, msgLen, destination, destinationLen); +} -done: - if (ctx != NULL) EVP_PKEY_CTX_free(ctx); - return ret; -#else - (void)pkey; - (void)extraHandle; - (void)msg; - (void)msgLen; - (void)context; - (void)contextLen; - (void)sig; - (void)sigLen; - return -1; -#endif +int32_t CryptoNative_MLDsaVerifyPreEncoded(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* sig, int32_t sigLen) +{ + assert(sigLen >= 2420 /* ML-DSA-44 signature size */); + return CryptoNative_EvpPKeyVerifyPreEncoded(pkey, extraHandle, msg, msgLen, sig, sigLen); } int32_t CryptoNative_MLDsaExportSecretKey(const EVP_PKEY* pKey, uint8_t* destination, int32_t destinationLength) diff --git a/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_ml_dsa.h b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_ml_dsa.h index dd70967193818b..ae4cfc78ae325c 100644 --- a/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_ml_dsa.h +++ b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_ml_dsa.h @@ -43,6 +43,26 @@ PALEXPORT int32_t CryptoNative_MLDsaVerifyPure(EVP_PKEY *pkey, uint8_t* context, int32_t contextLen, uint8_t* sig, int32_t sigLen); +/* +Sign an encoded message using the provided ML-DSA key. + +Returns 1 on success, 0 on a mismatched signature, -1 on error. +*/ +PALEXPORT int32_t CryptoNative_MLDsaSignPreEncoded(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* destination, int32_t destinationLen); + +/* +Verify an encoded message using the provided ML-DSA key. + +Returns 1 on a verified signature, 0 on a mismatched signature, -1 on error. +*/ +PALEXPORT int32_t CryptoNative_MLDsaVerifyPreEncoded(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* sig, int32_t sigLen); + /* Export the secret key from the given ML-DSA key. */ diff --git a/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.c b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.c new file mode 100644 index 00000000000000..29852282a2cdda --- /dev/null +++ b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.c @@ -0,0 +1,278 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#include "pal_evp_pkey.h" +#include "pal_evp_pkey_raw_signverify.h" +#include "pal_utilities.h" +#include "openssl.h" +#include + +int32_t CryptoNative_EvpPKeySignPure(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* context, int32_t contextLen, + uint8_t* destination, int32_t destinationLen) +{ + + assert(pkey); + assert(msgLen >= 0); + assert(contextLen >= 0); + assert(destination); + +#if defined(NEED_OPENSSL_3_0) && HAVE_OPENSSL_EVP_PKEY_SIGN_MESSAGE_INIT + if (!API_EXISTS(EVP_PKEY_sign_message_init) || + !API_EXISTS(EVP_PKEY_verify_message_init)) + { + return -1; + } + + ERR_clear_error(); + + EVP_PKEY_CTX* ctx = NULL; + + int ret = -1; + + ctx = EvpPKeyCtxCreateFromPKey(pkey, extraHandle); + if (!ctx) + { + goto done; + } + + OSSL_PARAM contextParams[] = + { + OSSL_PARAM_construct_end(), + OSSL_PARAM_construct_end(), + }; + + if (context) + { + contextParams[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING, (void*)context, Int32ToSizeT(contextLen)); + } + + if (EVP_PKEY_sign_message_init(ctx, NULL, contextParams) <= 0) + { + goto done; + } + + size_t dstLen = Int32ToSizeT(destinationLen); + if (EVP_PKEY_sign(ctx, destination, &dstLen, msg, Int32ToSizeT(msgLen)) == 1) + { + if (dstLen != Int32ToSizeT(destinationLen)) + { + assert(false); // length mismatch + goto done; + } + + ret = 1; + } + else + { + ret = 0; + } + +done: + if (ctx != NULL) EVP_PKEY_CTX_free(ctx); + return ret; +#else + (void)pkey; + (void)extraHandle; + (void)msg; + (void)msgLen; + (void)context; + (void)contextLen; + (void)destination; + (void)destinationLen; + return -1; +#endif +} + +int32_t CryptoNative_EvpPKeyVerifyPure(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* context, int32_t contextLen, + uint8_t* sig, int32_t sigLen) +{ + assert(pkey); + assert(msgLen >= 0); + assert(sig); + assert(contextLen >= 0); + +#if defined(NEED_OPENSSL_3_0) && HAVE_OPENSSL_EVP_PKEY_SIGN_MESSAGE_INIT + if (!API_EXISTS(EVP_PKEY_sign_message_init) || + !API_EXISTS(EVP_PKEY_verify_message_init)) + { + return -1; + } + + ERR_clear_error(); + + EVP_PKEY_CTX* ctx = NULL; + + int ret = -1; + + ctx = EvpPKeyCtxCreateFromPKey(pkey, extraHandle); + if (!ctx) + { + goto done; + } + + OSSL_PARAM contextParams[] = + { + OSSL_PARAM_construct_end(), + OSSL_PARAM_construct_end(), + }; + + if (context) + { + contextParams[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING, (void*)context, Int32ToSizeT(contextLen)); + } + + if (EVP_PKEY_verify_message_init(ctx, NULL, contextParams) <= 0) + { + goto done; + } + + ret = EVP_PKEY_verify(ctx, sig, Int32ToSizeT(sigLen), msg, Int32ToSizeT(msgLen)) == 1; + +done: + if (ctx != NULL) EVP_PKEY_CTX_free(ctx); + return ret; +#else + (void)pkey; + (void)extraHandle; + (void)msg; + (void)msgLen; + (void)context; + (void)contextLen; + (void)sig; + (void)sigLen; + return -1; +#endif +} + +int32_t CryptoNative_EvpPKeySignPreEncoded(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* destination, int32_t destinationLen) +{ + + assert(pkey); + assert(msgLen >= 0); + assert(destination); + +#if defined(NEED_OPENSSL_3_0) && HAVE_OPENSSL_EVP_PKEY_SIGN_MESSAGE_INIT + if (!API_EXISTS(EVP_PKEY_sign_message_init) || + !API_EXISTS(EVP_PKEY_verify_message_init)) + { + return -1; + } + + ERR_clear_error(); + + EVP_PKEY_CTX* ctx = NULL; + + int ret = -1; + + ctx = EvpPKeyCtxCreateFromPKey(pkey, extraHandle); + if (!ctx) + { + goto done; + } + + int messageEncoding = 0; + OSSL_PARAM messageEncodingParams[] = + { + OSSL_PARAM_construct_int(OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING, &messageEncoding), + OSSL_PARAM_construct_end(), + }; + + if (EVP_PKEY_sign_message_init(ctx, NULL, messageEncodingParams) <= 0) + { + goto done; + } + + size_t dstLen = Int32ToSizeT(destinationLen); + if (EVP_PKEY_sign(ctx, destination, &dstLen, msg, Int32ToSizeT(msgLen)) == 1) + { + if (dstLen != Int32ToSizeT(destinationLen)) + { + assert(false); // length mismatch + goto done; + } + + ret = 1; + } + else + { + ret = 0; + } + +done: + if (ctx != NULL) EVP_PKEY_CTX_free(ctx); + return ret; +#else + (void)pkey; + (void)extraHandle; + (void)msg; + (void)msgLen; + (void)destination; + (void)destinationLen; + return -1; +#endif +} + +int32_t CryptoNative_EvpPKeyVerifyPreEncoded(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* sig, int32_t sigLen) +{ + assert(pkey); + assert(msgLen >= 0); + assert(sig); + +#if defined(NEED_OPENSSL_3_0) && HAVE_OPENSSL_EVP_PKEY_SIGN_MESSAGE_INIT + if (!API_EXISTS(EVP_PKEY_sign_message_init) || + !API_EXISTS(EVP_PKEY_verify_message_init)) + { + return -1; + } + + ERR_clear_error(); + + EVP_PKEY_CTX* ctx = NULL; + + int ret = -1; + + ctx = EvpPKeyCtxCreateFromPKey(pkey, extraHandle); + if (!ctx) + { + goto done; + } + + int messageEncoding = 0; + OSSL_PARAM messageEncodingParams[] = + { + OSSL_PARAM_construct_int(OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING, &messageEncoding), + OSSL_PARAM_construct_end(), + }; + + if (EVP_PKEY_verify_message_init(ctx, NULL, messageEncodingParams) <= 0) + { + goto done; + } + + ret = EVP_PKEY_verify(ctx, sig, Int32ToSizeT(sigLen), msg, Int32ToSizeT(msgLen)) == 1; + +done: + if (ctx != NULL) EVP_PKEY_CTX_free(ctx); + return ret; +#else + (void)pkey; + (void)extraHandle; + (void)msg; + (void)msgLen; + (void)sig; + (void)sigLen; + return -1; +#endif +} diff --git a/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.h b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.h new file mode 100644 index 00000000000000..5280d76d145882 --- /dev/null +++ b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.h @@ -0,0 +1,24 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +int32_t CryptoNative_EvpPKeySignPure(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* context, int32_t contextLen, + uint8_t* destination, int32_t destinationLen); + +int32_t CryptoNative_EvpPKeyVerifyPure(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* context, int32_t contextLen, + uint8_t* sig, int32_t sigLen); + +int32_t CryptoNative_EvpPKeySignPreEncoded(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* destination, int32_t destinationLen); + +int32_t CryptoNative_EvpPKeyVerifyPreEncoded(EVP_PKEY *pkey, + void* extraHandle, + uint8_t* msg, int32_t msgLen, + uint8_t* sig, int32_t sigLen); diff --git a/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_slh_dsa.c b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_slh_dsa.c index 5b2935674e4923..e5b362703e0d83 100644 --- a/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_slh_dsa.c +++ b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_slh_dsa.c @@ -3,6 +3,7 @@ #include "pal_evp_pkey.h" #include "pal_evp_pkey_slh_dsa.h" +#include "pal_evp_pkey_raw_signverify.h" #include "pal_utilities.h" #include "openssl.h" #include @@ -56,78 +57,8 @@ int32_t CryptoNative_SlhDsaSignPure(EVP_PKEY *pkey, uint8_t* context, int32_t contextLen, uint8_t* destination, int32_t destinationLen) { - - assert(pkey); - assert(msgLen >= 0); - assert(contextLen >= 0); - assert(destination); assert(destinationLen >= 7856 /* SLH-DSA-SHA2-128s/SLH-DSA-SHAKE-128s signature size */); - -#if defined(NEED_OPENSSL_3_0) && HAVE_OPENSSL_EVP_PKEY_SIGN_MESSAGE_INIT - if (!API_EXISTS(EVP_PKEY_sign_message_init) || - !API_EXISTS(EVP_PKEY_verify_message_init)) - { - return -1; - } - - ERR_clear_error(); - - EVP_PKEY_CTX* ctx = NULL; - - int ret = -1; - - ctx = EvpPKeyCtxCreateFromPKey(pkey, extraHandle); - if (!ctx) - { - goto done; - } - - OSSL_PARAM contextParams[] = - { - OSSL_PARAM_construct_end(), - OSSL_PARAM_construct_end(), - }; - - if (context) - { - contextParams[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING, (void*)context, Int32ToSizeT(contextLen)); - } - - if (EVP_PKEY_sign_message_init(ctx, NULL, contextParams) <= 0) - { - goto done; - } - - size_t dstLen = Int32ToSizeT(destinationLen); - if (EVP_PKEY_sign(ctx, destination, &dstLen, msg, Int32ToSizeT(msgLen)) == 1) - { - if (dstLen != Int32ToSizeT(destinationLen)) - { - assert(false); // length mismatch - goto done; - } - - ret = 1; - } - else - { - ret = 0; - } - -done: - if (ctx != NULL) EVP_PKEY_CTX_free(ctx); - return ret; -#else - (void)pkey; - (void)extraHandle; - (void)msg; - (void)msgLen; - (void)context; - (void)contextLen; - (void)destination; - (void)destinationLen; - return -1; -#endif + return CryptoNative_EvpPKeySignPure(pkey, extraHandle, msg, msgLen, context, contextLen, destination, destinationLen); } int32_t CryptoNative_SlhDsaVerifyPure(EVP_PKEY *pkey, @@ -136,63 +67,8 @@ int32_t CryptoNative_SlhDsaVerifyPure(EVP_PKEY *pkey, uint8_t* context, int32_t contextLen, uint8_t* sig, int32_t sigLen) { - assert(pkey); - assert(msgLen >= 0); - assert(sig); assert(sigLen >= 7856 /* SLH-DSA-SHA2-128s/SLH-DSA-SHAKE-128s signature size */); - assert(contextLen >= 0); - -#if defined(NEED_OPENSSL_3_0) && HAVE_OPENSSL_EVP_PKEY_SIGN_MESSAGE_INIT - if (!API_EXISTS(EVP_PKEY_sign_message_init) || - !API_EXISTS(EVP_PKEY_verify_message_init)) - { - return -1; - } - - ERR_clear_error(); - - EVP_PKEY_CTX* ctx = NULL; - - int ret = -1; - - ctx = EvpPKeyCtxCreateFromPKey(pkey, extraHandle); - if (!ctx) - { - goto done; - } - - OSSL_PARAM contextParams[] = - { - OSSL_PARAM_construct_end(), - OSSL_PARAM_construct_end(), - }; - - if (context) - { - contextParams[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING, (void*)context, Int32ToSizeT(contextLen)); - } - - if (EVP_PKEY_verify_message_init(ctx, NULL, contextParams) <= 0) - { - goto done; - } - - ret = EVP_PKEY_verify(ctx, sig, Int32ToSizeT(sigLen), msg, Int32ToSizeT(msgLen)) == 1; - -done: - if (ctx != NULL) EVP_PKEY_CTX_free(ctx); - return ret; -#else - (void)pkey; - (void)extraHandle; - (void)msg; - (void)msgLen; - (void)context; - (void)contextLen; - (void)sig; - (void)sigLen; - return -1; -#endif + return CryptoNative_EvpPKeyVerifyPure(pkey, extraHandle, msg, msgLen, context, contextLen, sig, sigLen); } int32_t CryptoNative_SlhDsaSignPreEncoded(EVP_PKEY *pkey, @@ -200,71 +76,8 @@ int32_t CryptoNative_SlhDsaSignPreEncoded(EVP_PKEY *pkey, uint8_t* msg, int32_t msgLen, uint8_t* destination, int32_t destinationLen) { - - assert(pkey); - assert(msgLen >= 0); - assert(destination); assert(destinationLen >= 7856 /* SLH-DSA-SHA2-128s/SLH-DSA-SHAKE-128s signature size */); - -#if defined(NEED_OPENSSL_3_0) && HAVE_OPENSSL_EVP_PKEY_SIGN_MESSAGE_INIT - if (!API_EXISTS(EVP_PKEY_sign_message_init) || - !API_EXISTS(EVP_PKEY_verify_message_init)) - { - return -1; - } - - ERR_clear_error(); - - EVP_PKEY_CTX* ctx = NULL; - - int ret = -1; - - ctx = EvpPKeyCtxCreateFromPKey(pkey, extraHandle); - if (!ctx) - { - goto done; - } - - int messageEncoding = 0; - OSSL_PARAM contextParams[] = - { - OSSL_PARAM_construct_int(OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING, &messageEncoding), - OSSL_PARAM_construct_end(), - }; - - if (EVP_PKEY_sign_message_init(ctx, NULL, contextParams) <= 0) - { - goto done; - } - - size_t dstLen = Int32ToSizeT(destinationLen); - if (EVP_PKEY_sign(ctx, destination, &dstLen, msg, Int32ToSizeT(msgLen)) == 1) - { - if (dstLen != Int32ToSizeT(destinationLen)) - { - assert(false); // length mismatch - goto done; - } - - ret = 1; - } - else - { - ret = 0; - } - -done: - if (ctx != NULL) EVP_PKEY_CTX_free(ctx); - return ret; -#else - (void)pkey; - (void)extraHandle; - (void)msg; - (void)msgLen; - (void)destination; - (void)destinationLen; - return -1; -#endif + return CryptoNative_EvpPKeySignPreEncoded(pkey, extraHandle, msg, msgLen, destination, destinationLen); } int32_t CryptoNative_SlhDsaVerifyPreEncoded(EVP_PKEY *pkey, @@ -272,56 +85,8 @@ int32_t CryptoNative_SlhDsaVerifyPreEncoded(EVP_PKEY *pkey, uint8_t* msg, int32_t msgLen, uint8_t* sig, int32_t sigLen) { - assert(pkey); - assert(msgLen >= 0); - assert(sig); assert(sigLen >= 7856 /* SLH-DSA-SHA2-128s/SLH-DSA-SHAKE-128s signature size */); - -#if defined(NEED_OPENSSL_3_0) && HAVE_OPENSSL_EVP_PKEY_SIGN_MESSAGE_INIT - if (!API_EXISTS(EVP_PKEY_sign_message_init) || - !API_EXISTS(EVP_PKEY_verify_message_init)) - { - return -1; - } - - ERR_clear_error(); - - EVP_PKEY_CTX* ctx = NULL; - - int ret = -1; - - ctx = EvpPKeyCtxCreateFromPKey(pkey, extraHandle); - if (!ctx) - { - goto done; - } - - int messageEncoding = 0; - OSSL_PARAM contextParams[] = - { - OSSL_PARAM_construct_int(OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING, &messageEncoding), - OSSL_PARAM_construct_end(), - }; - - if (EVP_PKEY_verify_message_init(ctx, NULL, contextParams) <= 0) - { - goto done; - } - - ret = EVP_PKEY_verify(ctx, sig, Int32ToSizeT(sigLen), msg, Int32ToSizeT(msgLen)) == 1; - -done: - if (ctx != NULL) EVP_PKEY_CTX_free(ctx); - return ret; -#else - (void)pkey; - (void)extraHandle; - (void)msg; - (void)msgLen; - (void)sig; - (void)sigLen; - return -1; -#endif + return CryptoNative_EvpPKeyVerifyPreEncoded(pkey, extraHandle, msg, msgLen, sig, sigLen); } int32_t CryptoNative_SlhDsaExportSecretKey(const EVP_PKEY* pKey, uint8_t* destination, int32_t destinationLength) From de0d446bfcb05679e0b05c31805ad6399646bf13 Mon Sep 17 00:00:00 2001 From: Krzysztof Wicher Date: Tue, 8 Jul 2025 15:25:07 +0200 Subject: [PATCH 2/5] revert some accidental changes --- .../Cryptography/AlgorithmImplementations/MLDsa/MLDsaTests.cs | 1 - .../Common/tests/System/Security/Cryptography/CryptoUtils.cs | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTests.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTests.cs index 7c701a1d451bd0..b6cb0c35672024 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTests.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTests.cs @@ -5,7 +5,6 @@ using System.Formats.Asn1; using System.Linq; using System.Security.Cryptography.Asn1; -using System.Security.Cryptography.SLHDsa.Tests; using Microsoft.DotNet.RemoteExecutor; using Microsoft.DotNet.XUnitExtensions; using Test.Cryptography; diff --git a/src/libraries/Common/tests/System/Security/Cryptography/CryptoUtils.cs b/src/libraries/Common/tests/System/Security/Cryptography/CryptoUtils.cs index dba5305cfb5ed4..dc417e392d95b0 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/CryptoUtils.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/CryptoUtils.cs @@ -5,8 +5,6 @@ using System.Collections.Generic; using System.Globalization; using System.Security.Cryptography; -using Xunit; -using Xunit.Sdk; namespace Test.Cryptography { From 3f7709a2f6ce4beaa4168e90ce7bac503fb1929c Mon Sep 17 00:00:00 2001 From: Krzysztof Wicher Date: Tue, 8 Jul 2025 17:32:57 +0200 Subject: [PATCH 3/5] fix M.B.Cryptography --- .../System/Security/Cryptography/HashInfo.cs | 20 ++++++++++++++----- .../Microsoft.Bcl.Cryptography.Tests.csproj | 2 ++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/libraries/Common/tests/System/Security/Cryptography/HashInfo.cs b/src/libraries/Common/tests/System/Security/Cryptography/HashInfo.cs index 7e9b8de8efc9c2..7708694c275d12 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/HashInfo.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/HashInfo.cs @@ -32,14 +32,24 @@ public class HashInfo public static readonly HashInfo Sha384 = new HashInfo(Sha384Oid, 384 / 8, HashAlgorithmName.SHA384); public static readonly HashInfo Sha512 = new HashInfo(Sha512Oid, 512 / 8, HashAlgorithmName.SHA512); + private static readonly HashAlgorithmName HashAlgSHAKE128 = new HashAlgorithmName("BOGUS-SHAKE128"); + private static readonly HashAlgorithmName HashAlgSHAKE256 = new HashAlgorithmName("BOGUS-SHAKE256"); #if NET - public static readonly HashInfo Sha3_256 = new HashInfo(Sha3_256Oid, 256 / 8, HashAlgorithmName.SHA3_256); - public static readonly HashInfo Sha3_384 = new HashInfo(Sha3_384Oid, 384 / 8, HashAlgorithmName.SHA3_384); - public static readonly HashInfo Sha3_512 = new HashInfo(Sha3_512Oid, 512 / 8, HashAlgorithmName.SHA3_512); - public static readonly HashInfo Shake128 = new HashInfo(Shake128Oid, 256 / 8, new HashAlgorithmName("SHAKE128")); - public static readonly HashInfo Shake256 = new HashInfo(Shake256Oid, 512 / 8, new HashAlgorithmName("SHAKE256")); + private static readonly HashAlgorithmName HashAlgSHA3_256 = HashAlgorithmName.SHA3_256; + private static readonly HashAlgorithmName HashAlgSHA3_384 = HashAlgorithmName.SHA3_384; + private static readonly HashAlgorithmName HashAlgSHA3_512 = HashAlgorithmName.SHA3_512; +#else + private static readonly HashAlgorithmName HashAlgSHA3_256 = new HashAlgorithmName("BOGUS-SHA3_256"); + private static readonly HashAlgorithmName HashAlgSHA3_384 = new HashAlgorithmName("BOGUS-SHA3_384"); + private static readonly HashAlgorithmName HashAlgSHA3_512 = new HashAlgorithmName("BOGUS-SHA3_512"); #endif + public static readonly HashInfo Sha3_256 = new HashInfo(Sha3_256Oid, 256 / 8, HashAlgSHA3_256); + public static readonly HashInfo Sha3_384 = new HashInfo(Sha3_384Oid, 384 / 8, HashAlgSHA3_384); + public static readonly HashInfo Sha3_512 = new HashInfo(Sha3_512Oid, 512 / 8, HashAlgSHA3_512); + public static readonly HashInfo Shake128 = new HashInfo(Shake128Oid, 256 / 8, HashAlgSHAKE128); + public static readonly HashInfo Shake256 = new HashInfo(Shake256Oid, 512 / 8, HashAlgSHAKE256); + public string Oid { get; } public HashAlgorithmName Name { get; } public int OutputSize { get; } diff --git a/src/libraries/Microsoft.Bcl.Cryptography/tests/Microsoft.Bcl.Cryptography.Tests.csproj b/src/libraries/Microsoft.Bcl.Cryptography/tests/Microsoft.Bcl.Cryptography.Tests.csproj index 4467b8eaa82d73..ad425c6cc3819d 100644 --- a/src/libraries/Microsoft.Bcl.Cryptography/tests/Microsoft.Bcl.Cryptography.Tests.csproj +++ b/src/libraries/Microsoft.Bcl.Cryptography/tests/Microsoft.Bcl.Cryptography.Tests.csproj @@ -114,6 +114,8 @@ Link="CommonTest\System\Security\Cryptography\ByteUtils.cs" /> + Date: Fri, 11 Jul 2025 12:00:51 +0200 Subject: [PATCH 4/5] Address feedback --- .../System/Security/Cryptography/Helpers.cs | 5 +-- .../src/System/Security/Cryptography/MLDsa.cs | 4 +-- .../System/Security/Cryptography/SlhDsa.cs | 4 +-- .../MLDsa/MLDsaTestImplementation.cs | 1 - .../System/Security/Cryptography/Helpers.cs | 32 +++++++++++++++++-- .../MLDsaImplementation.OpenSsl.cs | 4 +-- .../Cryptography/MLDsaOpenSsl.OpenSsl.cs | 4 +-- .../SlhDsaImplementation.OpenSsl.cs | 4 +-- .../Cryptography/SlhDsaOpenSsl.OpenSsl.cs | 4 +-- .../pal_evp_pkey_raw_signverify.h | 2 ++ 10 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/libraries/Common/src/System/Security/Cryptography/Helpers.cs b/src/libraries/Common/src/System/Security/Cryptography/Helpers.cs index 2d3599a3e7b148..e3301551f7f5a5 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/Helpers.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/Helpers.cs @@ -124,12 +124,12 @@ internal static int HashOidToByteLength(string hashOid) throw new CryptographicException(SR.Format(SR.Cryptography_UnknownHashAlgorithm, hashOid)); } - +#if !BUILDING_PKCS /// /// Validates if the hash length matches the expected output size for the given hash algorithm OID. /// When the OID is not one of the common hash algorithms, it only validates the format of the OID. /// - internal static void ValidateHashAlgorithm(ReadOnlySpan hash, ReadOnlySpan hashAlgorithmOid) + internal static void ValidateHashLength(ReadOnlySpan hash, ReadOnlySpan hashAlgorithmOid) { int? outputSize = TryGetHashOidToByteLength(hashAlgorithmOid); @@ -157,6 +157,7 @@ internal static void ValidateHashAlgorithm(ReadOnlySpan hash, ReadOnlySpan } } } +#endif internal static bool HashAlgorithmRequired(string? keyAlgorithm) { diff --git a/src/libraries/Common/src/System/Security/Cryptography/MLDsa.cs b/src/libraries/Common/src/System/Security/Cryptography/MLDsa.cs index d85fc6a7cc106c..2051b5a8f8086c 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/MLDsa.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/MLDsa.cs @@ -314,7 +314,7 @@ public void SignPreHash(ReadOnlySpan hash, Span destination, string SR.Argument_SignatureContextTooLong255); } - Helpers.ValidateHashAlgorithm(hash, hashAlgorithmOid); + Helpers.ValidateHashLength(hash, hashAlgorithmOid); ThrowIfDisposed(); SignPreHashCore(hash, context, hashAlgorithmOid, destination); @@ -402,7 +402,7 @@ public bool VerifyPreHash(ReadOnlySpan hash, ReadOnlySpan signature, SR.Argument_SignatureContextTooLong255); } - Helpers.ValidateHashAlgorithm(hash, hashAlgorithmOid); + Helpers.ValidateHashLength(hash, hashAlgorithmOid); ThrowIfDisposed(); if (signature.Length != Algorithm.SignatureSizeInBytes) diff --git a/src/libraries/Common/src/System/Security/Cryptography/SlhDsa.cs b/src/libraries/Common/src/System/Security/Cryptography/SlhDsa.cs index 68e638ef09b622..05889182ff44dc 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/SlhDsa.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/SlhDsa.cs @@ -328,7 +328,7 @@ public void SignPreHash(ReadOnlySpan hash, Span destination, string SR.Argument_SignatureContextTooLong255); } - Helpers.ValidateHashAlgorithm(hash, hashAlgorithmOid); + Helpers.ValidateHashLength(hash, hashAlgorithmOid); ThrowIfDisposed(); SignPreHashCore(hash, context, hashAlgorithmOid, destination); @@ -426,7 +426,7 @@ public bool VerifyPreHash(ReadOnlySpan hash, ReadOnlySpan signature, SR.Argument_SignatureContextTooLong255); } - Helpers.ValidateHashAlgorithm(hash, hashAlgorithmOid); + Helpers.ValidateHashLength(hash, hashAlgorithmOid); ThrowIfDisposed(); if (signature.Length != Algorithm.SignatureSizeInBytes) diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestImplementation.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestImplementation.cs index efb9f3a42f229f..552d77c21e8c60 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestImplementation.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/MLDsa/MLDsaTestImplementation.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using Xunit; -using static System.Security.Cryptography.SLHDsa.Tests.SlhDsaMockImplementation; namespace System.Security.Cryptography.Tests { diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Helpers.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Helpers.cs index fd886f71ee3244..02a16e23a31ab5 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Helpers.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/Helpers.cs @@ -469,17 +469,45 @@ internal static void ThrowIfPasswordContainsNullCharacter(string? password) internal static bool IsSlhDsaOid(string? oid) => SlhDsaAlgorithm.GetAlgorithmFromOid(oid) is not null; - public delegate TResult PreHashFuncCallback( + internal delegate TResult PreHashFuncCallback( TKey key, ReadOnlySpan encodedMessage, TSignature signatureBuffer) where TSignature : allows ref struct; + /// + /// Encodes the message for ML-DSA pre-hash signing. + /// Algorithm is described in FIPS 205: Algorithm 23. + /// + internal static TResult MLDsaPreHash( + ReadOnlySpan hash, + ReadOnlySpan context, + ReadOnlySpan hashAlgorithmOid, + TKey key, + TSignature signatureBuffer, + PreHashFuncCallback callback) + where TSignature : allows ref struct + => MLDsaSlhDsaPreHash(hash, context, hashAlgorithmOid, key, signatureBuffer, callback); + + /// + /// Encodes the message for SLH-DSA pre-hash signing. + /// Algorithm is described in FIPS 204: Algorithm 4. + /// + internal static TResult SlhDsaPreHash( + ReadOnlySpan hash, + ReadOnlySpan context, + ReadOnlySpan hashAlgorithmOid, + TKey key, + TSignature signatureBuffer, + PreHashFuncCallback callback) + where TSignature : allows ref struct + => MLDsaSlhDsaPreHash(hash, context, hashAlgorithmOid, key, signatureBuffer, callback); + /// /// Encodes the message for ML-DSA and SLH-DSA pre-hash signing. /// Algorithm is described in FIPS 204: Algorithm 4 and equivalent algorithm in FIPS 205: Algorithm 23. /// - internal static TResult MLDsaSlhDsaPreHash( + private static TResult MLDsaSlhDsaPreHash( ReadOnlySpan hash, ReadOnlySpan context, ReadOnlySpan hashAlgorithmOid, diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaImplementation.OpenSsl.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaImplementation.OpenSsl.cs index d53a9e7ae8ebd6..3986c70142ef68 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaImplementation.OpenSsl.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaImplementation.OpenSsl.cs @@ -58,7 +58,7 @@ protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => - Helpers.MLDsaSlhDsaPreHash( + Helpers.MLDsaPreHash( hash, context, hashAlgorithmOid, @@ -71,7 +71,7 @@ protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => - Helpers.MLDsaSlhDsaPreHash( + Helpers.MLDsaPreHash( hash, context, hashAlgorithmOid, diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.OpenSsl.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.OpenSsl.cs index 98b565d73a03d7..77bda3882099fe 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.OpenSsl.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/MLDsaOpenSsl.OpenSsl.cs @@ -79,7 +79,7 @@ protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => - Helpers.MLDsaSlhDsaPreHash( + Helpers.MLDsaPreHash( hash, context, hashAlgorithmOid, @@ -93,7 +93,7 @@ protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan protected override bool VerifyPreHashCore(ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => - Helpers.MLDsaSlhDsaPreHash( + Helpers.MLDsaPreHash( hash, context, hashAlgorithmOid, diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaImplementation.OpenSsl.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaImplementation.OpenSsl.cs index 9005114c60ae90..773d7b5eb5ee29 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaImplementation.OpenSsl.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaImplementation.OpenSsl.cs @@ -67,7 +67,7 @@ protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => - Helpers.MLDsaSlhDsaPreHash( + Helpers.SlhDsaPreHash( hash, context, hashAlgorithmOid, @@ -80,7 +80,7 @@ protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => - Helpers.MLDsaSlhDsaPreHash( + Helpers.SlhDsaPreHash( hash, context, hashAlgorithmOid, diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaOpenSsl.OpenSsl.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaOpenSsl.OpenSsl.cs index 4ba2b9f24cc055..36db28b7b8b175 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaOpenSsl.OpenSsl.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/SlhDsaOpenSsl.OpenSsl.cs @@ -87,7 +87,7 @@ protected override bool VerifyDataCore(ReadOnlySpan data, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, Span destination) => - Helpers.MLDsaSlhDsaPreHash( + Helpers.SlhDsaPreHash( hash, context, hashAlgorithmOid, @@ -100,7 +100,7 @@ protected override void SignPreHashCore(ReadOnlySpan hash, ReadOnlySpan hash, ReadOnlySpan context, string hashAlgorithmOid, ReadOnlySpan signature) => - Helpers.MLDsaSlhDsaPreHash( + Helpers.SlhDsaPreHash( hash, context, hashAlgorithmOid, diff --git a/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.h b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.h index 5280d76d145882..fad34f72428a16 100644 --- a/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.h +++ b/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_raw_signverify.h @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +#pragma once + int32_t CryptoNative_EvpPKeySignPure(EVP_PKEY *pkey, void* extraHandle, uint8_t* msg, int32_t msgLen, From ab76ec998cccddb4acb0b1837f545d777b62416a Mon Sep 17 00:00:00 2001 From: Krzysztof Wicher Date: Fri, 11 Jul 2025 12:28:29 +0200 Subject: [PATCH 5/5] add accidentally not commited change --- .../src/Resources/Strings.resx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/libraries/System.Security.Cryptography.Pkcs/src/Resources/Strings.resx b/src/libraries/System.Security.Cryptography.Pkcs/src/Resources/Strings.resx index 0d545c33b0d2eb..a9016f2f9d3f3f 100644 --- a/src/libraries/System.Security.Cryptography.Pkcs/src/Resources/Strings.resx +++ b/src/libraries/System.Security.Cryptography.Pkcs/src/Resources/Strings.resx @@ -178,9 +178,6 @@ The certificate is not valid for the requested usage. - - The specified hash is not a valid size for this hash algorithm. - Key is not a valid public or private key.