cryptography es lo que usa la mayor parte del código Python —PyJWT, Authlib, paramiko, certbot, los SDK de AWS y de Google— para la criptografía propiamente dicha. Su capa hazmat expone directamente las claves y las firmas; los wheels incluyen su propio OpenSSL, así que el comportamiento depende de la versión del paquete y no del sistema operativo (la 50.0.2 incluye OpenSSL 4.0.3).
Las firmas ECDSA salen en DER ASN.1, y verify() espera DER. WebCrypto, JWS y la mayoría de los tokens de hardware usan la forma r‖s en bruto de 64 bytes, que verify() rechaza con el mismo InvalidSignature que una firma falsificada. decode_dss_signature y encode_dss_signature convierten entre DER y el par de enteros; el relleno a ancho fijo te toca añadirlo a ti, tal como muestra el ejemplo, o usa el conversor DER ⇄ en bruto para comprobarlo a mano.
El nonce es aleatorio salvo que pidas RFC 6979: ec.ECDSA(hashes.SHA256(), deterministic_signing=True) reprodujo exactamente el vector de prueba P-256 del RFC, incluido su s alto (high-S), porque nada en el paquete normaliza s, y la verificación acepta ambas mitades. En las firmas destinadas a un verificador low-S como libsecp256k1 o @noble/curves, hay que sustituir antes s por n − s. sign() y verify() calculan el hash de los datos por su cuenta; pasa Prehashed(hashes.SHA256()) cuando ya tengas un resumen, o calcularás el hash dos veces.
La cobertura de curvas es amplia —de P-224 a P-521, secp256k1 y las curvas Brainpool r1—, además de Ed25519, Ed448, ML-KEM-768/1024 y ML-DSA-44/65/87 en la 50.0.2. Las claves se cargan desde PEM y DER (SPKI, PKCS#8, PKCS#8 cifrado, SEC1), OpenSSH y puntos SEC1 sin envoltorio; no hay lector de JWK, así que las JWK pasan por PyJWT, Authlib o jwcrypto, o por el conversor de JWK.
La mayoría de los errores que la gente busca vienen de la carga de claves y no de la firma: una clave pública pasada a load_pem_private_key, una clave cifrada sin contraseña o un punto que no está en la curva con nombre. El verificador de firmas y la matriz de interoperabilidad de bibliotecas ayudan cuando una firma procedente de otro stack no se verifica.