bitwarden / bitwarden/ios

[PM-41033] Passkey creation fails with Ctap2(Vendor(VendorError(241))) when saving a GitHub passkey on iOS 26.5.1

Open
#2,919 3 comments 0 reactions 0 assignees View on GitHub
app:password-manager bug
Dominant language
Swift
Stars
684
Forks
154
Avg merge
7d 2h
Merged PRs (30d)
32

Description

### Steps To Reproduce

1. On iPhone running iOS 26.5.1, set Bitwarden as the provider in
Settings → General → AutoFill & Passwords (Passwords/iCloud Keychain off).
2. In Safari, sign in to github.com.
3. Go to Settings → Password and authentication → Passkeys → "Add a passkey".
4. Complete GitHub's re-authentication prompt.
5. When the iOS system sheet appears, choose Bitwarden.
6. On the "Choose a login to save this passkey to" screen, select the
existing github.com login item.
7. Confirm.

### Expected Result

The passkey is created, saved to the selected github.com login item, and
registered successfully with GitHub.

### Actual Result

Creation fails immediately with "An error has occurred." GitHub reports
"Passkey registration failed." No passkey is saved to the vault item.

Error details from "Share error details":

Bitwarden Autofill 2026.7.0 (3402)
Bundle: com.8bit.bitwarden.autofill
Device: iPhone18,3
System: iOS 26.5.1
SDK: 3.0.0-6848-159aed9
Server: 2026.7.1 @ US
Commit: bitwarden/ios/release/2026.7-rc53@e9514dc0f85092ef3cf2a2ccbe07dc5a4f661b0c

BitwardenSdk.BitwardenError.MakeCredential(BitwardenSdk.MakeCredentialError.Other(
message: "make_credential error: Ctap2(Vendor(VendorError(241)))"))

Stack trace terminates in unsymbolicated BitwardenShared / BitwardenKit /
SwiftUI / libswift_Concurrency frames.

```
Bitwarden Autofill 2026.7.0 (3402)

Bitwarden Error Error Date: 2026-07-27T16:29:19-07:00 Bitwarden Autofill 2026.7.0 (3402) Bundle: com.8bit.bitwarden.autofill Device: iPhone18,3 System: iOS 26.5.1 SDK: 3.0.0-6848-159aed9 Server: 2026.7.1 @ US Commit: bitwarden/ios/release/2026.7-rc53@e9514dc0f85092ef3cf2a2ccbe07dc5a4f661b0c Build Source: bitwarden/ios/actions/runs/29108837579/attempts/1 User ID: xxxxxxxxxredacted BitwardenSdk.BitwardenError.MakeCredential(BitwardenSdk.MakeCredentialError.Other(message: "make_credential error: Ctap2(Vendor(VendorError(241)))")) BitwardenSdk.BitwardenError.MakeCredential(BitwardenSdk.MakeCredentialError.Other(message: "make_credential error: Ctap2(Vendor(VendorError(241)))")) Stack trace: 0 BitwardenKit 0x00000001028f7954 __swift_memcpy0_1 + 31596 1 BitwardenShared 0x0000000105394335 objectdestroyTm + 957 2 BitwardenKit 0x00000001028acc39 __swift_mutable_project_boxed_opaque_existential_1 + 1989 3 BitwardenKit 0x00000001028a568d __swift_instantiateGenericMetadata + 2773 4 BitwardenKit 0x00000001028ad01d __swift_mutable_project_boxed_opaque_existential_1 + 2985 5 BitwardenShared 0x0000000105919c21 __swift_memcpy225_8 + 67853 6 BitwardenShared 0x0000000105912dfd __swift_memcpy225_8 + 39657 7 BitwardenShared 0x00000001059112ad __swift_memcpy225_8 + 32665 8 BitwardenKit 0x00000001028a5355 __swift_instantiateGenericMetadata + 1949 9 BitwardenKit 0x00000001028aca01 __swift_mutable_project_boxed_opaque_existential_1 + 1421 10 BitwardenKit 0x00000001028a568d __swift_instantiateGenericMetadata + 2773 11 BitwardenKit 0x0000000102982e75 objectdestroy.13Tm + 905 12 BitwardenShared 0x0000000105922ca1 objectdestroy.3Tm + 26417 13 BitwardenShared 0x0000000105394335 objectdestroyTm + 957 14 SwiftUI 0x00000001944cb281 A5CD9C54-E40A-3736-8366-4CE5DAB770D5 + 1036929 15 SwiftUI 0x00000001944cb281 A5CD9C54-E40A-3736-8366-4CE5DAB770D5 + 1036929 16 SwiftUI 0x00000001944cb27d A5CD9C54-E40A-3736-8366-4CE5DAB770D5 + 1036925 17 SwiftUI 0x00000001944cb281 A5CD9C54-E40A-3736-8366-4CE5DAB770D5 + 1036929 18 libswift_Concurrency.dylib 0x00000001894a1385 70E4FD9F-9BAA-38D3-9127-4B5194AD41EB + 21381 Binary images: AuthenticatorBridgeKit: 0x0000000102b38000 BitwardenAutoFillExtension: 0x0000000102810000 BitwardenKit: 0x0000000102898000 BitwardenResources: 0x0000000106080000 BitwardenSdk_464161978EAC5FCE_PackageProduct: 0x0000000102d18000 BitwardenShared: 0x0000000105384000

...
```

### Screenshots or Videos

_No response_

### Additional Context

- 241 (0xF1) falls in the CTAP2 vendor-specific error range, which suggests
an internal SDK failure during credential creation rather than a
protocol-level rejection from the relying party.

- The same registration also fails from macOS: Chrome and Firefox both
return GitHub's "Passkey registration failed / This device cannot be
registered." In Chrome the extension does present the "Save passkey"
picker and the item can be selected, but registration still fails.

- The GitHub account already has one platform passkey registered
(Face ID / iCloud Keychain) plus authenticator-app 2FA. Possibly relevant
if excludeCredentials handling is involved, though the vendor error code
suggests the failure happens before that point.

- No security keys are registered on the account.
- A previously orphaned passkey was deleted from the vault item before
these attempts.

### Build Version

2026.07.0 3402

### What server are you connecting to?

US

### Self-host Server Version

_No response_

### Environment Details

_No response_

### Issue Tracking Info

- [ ] I understand that work is tracked outside of Github. A PR will be linked to this issue should one be opened to address it, but Bitwarden doesn't use fields like "assigned", "milestone", or "project" to track progress.

Contributor guide

Open the contributing guide

Research direction

Start by reproducing passkey creation through the iOS Autofill flow and trace the make_credential error in the BitwardenAutofill, BitwardenShared, and BitwardenKit paths, focusing on Ctap2(Vendor(VendorError(241))). Compare the iOS failure with the reported macOS behavior and verify that the selected github.com login receives a passkey and GitHub completes registration successfully.

Written by the indexing model from the issue text.

Assessment

Tech stack
ios, swift
Domain
authentication, mobile, security
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.