Skip to content

Conversation

@nikwithak
Copy link
Contributor

@nikwithak nikwithak commented Sep 10, 2025

🎟️ Tracking

PM-25012

📔 Objective

Moves the deserialization of the data object into the SDK - as part of running cipher migrations, the CipherType objects will be extracted instead of being passed in from the client.

⏰ Reminders before review

  • Contributor guidelines followed
  • All formatters and local linters executed and passed
  • Written new unit and / or integration tests where applicable
  • Protected functional changes with optionality (feature flags)
  • Used internationalization (i18n) for all UI strings
  • CI builds passed
  • Communicated to DevOps any deployment requirements
  • Updated any necessary documentation (Confluence, contributing docs) or informed the documentation
    team

🦮 Reviewer guidelines

  • 👍 (:+1:) or similar for great changes
  • 📝 (:memo:) or ℹ️ (:information_source:) for notes or general info
  • ❓ (:question:) for questions
  • 🤔 (:thinking:) or 💭 (:thought_balloon:) for more open inquiry that's not quite a confirmed
    issue and could potentially benefit from discussion
  • 🎨 (:art:) for suggestions / improvements
  • ❌ (:x:) or ⚠️ (:warning:) for more significant problems or concerns needing attention
  • 🌱 (:seedling:) or ♻️ (:recycle:) for future improvements or indications of technical debt
  • ⛏ (:pick:) for minor or nitpick changes

jrmccannon and others added 30 commits August 11, 2025 16:05
…371)

## 🎟️ Tracking
[PM-22256](https://bitwarden.atlassian.net/browse/PM-22256)

## 📔 Objective
This adds type and default user collection email to the Collection
struct. Type is only added to CollectionView. Name is now computed by
the decrypt function of Collection as it is unneeded on the
CollectionView.

[PM-22256]:
https://bitwarden.atlassian.net/browse/PM-22256?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
## 🎟️ Tracking

https://bitwarden.slack.com/archives/C054ZQSBS49/p1755188403409309

## 📔 Objective

It seems #279 accidentally
required wasm in all uniffi builds via `bitwarden-vault` ->
`bitwarden-collections` -> `bitwarden-core`. Since it is only required
on core, this leads to build issues on anything where an impl is tagged
with wasm-bindgen, but uses a struct from a third package - such as
`bitwarden-crypto` that does not have the wasm feature enabled.

Attempts to fix the build errors of:
#383

Note: This flags out a function from the collections client. This has to
be fixed by the owning team and updated, this PR just unblocks builds
and fixes the imports.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes

---------

Co-authored-by: Oscar Hinton <[email protected]>
## 🎟️ Tracking

https://bitwarden.atlassian.net/browse/SRE-2330

## 📔 Objective

Part of overall effort to deprecate auth-email header

Server side changes: bitwarden/server#5709

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes

---------

Co-authored-by: Oscar Hinton <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [typescript](https://www.typescriptlang.org/)
([source](https://redirect.github.com/microsoft/TypeScript)) | [`5.8.3`
-> `5.9.2`](https://renovatebot.com/diffs/npm/typescript/5.8.3/5.9.2) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/typescript/5.9.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/typescript/5.8.3/5.9.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>microsoft/TypeScript (typescript)</summary>

###
[`v5.9.2`](https://redirect.github.com/microsoft/TypeScript/compare/v5.8.3...5be33469d551655d878876faa9e30aa3b49f8ee9)

[Compare
Source](https://redirect.github.com/microsoft/TypeScript/compare/v5.8.3...v5.9.2)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "every 2nd week starting on the 2 week
of the year before 4am on Monday" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/bitwarden/sdk-internal).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS43MS4xIiwidXBkYXRlZEluVmVyIjoiNDEuNzEuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel García <[email protected]>
## 🎟️ Tracking

<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->

## 📔 Objective

<!-- Describe what the purpose of this PR is, for example what bug
you're fixing or new feature you're adding. -->

Updates wasm to use the same implementation as mobile, i.e.
`load_flags`. This uses a hashmap instead of the internal `Flags` enum
as we want to prevent additions or removal of flags to be a breaking
change.

Consumers should pass in the full flag object they get from the config
endpoint and let the SDK handle the rest.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[rust-nightly](https://redirect.github.com/phi-ag/renovate-rust-nightly)
([source](https://rust-lang.github.io/rustup-components-history)) |
minor | `2025-05-08` -> `2025-08-18` |

---

### Configuration

📅 **Schedule**: Branch creation - "every 2nd week starting on the 2 week
of the year before 4am on Monday" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/bitwarden/sdk-internal).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC43LjEiLCJ1cGRhdGVkSW5WZXIiOiI0MS43MS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel García <[email protected]>
Adds multiple CXF mappings
## 🎟️ Tracking

<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->

## 📔 Objective

Simplify the instructions by using the script that is now part of the
server repo: bitwarden/server#6066

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [schemars](https://graham.cool/schemars/)
([source](https://redirect.github.com/GREsau/schemars)) |
workspace.dependencies | minor | `>=0.8.9, <0.9` -> `>=0.8.9, <0.10` |

---

### Release Notes

<details>
<summary>GREsau/schemars (schemars)</summary>

###
[`v0.9.0`](https://redirect.github.com/GREsau/schemars/blob/HEAD/CHANGELOG.md#090---2025-05-26)

[Compare
Source](https://redirect.github.com/GREsau/schemars/compare/v0.8.22...v0.9.0)

This version is identical to `1.0.0-alpha.18`, but is available for
those who are unable to unwilling to use a pre-release version.

Those upgrading from Schemars 0.8 may want to consult [the migration
guide](https://graham.cool/schemars/migrating/), which also applies when
migrating from 0.8 to 0.9.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "every 2nd week starting on the 2 week
of the year before 4am on Monday" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/bitwarden/sdk-internal).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC42Mi4xIiwidXBkYXRlZEluVmVyIjoiNDAuNjIuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel García <[email protected]>
## 🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-24127
## 📔 Objective

The current masterkey logic is complex to understand for using teams
(auth), and also prone to error. When any setting changes / gets out of
sync, such as the email, or kdf, then decryption fails. The masterkey is
further too widely scoped, used both in an authentication protocol, and
in unlock decryption.

This PR introduces a PasswordProtectedKeyEnvelope. The goal is to
protect a symmetric key with a password securely. Internally, this uses
a KDF, and the KDF settings (argon2 parameters, and random salt) are
stored on the serialized object.

That means that the only thing needed to unlock this structure is the
correct password, everything else is stored on the object, making this
process much less error prone. At the same time the interface is easier
to use.

An example is provided to show usage.

A follow-up PR will add an unlock method / enrollment for PIN based on
this new cryptographic API.

Note: Only argon2 is supported here. The PasswordProtectedKeyEnvelope's
settings are completely decoupled from the account settings, and we
don't need to provide backwards compatibility to non-recommended legacy
cryptographic algorithms (pbkdf2).

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes

---------

Co-authored-by: Matt Gibson <[email protected]>
Co-authored-by: Oscar Hinton <[email protected]>
Co-authored-by: Thomas Avery <[email protected]>
## 🎟️ Tracking

N/A

## 📔 Objective

The "schemars" dependency update have no updated the lock file fully.
Related to #324

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
There is no reason for auth api request/responses to be public. This
changes them to `pub(crate)` for simplicity, but they are never publicly
exposed outside of `auth`.
## 🎟️ Tracking

<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->

## 📔 Objective

In prod builds, we should enforce that all the requests that we do are
HTTPS. This will also protect against redirects to HTTP that would cause
a downgrade.

Note that this is only applicable to non-WASM builds, as the HTTP client
for WASM is just a thin layer over `fetch`

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
## 📔 Objective

Adds a space in the README.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
## 🎟️ Tracking

<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->

## 📔 Objective

<!-- Describe what the purpose of this PR is, for example what bug
you're fixing or new feature you're adding. -->

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
## 🎟️ Tracking

<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->
https://bitwarden.atlassian.net/browse/PM-24249

## 📔 Objective

<!-- Describe what the purpose of this PR is, for example what bug
you're fixing or new feature you're adding. -->
Add a new job to update the Bitwarden SDK in the Android repo whenever
there's a new version of it.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
Continues the work on #225 by introducing `UserId`, `CipherId` and
`FolderId`. It also propagates the `OrganizationId` deeper into the core
crate.

- Renamed `uuid` macro to `uuid_newtype`, avoids collision with the
macro from `uuid` crate.
- Added `Hash` to the uuids.
- Added `new_v4` primarily useful in tests to generate valid UUID v4
based IDs.
Provides a generic B64 and B64Url types we can use throughout the sdk.
## 🎟️ Tracking

<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->

## 📔 Objective

UniFFI uses the `custom_type!` macro to convert request/response types.
The request conversion is allowed to fail which should produce an error
in the apps, but there are cases where it would produce a panic instead.
The cases are:
- If the FFI function doesn't return a result, then UniFFI produces a
panic.
- If the Error type of the function is different than the Error type in
`custom_type!`, then UniFFI produces a panic.

One way to fix this is to have the `custom_type!` calls return
`bitwarden_uniffi::error::BitwardenError`, but this isn't possible as
core and crypto can't depend on uniffi due to circular dependency
issues.

This PR makes the uniffi crate register an error conversion function
during client initialization, thanks to the use of a new `uniffi-error`
crate. It also updates all the calls to `custom_type!` to use this new
error conversion.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes

---------

Co-authored-by: Thomas Avery <[email protected]>
## 🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-25121

## 📔 Objective

Migrates most usages of B64 into the new `B64` struct.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
## 🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-24263

## 📔 Objective

Adds enrollment functionality for Password(PIN)Protected user key
envelope. Both crypto initialization via the init request, *and* a
function exposing the raw key material are provided. The latter is
required since unlock is not yet done via the init methods on
WASM/`clients`.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes

---------

Co-authored-by: Matt Gibson <[email protected]>
Co-authored-by: Oscar Hinton <[email protected]>
Co-authored-by: Thomas Avery <[email protected]>
…iding (#379)

## 🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-24640
https://bitwarden.atlassian.net/browse/PM-24639

## 📔 Objective

`""` is a valid value to encrypt, and the current vault code in clients
*sometimes* does encrypt `""` (and sometimes just returns null). This
was not anticipated when writing the padding initially. This changes the
padding to allow padding empty byte arrays.

Further, it seems the block padding for strings was done incorrectly and
only hides the first block's plaintext length, but afterwards has a 1:1
correlation to plaintext length:

Before:
```
String Length -> EncString Length
================================
  0 ->  194
  1 ->  194
  2 ->  194
  3 ->  194
  4 ->  194
  5 ->  194
  6 ->  194
  7 ->  194
  8 ->  194
  9 ->  194
 10 ->  194
 11 ->  194
 12 ->  194
 13 ->  194
 14 ->  194
 15 ->  194
 16 ->  194
 17 ->  194
 18 ->  194
 19 ->  194
 20 ->  194
 21 ->  194
 22 ->  194
 23 ->  194
 24 ->  194
 25 ->  194
 26 ->  194
 27 ->  194
 28 ->  194
 29 ->  194
 30 ->  194
 31 ->  194
 32 ->  198
 33 ->  198
 34 ->  198
 35 ->  202
 36 ->  202
 37 ->  202
 38 ->  206
 39 ->  206
 40 ->  206
 41 ->  210
 42 ->  210
 43 ->  210
 44 ->  214
 45 ->  214
 46 ->  214
 47 ->  218
 48 ->  218
 49 ->  218
 50 ->  222
 51 ->  222
 52 ->  222
 53 ->  226
 54 ->  226
 55 ->  226
 56 ->  230
 57 ->  230
 58 ->  230
 59 ->  234
 60 ->  234
 61 ->  234
 62 ->  238
 63 ->  238
 64 ->  238
 65 ->  242
 66 ->  242
 67 ->  242
 68 ->  246
 69 ->  246
 70 ->  246
 71 ->  250
 72 ->  250
 73 ->  250
 74 ->  254
 75 ->  254
 76 ->  254
 77 ->  258
 78 ->  258
 79 ->  258
 80 ->  262
```

After:
```
String Length -> EncString Length
================================
  0 ->  194
  1 ->  194
  2 ->  194
  3 ->  194
  4 ->  194
  5 ->  194
  6 ->  194
  7 ->  194
  8 ->  194
  9 ->  194
 10 ->  194
 11 ->  194
 12 ->  194
 13 ->  194
 14 ->  194
 15 ->  194
 16 ->  194
 17 ->  194
 18 ->  194
 19 ->  194
 20 ->  194
 21 ->  194
 22 ->  194
 23 ->  194
 24 ->  194
 25 ->  194
 26 ->  194
 27 ->  194
 28 ->  194
 29 ->  194
 30 ->  194
 31 ->  194
 32 ->  238
 33 ->  238
 34 ->  238
 35 ->  238
 36 ->  238
 37 ->  238
 38 ->  238
 39 ->  238
 40 ->  238
 41 ->  238
 42 ->  238
 43 ->  238
 44 ->  238
 45 ->  238
 46 ->  238
 47 ->  238
 48 ->  238
 49 ->  238
 50 ->  238
 51 ->  238
 52 ->  238
 53 ->  238
 54 ->  238
 55 ->  238
 56 ->  238
 57 ->  238
 58 ->  238
 59 ->  238
 60 ->  238
 61 ->  238
 62 ->  238
 63 ->  238
 64 ->  282
 65 ->  282
 66 ->  282
 67 ->  282
 68 ->  282
 69 ->  282
 70 ->  282
 71 ->  282
 72 ->  282
 73 ->  282
 74 ->  282
 75 ->  282
 76 ->  282
 77 ->  282
 78 ->  282
 79 ->  282
 80 ->  282
```

Both of these changes don't break compatibility. However, even if they
did, the code is not rolled out yet so it would be OK.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
Adds support for mapping CustomFieldsCredential to custom fields.
## 🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-25253

<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->

## 📔 Objective

Fall back to passkey username / url

<!-- Describe what the purpose of this PR is, for example what bug
you're fixing or new feature you're adding. -->

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes

---------

Co-authored-by: Oscar Hinton <[email protected]>
Adds support for exporting SSH keys using Credential Exchange.
## 🎟️ Tracking

<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->
https://bitwarden.atlassian.net/browse/PM-25330

## 📔 Objective

<!-- Describe what the purpose of this PR is, for example what bug
you're fixing or new feature you're adding. -->

Currently `bitwarden_wasm_internal.d.ts` produces: 
```
export type B64 = String;
```

This PR makes it produce:

```
export type B64 = string;
```

In TypeScript the `string` primitive is case sensitive. This was causing
breaking changes to TS clients.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
## 🎟️ Tracking
https://bitwarden.atlassian.net/browse/PM-23661

<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->

## 📔 Objective

This PR maps BW Identity to one or multiple CXF Credentials

<!-- Describe what the purpose of this PR is, for example what bug
you're fixing or new feature you're adding. -->

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes

---------

Co-authored-by: Oscar Hinton <[email protected]>
## 🎟️ Tracking
https://bitwarden.atlassian.net/browse/PM-25311
<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->

## 📔 Objective

This PR is a quick stab at mapping all custom fields on a cipher to a
single CustomFieldCredential.

I'm not 100% sure about how to parse this from the spec:

> If the [exporting
provider](https://fidoalliance.org/specs/cx/cxf-v1.0-ps-20250814.html#exporting-provider)
allows custom fields to be added to items but does not have a grouping
concept, it SHOULD use this object without setting the label or id
fields.

From:
https://fidoalliance.org/specs/cx/cxf-v1.0-ps-20250814.html#dict-custom-fields



<!-- Describe what the purpose of this PR is, for example what bug
you're fixing or new feature you're adding. -->

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
## 🎟️ Tracking

<!-- Paste the link to the Jira or GitHub issue or otherwise describe /
point to where this change is coming from. -->

## 📔 Objective

The merge of #414 and
#413 has created some
conflicts leading to the main branch not building anymore. This PR
should fix that.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
…dds it to identity success response model (#376)

## 🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-24051

## 📔 Objective

Adds `MasterPasswordUnlockData` model with
`MasterPasswordUnlockResponseModel` mapping. This wi
Adds `UserDecryptionOptionsResponseModel` into the identity success
token response. This model includes the master password unlock field.
The `/sync` response model is autogenerated by OpenApi and already
includes user decryption option and the master password unlock fields.
Includes Uniffi and WASM bindings for `MasterPasswordUnlock`.

In further PR's we plan to use the `MasterPasswordUnlock` in
`InitUserCryptoMethod` enum - this is still in discussion.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
@gbubemismith
Copy link
Contributor

@gbubemismith

I think we want to target the vault/feature/cipher-versioning branch,

I changed the target to vault/feature/cipher-versioning, but changed it back since it cluttered the diff with all of the API changes from the current target. Do you plant to merge vault/cipher-versioning-with-data (which has the generated API code) into the feature branch, or should I nix those commits from my branch entirely? This change is dependent on the .data field added by that branch.

I have a PR that has the api generated code, I can merge mine first

Hinton and others added 8 commits September 18, 2025 18:05
Adds a workflow for updating api bindings.

Example output: #444
Ignore `Cargo.toml` since it's handled by renovate. This resolves some
blocking issues preventing API binding automation.
Updates the API bindings to `c93c3464732c93c9be593a3a55b032c029c4bd6f`

---------

Co-authored-by: bw-ghapp[bot] <178206702+bw-ghapp[bot]@users.noreply.github.com>
Co-authored-by: Hinton <[email protected]>
- Enable dylint in CI and pre-commit.
- Fix remaining violations.
- Tweak linter to avoid catching `Error` variants in non error enums.
## 🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-23512

## 📔 Objective

Create the bitwarden-pm crate that will sit between bitwarden-core and
bitwarden-wasm/uniffi and will encapsulate all the password manager
functionality. Note that uniffi is still mostly reimplementing the API
due to #424, so this
doesn't change that much.

I've also made the bitwarden-pm crate reexport the clients from the
feature crates, which allows us to remove them from the wasm-crate.

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
I noticed we missed updating a few places to use `FolderId` instead of
`str` or `uuid`.
Updates the API bindings to `d384c0cfe60ec02226479d3cde200e4d785a7e50`

Co-authored-by: bw-ghapp[bot] <178206702+bw-ghapp[bot]@users.noreply.github.com>
… vault/PM-25012/cipher_versioning_data_types
@nikwithak nikwithak requested review from a team as code owners September 22, 2025 18:39
@nikwithak nikwithak requested review from AmyLGalles, mzieniukbw and rr-bw and removed request for a team September 22, 2025 18:39
@nikwithak nikwithak changed the base branch from vault/cipher-versioning-with-data to vault/feature/cipher-versioning September 22, 2025 18:40
@nikwithak nikwithak marked this pull request as draft September 22, 2025 19:20
@nikwithak
Copy link
Contributor Author

Converting to draft while I sort out the diff from changing the target branch.

@sonarqubecloud
Copy link

@nikwithak nikwithak changed the base branch from vault/feature/cipher-versioning to vault/cipher-versioning-with-data October 14, 2025 22:57
@nikwithak nikwithak closed this Oct 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.