github.com/go-webauthn/webauthn(duo-labs/webauthn の保守されているフォーク)は、両方のセレモニー(BeginRegistration/FinishRegistration と BeginLogin/FinishLogin、または net/http 以外のフレームワーク向けの Validate* 系の関数)を実行し、あらゆる形式のアテステーションを検証します。チェックでは、SimpleWebAuthn、py_webauthn、WebAuthn4J と同じソフトウェア認証器のレスポンスを検証しました。
ポリシーは設定から取得され、SessionData に保持されます。AuthenticatorSelection が空のとき、BeginRegistration は空のオブジェクトを送信したため、ブラウザーはデフォルト値(ユーザー検証は preferred、レジデントキーは discouraged)を適用しました。セッションが preferred しか要求していなかったため、検証では UV フラグが立っていないレスポンスも受け入れられました。セッションに UserVerification: required を設定すると、同じアサーションは User verification required but flag not set by authenticator で失敗しました。サンプルのように Config.AuthenticatorSelection でポリシーを設定し、2 つの呼び出しの間で SessionData 全体を保存してください。
カウンターの扱いが、他のライブラリとの最も重要な違いです。カウンター(3)が保存済みの値(5)より小さいアサーションでも、ログインに成功しました。返された認証情報では Authenticator.CloneWarning が設定され、SignCount は 5 のままでした。このライブラリはクローンの可能性を報告するだけで、ログインを拒否するかどうかはアプリケーションのコード次第です。そのコードは、ログインのたびに CloneWarning を確認しなければなりません。
アサーション署名は ASN.1 DER でなければなりません(64 バイトの生の r‖s 署名は Error validating the assertion signature: Signature invalid or not provided で失敗しました)。また、high-S の DER 署名は検証を通りました。デフォルトの pubKeyCredParams の一覧は長く、ES256、ES384、ES512(-7、-35、-36)、RS256〜RS512(-257〜-259)、PS256〜PS512(-37〜-39)、Ed25519(-8)が含まれます。Ed25519 の認証情報は、登録から認証まで一通り検証できました。0.18.2 には ML-DSA の項目はありません。
ブラウザーが送信する内容は WebAuthn インスペクターでデコードし、認証器の機種は AAGUID 検索で調べ、セレモニーはパスキーサンドボックスで試してください。