Skip to content

create() with a security key does not complete on iOS 26 (userVerification: required, YubiKey 5 FIPS) #68

Description

@enda-kelly

What happens

With authenticatorAttachment: 'cross-platform' and userVerification: 'required', create() does
not complete on iOS 26.5.2 with a YubiKey 5 FIPS over USB-C:

  1. iOS shows the "Set Up Security Key" sheet.
  2. The user inserts the key and touches it.
  3. iOS never asks for the key PIN.
  4. The promise does not resolve, and no credential is stored.

The same key registers correctly through a desktop browser against the same relying party. So the
key and the relying-party configuration are good.

Key diagnostic: a lone security-key request fails, a combined request works

On the same device and key:

  • create() with only the security-key registration request submitted to ASAuthorizationController
    (that is, authenticatorAttachment: 'cross-platform') fails as above (no PIN, no credential).
  • create() with both the platform and security-key registration requests submitted together
    (attachment unset) works. iOS shows a combined sheet. The user picks the security key, enters the
    PIN, touches the key, and the credential is stored. Verified on a device with a YubiKey 5 FIPS over
    USB-C.

So the failure is specific to iOS 26 presenting a single security-key registration request. Including
the platform request alongside it drives the ceremony correctly. This may be an
ASAuthorizationController behaviour on iOS 26: a lone
ASAuthorizationSecurityKeyPublicKeyCredentialRegistrationRequest does not reach the PIN sub-flow.
That could be an OS bug worth reporting to Apple. The library could also work around it by always
including a platform request.

Notes

  • No PIN prompt suggests the user-verification sub-flow is not driven for the lone request.
  • residentKey: 'preferred' and residentKey: 'discouraged' behave the same.
  • Authentication (get()) with a security key works on the same device. So the security-key provider
    itself is functional.

Environment

  • react-native-passkeys 0.4.1
  • Expo SDK 57, iOS 26.5.2
  • YubiKey 5 FIPS (USB-C; NFC shows the same result)
  • userVerification: 'required', attestation: 'direct'

Related: #67 (the change that presents both providers, which avoids this by always including a platform request).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions