From 8d791789c8b2c5f1ae5706fc0e757eb2a71c0205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= Date: Fri, 6 Jan 2023 11:22:46 +0100 Subject: [PATCH] Add usbip example runner --- Cargo.toml | 10 +++++++-- examples/usbip.rs | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 examples/usbip.rs diff --git a/Cargo.toml b/Cargo.toml index eda47f4..75c537c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,12 +45,17 @@ aes = "0.8.2" stoppable_thread = "0.2.1" expectrl = "0.6.0" +# Examples +trussed-usbip = { git = "https://github.com/trussed-dev/pc-usbip-runner", default-features = false, features = ["ccid"]} +apdu-dispatch = "0.1" +usbd-ccid = { git = "https://github.com/Nitrokey/nitrokey-3-firmware", features = ["highspeed-usb"]} +rand = "0.8.5" [features] default = [] strict-pin = [] std = [] -virtual = ["std", "vpicc","trussed/virt"] +virtual = ["std", "vpicc", "trussed/virt"] pivy-tests = [] opensc-tests = [] @@ -62,7 +67,8 @@ log-warn = [] log-error = [] [patch.crates-io] -trussed = { git = "https://github.com/Nitrokey/trussed", tag = "v0.1.0-nitrokey-3"} +trussed = { git = "https://github.com/Nitrokey/trussed", tag = "v0.1.0-nitrokey-4"} +littlefs2 = { git = "https://github.com/Nitrokey/littlefs2", tag = "v0.3.2-nitrokey-1" } [profile.dev.package.rsa] opt-level = 2 diff --git a/examples/usbip.rs b/examples/usbip.rs new file mode 100644 index 0000000..7fe20f9 --- /dev/null +++ b/examples/usbip.rs @@ -0,0 +1,54 @@ +// Copyright (C) 2022 Nitrokey GmbH +// SPDX-License-Identifier: CC0-1.0 + +use trussed::virt::{self, Ram, UserInterface}; +use trussed::{ClientImplementation, Platform}; + +use piv_authenticator as piv; +use trussed_usbip::Syscall; + +const MANUFACTURER: &str = "Nitrokey"; +const PRODUCT: &str = "Nitrokey 3"; +const VID: u16 = 0x20a0; +const PID: u16 = 0x42b2; + +struct PivApp { + piv: piv::Authenticator>>>, +} + +impl trussed_usbip::Apps>>, ()> for PivApp { + fn new( + make_client: impl Fn(&str) -> ClientImplementation>>, + _data: (), + ) -> Self { + PivApp { + piv: piv::Authenticator::new(make_client("piv")), + } + } + + fn with_ccid_apps( + &mut self, + f: impl FnOnce(&mut [&mut dyn apdu_dispatch::App<7609, 7609>]) -> T, + ) -> T { + f(&mut [&mut self.piv]) + } +} + +fn main() { + env_logger::init(); + + let options = trussed_usbip::Options { + manufacturer: Some(MANUFACTURER.to_owned()), + product: Some(PRODUCT.to_owned()), + serial_number: Some("TEST".into()), + vid: VID, + pid: PID, + }; + trussed_usbip::Runner::new(virt::Ram::default(), options) + .init_platform(move |platform| { + let ui: Box = + Box::new(UserInterface::new()); + platform.user_interface().set_inner(ui); + }) + .exec::(|_platform| {}); +}