diff --git a/CHANGELOG.md b/CHANGELOG.md index c54c518..b913e27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [5.2.1] — Carousel polish (2026-02-28) + +### Added +- CLI reference in `docs/API.md` for `git cas rotate` and `git cas vault rotate` flags. + +### Changed +- Rotation helpers in `CasService` use native `#private` methods, matching the facade's style. +- `VAULT_CONFLICT` and `VAULT_METADATA_INVALID` error code docs now list `rotateVaultPassphrase()`. + +### Fixed +- `rotateVaultPassphrase` now honours `kdfOptions.algorithm` instead of silently using the old algorithm. +- Rotation integration test no longer flaps under CI load (reduced test-only KDF iterations). + +## [5.2.0] — Carousel (2026-02-28) + +### Added +- **Key rotation without re-encrypting data** — `CasService.rotateKey()` re-wraps the DEK with a new KEK, leaving data blobs untouched. Enables key compromise response without re-storing assets. +- **`keyVersion` tracking** — manifest-level and per-recipient `keyVersion` counters track rotation history for audit compliance. Optional field, backward-compatible with existing manifests. +- **`git cas rotate` CLI command** — rotate a recipient's key via `--slug` (vault round-trip) or `--oid` (manifest-only). Supports `--label` for targeted single-recipient rotation. +- **`rotateVaultPassphrase()`** — rotate the vault-level encryption passphrase across all envelope-encrypted entries in a single atomic commit. Non-envelope entries are skipped with reporting. +- **`git cas vault rotate` CLI command** — rotate vault passphrase from the command line with `--old-passphrase` and `--new-passphrase`. +- **`ROTATION_NOT_SUPPORTED` error code** — thrown when `rotateKey()` is called on a manifest without envelope encryption (legacy/direct-key). +- 27 new unit tests covering key rotation, schema validation, and vault passphrase rotation. + ## [5.1.0] — Locksmith (2026-02-28) ### Added diff --git a/COMPLETED_TASKS.md b/COMPLETED_TASKS.md index 0e736e5..f8f5165 100644 --- a/COMPLETED_TASKS.md +++ b/COMPLETED_TASKS.md @@ -17,6 +17,19 @@ Task cards moved here from ROADMAP.md after completion. Organized by milestone. --- +# M12 — Carousel (v5.2.0) ✅ CLOSED + +**Theme:** Key rotation without re-encrypting data. Rotate recipient keys or vault passphrases by re-wrapping the DEK, leaving data blobs untouched. + +**Completed:** v5.2.0 (2026-02-28) + +- **Task 12.1:** Key rotation workflow — `CasService.rotateKey({ manifest, oldKey, newKey, label? })` unwraps DEK with `oldKey`, re-wraps with `newKey`. Data blobs never accessed. `keyVersion` counter tracks rotation history. Legacy (non-envelope) manifests throw `ROTATION_NOT_SUPPORTED`. +- **Task 12.2:** Key version tracking in manifest — `keyVersion` field (non-negative integer, default 0) at manifest-level and per-recipient. `rotateKey()` increments both counters. Old manifests without `keyVersion` treated as version 0 (backward compatible). +- **Task 12.3:** CLI key rotation commands — `git cas rotate --slug --old-key-file --new-key-file [--label