Passkey Lab

The results table below shows two problems that can stop the same passkey from unlocking encrypted data across devices, browsers and connection methods: different encryption keys, and inconsistent identity verification.

In the first problem, using 1Password through local Safari and through Chrome’s phone QR flow produced different encryption keys, despite using the same passkey and input.

In the second problem, Chrome Password Manager behaved differently in Chrome on iPhone and desktop, despite using the same userVerification: "preferred" setting. The iPhone reported successful identity verification; the desktop did not, so the desktop test stopped before reading the passkey’s encryption keys or checking whether they matched. Desktop runs using "required" reported successful verification and completed the comparison.

Each row represents a different combination of PRF creators and consumers. The Creator is the device that created the passkey; the Consumer is the device that retrieves and uses that same passkey. Given the same input, every combination of Creator and Consumer should be able to run PRF and generate matching encryption keys, but our tests found discrepancies.

Reading the keys

This notation shows how inconsistent hashing can produce different encryption keys.

x
The original input given to the passkey.
D(x)
A hashed version of that input, used for comparison.
P(x)
The encryption key the phone returns for the original input.
P(D(x))
The encryption key the phone incorrectly derives from the hashed input.

In the P(D(x)) case, the tested 1Password QR flow behaves as though the input is hashed one extra time compared with local Safari. This produces a different encryption key, preventing data encrypted through one path from opening through the other.

“Pass” means decryption worked out of the box. “Needs changes” means decryption worked after additional configuration.

Latest results: (Pacific).
TestCreatorConsumerRequested verification
Creator → Consumer
Creator keyConsumer keyOutcomeVendor follow-up / proposed fix
01iPhone Safari1PasswordChrome · QRiPhone · 1PasswordPreferred→ PreferredP(x)P(D(x)) Fail1Password, Apple and Google should check why QR returns a different key from Safari for the same passkey and input. The responsible vendor is not yet known.
02Chrome · QRiPhone · 1PasswordiPhone Safari1PasswordPreferred→ PreferredP(D(x))P(x) FailInvestigate the same key mismatch when data is encrypted through QR and opened in Safari. Check where the two routes hash the input differently.
03iPhone SafariApple PasswordsChrome · QRiPhone · Apple PasswordsPreferred→ PreferredP(x)P(x) PassApple: no change needed for this tested QR route.
04Chrome · QRiPhone · Apple PasswordsiPhone SafariApple PasswordsPreferred→ PreferredP(x)P(x) PassApple: no change needed for this tested reverse QR route.
05iPhone SafariApple PasswordsDesktop Chrome · directApple PasswordsPreferred→ PreferredP(x)P(x) PassApple: no change needed for this tested direct route.
06Desktop Chrome · directApple PasswordsiPhone SafariApple PasswordsPreferred→ PreferredP(x)P(x) PassApple: no change needed for this tested reverse direct route.
07iPhone ChromeChrome Password ManagerDesktop Chrome · directChrome Password ManagerPreferred→ RequiredP(x)P(x) Needs changesGoogle: investigate the earlier desktop approvals that did not report identity verification. This run worked with required verification and matching keys.
08Desktop Chrome · directChrome Password ManageriPhone ChromeChrome Password ManagerRequired→ PreferredP(x)P(x) Needs changesGoogle: investigate why the default desktop approval did not report identity verification. The stricter request worked and the keys matched.
09iPhone Safari1PasswordDesktop Chrome · direct1Password extensionPreferred→ PreferredP(x)P(x) Pass1Password: this direct extension route worked without changes. The key mismatch appeared in the earlier QR tests.
10Desktop Chrome · direct1Password extensioniPhone Safari1PasswordRequired→ PreferredP(x)P(x) Needs changes1Password: check whether this also works with the default verification setting. This run used the stricter setting; it does not prove the default would fail.

Who needs to fix this? It is not yet clear whether the fault is in 1Password, Apple’s passkey support or Chrome. The QR and direct-extension tests used different websites and passkeys. 1Password’s handling of Apple’s inputs and Chrome’s iOS code are places to investigate; they do not prove which vendor caused the mismatch.


Contributing

Help broaden the evidence with another browser, password manager or access path.

Share a result on GitHub or read the contribution guide. Explain what happened and label any guesses about why.