Skip to content

feat(usb-passthrough): YubiKey USB passthrough for ephemeral VMs#2

Open
corning-croak-cable wants to merge 18 commits into
mainfrom
feature/yubikey-usb-passthrough
Open

feat(usb-passthrough): YubiKey USB passthrough for ephemeral VMs#2
corning-croak-cable wants to merge 18 commits into
mainfrom
feature/yubikey-usb-passthrough

Conversation

@corning-croak-cable

Copy link
Copy Markdown
Collaborator

Adds --yubikey support to bcvk ephemeral run, passing the host YubiKey directly into the QEMU VM via USB host passthrough.

New: crates/bcvk-qemu/src/usb_passthrough.rs

  • detect_yubikeys() — walks /sys/bus/usb/devices/, matches idVendor=1050 (Yubico)
  • require_yubikeys() — errors if no key found
  • qemu_usb_args() — emits -device usb-ehci,id=yubikey-ehci + -device usb-host,vendorid=0x1050,bus=yubikey-ehci.0 for each detected key
  • 5 unit tests (pure, no hardware)

Wiring (see docs/yubikey-passthrough.md)

// In CommonVmOpts:
#[clap(long)]
pub yubikey: bool,

// In run_impl():
if opts.common.yubikey {
    let keys = usb_passthrough::require_yubikeys()?;
    for arg in usb_passthrough::qemu_usb_args(&keys) {
        qemu_config.extra_args.push(arg);
    }
}

Usage

bcvk ephemeral run --yubikey ghcr.io/corning-croak-cable/yubiOS:latest

Tracked in: corning-croak-cable/yubiOS

Adds crates/bcvk-qemu/src/usb_passthrough.rs:
- detect_yubikeys(): walks /sys/bus/usb/devices, matches idVendor=0x1050
- require_yubikeys(): fails fast with clear message if none found
- qemu_usb_args(): builds usb-ehci controller + usb-host device args
- UsbHostDevice: vendorid/productid pair with QEMU arg formatter
- Unit tests: 5 tests, all pure (no sysfs access)

See docs/yubikey-passthrough.md for CommonVmOpts wiring instructions.
… lib.rs

Assisted-by: Sauna (claude-sonnet-4-6)
… QemuConfig

- Adds `usb_host_devices: Vec<UsbHostDevice>` field (defaults to empty via Default)
- Adds `add_usb_host_device()` builder method
- Emits QEMU USB EHCI controller + usb-host args in spawn() when list is non-empty

Assisted-by: Sauna (claude-sonnet-4-6)
…impl

- Adds `--yubikey` bool to `CommonVmOpts` (serde default = false for BCK_CONFIG compat)
- In `run_impl`, calls `bcvk_qemu::usb_passthrough::require_yubikeys()` and registers
  each detected device with `qemu_config.add_usb_host_device()`
- Fails fast if --yubikey requested but no Yubico device found on host

Assisted-by: Sauna (claude-sonnet-4-6)
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Signed-off-by: foil-copy-overrate <foil-copy-overrate@duck.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants