36 lines
5.4 KiB
Markdown
36 lines
5.4 KiB
Markdown
# Tasks: note and secret-folder encryption design (roadmap 34)
|
||
|
||
Spec: `spec.md`. DESIGN ONLY: every OWNS path stays below this feature directory; no cargo/code/dependency edits. Tasks are sequential reviewable documents, individually checked against explicit cases. Existing source paths are inspection inputs, never writable in this phase.
|
||
**First tool call rule:** read at most three listed inputs in first call; write FIRST OWNS document in SECOND call with initial checklist, then complete it. Code-stub/failing-test rule intentionally replaced with document acceptance cases because no crypto code is authorized.
|
||
**Standing VERIFY:** resolve each referenced existing path with `rg --files`; compare document to spec acceptance matrix and cited primary sources; check no secret values/examples and no runnable crypto. Do not run cargo during this design phase.
|
||
**Standing DO NOT:** change code/Cargo/git state; add dependency; implement encryption/decryption/KDF/RNG; weaken unsafe policy; freeze algorithm/format without owner approval; claim secure erasure.
|
||
|
||
- [ ] 1. Threat model and trust boundaries.
|
||
OWNS: `specs/plugins-parity/note-encryption/threat-model.md` (new, FIRST).
|
||
FILES TO OPEN: `specs/plugins-parity/note-encryption/spec.md` D1; `crates/engine/src/vault/session.rs`; `crates/vault/src/lib.rs`.
|
||
GOAL: asset/adversary/trust-boundary table for per-note and folder domains; separate locked/unlocked behavior, metadata and prior backups; explain local-at-rest vs sync E2EE; owner Q1/Q4 decision checklist with explicit pending status.
|
||
TESTS: tabletop cases stolen locked vault, replayed old ciphertext, swapped object, hostile same-user process while unlocked, plaintext shared attachment, known filename and old snapshot; each maps protected/excluded/blocked plus reason.
|
||
VERIFY: standing; D1 and acceptance 1/4 traced with no undocumented assumption.
|
||
DO NOT: crypto snippets, promise zero knowledge or rollback protection, approve own threat model.
|
||
- [ ] 2. Container format and bounded parser design.
|
||
OWNS: `specs/plugins-parity/note-encryption/format.md` (new, FIRST).
|
||
FILES TO OPEN: spec D2; task 1 threat model; `crates/engine/src/vault/attachments.rs`.
|
||
GOAL: byte-by-byte candidate envelope, endian/length encoding, AEAD associated-data byte layout, encrypted manifest/object identity, key-slot integrity, versioning and pre-KDF bounds. Record AES-GCM/Argon2id as proposed; list dependency/RNG review questions. No format claims frozen before independent review.
|
||
TESTS: design vectors for truncation at every field, oversized lengths/KDF cost, nonce reuse across retries, object swap, tampered header/tag, missing manifest object, unknown suite and version; specify expected rejection stage.
|
||
VERIFY: standing + field/length/AAD consistency review; RFC 9106 parameter rationale measured-plan required.
|
||
DO NOT: choose unapproved crate or write toy crypto; pass arbitrary hostile KDF cost to runtime.
|
||
- [ ] 3. Key state machine and migration failure matrix.
|
||
OWNS: `specs/plugins-parity/note-encryption/key-lifecycle.md` (new, FIRST), `specs/plugins-parity/note-encryption/migration.md` (new).
|
||
FILES TO OPEN: spec D3–D4; `crates/engine/src/vault/buffers.rs`; `crates/engine/src/sync/worker.rs`.
|
||
GOAL: unlock/lock state transitions, dirty save error/cancel, zeroization limits, rotation/key-slot recovery, idle/suspend races, session-only defaults and keychain/recovery alternatives; crash-safe atomic migration sequence and explicit plaintext removal authorization point.
|
||
TESTS: tabletop wrong password, closed dirty tab, crash after every migration stage, low disk on lock, passphrase change interrupted, sync old key slot, forgotten password, OS lock during extraction; preserve work without claiming locked after failure.
|
||
VERIFY: standing; each state transition names data retained/cleared and error behavior; key material never enters settings/logs/command params.
|
||
DO NOT: guarantee wiping SSD/swap/backups; silently delete plaintext; implement keychain.
|
||
- [ ] 4. Leakage integration inventory and owner review package.
|
||
OWNS: `specs/plugins-parity/note-encryption/integration-review.md` (new, FIRST), `specs/plugins-parity/note-encryption/approval-checklist.md` (new).
|
||
FILES TO OPEN: spec acceptance/questions; `crates/engine/src/vault/find/content_search.rs`; `crates/engine/src/ai/assistant_gate.rs`; later inspect `crates/engine/src/vault/pdf_preview.rs`, `crates/engine/src/vault/attachments.rs`, `crates/engine/src/sync/worker.rs`.
|
||
GOAL: input/output/cache/history/trash/preview/OCR/export/AI/plugin/share/capture matrix, verified source path per boundary, proposed locked behavior and future regression test. Prepare owner questions with exact proposed dependencies only after safe-Rust/security/license investigation. Future implementation must have new approved spec/tasks; if new crypto crate chosen, first task explicitly owns/registers `crates/crypto/Cargo.toml`, `crates/crypto/src/lib.rs`, root `Cargo.toml` workspace dependency and `xtask/src/layers.rs` layer entry.
|
||
TESTS: known encrypted path via all external command surfaces while locked denied; worker late publication after lock; stale index/cache snippets; shared attachment reference leakage; encrypted sync conflicts. Each unresolved surface blocks implementation approval.
|
||
VERIFY: standing; trace all five spec acceptance criteria and Q1–Q4 to checklist; no approvals inferred.
|
||
DO NOT: implement future task, modify root docs/status as shipped, mark design approval granted.
|