github.com/go-webauthn/webauthn (the maintained fork of duo-labs/webauthn) runs both ceremonies — BeginRegistration/FinishRegistration and BeginLogin/FinishLogin or their Validate* variants for frameworks other than net/http — and verifies every attestation format. The check validated the same software-authenticator responses used for SimpleWebAuthn, py_webauthn and WebAuthn4J.
Policy comes from the configuration and is carried in SessionData. With an empty AuthenticatorSelection, BeginRegistration sent an empty object, so browsers apply the defaults — user verification preferred, resident key discouraged — and validation accepted responses with the UV flag clear because the session asked only for preferred. With UserVerification: required in the session the same assertion failed with User verification required but flag not set by authenticator. Set the policy in Config.AuthenticatorSelection, as the sample does, and store the whole SessionData between the two calls.
Counter handling is the most important difference from the other libraries. An assertion whose counter (3) was lower than the stored one (5) logged in successfully: the returned credential had Authenticator.CloneWarning set and its SignCount left at 5. The library only reports a possible clone; whether to refuse the login is up to your code, which must check CloneWarning after every login.
Assertion signatures must be ASN.1 DER — a raw 64-byte r‖s signature failed with Error validating the assertion signature: Signature invalid or not provided — and a high-S DER signature verified. The default pubKeyCredParams list is long: ES256, ES384 and ES512 (-7, -35, -36), RS256 to RS512 (-257 to -259), PS256 to PS512 (-37 to -39) and Ed25519 (-8); the Ed25519 credential verified end to end. There is no ML-DSA entry in 0.18.2.
Decode what a browser sends with the WebAuthn inspector, look up authenticator models with AAGUID lookup, and try ceremonies in the passkey sandbox.