py_webauthn (el paquete webauthn de PyPI) genera las opciones de registro y de autenticación y verifica las respuestas, incluidos todos los formatos de atestación, sobre pyca/cryptography. La comprobación le pasó el mismo registro y las mismas aserciones de un autenticador por software que se usaron con SimpleWebAuthn, go-webauthn y WebAuthn4J, y eso es lo que hace visibles las diferencias entre ellas.
Los valores predeterminados de la política son los más laxos de las cuatro. generate_registration_options() no envía ningún miembro authenticatorSelection, así que los navegadores recurren a la verificación del usuario preferred y a la clave residente discouraged —llaves de acceso que no son detectables—, y verify_registration_response() y verify_authentication_response() aceptaron respuestas con el indicador UV desactivado salvo que se pase require_user_verification=True. Por eso, un inicio de sesión construido sobre los valores predeterminados acepta un toque en una llave de seguridad sin PIN. Establece la política de forma explícita en ambos lados, como hace el ejemplo.
Las firmas de aserción deben ser DER ASN.1: una firma r‖s en bruto de 64 bytes falló con Could not verify authentication signature, un mensaje que no menciona la codificación; el conversor DER ⇄ en bruto muestra si un cliente de prueba produjo la forma equivocada. Una firma DER high-S se verificó. Por defecto se ofrecen Ed25519 (-8), ES256 (-7) y RS256 (-257); no hay ninguna entrada ML-DSA, a diferencia de SimpleWebAuthn 14.
Los contadores son estrictos: Response sign count of 3 was not greater than current count of 5, y lo mismo con 0 tras 5, mientras que 0 tras 0 —lo que notifican las llaves de acceso sincronizadas— se verificó. Guarda el new_sign_count devuelto después de cada inicio de sesión correcto.
Decodifica la salida en bruto del navegador con el inspector de WebAuthn y experimenta sin riesgos en el entorno de pruebas de llaves de acceso.