Skip to content

Commit b8cbad5

Browse files
authored
refactor: reuse read_serial fn with nusb (#58)
1 parent 9090a69 commit b8cbad5

File tree

4 files changed

+55
-84
lines changed

4 files changed

+55
-84
lines changed

src/lib.rs

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ impl ChallengeResponse {
6666
self.backend.find_all_devices()
6767
}
6868

69+
pub fn read_serial_number(&mut self, conf: Config) -> Result<u32> {
70+
self.backend
71+
.read_serial_from_device(conf.device.bus_id, conf.device.address_id)
72+
}
73+
6974
pub fn write_config(&mut self, conf: Config, device_config: &mut DeviceModeConfig) -> Result<()> {
7075
let d = device_config.to_frame(conf.command);
7176
let mut buf = [0; usb::STATUS_UPDATE_PAYLOAD_SIZE];
@@ -87,39 +92,6 @@ impl ChallengeResponse {
8792
Ok(())
8893
}
8994

90-
pub fn read_serial_number(&mut self, conf: Config) -> Result<u32> {
91-
let (mut handle, interfaces) = self
92-
.backend
93-
.open_device(conf.device.bus_id, conf.device.address_id)?;
94-
95-
let challenge = [0; CHALLENGE_SIZE];
96-
let command = Command::DeviceSerial;
97-
98-
let d = Frame::new(challenge, command); // FixMe: do not need a challange
99-
let mut buf = [0; usb::STATUS_UPDATE_PAYLOAD_SIZE];
100-
self.backend.wait(
101-
&mut handle,
102-
|f| !f.contains(usb::Flags::SLOT_WRITE_FLAG),
103-
&mut buf,
104-
)?;
105-
106-
self.backend.write_frame(&mut handle, &d)?;
107-
108-
// Read the response.
109-
let mut response = [0; usb::RESPONSE_SIZE];
110-
self.backend.read_response(&mut handle, &mut response)?;
111-
self.backend.close_device(handle, interfaces)?;
112-
113-
// Check response.
114-
if crc16(&response[..6]) != CRC_RESIDUAL_OK {
115-
return Err(ChallengeResponseError::WrongCRC);
116-
}
117-
118-
let serial = structure!("2I").unpack(response[..8].to_vec())?;
119-
120-
Ok(serial.0)
121-
}
122-
12395
pub fn challenge_response_hmac(&mut self, chall: &[u8], conf: Config) -> Result<Hmac> {
12496
let mut hmac = Hmac([0; 20]);
12597

src/usb.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,4 +190,34 @@ pub trait Backend<DeviceHandle, Interface> {
190190
self.write_reset(handle)?;
191191
Ok(r0)
192192
}
193+
194+
fn read_serial_from_device(
195+
&mut self,
196+
device_bus_id: u8,
197+
device_address: u8,
198+
) -> Result<u32, ChallengeResponseError> {
199+
let (mut handle, interfaces) = self.open_device(device_bus_id, device_address)?;
200+
let challenge = [0; CHALLENGE_SIZE];
201+
let command = Command::DeviceSerial;
202+
203+
let d = Frame::new(challenge, command); // FIXME: do not need a challange
204+
let mut buf = [0; STATUS_UPDATE_PAYLOAD_SIZE];
205+
self.wait(&mut handle, |f| !f.contains(Flags::SLOT_WRITE_FLAG), &mut buf)?;
206+
207+
self.write_frame(&mut handle, &d)?;
208+
209+
// Read the response.
210+
let mut response = [0; RESPONSE_SIZE];
211+
self.read_response(&mut handle, &mut response)?;
212+
self.close_device(handle, interfaces)?;
213+
214+
// Check response.
215+
if crc16(&response[..6]) != crate::sec::CRC_RESIDUAL_OK {
216+
return Err(ChallengeResponseError::WrongCRC);
217+
}
218+
219+
let serial = structure!("2I").unpack(response[..8].to_vec())?;
220+
221+
Ok(serial.0)
222+
}
193223
}

src/usb/nusb.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,11 @@ impl Backend<NUSBDevice, Interface> for NUSBBackend {
118118
continue;
119119
}
120120

121-
let device_serial = match device_info.serial_number() {
122-
Some(s) => match s.parse::<u32>() {
121+
let device_serial =
122+
match self.read_serial_from_device(device_info.bus_number(), device_info.device_address()) {
123123
Ok(s) => s,
124124
Err(_) => continue,
125-
},
126-
None => continue,
127-
};
125+
};
128126

129127
if device_serial == serial {
130128
return Ok(Device {
@@ -154,18 +152,16 @@ impl Backend<NUSBDevice, Interface> for NUSBBackend {
154152
continue;
155153
}
156154

155+
let device_serial = self
156+
.read_serial_from_device(device_info.bus_number(), device_info.device_address())
157+
.ok();
158+
157159
devices.push(Device {
158160
name: match device_info.manufacturer_string() {
159161
Some(name) => Some(name.to_string()),
160162
None => Some("unknown".to_string()),
161163
},
162-
serial: match device_info.serial_number() {
163-
Some(serial) => match serial.parse::<u32>() {
164-
Ok(s) => Some(s),
165-
Err(_) => None,
166-
},
167-
None => None,
168-
},
164+
serial: device_serial,
169165
product_id,
170166
vendor_id,
171167
bus_id: device_info.bus_number(),

src/usb/rusb.rs

Lines changed: 12 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
use error::ChallengeResponseError;
2-
use rusb::{
3-
request_type, Context, Device as RUSBDevice, DeviceHandle, Direction, Recipient, RequestType, UsbContext,
4-
};
5-
use sec::crc16;
2+
use rusb::{request_type, Context, DeviceHandle, Direction, Recipient, RequestType, UsbContext};
63
use std::time::Duration;
7-
use usb::{
8-
Backend, Command, Device, Flags, Frame, CHALLENGE_SIZE, HID_GET_REPORT, HID_SET_REPORT, PRODUCT_ID,
9-
REPORT_TYPE_FEATURE, RESPONSE_SIZE, STATUS_UPDATE_PAYLOAD_SIZE, VENDOR_ID,
10-
};
4+
use usb::{Backend, Device, HID_GET_REPORT, HID_SET_REPORT, PRODUCT_ID, REPORT_TYPE_FEATURE, VENDOR_ID};
115

126
pub struct RUSBBackend {
137
context: Context,
@@ -144,7 +138,9 @@ impl Backend<DeviceHandle<Context>, u8> for RUSBBackend {
144138
}
145139

146140
let name = device.open()?.read_product_string_ascii(&descr).ok();
147-
let serial = self.read_serial_from_device(device.clone()).ok();
141+
let serial = self
142+
.read_serial_from_device(device.bus_number(), device.address())
143+
.ok();
148144
let device = Device {
149145
name,
150146
serial,
@@ -174,7 +170,10 @@ impl Backend<DeviceHandle<Context>, u8> for RUSBBackend {
174170
}
175171

176172
let name = device.open()?.read_product_string_ascii(&descr).ok();
177-
let fetched_serial = match self.read_serial_from_device(device.clone()).ok() {
173+
let fetched_serial = match self
174+
.read_serial_from_device(device.bus_number(), device.address())
175+
.ok()
176+
{
178177
Some(s) => s,
179178
None => 0,
180179
};
@@ -210,7 +209,9 @@ impl Backend<DeviceHandle<Context>, u8> for RUSBBackend {
210209
}
211210

212211
let name = device.open()?.read_product_string_ascii(&descr).ok();
213-
let serial = self.read_serial_from_device(device.clone()).ok();
212+
let serial = self
213+
.read_serial_from_device(device.bus_number(), device.address())
214+
.ok();
214215
let device = Device {
215216
name,
216217
serial,
@@ -229,31 +230,3 @@ impl Backend<DeviceHandle<Context>, u8> for RUSBBackend {
229230
Err(ChallengeResponseError::DeviceNotFound)
230231
}
231232
}
232-
233-
impl RUSBBackend {
234-
fn read_serial_from_device(&mut self, device: RUSBDevice<Context>) -> Result<u32, ChallengeResponseError> {
235-
let (mut handle, interfaces) = self.open_device(device.bus_number(), device.address())?;
236-
let challenge = [0; CHALLENGE_SIZE];
237-
let command = Command::DeviceSerial;
238-
239-
let d = Frame::new(challenge, command); // FixMe: do not need a challange
240-
let mut buf = [0; STATUS_UPDATE_PAYLOAD_SIZE];
241-
self.wait(&mut handle, |f| !f.contains(Flags::SLOT_WRITE_FLAG), &mut buf)?;
242-
243-
self.write_frame(&mut handle, &d)?;
244-
245-
// Read the response.
246-
let mut response = [0; RESPONSE_SIZE];
247-
self.read_response(&mut handle, &mut response)?;
248-
self.close_device(handle, interfaces)?;
249-
250-
// Check response.
251-
if crc16(&response[..6]) != crate::sec::CRC_RESIDUAL_OK {
252-
return Err(ChallengeResponseError::WrongCRC);
253-
}
254-
255-
let serial = structure!("2I").unpack(response[..8].to_vec())?;
256-
257-
Ok(serial.0)
258-
}
259-
}

0 commit comments

Comments
 (0)