ecdsa implémente ECDSA et EdDSA en pur Python, sans OpenSSL en dessous. Il s’installe donc partout et se prête bien aux vecteurs de test et à l’enseignement, et il reste une dépendance d’anciennes piles JOSE comme python-jose. Ses mainteneurs déclarent qu’il n’est pas conçu pour résister aux attaques par canal auxiliaire : en production, la signature relève de pyca/cryptography ou de coincurve.
Trois valeurs par défaut causent presque tous les échecs d’interopérabilité. La fonction de hachage par défaut est SHA-1 : une SigningKey créée sans hashfunc signe des condensats SHA-1, ce que les essais ont confirmé en vérifiant la signature par défaut avec pyca/cryptography (elle a réussi avec SHA-1 et échoué avec SHA-256). La signature est en r‖s brut (64 octets sur P-256), pas en DER. Enfin, VerifyingKey.to_string() renvoie le x‖y nu de 64 octets sans préfixe 0x04, qu’OpenSSL, Go et WebCrypto ne lisent pas comme un point.
La signature utilise un nonce aléatoire, sauf si vous appelez sign_deterministic(), qui a reproduit le vecteur de test P-256 de la RFC 6979. s est laissé tel que calculé (élevé environ une fois sur deux), sauf si vous choisissez l’un des encodeurs *_canonize, et la vérification accepte l’une ou l’autre moitié. Chaque choix d’encodage se fait à chaque appel via sigencode= et sigdecode=, si bien que les côtés signature et vérification doivent désigner la même paire ; une signature DER passée au décodeur brut par défaut lève BadSignatureError: Malformed formatting of signature.
La prise en charge des courbes est la plus large des bibliothèques Python (de P-224 à P-521, secp256k1 et Brainpool), avec en plus Ed25519 et Ed448. Les clés s’importent en SPKI PEM ou DER, en points SEC1 et en scalaires bruts ; to_pem() écrit du SEC1 EC PRIVATE KEY, sauf si vous passez format="pkcs8".
L’exemple corrige les trois valeurs par défaut d’un coup : SHA-256, un nonce déterministe et une signature DER canonique low-S. Pour confronter une signature qu’il a produite à une autre bibliothèque, le convertisseur DER ⇄ brut et les vecteurs de test sont le chemin le plus rapide.