Commit Graph
152 Commits
Author SHA1 Message Date
Maxim Muravev a8ab4b7c09 feat(ui): auto-detect device hot-plug and refresh live
A ~1s background watcher on DeviceRepo samples a cheap FIDO HID presence
fingerprint (vid:pid:serial, by enumeration only — it never opens the
device, so it can't contend with an in-flight read or write) and triggers
a refresh whenever the key is plugged, unplugged or swapped. Every screen
then reflects the current device without the manual Refresh button. The
watcher skips a tick while a refresh/write is in flight and stops cleanly
when the repo is dropped.
2026-07-19 18:35:58 +03:00
Maxim Muravev 1f7a6b0d92 fix: correctly read and write RS-Key device configuration
Several Configuration-screen fields were blank, wrong, or silently
overwrote a working device on save when talking to RS-Key firmware:

- CONFIG_READ over CTAPHID 0x41 answers with a CBOR `{1: blob}` map, but
  the client fed the raw CBOR bytes downstream. The PHY read only worked
  by accident for records under 24 bytes and broke once a product name
  pushed it over; the LED read never worked. Decode the map and return
  the inner record.
- Parse the LED status block at the correct stride ((len-1)/4) in one
  shared helper, fixing the CCID path that read a 17-byte block as a
  legacy 9-byte one (colour shown as the effect id).
- Read hardware LED (GPIO/brightness/driver) and touch-timeout as
  optionals: an absent phy tag now means "firmware default" (blank
  field) and is not written back, so a virgin phy is no longer clobbered
  with GPIO=0 / driver=Pico / brightness=0 on the next Apply. A value is
  written only when the user sets one.
- Hide the "Supported Curves" card for RS-Key: its firmware ignores the
  phy ENABLED_CURVES tag (curve support is compile-time), so the toggles
  were a no-op that also wrote a meaningless tag on save.
- Preserve each status' LED effect/speed on a colour write (read-modify-
  write), reject over-long product names, read the enabled USB apps over
  the 0xC2 vendor command, and fall back to the USB product string when
  the phy record carries no product override.
2026-07-19 18:35:57 +03:00
Suyog Tandel fd0752b152 chore: make UI more responsive and more wide 2026-07-19 16:44:43 +05:30
Suyog Tandel 86dfa606aa chore: rename local variables across UI module for readability
- dialog.rs: pin entity/text bindings (current/new/confirm)
- config/view_model.rs: entity→weak_self, parsed_gpio/driver_value, new_* form fields
- config/view.rs: fido_no_rskey→is_fido_no_rskey
- passkeys/view_model.rs: entity→weak_self, new→new_pin_value, s→submit_clone/status_content
- passkeys/view.rs: ep_set→enterprise_attestation_set
- home/view.rs: rk→resident_keys_supported, ep_set→enterprise_attestation_set
- sidebar.rs: t→padding_anim_t
- ci.yml: fix audit-check short SHA→full SHA
2026-07-09 22:42:53 +05:30
Suyog Tandel c24999d3a4 refactor(hal): rename variables for clarity and extract format_firmware_version helper
- fido/mod.rs: extract format_firmware_version, rename v→entry, s→error_text,
  val→field_data in TLV parsers
- fido/ops.rs: rename auth_x/y→auth_point_x/y, rng→system_rng, err_str→error_string
- rescue/ops.rs: rename rx_*→*_response, rdr→cursor, i→offset, val→field_data,
  opts_val→options_raw, curves_val→raw_curves_value
- rescue/constants.rs: rename val→tag_value/color_value in from_u8 methods
- transport/fido.rs: rename drain_buf→stale_packet_buffer, buf→packet_buf,
  start_time→deadline_start, status→keepalive_status/ctap_status_byte
- firmwares/mod.rs: rename fw_type→firmware_variant, ver→firmware_version
2026-07-09 21:48:12 +05:30
Suyog Tandel 2707ff6602 fix: codebase formatting 2026-07-09 20:34:13 +05:30
Suyog Tandel c272e148da fix: replace manual and_then/filter pattern with Option::filter
Fixes clippy::manual_filter lint on Rust 1.97 (CI), while
keeping compatibility with 1.96 (local).
2026-07-09 20:29:12 +05:30
Suyog Tandel 5121bb011d feat: RS-Key curve selection card, transport priority fix, RescueCurves re-export
- Reversed transport priority: PCSC/Rescue preferred over FIDO
- Added `RescueCurves` bitflags re-export to `hal/types.rs`
- Replaced single secp256k1 toggle with full "Supported Curves" card
  (11 curves) gated on RS-Key, with mask-building in apply_changes
- Updated FIDO/Rescue write status messages to match transport behavior
- Cleaned up device status display (green "Online" for RS-Key)

Changes: src/ui/screens/config/view.rs, view_model.rs, hal/io.rs, hal/transport/mod.rs, hal/types.rs.
2026-07-09 00:04:38 +05:30
Suyog Tandel 20c56d947d docs: add module/item docs across all 43 source files and enable #![deny(missing_docs)]
- Add //! module-level headers and /// item-level docs to every source file
- Fix unresolved doc links in hal/mod.rs, ui/mod.rs, transport/pcsc.rs, transport/fido.rs
- Add #![deny(missing_docs)] at crate root to enforce doc completeness in CI
2026-07-08 22:57:20 +05:30
Suyog Tandel 423b5ae470 refactor(hal): extract transport layer and split rescue/fido ops
- Move HidTransport from hal/fido/hid.rs to hal/transport/fido.rs
- Add PcscTransport in hal/transport/pcsc.rs for CCID communication
- Refactor DeviceHandle::Rescue to hold PcscTransport instead of bare FirmwareType
- Split monolithic rescue/mod.rs into high-level interface and ops.rs with APDU logic
- Rename hal/fido/hid.rs → hal/fido/ops.rs (FidoOperations), depend on transport::fido
- Update FIDO config-write capability checks with more specific trait methods
- Fix all import paths in hal/io.rs and ui/models/device.rs
2026-07-08 22:20:35 +05:30
Suyog Tandel c76b059ae6 feat(hal): introduce RS-Key(0.3.x) support and FirmwareTrait architecture
This commit significantly refactors the HAL layer to introduce proper support for the RS-Key firmware and abstraction across different hardware profiles
  (PicoFido, RSKey, LkOne).

    Key changes include:
    - **Firmware Abstraction**: Added `FirmwareTrait` and `AnyFirmware` in `src/hal/firmwares/mod.rs` with specific implementations for `PicoFidoFirmware` and
  `RSKeyFirmware` to decouple hardware-specific logic from the high-level `io.rs` layer.
    - **RS-Key FIDO Support**: Implemented RS-Key payload logic in `src/hal/fido/mod.rs` to support reading/writing LED configuration and DEV_CONF directly over
  the CTAPHID FIDO transport using TLV and custom command targets.
    - **Constants Cleanup**: Stripped out and consolidated 200+ lines of raw CTAP2 constants and vendor opcodes from `src/hal/fido/constants.rs` to clean up the
  module.
    - **UI & PIN Dialogs**: Updated `src/ui/screens/config/view_model.rs` to route `DeviceMethod` correctly when applying configurations. Added
  `StatusDialogHandle` integration to prompt the user for their FIDO PIN and instruct them to "Please touch your device if it flashes" when performing hardware
  config writes over FIDO.
    - **LkOne Type**: Added the `LkOne` AAGUID and firmware types to the hardware definition tree.
    - **Home View Check**: Fixed a UI issue in `home/view.rs` to conditionally display the LED config card based on whether the `FirmwareType` actually supports
  FIDO config modifications (like RS-Key).

    This lays the architectural foundation needed to handle FIDO configurations dynamically based on the discovered firmware type.
2026-07-08 21:14:55 +05:30
Suyog Tandel b293e294f5 feat: refactor hal module architecture and add tests in fido module 2026-07-07 01:23:26 +05:30
Suyog Tandel ae8a12946e chore: Remove firmware type label from sidebar online status
- Drop firmware variant display (RS-Key/pico-fido) in sidebar status footer
- Rename workflow job to verify-build
2026-07-06 22:11:29 +05:30
Suyog Tandel c61f905dbb refactor: establish DeviceRepo as sole HAL gateway; fix passkeys lifecycle regressions
Break the UI→HAL dependency: Views and ViewModels no longer import
`crate::hal` directly. DeviceRepo is the single bridge — it re-exports
all needed types, provides 16 blocking static methods for background
tasks, and owns all state mutations + event emissions.

- device.rs: Add FreshDeviceState, apply_fresh_state(), update_fido_info(),
  read_device_serial_blocking(), 16 *_blocking() wrappers, full re-exports
- app.rs: Remove unconditional passkeys nilling on sidebar navigation;
  only invalidate on device_changed (replug). Remove stale
  refresh_device_status method.
- config/view_model.rs: Replace all io::* / fido::* calls with
  DeviceRepo::*_blocking(). Use apply_fresh_state() instead of refresh()
  for RS-Key LED/management writes.
- passkeys/view_model.rs: Replace all io::* calls with
  DeviceRepo::*_blocking(). Fix sync_fido_state to use
  repo.update_fido_info() instead of manual field mutation.
  Restore refresh_if_unlocked via DeviceEvent subscriber.
- Update all view imports: hal::types → ui::models::device,
  hal::rescue::constants → ui::models::device
- Update docs in main.rs, app.rs, ui/mod.rs to reflect the new architecture
2026-07-05 20:06:30 +05:30
Suyog Tandel de338512ba chore(docs): refactor and update the docs to point to correct dir locations and explain the new UI architecture.
- updated mod doc in main.rs
- added mod doc in ui/mod.rs
- added few documentation to symbols in app.rs
2026-07-05 16:36:29 +05:30
Suyog Tandel 5fede906b0 refactor: extract screens into view/view_model dirs, add AppModels DI, switch to Entity<DeviceRepo>
- Decompose flat about.rs/home.rs/security.rs/config.rs/passkeys.rs into
  per-screen directories with mod.rs, view.rs, view_model.rs
- Extract ApplicationRoot, LayoutState, ActiveView, ViewModelStore into new app.rs
- Replace DeviceConnectionState (snapshot-based) with reactive Entity<DeviceRepo>
- Replace ViewCache with ViewModelStore using uniform get_or_insert_with lazy init
- Add AppModels DI bag shared across all view constructors
- Move side types (UsbIdentityPreset, LedDriverType, etc.) into local view_model files
- Delete src/ui/types.rs
2026-07-05 16:02:14 +05:30
Suyog Tandel 7688cc3b13 chore: rename device dir to hal and create models module for repo storage 2026-07-05 02:14:33 +05:30
Suyog Tandel e6f9c4df6d fix: pr98 review, lock the storage before performing a sync to get new status after device reset 2026-06-30 00:04:31 +05:30
kralonur b720285c1a fix(ui): sync cached FIDO state after mutations 2026-06-25 02:54:58 +03:00
Suyog Tandel 7762dccdc5 chore: remove verbose internal-dialogue comments and minor code cleanup
- Strip thinking-out-loud and notes-to-self comments from
  device/fido/hid.rs, device/rescue/mod.rs, error.rs, ui/views/passkeys.rs
- Replace redundant let c_i = i binding with direct i usage (Copy type)
- Replace magic number 8 with LedColor::all().len() in config.rs
2026-06-24 13:50:14 +05:30
Suyog Tandel 8df78c753d feat: add project info in project documentation 2026-06-24 10:40:40 +05:30
Suyog Tandel e5c2812269 feat(device): add ML-DSA COSE algorithms and expand rescue curves
Summary of changes:
- src/device/fido/constants.rs — added ML-DSA-44/65/87 post-quantum COSE algorithm variants (-48 to -50); updated from_raw/Display; refreshed VendorCommand docs with version history and RS-Key caveat; removed stale CTAP2-vs-firmware discrepancy comment
- src/device/rescue/constants.rs — added 8 new curve flags to RescueCurves (SECP256R1, SECP384R1, SECP521R1, BP256R1/384R1/512R1, ED25519, ED448, CURVE25519, CURVE448); corrected MANAGEMENT_AID doc to say it's available on both firmwares
Non-breaking. All additions are purely additive:
- CoseAlgorithm — only accessed via from_raw() (has _ => None catch-all) — existing match arms unaffected
- RescueCurves — bitflags! type, existing code only touches SECP256K1 via contains/bits — new flags don't affect those
- cargo check and cargo clippy both pass clean with no warnings
2026-06-24 08:57:55 +05:30
Suyog Tandel 720adb6a17 feat: add documentation page for picoforge source code 2026-06-23 23:45:11 +05:30
Suyog Tandel c268d8ac28 fix: clippy errors in new documentedation of code in device mod 2026-06-23 23:11:55 +05:30
Suyog Tandel e3dc8fc1c6 docs: add documentation to src/device/module 2026-06-23 21:53:00 +05:30