# Setup Last updated: 2026-04-24 This is a living setup/status file for the local ChromeCard workspace at `/home/user/chromecard`. Update this file whenever environment status or verified behavior changes. ## Repository Policy - Treat `/home/user/chromecard/CR_SDK_CK-main` as read-only in this workflow. - Do not add or modify helper/test scripts inside `CR_SDK_CK-main`. - Keep host-side helper scripts at workspace root (`/home/user/chromecard`). ## Documentation Maintenance - Canonical living status docs for this workspace are: - `/home/user/chromecard/Setup.md` - `/home/user/chromecard/Workplan.md` - After each meaningful execution step, update at least: - `Setup.md` for observed environment/runtime state - `Workplan.md` for phase progress and next blocking action - Keep helper script paths consistent in docs: - `/home/user/chromecard/fido2_probe.py` - `/home/user/chromecard/webauthn_local_demo.py` - Treat `CR_SDK_CK-main/README_HOST.md` as historical reference unless its script paths are aligned with this workspace policy. ## Scope - Experimental ChromeCard connected over USB. - Firmware source tree: `/home/user/chromecard/CR_SDK_CK-main`. - Host-side FIDO2 demo tools: - `/home/user/chromecard/fido2_probe.py` - `/home/user/chromecard/webauthn_local_demo.py` - Target runtime platform: Qubes OS with 3 AppVMs: - `k_client` (browser + enrollment process) - `k_proxy` (card-connected proxy/auth client) - `k_server` (protected resource/backend) ## Planned Transport Evolution - Current phase assumption: card is connected directly to `k_proxy` (USB). - Future target: card is connected to a phone, and `k_proxy` performs validation through a wireless link to that phone. - Design implication: keep authenticator transport behind an abstraction in `k_proxy` so USB-direct and phone-wireless backends can be swapped without changing client/server API contracts. ## Target Qubes Topology - Base template for all AppVMs: `debian-13-xfce`. - Allowed network paths: - `k_client` -> `k_proxy` over TLS - `k_proxy` -> `k_server` over TLS - Response traffic returns on those established connections. - Disallowed direct path: - `k_client` -> `k_server` (direct access should be blocked). Functional roles: - `k_client`: - Browser-only traffic client. - Runs a user enrollment process. - `k_proxy`: - Current: connected to the ChromeCard over USB. - Future: connects wirelessly to phone-attached card for validation. - Accepts TLS requests from `k_client`. - Uses card-backed FIDO2/WebAuthn operations to authenticate user/session. - Calls `k_server` over TLS after successful authorization. - Returns proxied data and session information to `k_client`. - `k_server`: - Hosts resource(s) requiring login via the proxy-mediated flow. - Provides a dummy protected resource for early integration testing (monotonic increasing number/counter). - May hold user/session state logic needed for authorization decisions. UI baseline for each AppVM (start-menu visible apps): - Firefox - XFCE Terminal - File Manager ## Target Request Flow 1. `k_client` sends HTTPS request to `k_proxy`. 2. `k_proxy` validates/authenticates user via card-backed flow. 3. If allowed, `k_proxy` opens HTTPS request to `k_server` resource. 4. `k_server` responds to `k_proxy`. 5. `k_proxy` returns response payload to `k_client` plus session state. 6. Subsequent requests reuse session state so card auth is not required every request. Implementation note: - `k_proxy` does not need a full web server stack; a minimal TLS API service is sufficient. - Session state should be integrity-protected (signed/encrypted token or server-side session ID) with TTL and revocation behavior defined. - `k_proxy` and `k_server` must be safe under concurrent access (thread-safe state handling). ## Minimum Service Behavior (Current Target) - `k_server`: - Expose protected endpoint returning an increasing integer value (dummy resource). - Increment behavior must remain correct under concurrent requests. - Optionally expose/maintain user/session validation logic. - `k_proxy`: - Accept concurrent HTTPS requests from one or more `k_client` instances. - Perform card-backed auth when no valid session is present. - Cache and validate session state so repeated requests avoid card access until expiry. - Forward authorized requests to `k_server` and return upstream data plus session info. Thread-safety expectation: - Shared mutable state (counter, session store, user state) must be protected against races. - Parallel requests must not corrupt session records or return duplicate/skipped counter values caused by unsafe updates. ## Test Topology Requirement - Support concurrency testing from multiple simultaneous clients: - multiple browser tabs/processes in one `k_client`, and/or - multiple `k_client` AppVM instances if available. - Validate both correctness and stability under load: - session reuse works as intended - unauthorized access stays blocked - protected counter/resource remains consistent. ## Current Status Snapshot (2026-04-24) - AppVM OS version is confirmed: Debian `13.4` (`k_server`, and same on `k_client`/`k_proxy`). - Python in AppVMs is available: `Python 3.13.5`. - `python3 /home/user/chromecard/fido2_probe.py --list` in `k_proxy` now detects ChromeCard on `/dev/hidraw0` (`vid:pid=4617:5`). - HID raw device nodes are now visible in `k_proxy`: - `/dev/hidraw0` -> `crw-rw----+` - `/dev/hidraw1` -> `crw-------` - `python3 /home/user/chromecard/fido2_probe.py --json` succeeds and returns CTAP2 `getInfo`: - versions: `["FIDO_2_0"]` - aaguid: `1234567890abcdef0123456789abcdef` - options: `rk=false`, `up=true`, `uv=true` - max_msg_size: `1024` - Local WebAuthn demo (`http://localhost:8765` in `k_proxy`) succeeded: - register: `ok=true`, `username=alice`, `credential_count=1` - login/auth: `ok=true`, `username=alice`, `authenticated=true` - Phase 5 prototype services are now available: - `/home/user/chromecard/k_proxy_app.py` - `/home/user/chromecard/k_server_app.py` - `/home/user/chromecard/PHASE5_RUNBOOK.md` - `west` is not currently installed/in PATH: `west not found`. - The checked-out `CR_SDK_CK-main` tree appears incomplete for documented sysbuild role layout: - missing: `mvp`, `setup`, `components`, `samples` - `CR_SDK_CK-main/scripts/build_flash_mvp.sh` exists, but it expects the above role directories. - Python helper scripts were intentionally moved out of `CR_SDK_CK-main/scripts` and are now maintained at workspace root. - Qubes AppVM baseline is now up: `k_client`, `k_proxy`, `k_server` can start and have terminals running. Implication: - Live FIDO2 connectivity from `k_proxy` to ChromeCard is confirmed over USB HID/CTAPHID. - Local browser WebAuthn register/login flow is confirmed working in `k_proxy`. - We cannot currently run the documented firmware build/flash flow. Session note (2026-04-24): - Markdown tracking was reviewed and normalized around `Setup.md` + `Workplan.md` as the active, continuously updated execution record. - AppVM template decision recorded: use `debian-13-xfce` for `k_client`, `k_proxy`, and `k_server`. - VM start attempt failed with Xen toolstack error: `libxenlight have failed to create new domain 'k_client'`. - VM start blocker was resolved by reducing VM memory to `400` MiB; all three AppVMs now start. - Runtime check from VMs: Debian `13.4` and Python `3.13.5`; `k_proxy` still shows `no hidraw devices`. - After USB assignment to `k_proxy`, `/dev/hidraw0` and `/dev/hidraw1` appeared. - CTAP probe re-run succeeded with detected ChromeCard device and valid CTAP2 `getInfo` response. - Local WebAuthn demo completed successfully for user `alice` (register + login). - Phase 5 starter implementation added with session TTL, logout/invalidation, and proxy->server protected counter forwarding. ## Known FIDO2 Transport Boundary - FIDO2 on this firmware is handled via USB HID (CTAPHID), not Wi-Fi/BLE/MQTT. - Key code points in `CR_SDK_CK-main`: - `mgr_fido2.c`: `mgr_fido2_init()` registers `fido2_ctaphid_handle_packet`. - `ctaphid.c`: `fido2_ctaphid_handle_packet(...)`. - `cr_config.h`: FIDO2 HID report descriptor definitions. ## Host Bring-Up Steps (How To Get To A Working FIDO2 Check) 1. Confirm USB enumeration and HID visibility. - Replug card with a known data-capable cable. - Check: `ls -l /dev/hidraw*` 2. If needed, grant Linux HID access for this device. - Add rule at `/etc/udev/rules.d/70-chromecard-fido.rules`: ```udev SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="0005", MODE="0660", TAG+="uaccess" ``` - Reload/apply rules and replug the device. 3. Verify CTAP HID presence. - `python3 /home/user/chromecard/fido2_probe.py --list` - Then: - `python3 /home/user/chromecard/fido2_probe.py --json` 4. Run local WebAuthn bring-up demo. - `python3 /home/user/chromecard/webauthn_local_demo.py` - Open `http://localhost:8765` (use `localhost`, not `127.0.0.1`). 5. Execute register/login test. - Register a user. - Login with the same user. - Confirm no origin/challenge mismatch errors. ## Build/Flash Prerequisites (How To Get To Firmware Build) 1. Ensure full SDK checkout layout exists under `CR_SDK_CK-main`: - `mvp` - `setup` - `components` - `samples` 2. Ensure toolchain is available in shell: - `west --version` - `nrfjprog --version` 3. Once layout/tooling are in place, run: - `cd /home/user/chromecard/CR_SDK_CK-main` - `./scripts/build_flash_mvp.sh` ## Open Gaps To Resolve - Whether a full `CR_SDK_CK-main` checkout (with role directories) is available locally. - Whether server-side code should be pulled now for broader CIP/WebAuthn integration testing. - Exact Qubes firewall and service binding rules to enforce the `k_client -> k_proxy -> k_server` chain. - Exact enrollment process interface running in `k_client` and how it reaches `k_proxy`. - Upgrade Phase 5 auth gate from card-presence probe to full WebAuthn assertion verification for session creation. - Precise ownership split of session/user state between `k_proxy` and `k_server`. - Concrete concurrency limits and acceptance criteria (requests/sec, parallel clients, latency/error thresholds).