.NET enveloppe la cryptographie de la plateforme (CNG sous Windows, OpenSSL sous Linux, les bibliothèques d’Apple sous macOS) derrière une seule API : ECDsa, RSA, MLDsa, MLKem et consorts. Les essais ont été menés avec .NET 10.0.13 sous Ubuntu 24.04, où l’OpenSSL sous-jacent est la version 3.0.13, et cette version détermine plusieurs résultats.
L’encodage de signature par défaut est l’inverse de celui de la plupart des bibliothèques côté serveur. ECDsa.SignData renvoie le r‖s IEEE P1363 de 64 octets et VerifyData l’attend ; le DER exige DSASignatureFormat.Rfc3279DerSequence dans les deux appels. .NET est ainsi compatible d’emblée avec JWS et WebCrypto, mais pas avec OpenSSL, SHA256withECDSA de Java ni SignASN1 de Go. Toute signature mal formée ou au mauvais format fait renvoyer false à VerifyData, si bien qu’une signature DER contrôlée avec le format par défaut ressemble exactement à une falsification : l’exemple montre les deux issues, et le convertisseur DER ⇄ brut indique laquelle des deux formes vous avez.
Sous Linux, ECDSA a couvert de P-256 à P-521, secp256k1 et les courbes Brainpool r1, toutes via OpenSSL. SignHash signe un condensat que vous avez calculé, les nonces sont aléatoires, s n’est pas normalisé et la vérification accepte high-S. La bibliothèque de classes de base ne contient aucune classe Ed25519 ni Ed448 ; EdDSA exige Bouncy Castle pour .NET ou un autre paquet.
MLKem, MLDsa, SlhDsa et CompositeMLDsa existent dans .NET 10, mais chacune indique IsSupported selon la plateforme. Avec OpenSSL 3.0.13, toutes valaient false ; OpenSSL a ajouté ML-KEM et ML-DSA dans la 3.5, si bien que sous Linux elles exigent une distribution qui fournit cette version, et sous Windows la prise en charge CNG correspondante. Le code doit vérifier IsSupported au lieu de le supposer, et cette page n’a vérifié aucune plateforme où la réponse est true.
Les clés s’importent depuis SPKI et PKCS#8 (PEM ou DER, chiffré ou non), SEC1 EC PRIVATE KEY et les coordonnées brutes d’ECParameters ; il n’existe pas d’import de point SEC1 ni de JWK. Inspectez les fichiers PFX avec l’inspecteur PFX.