cryptography est ce qu’utilise la plupart du code Python (PyJWT, Authlib, paramiko, certbot, les SDK AWS et Google) pour la cryptographie proprement dite. Sa couche hazmat expose directement les clés et les signatures ; les wheels embarquent leur propre OpenSSL, si bien que le comportement dépend de la version du paquet et non du système d’exploitation (la 50.0.2 embarque OpenSSL 4.0.3).
Les signatures ECDSA sortent en ASN.1 DER, et verify() attend du DER. WebCrypto, JWS et la plupart des jetons matériels utilisent la forme r‖s brute de 64 octets, que verify() rejette avec la même exception InvalidSignature qu’une signature falsifiée. decode_dss_signature et encode_dss_signature convertissent entre le DER et la paire d’entiers ; le remplissage à largeur fixe est à votre charge, exactement comme le montre l’exemple, ou utilisez le convertisseur DER ⇄ brut pour vérifier à la main.
Le nonce est aléatoire, sauf si vous demandez la RFC 6979 : ec.ECDSA(hashes.SHA256(), deterministic_signing=True) a reproduit exactement le vecteur de test P-256 de la RFC, y compris sa valeur de s élevée (high-S), car rien dans le paquet ne normalise s, et la vérification accepte les deux moitiés. Les signatures destinées à un vérificateur low-S comme libsecp256k1 ou @noble/curves doivent d’abord voir s remplacé par n − s. sign() et verify() hachent eux-mêmes les données ; passez Prehashed(hashes.SHA256()) si vous disposez déjà d’un condensat, sinon vous hacherez deux fois.
La couverture des courbes est large (de P-224 à P-521, secp256k1 et les courbes Brainpool r1), avec en plus Ed25519, Ed448, ML-KEM-768/1024 et ML-DSA-44/65/87 dans la 50.0.2. Les clés se chargent depuis PEM et DER (SPKI, PKCS#8, PKCS#8 chiffré, SEC1), OpenSSH et des points SEC1 bruts ; il n’existe pas de lecteur JWK, si bien que les JWK passent par PyJWT, Authlib ou jwcrypto, ou par le convertisseur JWK.
La plupart des erreurs que les développeurs recherchent proviennent du chargement des clés et non de la signature : une clé publique passée à load_pem_private_key, une clé chiffrée sans mot de passe ou un point qui n’est pas sur la courbe nommée. Le vérificateur de signatures et la matrice d’interopérabilité des bibliothèques vous aident quand une signature issue d’une autre pile ne passe pas la vérification.