Table of Contents

Class MLDsa87

Namespace
CryptoHives.Foundation.Security.Cryptography.Dsa
Assembly
CryptoHives.Foundation.Security.Cryptography.dll

ML-DSA-87 digital signature algorithm (NIST security category 5).

public sealed class MLDsa87 : IDsa, IDisposable
Inheritance
MLDsa87
Implements
Inherited Members

Remarks

ML-DSA-87 is a post-quantum digital signature scheme standardized in FIPS 204, derived from CRYSTALS-Dilithium and based on the Module-LWE problem.

Parameters (FIPS 204 Table 1): (k, ℓ) = (8, 7), η = 2, τ = 60, γ₁ = 2¹⁹. Public key: 2592 bytes, secret key: 4896 bytes, signature: 4627 bytes.

Constructors

MLDsa87()

Initializes a new instance of the MLDsa87 class.

public MLDsa87()

Fields

KeyGenSeedSizeBytesConst

The key generation seed size in bytes (32 bytes).

public const int KeyGenSeedSizeBytesConst = 32

Field Value

int

PublicKeySizeBytesConst

The public key size in bytes (2592 bytes).

public const int PublicKeySizeBytesConst = 2592

Field Value

int

SecretKeySizeBytesConst

The secret key size in bytes (4896 bytes).

public const int SecretKeySizeBytesConst = 4896

Field Value

int

SignatureSizeBytesConst

The signature size in bytes (4627 bytes).

public const int SignatureSizeBytesConst = 4627

Field Value

int

Properties

AlgorithmName

Gets the algorithm name.

public string AlgorithmName { get; }

Property Value

string

PublicKeySizeBytes

Gets the public key size in bytes.

public int PublicKeySizeBytes { get; }

Property Value

int

SecretKeySizeBytes

Gets the secret key size in bytes.

public int SecretKeySizeBytes { get; }

Property Value

int

SignatureSizeBytes

Gets the signature size in bytes.

public int SignatureSizeBytes { get; }

Property Value

int

Methods

Create()

Creates a new ML-DSA-87 instance.

public static MLDsa87 Create()

Returns

MLDsa87

A new ML-DSA-87 instance.

Dispose()

Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.

public void Dispose()

GenerateKeyPair(ReadOnlySpan<byte>, Span<byte>, Span<byte>)

Generates a key pair deterministically from the provided 32-byte seed ξ.

public void GenerateKeyPair(ReadOnlySpan<byte> seed, Span<byte> publicKey, Span<byte> secretKey)

Parameters

seed ReadOnlySpan<byte>

The 32-byte key generation seed.

publicKey Span<byte>

The buffer to receive the public key.

secretKey Span<byte>

The buffer to receive the secret key.

Exceptions

ArgumentException

A parameter has an invalid size.

GenerateKeyPair(ReadOnlySpan<byte>, Span<byte>, Span<byte>, bool)

Generates a key pair from a seed, optionally skipping the pairwise consistency test.

public void GenerateKeyPair(ReadOnlySpan<byte> seed, Span<byte> publicKey, Span<byte> secretKey, bool pairwiseConsistencyTest)

Parameters

seed ReadOnlySpan<byte>

The 32-byte key generation seed ξ.

publicKey Span<byte>

The buffer to receive the public key.

secretKey Span<byte>

The buffer to receive the secret key.

pairwiseConsistencyTest bool

true to verify the generated key pair; false to skip it.

Exceptions

ArgumentException

A parameter has an invalid size.

GenerateKeyPair(Span<byte>, Span<byte>)

Generates a new key pair using the OS random number generator.

public void GenerateKeyPair(Span<byte> publicKey, Span<byte> secretKey)

Parameters

publicKey Span<byte>

The buffer to receive the public key.

secretKey Span<byte>

The buffer to receive the secret key.

Exceptions

ArgumentException

A buffer is too small.

GenerateKeyPair(Span<byte>, Span<byte>, bool)

Generates a key pair, optionally skipping the pairwise consistency test.

public void GenerateKeyPair(Span<byte> publicKey, Span<byte> secretKey, bool pairwiseConsistencyTest)

Parameters

publicKey Span<byte>

The buffer to receive the public key.

secretKey Span<byte>

The buffer to receive the secret key.

pairwiseConsistencyTest bool

true to verify the generated key pair with a sign/verify round trip; false to skip it. See the remarks on the signature type.

Exceptions

ArgumentException

A buffer is too small.

Sign(ReadOnlySpan<byte>, ReadOnlySpan<byte>, ReadOnlySpan<byte>, Span<byte>)

Signs a message using the hedged (randomized) variant of ML-DSA.

public void Sign(ReadOnlySpan<byte> secretKey, ReadOnlySpan<byte> message, ReadOnlySpan<byte> context, Span<byte> signature)

Parameters

secretKey ReadOnlySpan<byte>

The secret key.

message ReadOnlySpan<byte>

The message to sign.

context ReadOnlySpan<byte>

The optional context string (at most 255 bytes).

signature Span<byte>

The buffer to receive the signature.

Exceptions

ArgumentException

A parameter has an invalid size.

SignDeterministic(ReadOnlySpan<byte>, ReadOnlySpan<byte>, ReadOnlySpan<byte>, Span<byte>)

Signs a message using the deterministic variant of ML-DSA (rnd = 0³²).

public void SignDeterministic(ReadOnlySpan<byte> secretKey, ReadOnlySpan<byte> message, ReadOnlySpan<byte> context, Span<byte> signature)

Parameters

secretKey ReadOnlySpan<byte>

The secret key.

message ReadOnlySpan<byte>

The message to sign.

context ReadOnlySpan<byte>

The optional context string (at most 255 bytes).

signature Span<byte>

The buffer to receive the signature.

Remarks

Hedged signing (see Sign(ReadOnlySpan<byte>, ReadOnlySpan<byte>, ReadOnlySpan<byte>, Span<byte>)) is the FIPS 204 default and should be preferred; the deterministic variant exists for reproducibility requirements and known-answer testing.

Exceptions

ArgumentException

A parameter has an invalid size.

Verify(ReadOnlySpan<byte>, ReadOnlySpan<byte>, ReadOnlySpan<byte>, ReadOnlySpan<byte>)

Verifies a signature over a message.

public bool Verify(ReadOnlySpan<byte> publicKey, ReadOnlySpan<byte> message, ReadOnlySpan<byte> context, ReadOnlySpan<byte> signature)

Parameters

publicKey ReadOnlySpan<byte>

The public key.

message ReadOnlySpan<byte>

The signed message.

context ReadOnlySpan<byte>

The context string used when signing (at most 255 bytes).

signature ReadOnlySpan<byte>

The signature to verify.

Returns

bool

True when the signature is valid for the message, key, and context.

Exceptions

ArgumentException

A parameter has an invalid size.