Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,11 @@ jobs:
# ratatui); revisit when ratatui's tree updates.
# RUSTSEC-2024-0436 — paste (unmaintained, build-time proc-macro)
# RUSTSEC-2026-0002 — lru 0.12.5 (unsound IterMut; transitive via ratatui)
ignore: RUSTSEC-2024-0436,RUSTSEC-2026-0002
# RUSTSEC-2023-0071 — rsa (Marvin timing sidechannel, no upstream fix).
# rsa unwraps organization keys (RSA-OAEP) once, locally, at unlock;
# the attack needs a network-observable decryption oracle, which Vault
# never exposes. Revisit if rsa ships a constant-time fix.
ignore: RUSTSEC-2024-0436,RUSTSEC-2026-0002,RUSTSEC-2023-0071

deny:
name: cargo-deny
Expand Down
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,15 @@ range may break in any release.

### Fixed

- **TUI `Space` reveals the password from every pane.** `Space` revealed a
login's password from the item list, but did nothing while the **detail** pane
was focused (logins have no per-field detail rows, so there was nothing to
reveal) and was inert in the **folder** pane. Reveal target resolution now
lives in a testable `App::reveal_target`: the detail pane reveals the
cursor-selected masked field for cards/identities and falls back to the item's
primary secret for logins/notes, and the list and folder panes both reveal the
selected item's primary secret — so `Space` works from all three panes.

- **Login against current Bitwarden / Vaultwarden servers.** Once the master
password was accepted, the server rejected the token request with
`400 version_header_missing` — *"No client version header found, required to
Expand Down Expand Up @@ -67,6 +76,19 @@ range may break in any release.

### Added

- **Organization / Collection items now decrypt (org-key support).** Vault
previously skipped every organization-owned cipher — the bulk of a vault that
uses Collections — because it held no key for them. At unlock the agent now
unwraps each organization's symmetric key from `/sync`
(`profile.organizations[].key`, an RSA-OAEP-SHA1 envelope opened with the
account key recovered from `profile.privateKey`) and routes each cipher's
decryption by `organization_id` (org key vs user key). Works online and from
the offline cache. New dependency `rsa` (RSA decryption — `ring` has none);
see the justified `RUSTSEC-2023-0071` ignore in `deny.toml` / CI. Items whose
org key can't be unwrapped are still skipped, and **editing** org items is
refused for now (the write path would re-encrypt under the wrong key) —
reads/copy work.

- **`vault sync` progress spinner.** On a TTY, `vault sync` now animates a
spinner while the agent pulls and decrypts `/sync`, then prints `✓ synced N
items`. Suppressed under `--json` and when stderr is not a terminal, so
Expand Down
156 changes: 156 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ cipher = { version = "0.4", features = ["block-padding"] }
hmac = "0.12"
sha1 = "0.10"
sha2 = "0.10"
# RSA-2048-OAEP-SHA1 — unwraps organization keys (Bitwarden type-4 EncStrings).
# `ring` has no RSA decryption, so this is the one non-ring asymmetric path.
# Carries RUSTSEC-2023-0071 (Marvin timing sidechannel, no upstream fix); see the
# justified `cargo audit` ignore in `justfile` / CI. Not reachable as a network
# oracle here — org keys are unwrapped once, locally, at unlock.
rsa = "0.9"
pbkdf2 = { version = "0.12", default-features = false, features = ["hmac", "sha2"] }
argon2 = { version = "0.5", default-features = false, features = ["alloc"] }
hkdf = "0.12"
Expand Down
Loading
Loading