275 lines
11 KiB
Markdown
275 lines
11 KiB
Markdown
# Workplan
|
|
|
|
Last updated: 2026-04-24
|
|
|
|
This is the execution plan for making ChromeCard FIDO2 development and validation reproducible on this machine.
|
|
|
|
## Constraints
|
|
|
|
- Treat `/home/user/chromecard/CR_SDK_CK-main` as read-only.
|
|
- Keep helper scripts such as `fido2_probe.py` and `webauthn_local_demo.py` at `/home/user/chromecard`.
|
|
- Target deployment model is Qubes OS with 3 AppVMs based on `debian-13-xfce`: `k_client`, `k_proxy`, `k_server`.
|
|
- Current authenticator link is card->`k_proxy` (USB), but architecture must allow migration to wireless phone-mediated validation.
|
|
|
|
## Goals
|
|
|
|
- Re-establish deterministic host-to-card FIDO2 communication over USB HID/CTAPHID.
|
|
- Restore a buildable/flashable firmware workspace for `CR_SDK_CK-main`.
|
|
- Turn ad-hoc demos into a repeatable verification flow.
|
|
- Stand up chained TLS communication in Qubes: `k_client -> k_proxy -> k_server`.
|
|
- Support both login flow (browser in `k_client`) and user enrollment flow (process in `k_client`).
|
|
- Minimize repeated card prompts by introducing secure session reuse after successful authentication.
|
|
- Implement a protected dummy resource on `k_server` (monotonic counter) for end-to-end validation.
|
|
- Ensure `k_proxy` and `k_server` are thread-safe and support concurrent access.
|
|
- Prepare `k_proxy` auth path for future transport shift: USB-direct -> wireless phone bridge.
|
|
|
|
## Phase 0: Qubes VM Baseline (Blocking)
|
|
|
|
1. Provision/verify AppVMs.
|
|
- Ensure `k_client`, `k_proxy`, `k_server` exist and are based on `debian-13-xfce`.
|
|
|
|
2. Assign functional responsibilities.
|
|
- `k_client`: browser client + enrollment process.
|
|
- `k_proxy`: USB card access + proxy/auth bridge.
|
|
- `k_server`: protected resource/service endpoint.
|
|
|
|
3. Define TLS endpoints and certificates.
|
|
- `k_proxy` presents TLS service to `k_client`.
|
|
- `k_server` presents TLS service to `k_proxy`.
|
|
- Trust roots and cert distribution model documented per VM.
|
|
|
|
Exit criteria:
|
|
- All 3 VMs exist, boot, and have clearly defined service ownership.
|
|
|
|
## Phase 1: Qubes Firewall Policy (Blocking)
|
|
|
|
1. Enforce allowed forward paths only.
|
|
- Allow `k_client` outbound TLS only to `k_proxy` service port(s).
|
|
- Allow `k_proxy` outbound TLS only to `k_server` service port(s).
|
|
- Deny direct `k_client` to `k_server` traffic.
|
|
|
|
2. Validate return path behavior.
|
|
- Confirm responses propagate back through established flows.
|
|
|
|
3. Verify with simple probes.
|
|
- TLS handshake and HTTP(S) checks from `k_client` to `k_proxy`.
|
|
- TLS handshake and HTTP(S) checks from `k_proxy` to `k_server`.
|
|
|
|
Exit criteria:
|
|
- Policy matches intended chain and is test-verified.
|
|
|
|
## Phase 2: TLS Certificates and Service Endpoints
|
|
|
|
1. Certificate model.
|
|
- Create or import CA and issue certs for `k_proxy` and `k_server`.
|
|
- Install trust roots in client VM(s) that need validation.
|
|
|
|
2. Service shape.
|
|
- `k_server`: HTTPS service exposing protected resource endpoint(s), including a monotonic counter endpoint.
|
|
- `k_proxy`: minimal HTTPS API gateway service (full web server framework not required).
|
|
|
|
3. Endpoint contract.
|
|
- Define request/response schema between `k_client` and `k_proxy`.
|
|
- Define upstream request contract from `k_proxy` to `k_server`.
|
|
|
|
Exit criteria:
|
|
- Mutual TLS trust decisions are documented and tested.
|
|
- HTTPS calls succeed on both links with expected cert validation.
|
|
|
|
## Phase 2.5: Define State Ownership and Concurrency Model
|
|
|
|
1. State ownership.
|
|
- Decide where user/session state is authoritative (`k_proxy`, `k_server`, or split model).
|
|
- Define token/session format and validation boundary.
|
|
|
|
2. Concurrency controls.
|
|
- Define thread-safe strategy for session store and shared counters.
|
|
- Define locking/atomic/update semantics for counter increments and session updates.
|
|
|
|
3. Runtime model.
|
|
- Choose service runtime/config that supports simultaneous requests safely.
|
|
|
|
Exit criteria:
|
|
- Architecture clearly documents state authority and race-free update rules.
|
|
|
|
## Phase 3: Recover Basic Device Visibility on `k_proxy` (Blocking)
|
|
|
|
1. Verify physical + USB enumeration path.
|
|
- Check cable/port and confirm device appears in USB listings.
|
|
- Confirm `/dev/hidraw*` nodes appear when card is connected.
|
|
|
|
2. Validate Linux permissions.
|
|
- Install/update udev rule for ChromeCard HID VID/PID.
|
|
- Reload udev and verify non-root read/write access to hidraw node.
|
|
|
|
3. Re-run host probe.
|
|
- Run `python3 /home/user/chromecard/fido2_probe.py --list`.
|
|
- Run `python3 /home/user/chromecard/fido2_probe.py --json`.
|
|
- Record VID/PID/path and CTAP2 `getInfo` output in `Setup.md`.
|
|
|
|
Exit criteria:
|
|
- At least one CTAP HID device is listed.
|
|
- `--json` returns valid `ctap2_info`.
|
|
|
|
## Phase 4: Re-validate Local WebAuthn Demo on `k_proxy`
|
|
|
|
1. Start local demo server.
|
|
- Run `python3 /home/user/chromecard/webauthn_local_demo.py`.
|
|
- Confirm URL is `http://localhost:8765`.
|
|
|
|
2. Exercise register/login.
|
|
- Register a test user.
|
|
- Authenticate with same user.
|
|
- Capture errors (if any) and update `Setup.md`.
|
|
|
|
3. Decide next demo hardening step.
|
|
- Keep bring-up-only mode, or
|
|
- add signature verification for attestation/assertion.
|
|
|
|
Exit criteria:
|
|
- Register and login both complete with card interaction prompts.
|
|
|
|
Status (2026-04-24):
|
|
- Completed in `k_proxy` using `http://localhost:8765`.
|
|
- Registration result: `ok=true`, `username=alice`, `credential_count=1`.
|
|
- Authentication result: `ok=true`, `username=alice`, `authenticated=true`.
|
|
|
|
## Phase 5: Implement Proxy Auth + Session Reuse
|
|
|
|
1. Authenticate via card once per session window.
|
|
- `k_proxy` handles initial auth using connected card.
|
|
- On success, create session state for `k_client`.
|
|
|
|
2. Session model.
|
|
- Prefer server-side session store or signed session token.
|
|
- Include TTL/expiry, rotation, and explicit invalidation/logout path.
|
|
- Do not expose card secrets or long-lived auth material to `k_client`.
|
|
|
|
3. Proxying behavior.
|
|
- With valid session: `k_proxy` forwards request to `k_server` and returns result.
|
|
- Without valid session: require fresh card-backed auth flow.
|
|
|
|
Exit criteria:
|
|
- Repeated authorized requests do not require card interaction until session expiry.
|
|
- Expired/invalid sessions are correctly rejected.
|
|
|
|
## Phase 5.5: Implement Dummy Resource + Access Policy on `k_server`
|
|
|
|
1. Protected dummy resource.
|
|
- Add endpoint returning increasing number.
|
|
- Require valid upstream auth/session context from `k_proxy`.
|
|
|
|
2. Optional user/session handling.
|
|
- Add minimal user/session checks if `k_server` is chosen as authority (or partial authority).
|
|
|
|
3. Correctness under concurrency.
|
|
- Ensure increments are monotonic and race-safe under parallel calls.
|
|
|
|
Exit criteria:
|
|
- Authorized requests obtain consistent increasing values.
|
|
- Unauthorized requests are rejected.
|
|
|
|
## Phase 6: Integrate Client Enrollment + Proxy Login Flow
|
|
|
|
1. Enrollment process in `k_client`.
|
|
- Start process from `k_client` that captures new-user enrollment intent/data.
|
|
- Route enrollment requests to `k_proxy` over TLS.
|
|
|
|
2. Card-mediated login in `k_proxy`.
|
|
- `k_proxy` uses connected card for FIDO2/WebAuthn operations.
|
|
- `k_proxy` authenticates toward `k_server` over TLS.
|
|
|
|
3. Browser flow in `k_client`.
|
|
- Browser traffic goes only to `k_proxy`.
|
|
- Validate end-to-end login to `k_server` resource through proxy chain.
|
|
|
|
Exit criteria:
|
|
- Enrollment and login both function end-to-end via `k_client -> k_proxy -> k_server`.
|
|
|
|
## Phase 6.5: Concurrency and Multi-Client Test Setup
|
|
|
|
1. Single-VM concurrency tests.
|
|
- Generate parallel request bursts from `k_client` to `k_proxy`.
|
|
- Verify response integrity, session reuse behavior, and error rates.
|
|
|
|
2. Multi-client tests.
|
|
- Run requests from multiple `k_client` instances (or equivalent parallel clients) concurrently.
|
|
- Verify isolation between users/sessions.
|
|
|
|
3. Acceptance checks.
|
|
- No race-related crashes/corruption in `k_proxy` or `k_server`.
|
|
- Counter/resource behavior remains correct under load.
|
|
- Session reuse reduces card prompts while preserving authorization checks.
|
|
|
|
Exit criteria:
|
|
- Test results demonstrate stable concurrent operation with documented limits.
|
|
|
|
## Phase 7: Restore Firmware Build/Flash Path
|
|
|
|
1. Validate SDK tree completeness.
|
|
- Confirm presence of `mvp`, `setup`, `components`, `samples` under `CR_SDK_CK-main`.
|
|
- If missing, obtain full repository/checkpoint and document source.
|
|
|
|
2. Install/enable build tools.
|
|
- Ensure `west` and `nrfjprog` are available in shell.
|
|
- Confirm target board/toolchain match (`nrf7002dk/nrf5340/cpuapp`, NCS `v2.9.2` baseline in docs).
|
|
|
|
3. Run baseline build+flash.
|
|
- From `CR_SDK_CK-main`, run `./scripts/build_flash_mvp.sh`.
|
|
- If flashing fails, run documented recovery and retry.
|
|
|
|
Exit criteria:
|
|
- Successful `west build` and `west flash`.
|
|
|
|
## Phase 8: Consolidate Documentation and Paths
|
|
|
|
1. Remove path drift between docs and actual files.
|
|
- Keep `fido2_probe.py` and `webauthn_local_demo.py` at workspace root.
|
|
- Ensure docs never instruct placing helper scripts under `CR_SDK_CK-main`.
|
|
- Update references consistently in all docs.
|
|
|
|
2. Keep `Setup.md` current.
|
|
- After each significant change, update status snapshot and outcomes.
|
|
|
|
3. Add minimal reproducibility checklist.
|
|
- One command list for probe + demo + build/flash prechecks.
|
|
|
|
4. Maintain Markdown execution records continuously.
|
|
- `Setup.md` and `Workplan.md` are the canonical living docs for this workspace.
|
|
- Re-scan relevant `.md` files before each new execution cycle and reconcile drift.
|
|
- Record date-stamped session notes when priorities or blockers change.
|
|
|
|
Exit criteria:
|
|
- New team member can follow docs end-to-end without path or tooling ambiguity.
|
|
|
|
## Phase 9: Migrate to Phone-Mediated Wireless Validation (Future)
|
|
|
|
1. Auth transport abstraction in `k_proxy`.
|
|
- Introduce/keep a transport interface for authenticator operations.
|
|
- Implement at least two backends:
|
|
- USB-direct backend (current).
|
|
- Phone-wireless backend (future).
|
|
|
|
2. Wireless phone integration.
|
|
- Define protocol between `k_proxy` and phone service.
|
|
- Define secure pairing/authentication and message integrity for wireless link.
|
|
- Add timeout/retry behavior and offline handling.
|
|
|
|
3. Functional equivalence tests.
|
|
- Verify login/enrollment behavior is unchanged at API level for `k_client`.
|
|
- Verify session reuse still works and card prompts are not increased unexpectedly.
|
|
|
|
Exit criteria:
|
|
- `k_proxy` can validate via wireless phone path with no client-facing API changes.
|
|
|
|
## Inputs Expected During This Session
|
|
|
|
- Exact observed behavior on reconnect attempts (USB/hidraw/probe).
|
|
- Whether we should pull server-side code now.
|
|
- Any board/firmware variants different from default documentation assumptions.
|
|
- Preferred TLS ports, certificate approach, and hostname scheme for `k_client`, `k_proxy`, `k_server`.
|
|
- Session TTL and invalidation requirements for cached authenticated access.
|
|
- Decision on where user/session authority lives (`k_proxy` vs `k_server` vs split).
|
|
- Target concurrency level for validation (parallel clients and parallel requests per client).
|
|
- Preferred wireless transport/protocol between `k_proxy` and phone (for future phase).
|