WebAuthn4J verifies registration and authentication responses — attestation statements of every format, COSE keys, flags, counters and signatures — and leaves building the options to the relying party. Spring Security and Keycloak use it underneath. 0.31.11 depends on Jackson 3 (tools.jackson.*), which matters when your application still uses Jackson 2's com.fasterxml.jackson for its own JSON, and its API carries JetBrains @NotNull annotations: compiling against it with the single-file java launcher failed until org.jetbrains:annotations was on the classpath.
There is no default user-verification policy to forget: RegistrationParameters and AuthenticationParameters take userVerificationRequired and userPresenceRequired as mandatory arguments. In the check, a registration and an assertion with the UV flag clear verified when false was passed and failed with UserNotVerifiedException when true was. Keep the value consistent with the userVerification you send in the options, as the sample shows.
Signatures must be ASN.1 DER: a raw 64-byte r‖s assertion signature failed with BadSignatureException: Assertion signature is not valid., and a high-S DER signature verified. A counter lower than the stored one fails the login with MaliciousCounterValueException: Malicious counter value is detected. Cloned authenticators exist in parallel., while a counter that has always been 0, as synced passkeys report, passes. Ed25519 credentials verified end to end.
createNonStrictWebAuthnManager() accepts any attestation statement without checking it against trust anchors, which is right when you ask for attestation none and wrong when attestation is a policy decision; configure trust anchors and use a strict manager in that case.
The WebAuthn inspector decodes what browsers send, and AAGUID lookup identifies authenticator models for attestation policies.