false for Google Password Manager, and the calls worked.Passkey feature support is documented per browser and per operating system. That is how the specs are written and how our own PRF support tables are built, and for a long time it was enough, because the passkey was stored by whatever shipped with the device.
That assumption no longer holds. Since Android 14 and recent Windows 11 builds, third-party credential managers act as full passkey providers, which adds a third axis that the browser and OS tables do not cover. A user on Android with a third-party manager set as the default provider is in a different situation than the same user on the same phone with Google Password Manager. As a relying party you usually notice the difference only when a feature returns nothing and raises no error.
This article covers that third axis: which WebAuthn Level 3 features depend on the credential manager, what we can verify today and where the answer is still open.
Experiment with passkey flows in the Passkeys Debugger.
One note on wording. Password manager, credential manager, passkey manager and passkey provider all mean the same thing here: the software that stores the passkey and answers the WebAuthn call. We use the four labels interchangeably and spell out a distinction only where it changes the answer.
Recent Articles
š
Passkeys & WebAuthn PRF for End-to-End Encryption (2026)
āļø
Conditional Create for Passkeys: Support & Effectiveness
š
WebAuthn Signal API: Update & Delete Passkeys on Client-Side
š
WebAuthn Related Origins (ROR): Cross-Domain Passkey Guide
š
Passkey Providers: Different Types, AAGUID & Adoption
The three layers have to be separated before the matrix makes sense, because most of the confusion in this topic comes from mixing them.
getClientCapabilities and
related origin requests live here.
They depend on the browser version and, in the case of related origins, on your own
.well-known file. A credential manager cannot add or remove them.The distinction decides where you look first. "PRF does not work" can mean that the browser does not surface it, that the provider does not implement it or that the credential was created before the feature existed. The three have different fixes.
| Feature | What it gives you | Deep dive |
|---|---|---|
| PRF on get | Derive an encryption key from an existing passkey | PRF extension |
| PRF on create | Get the first key material already at registration | PRF extension |
| Conditional create | Upgrade a password user to a passkey without a prompt | Conditional create |
| Conditional UI | Passkey in the autofill dropdown | Conditional UI |
| Signal API | Keep server state and provider list in sync | Signal API |
| largeBlob | Store a small blob next to the credential | PRF vs largeBlob |
The matrix has two parts. The first is the status per provider and feature, built from our own tests, community data and vendor documentation. The second lists what we measured ourselves, per operating system and browser, because the same manager answers differently depending on where it runs.
Legend: ā works in every combination we measured, š” partial, meaning it works on some platforms or browsers but not others or only in a share of attempts, ā no output in the combinations we measured. There is no symbol for "we do not know": a provider we cannot measure is named below the table instead of taking up a row.
Status: August 2026. The two PRF columns are taken from our PRF support article, which owns the detail, the per-platform numbers and the sources for that feature.
| Credential manager | PRF on create | PRF on get | Conditional create | Conditional UI | Signal API | largeBlob | Status |
|---|---|---|---|---|---|---|---|
| Apple Passwords (iCloud Keychain) | ā | ā | ā Safari 18+, macOS 15+ | ā | ā accepted, no effect | ā | Aug 2026, own tests plus vendor docs |
| Google Password Manager | ā | ā | ā Chrome 136+ Windows and Linux, 142+ Android | ā | ā applied | ā | Aug 2026, own tests plus vendor docs |
| Windows Hello | ā Chrome 147+, Firefox 148+ | ā 25H2, Feb 2026 update | ā no password store | ā | ā accepted, no effect | ā | Aug 2026, own tests |
| Microsoft Password Manager | ā | ā ceremony fails | ā | ā | ā accepted, no effect | ā declared, then fails | Aug 2026, own tests on Windows 11 |
| 1Password | ā | ā | ā | ā | ā accepted, no effect | ā | Aug 2026, own tests on macOS |
| Enpass | ā | ā | ā | ā | ā accepted, no effect | ā | Aug 2026, own tests on macOS |
| Bitwarden | š” platform split | š” platform split | ā | ā | ā accepted, no effect | ā | Aug 2026, own tests on macOS plus demo data |
| Keeper | ā | ā | ā | ā | ā accepted, no effect | ā | Aug 2026, own tests on macOS |
| NordPass | ā | ā | š” runs, but not silently | ā no credential offered | ā accepted, no effect | ā | Aug 2026, own tests on macOS |
| Samsung Pass | ā | ā | ā | ā | ā accepted, no effect | ā | Aug 2026, own tests on Android |
| Dashlane | ā | ā | š” iOS 18, macOS 15, ā Chrome on macOS | ā | ā accepted, no effect | ā | Aug 2026, own tests on macOS |
| Proton Pass | ā | ā | ā | ā | ā accepted, no effect | ā | Aug 2026, own tests on macOS |
Two providers sit below the table rather than in it. KeePassXC and KeePassDX are covered by community data that puts both in the group returning a PRF value on the assertion, KeePassXC only sometimes at creation, and we have run neither ourselves.
Every row in the table above is a measurement. A cell we cannot stand behind keeps the provider out of the table rather than filling it with symbols that look like knowledge.
Sources and caveats per row:
conditionalCreate: false for the active Enpass provider and the ceremony went through
anyway, in two separate runs. Enpass also returns a PRF value at creation and the identical
value on the next authentication, which puts it in the same CTAP 2.2 bracket as iCloud
Keychain and Google Password Manager. It declined largeBlob at registration and acted on none
of the three signal calls.signalCurrentUserDetails; the other eleven left theirs
untouched. No call threw an error, and the reported capability contradicted the observed
behaviour in both directions. Section 6 has the numbers.conditionalCreate: false for Google Password Manager and iCloud Keychain and rejected the
ceremony for both, which matches the version table in our
conditional create article: the Chrome path covers
Windows, Linux and Android, and macOS runs the feature in Safari. 1Password, Bitwarden and
Proton Pass created a passkey silently on the same machine. The versions in the column come
from that article, except the Dashlane entry on iOS 18 and macOS 15, which Dashlane documents
itself.true, including
extension:largeBlob. Keeper then declined largeBlob at registration and acted on none of
the three signal calls it had just reported as supported. Conditional create is the one place
where the flag and the behaviour agree.d3452668-01fd-4c12-926c-83a4204853aa
against Windows Hello's 08987058-cadc-4b81-b6e1-30de50dcbe96. Its behaviour differs as well,
and more sharply than we previously recorded: the assertion does not return nothing, it
fails.get() that asked for largeBlob or
PRF failed with a NotAllowedError after the user had already picked the passkey and
confirmed. A modal get() for the same credential without any extension succeeded on the same
machine in the same session, which rules out the modal ceremony as the cause. WebAuthn expects
a client to ignore an extension it does not support. Here the request takes the login down
with it.hmac-secret is available unconditionally, and it
means a relying party that gates its encryption feature on the registration result will write
Samsung Pass off for a capability it actually has. Read both ends before you decide.true.
extension:largeBlob came back true and the registration returned no blob support at all.
All three signal calls were reported as supported, all three were accepted and the entry
under Settings > Accounts > Passkeys was unchanged afterwards. This is the same pattern as
Keeper, on a platform authenticator rather than a browser extension.hmac-secret, which is
the CTAP feature the PRF extension is built on. hmac-secret is not itself a Level 3 feature,
it is the authenticator side that L3's PRF extension talks to, which is why a browser can
support PRF while the platform still hands back nothing.androidx.credentials 1.6.0; Chrome's own documentation states that desktop extension
providers then decide whether to act on the signal. Conditional create has been up to the
provider since iOS 18 and Android 14. For every provider in the table the first gate is open,
so each ā in those two columns is a decision by the provider and not a missing browser
feature.We put twelve providers through the same test page, eight of them on one Mac, three on a Windows 11 machine and one on a Galaxy phone. The table grows with every provider we can reach.
| Provider | OS | Browser | Conditional create | Conditional UI | Signal API | largeBlob |
|---|---|---|---|---|---|---|
| Google Password Manager | macOS 26.3 | Chrome 151 | ā rejected | ā credential returned | ā entry renamed | ā written and read back |
| 1Password | macOS 26.3 | Chrome 151 | ā created silently | ā credential returned | ā accepted, no effect | ā declined at registration |
| iCloud Keychain | macOS 26.3 | Chrome 151 | ā rejected | ā credential offered | ā accepted, no effect | ā written and read back |
| Bitwarden | macOS 26.3 | Chrome 151 | ā created silently | ā credential returned | ā accepted, no effect | ā declined at registration |
| Dashlane | macOS 26.3 | Chrome 151 | ā rejected | ā credential returned | ā accepted, no effect | ā declined at registration |
| Proton Pass | macOS 26.3 | Chrome 151 | ā created silently | ā credential returned | ā accepted, no effect | ā declined at registration |
| Enpass | macOS 26.3 | Chrome 151 | ā created silently | ā credential returned from its own overlay | ā accepted, no effect | ā declined at registration |
| Keeper | macOS 26.3 | Chrome 151 | ā created silently | ā credential returned | ā accepted, no effect | ā declined at registration |
| Windows Hello | Windows 11 | Chrome 151 | ā nothing to upgrade from | ā credential returned | ā accepted, no effect | ā declined at registration |
| Microsoft Password Manager | Windows 11 | Edge 151 | ā rejected with a saved password present | ā credential returned | ā accepted, no effect | ā declared, then NotAllowedError on write |
| NordPass | macOS 26.3 | Chrome 151 | š” created, with its own confirm dialog | ā no credential offered | ā accepted, no effect | ā declined at registration |
| Samsung Pass | Android | Chrome 151 | ā rejected with a saved password present | ā credential returned | ā accepted, no effect | ā declined at registration |
Three results stand out:
conditionalCreate: false for Google Password Manager and iCloud Keychain and rejects the
ceremony for both. With 1Password, Bitwarden, Proton Pass, Enpass and Keeper the same call
created a passkey without a prompt, none of which had a saved password for the origin either.
NordPass sits between the two: the ceremony returns a credential, but only after its own window
asks the user to confirm, which is the opposite of the silent upgrade the feature exists for.
Microsoft Password Manager advertises the capability, holds a password for the origin and
still rejects the ceremony. Windows Hello advertises it too and has no password store to
upgrade from in the first place. For Enpass the browser reported
conditionalCreate: false and the ceremony still went through, so the flag and the behaviour
disagree within a single run.The first step of every run. The AAGUID decides which row a result belongs to, because a dialog that falls back to the provider shipped with the OS is the easiest way to mislabel a whole row.
Conditional UI, Google Password Manager on macOS 26.3 with Chrome 151. The dropdown names the provider, so the result cannot be confused with one produced by another manager. The credential list is fixed when the conditional request starts, so a passkey created afterwards only appears once you restart the request.
Conditional UI stays š” for the managers we have not run ourselves. A ā there needs a failed run rather than a missing one. Enpass moved from š” to ā for exactly that reason, and NordPass is the first provider that earned the ā the hard way, by advertising the capability and then offering nothing. Without conditional UI the passkey never appears in the dropdown and the user has to open the manager at every login, which degrades the flow without blocking it.

Passkeys Cheatsheet. Practical guidance, rollout patterns and KPIs for passkey programs.
get() asking for PRF authenticated without complaint once the
extension was dropped from the request. Ask for the extension in a separate ceremony, or retry
without it when a get() fails and never put the extension on the request that has to
authenticate the user.getClientCapabilities() is the standardised way to ask what the current client and provider
support, and it belongs at the start of any feature detection. It should not be the only
check.
In a run on macOS 26.3 with Chrome 151, the browser reported all three Signal API capabilities
as false for the active provider:
{ "signalAllAcceptedCredentials": false, "signalCurrentUserDetails": false, "signalUnknownCredential": false }
We called the three methods regardless, with three different providers active on the same machine and in the same browser. None of the calls threw an exception, and the outcomes were not the same:
| Active provider | Capability reported | signalCurrentUserDetails | Effect in the provider's own list |
|---|---|---|---|
| Google Password Manager | false | accepted | entry renamed |
| 1Password | false | accepted | unchanged |
| iCloud Keychain | false | accepted | unchanged |
| Bitwarden | true | accepted | unchanged |
| Dashlane | key absent | accepted | unchanged |
| Proton Pass | true | accepted | unchanged |
| Enpass | false | accepted | unchanged |
| Keeper | true | accepted | unchanged |
| Windows Hello | true | accepted | unchanged |
| Microsoft Password Manager | true | accepted | unchanged |
| NordPass | true | accepted | unchanged |
| Samsung Pass | true | accepted | unchanged |
The flag is wrong in both directions. Google Password Manager reports false and renames the
entry anyway. Bitwarden reports true for all three signal methods and for PRF, and in two
runs it applied no signal and returned no PRF output at all. Keeper reports true for all
three signal methods as well and renamed nothing. Conditional create fails in both directions.
Chrome reported false for Enpass and Enpass created the passkey regardless. Edge reported
true for Microsoft Password Manager, and with a password for the origin sitting in that same
manager the ceremony still came back with a NotAllowedError. The saved password matters here:
conditional create has nothing to upgrade without one, so a rejection on an empty vault would
prove nothing. We ran it twice, once without and once with the password, and got the same
answer both times.
The shape of the answer varies too. With Google Password Manager, iCloud Keychain and
1Password active, Chrome returned eleven keys with several set to false. With Keeper active
it returned twenty-four keys with all but two set to true, including extension:payment,
extension:minPinLength and extension:largeBlob, and Keeper then declined largeBlob at
registration. Windows Hello on Windows 11 answered with the same twenty-four keys and the same
two exceptions, and declined largeBlob as well, so the pattern is not limited to browser
extensions. In another combination Chrome left conditionalCreate and the three signal keys
out of the response entirely. An absent key says
something different from false, and neither is a promise about behaviour. Read the capability
answer as a starting point and confirm the ones you depend on.
Bitwarden on macOS 26.3 with Chrome 151. Every capability in the upper block is green. The registration in the lower block returned no extension result at all for largeBlob and PRF, in two separate runs.
Microsoft Password Manager on Windows 11 with Edge 151. The provider confirms largeBlob through the extension output at registration, which is a stronger statement than a capability flag.
The same run, a few ceremonies later. Both requests that carry an extension come back with a
NotAllowedError after the user has already picked the passkey and confirmed. A modal request
for the same credential without any extension succeeded in the same session.
Gate the feature on the capability check and you skip the calls Google Password Manager would have executed. Trust the resolved promise instead and you record twelve successes where you got one. Nothing in the return value separates the provider that acted from the eleven that did not.
The display name in Google Password Manager carries the value we sent through
signalCurrentUserDetails, on a client that had reported the capability as false a minute
earlier.
The silent no-op is the more dangerous of the two, because nothing in the API distinguishes it from success. A signal call that resolves without an error shows only that the browser accepted it, and there is no return value to inspect. Where revocation is part of your security model, verify it in the credential manager during testing instead of trusting the resolved promise, and keep a server-side path that does not depend on the signal arriving.
The measurements were taken in August 2026. The method is documented here because it determines how much weight a single cell can carry.
NotAllowedError whether or not it supports the feature. A silent creation is proof of
support; a rejection only counts once the manager demonstrably holds a password for the
origin. Every ā in that column comes from a run that met the second condition.One complete run, Google Password Manager on macOS 26.3 with Chrome 151. The blob written in one ceremony returns byte for byte in the next, and the three signal rows show the contradiction between the reported capability and the observed behaviour.
Update rhythm. We review this page quarterly, and additionally when a browser ships a Level 3 feature, a credential manager announces one, a vendor sends us a correction or our own field data contradicts a cell. Each review updates the status date even when nothing changed, so you can see how old the answer is.
Last checked: August 2026. Next scheduled review: November 2026.
If you maintain a credential manager and a row here is wrong or outdated, tell us and we will retest it. We would rather publish your result than our guess.
Subscribe to our Passkeys Substack for the latest news.
This matrix is hard to build from the outside because the relevant behaviour occurs in production, on devices you do not own, with providers you did not choose.
Corbado Observe turns that into data from your own login:
See Authenticator Inventory in Corbado Observe āThat is also how the open cells in the matrix will be filled: with outcomes from real traffic rather than with vendor claims.
The browser and OS view of passkey support is well documented, and it is no longer sufficient on its own. The credential manager decides whether PRF returns a value, whether a silent upgrade runs and whether a revocation ever reaches the user's credential list.
Version 1 has more open cells than closed ones, which is an accurate picture of the ecosystem. We close them by testing what we can reach and asking the vendors for the rest.
Corbado is the Passkey Intelligence Platform for large-scale CIAM teams running consumer authentication. We help you see what IDP logs and generic analytics tools can't: where passkeys, passwords, OTP, social login and fallback journeys succeed, stall or fail, which devices and browsers create friction, and when an OS update silently breaks login. Two products: Corbado Observe layers process mining and observability across authentication journeys. Corbado Connect adds managed passkeys with analytics built in alongside your IDP. VicRoads runs passkeys for 5M+ users with Corbado (+80% passkey activation). Talk to a Passkey Expert ā
The PRF extension, conditional create, conditional UI, largeBlob and the Signal API all need the credential manager to implement them. Related origin requests and getClientCapabilities are browser and relying party features, while credProtect, credBlob, minPinLength and enterprise attestation are properties of security keys rather than of a software credential manager.
Because the credential manager decides, and the same manager can behave differently per platform. Bitwarden returns PRF values on Linux with Firefox and nothing on iOS with Safari, so a single answer per vendor would be wrong. Detect the capability at runtime instead of inferring it from the product name.
Detect the capability instead of the provider, keep a working path for the case where the feature is missing and do not ask the user to switch credential managers. Falling back to the provider shipped with the operating system is technically sound, and vendors report that users who installed their own manager read it as a downgrade, most often in Japan and Germany.
Own tests on macOS 26.3 with Safari 26.3 and Chrome 150 and 151, the anonymous community results from our public PRF demo and vendor documentation where it is public and specific. Every cell carries a date and its source, and a cell with neither a test result nor a clear statement stays open.
Related Articles
Table of Contents