1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
// Copyright 2019 Robin Krahl <robin.krahl@ireas.org>
// SPDX-License-Identifier: GPL-3.0-or-later
use usb_device::bus::{UsbBus, UsbBusAllocator};
use usb_device::device::{UsbDevice, UsbDeviceBuilder, UsbVidPid};
use crate::hid::{HidDevice, Protocol, ReportType, Subclass};
const VID_CLAY_LOGIC: u16 = 0x20a0;
const PID_NITROKEY_PRO: u16 = 0x4108;
const REPORT_LEN: usize = 64;
const REPORT_DESCRIPTOR: &[u8] = &[
0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x05, 0x07, 0x19, 0xE0, 0x29, 0xE7, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x03, 0x95, 0x05, 0x75, 0x01,
0x05, 0x08, 0x19, 0x01, 0x29, 0x05, 0x91, 0x02, 0x95, 0x01, 0x75, 0x03, 0x91, 0x03, 0x95, 0x06,
0x75, 0x08, 0x15, 0x00, 0x25, 0x65, 0x05, 0x07, 0x19, 0x00, 0x29, 0x65, 0x81, 0x00, 0x09, 0x03,
0x75, 0x08, 0x95, 0x40, 0xB1, 0x02, 0xC0,
];
pub struct Nitrokey {
buf: [u8; REPORT_LEN],
}
impl Nitrokey {
pub fn new() -> Self {
Nitrokey {
buf: [0; REPORT_LEN],
}
}
}
impl HidDevice for Nitrokey {
fn subclass(&self) -> Subclass {
Subclass::BootInterface
}
fn protocol(&self) -> Protocol {
Protocol::Keyboard
}
fn report_descriptor(&self) -> &[u8] {
REPORT_DESCRIPTOR
}
fn get_report(&mut self, report_type: ReportType, report_id: u8) -> Result<&[u8], ()> {
let _ = (report_type, report_id);
Err(())
}
fn set_report(
&mut self,
report_type: ReportType,
report_id: u8,
data: &[u8],
) -> Result<(), ()> {
if report_type != ReportType::Feature || report_id != 0 || data.len() != REPORT_LEN {
Err(())
} else {
self.buf.copy_from_slice(data);
Ok(())
}
}
}
pub fn create_usb_device<B: UsbBus>(alloc: &UsbBusAllocator<B>) -> UsbDevice<'_, B> {
UsbDeviceBuilder::new(alloc, UsbVidPid(VID_CLAY_LOGIC, PID_NITROKEY_PRO))
.manufacturer("Nitrokey/ntw")
.product("Nitrokey Pro/ntw")
.serial_number("?")
.build()
}
|