Skip to content

Commit 3c50e97

Browse files
Make the HID channel safer
1 parent 006b8f9 commit 3c50e97

1 file changed

Lines changed: 15 additions & 4 deletions

File tree

libwebauthn/src/transport/hid/channel.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,10 @@ impl<'d> HidChannel<'d> {
246246
pub async fn hid_send(&self, msg: &HidMessage) -> Result<(), Error> {
247247
match &self.open_device {
248248
OpenHidDevice::HidApiDevice(hidapi_device) => {
249-
let guard = hidapi_device.lock().unwrap();
249+
let Ok(guard) = hidapi_device.lock() else {
250+
warn!("Poisoned lock on HID API device");
251+
return Err(Error::Transport(TransportError::ConnectionLost));
252+
};
250253
Self::hid_send_hidapi(guard.deref(), msg)
251254
}
252255
#[cfg(feature = "virtual-hid-device")]
@@ -264,7 +267,9 @@ impl<'d> HidChannel<'d> {
264267
report.extend(vec![0; PACKET_SIZE - packet.len()]);
265268
debug!({ packet = i, len = report.len() }, "Sending packet as HID report",);
266269
trace!(?report);
267-
device.write(&report).unwrap();
270+
device
271+
.write(&report)
272+
.or(Err(Error::Transport(TransportError::ConnectionLost)))?;
268273
}
269274
Ok(())
270275
}
@@ -307,7 +312,10 @@ impl<'d> HidChannel<'d> {
307312
loop {
308313
let response = match &self.open_device {
309314
OpenHidDevice::HidApiDevice(hidapi_device) => {
310-
let guard = hidapi_device.lock().unwrap();
315+
let Ok(guard) = hidapi_device.lock() else {
316+
warn!("Poisoned lock on HID API device");
317+
return Err(Error::Transport(TransportError::ConnectionLost));
318+
};
311319
Self::hid_recv_hidapi(guard.deref(), timeout)
312320
}
313321
#[cfg(feature = "virtual-hid-device")]
@@ -440,7 +448,10 @@ impl Channel for HidChannel<'_> {
440448
let cid = self.init.cid;
441449
debug!({ cid }, "Sending APDU request");
442450
trace!(?request);
443-
let apdu_raw = request.raw_long().unwrap();
451+
let Ok(apdu_raw) = request.raw_long() else {
452+
warn!("Failed to serialize APDU request");
453+
return Err(Error::Transport(TransportError::InvalidFraming));
454+
};
444455
self.hid_send(&HidMessage::new(cid, HidCommand::Msg, &apdu_raw))
445456
.await?;
446457
Ok(())

0 commit comments

Comments
 (0)