Edit

Composite ML-DSA on Windows uses native implementation

Starting in .NET 11, CompositeMLDsa on Windows uses the native Windows implementation of Composite ML-DSA instead of a managed implementation layered over ML-DSA, RSA, and ECDSA. Because Windows only implements a subset of the Composite ML-DSA parameter sets natively, this change reduces the number of Composite ML-DSA algorithms supported on Windows.

Version introduced

.NET 11 Preview 7

Previous behavior

Previously, CompositeMLDsa APIs on Windows worked for any composite algorithm as long as its underlying components (ML-DSA, RSA, and ECDSA) were supported, including all the RSA-based composite algorithms. Algorithms that combine ML-DSA with EdDSA (Ed25519 or Ed448) always threw PlatformNotSupportedException on Windows, because Windows doesn't support EdDSA.

New behavior

Starting in .NET 11, CompositeMLDsa APIs on Windows only support the composite algorithms that Windows implements natively in CNG. Windows currently implements native support for exactly these four parameter sets, all of which pair ML-DSA with ECDSA:

Windows parameter set Composite ML-DSA algorithm CompositeMLDsaAlgorithm member
44-ECDSA-P256-SHA256 Composite ML-DSA-44 and ECDSA P256 MLDsa44WithECDsaP256
65-ECDSA-P256-SHA512 Composite ML-DSA-65 and ECDSA P256 MLDsa65WithECDsaP256
65-ECDSA-P384-SHA512 Composite ML-DSA-65 and ECDSA P384 MLDsa65WithECDsaP384
87-ECDSA-P384-SHA512 Composite ML-DSA-87 and ECDSA P384 MLDsa87WithECDsaP384

All other composite algorithms now throw PlatformNotSupportedException on Windows. This includes every algorithm that pairs ML-DSA with RSA, which worked previously, and every algorithm that pairs ML-DSA with EdDSA (Ed25519 or Ed448), which already threw PlatformNotSupportedException before this change.

For more information, see the cbParameterSet field of the BCRYPT_PQDSA_KEY_BLOB structure.

Type of breaking change

This change is a behavioral change.

Reason for change

It's preferable to use the native implementation the operating system provides rather than a managed layer built on top of other primitives. Windows added native support for a subset of Composite ML-DSA parameter sets in recent Windows Insider Preview builds, and .NET now uses that native support when it's available.

Before you use a specific Composite ML-DSA algorithm on Windows, call IsAlgorithmSupported to check whether the algorithm is supported. If an algorithm isn't supported, choose a supported algorithm or handle the resulting PlatformNotSupportedException.

if (CompositeMLDsa.IsAlgorithmSupported(CompositeMLDsaAlgorithm.MLDsa65WithECDsaP384))
{
    using CompositeMLDsa mldsa = CompositeMLDsa.GenerateKey(CompositeMLDsaAlgorithm.MLDsa65WithECDsaP384);
    // Use mldsa.
}
else
{
    // Fall back to another algorithm, or handle the lack of support.
}

This change doesn't affect the Composite ML-DSA certificate APIs. Those APIs continue to throw PlatformNotSupportedException on Windows, as before.

Affected APIs