FIDO2 — the alliance, the spec family, the certification.
FIDO2 isn't a protocol. It's a brand for two specifications working in concert: WebAuthn (the W3C Web API the browser exposes to the relying party) and CTAP2 (the FIDO Alliance protocol the browser speaks to the authenticator). Together they replace shared-secret passwords with hardware-rooted public-key cryptography.
The FIDO2 family at a glance
WebAuthn
JavaScript API on the relying-party page. navigator.credentials.create() and .get() — that's the entire surface area.
CTAP2 (Client-To-Authenticator)
USB-HID, NFC, BLE wire format the browser uses to talk to a roaming authenticator. Platform authenticators bypass CTAP and use OS-native APIs.
COSE / CBOR
RFC 8152 / RFC 8949 — the binary structures FIDO2 uses for keys and messages. Compact enough to run on small MCUs.
Metadata Service
Signed JSON BLOB published by the Alliance, listing every certified authenticator (AAGUID, certification level, attestation root). Production RPs verify against MDS.
CTAP1 vs CTAP2
CTAP1 (also U2F) is the original FIDO protocol: a U2F register / authenticate flow with a 16-byte counter. No PIN, no resident credentials, no user verification beyond physical presence. Still in deployment, but considered legacy — CTAP2 supersedes it for everything new.
CTAP2 introduces resident (discoverable) credentials, PIN/UV protocols, larger commands, and a richer error model. It is what enables real passwordless flows — the username can come from the authenticator instead of the user.
A CTAP2 authenticator can also expose a CTAP1 transport for backwards compatibility with U2F-only RPs. WebAuthn level-1 and level-2 RPs interoperate with both via the WebAuthn API.
CTAP2 commands that matter
| Command | Purpose |
|---|---|
| authenticatorMakeCredential (0x01) | Registration: generate keypair, return attestationObject. |
| authenticatorGetAssertion (0x02) | Authentication: sign a challenge with an existing credential. |
| authenticatorGetInfo (0x04) | Discovery: report supported algorithms, transports, AAGUID, options. |
| authenticatorClientPIN (0x06) | PIN setup, PIN change, get pinUvAuthToken (CTAP2.1 PIN/UV protocol). |
| authenticatorReset (0x07) | Factory reset (invalidates all stored credentials). |
| authenticatorBioEnrollment (0x09) | On-device fingerprint enrolment (CTAP2.1 only). |
| authenticatorCredentialManagement (0x0A) | Enumerate / delete resident credentials. |
| authenticatorSelection (0x0B) | UA prompts user to pick which authenticator to use. |
| authenticatorLargeBlobs (0x0C) | Per-credential opaque blob storage (e.g. encrypted backup material). |
Authenticator certification levels
The FIDO Alliance certifies authenticators across L1 (software / functional), L2 (hardware-protected key, lightweight attack resistance), L3 (Common-Criteria-style hardware), and L3+ (highest assurance with side-channel and fault-injection resistance).
For enterprise deployments the AAGUID allow-list is typically derived from a target certification level — e.g. "L2 or higher", with explicit denials for AAGUIDs flagged in MDS as compromised.
Companion pages and tools
WebAuthn reference
Registration / authentication ceremonies, structures, RP rules.
Passkeys
BE/BS flags, syncable vs device-bound, enterprise policy.
Attestation deep dive
fmt formats, x5c chains, MDS verification, AAGUID policy.
FIDO2 Nano-Card Applet
embedded secure-element FIDO2 authenticator. Hardware-backed credentials on a CC EAL5+ secure element.
FIDO Validation Server
Multi-tenant SaaS. Verifies attestation, enforces per-tenant AAGUID policy, exposes a REST API.
CBOR decoder
Walk any CTAP2 message or attestation object.