You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+25Lines changed: 25 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,6 +5,31 @@ All notable changes to this project will be documented in this file.
5
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
8
+
## [5.1.0] — Locksmith (2026-02-28)
9
+
10
+
### Added
11
+
-**Envelope encryption (DEK/KEK)** — multi-recipient model where a random DEK encrypts content and per-recipient KEKs wrap the DEK. Recipients can be added/removed without re-encrypting data.
12
+
-**`RecipientSchema`** — Zod schema for validating recipient entries in manifests.
13
+
-**`recipients` field on `EncryptionSchema`** — optional array of `{ label, wrappedDek, nonce, tag }` entries.
-**`--recipient <label:keyfile>` CLI flag** — repeatable flag on `git cas store` for envelope encryption.
16
+
-**`git cas recipient add/remove/list`** subcommands — CLI management of envelope recipients.
17
+
-**`RecipientEntry` type re-exported** from `index.d.ts`.
18
+
- 48 new unit tests covering envelope store/restore, recipient management, edge cases, and fuzz round-trips.
19
+
20
+
### Fixed
21
+
-**`_wrapDek` / `_unwrapDek` missing `await`** — these called async `encryptBuffer()` / `decryptBuffer()` without `await`, silently producing garbage on Bun/Deno runtimes where crypto is async.
22
+
-**`--recipient` + `--vault-passphrase` not guarded** — CLI now rejects combining `--recipient` with `--key-file` or `--vault-passphrase`.
23
+
-**Dead `_resolveEncryptionKey` method removed** — superseded by `_resolveDecryptionKey` but left behind.
24
+
-**Redundant `RECIPIENT_NOT_FOUND` guards** in `removeRecipient` collapsed into one.
25
+
-**`addRecipient` duplicated unwrap loop** replaced with `_resolveKeyForRecipients` reuse.
26
+
-**`removeRecipient` post-filter guard** — defense-in-depth check prevents zero recipients when duplicate labels exist in corrupted/crafted manifests.
27
+
-**`EncryptionSchema` empty recipients** — `recipients` array now enforces `min(1)` to reject undecryptable envelope manifests.
28
+
-**`parseRecipient` empty keyfile** — CLI now rejects `--recipient alice:` (missing keyfile path) with a clear error.
29
+
-**CLI 30s hang in Docker** — `process.exit()` with I/O flushing prevents `setTimeout` leak in containerized runtimes.
0 commit comments