github.com/go-webauthn/webauthn (der gepflegte Fork von duo-labs/webauthn) führt beide Zeremonien aus – BeginRegistration/FinishRegistration und BeginLogin/FinishLogin oder deren Varianten Validate* für andere Frameworks als net/http – und prüft Attestierungen in jedem Format. Die Prüfung validierte dieselben Antworten eines Software-Authenticators wie bei SimpleWebAuthn, py_webauthn und WebAuthn4J.
Die Richtlinie stammt aus der Konfiguration und wird in SessionData mitgeführt. Bei leerem AuthenticatorSelection sendete BeginRegistration ein leeres Objekt, sodass Browser die Standardwerte anwenden – Benutzerverifizierung preferred, Resident Key discouraged –, und die Validierung akzeptierte Antworten mit nicht gesetztem UV-Flag, weil die Sitzung nur preferred verlangte. Mit UserVerification: required in der Sitzung scheiterte dieselbe Assertion mit User verification required but flag not set by authenticator. Lege die Richtlinie in Config.AuthenticatorSelection fest, wie es das Beispiel tut, und speichere zwischen den beiden Aufrufen das gesamte SessionData.
Der Umgang mit dem Signaturzähler ist der wichtigste Unterschied zu den anderen Bibliotheken. Eine Assertion, deren Zähler (3) unter dem gespeicherten Wert (5) lag, führte zu einer erfolgreichen Anmeldung: Beim zurückgegebenen Credential war Authenticator.CloneWarning gesetzt, und SignCount blieb bei 5. Die Bibliothek meldet nur einen möglichen Klon; ob die Anmeldung abgelehnt wird, entscheidet dein Code, der nach jeder Anmeldung CloneWarning prüfen muss.
Assertion-Signaturen müssen ASN.1-DER sein – eine rohe r‖s-Signatur mit 64 Byte scheiterte mit Error validating the assertion signature: Signature invalid or not provided –, und eine DER-Signatur mit High-S bestand die Prüfung. Die Standardliste pubKeyCredParams ist lang: ES256, ES384 und ES512 (-7, -35, -36), RS256 bis RS512 (-257 bis -259), PS256 bis PS512 (-37 bis -39) und Ed25519 (-8); das Ed25519-Credential funktionierte durchgängig, von der Registrierung bis zur Prüfung. In 0.18.2 gibt es keinen Eintrag für ML-DSA.
Dekodiere mit dem WebAuthn-Inspektor, was ein Browser sendet, schlage Authenticator-Modelle mit dem AAGUID-Lookup nach und probiere Zeremonien in der Passkey-Sandbox aus.