BouncyCastle.Cryptography (le paquet qui a remplacé Portable.BouncyCastle) est du code entièrement managé : ses résultats ne dépendent ni de CNG sous Windows ni de la version d’OpenSSL sous Linux, et c’est précisément ce qui le rend utile à côté de System.Security.Cryptography. Il propose une API SignerUtilities fondée sur des chaînes de caractères et des classes de plus bas niveau comme ECDsaSigner.
Ses comportements ECDSA par défaut suivent la tradition d’OpenSSL plutôt que celle de .NET : SHA-256withECDSA produit du DER, tandis que SHA-256withPLAIN-ECDSA donne le r‖s brut de 64 octets qu’utilisent JWS et la classe ECDsa de .NET elle-même. Les confondre est l’échec d’interopérabilité classique entre les deux bibliothèques au sein d’une même application, et toute entrée mal formée renvoie false au lieu de lever une exception. Les nonces sont aléatoires via SignerUtilities ; ECDsaSigner avec un HMacDsaKCalculator a reproduit le vecteur de test de la RFC 6979. s n’est pas normalisé et la vérification accepte high-S.
C’est pour sa couverture que les développeurs l’ajoutent : de P-224 à P-521, secp256k1 et les courbes Brainpool r1 ; Ed25519 et Ed448, comme dans l’exemple ; et ML-KEM, ML-DSA et SLH-DSA via MLKemEncapsulator, MLDsaSigner et SlhDsaSigner, qui ont tous fonctionné sur la même image Linux où la bibliothèque de classes de base ne signalait aucune prise en charge post-quantique. Essayez les algorithmes dans le bac à sable des signatures post-quantiques.
PemWriter écrit les clés privées EC au format SEC1 -----BEGIN EC PRIVATE KEY-----, et PemReader les renvoie sous forme d’AsymmetricCipherKeyPair ; PKCS#8 passe par PrivateKeyInfoFactory. La version propre de l’assembly est la version de nom fort 2.0.0 pour toutes les versions 2.x : vérifiez donc la version du paquet (ici 2.7.0) lorsque vous comparez des comportements.