diff --git a/core/embed/trezorhal/usb.c b/core/embed/trezorhal/usb.c index 33f6ab505f..9e62c73e17 100644 --- a/core/embed/trezorhal/usb.c +++ b/core/embed/trezorhal/usb.c @@ -343,7 +343,6 @@ static uint8_t usb_class_deinit(USBD_HandleTypeDef *dev, uint8_t cfg_idx) { static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, USBD_SetupReqTypedef *req) { - wait_random(); if (((req->bmRequest & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_CLASS) && ((req->bmRequest & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_STANDARD) && ((req->bmRequest & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_VENDOR)) { @@ -375,10 +374,12 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, 'r', 't', // char URL[] }; + wait_random(); USBD_CtlSendData(dev, UNCONST(webusb_url), MIN_8bits(req->wLength, sizeof(webusb_url))); return USBD_OK; } else { + wait_random(); USBD_CtlError(dev, req); return USBD_FAIL; } @@ -402,10 +403,12 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, 0x00, // subCompatibleId 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved }; + wait_random(); USBD_CtlSendData(dev, UNCONST(winusb_wcid), MIN_8bits(req->wLength, sizeof(winusb_wcid))); return USBD_OK; } else { + wait_random(); USBD_CtlError(dev, req); return USBD_FAIL; } @@ -440,10 +443,12 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, 'c', 0x00, 'e', 0x00, 'a', 0x00, '5', 0x00, '0', 0x00, '3', 0x00, 'd', 0x00, '}', 0x00, 0x00, 0x00, 0x00, 0x00, // propertyData }; + wait_random(); USBD_CtlSendData(dev, UNCONST(winusb_guid), MIN_8bits(req->wLength, sizeof(winusb_guid))); return USBD_OK; } else { + wait_random(); USBD_CtlError(dev, req); return USBD_FAIL; } @@ -452,18 +457,23 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, } else if ((req->bmRequest & USB_REQ_RECIPIENT_MASK) == USB_REQ_RECIPIENT_INTERFACE) { if (req->wIndex >= USBD_MAX_NUM_INTERFACES) { + wait_random(); USBD_CtlError(dev, req); return USBD_FAIL; } switch (usb_ifaces[req->wIndex].type) { case USB_IFACE_TYPE_HID: + wait_random(); return usb_hid_class_setup(dev, &usb_ifaces[req->wIndex].hid, req); case USB_IFACE_TYPE_VCP: + wait_random(); return usb_vcp_class_setup(dev, &usb_ifaces[req->wIndex].vcp, req); case USB_IFACE_TYPE_WEBUSB: + wait_random(); return usb_webusb_class_setup(dev, &usb_ifaces[req->wIndex].webusb, req); default: + wait_random(); USBD_CtlError(dev, req); return USBD_FAIL; } @@ -472,16 +482,18 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, } static uint8_t usb_class_data_in(USBD_HandleTypeDef *dev, uint8_t ep_num) { - wait_random(); for (int i = 0; i < USBD_MAX_NUM_INTERFACES; i++) { switch (usb_ifaces[i].type) { case USB_IFACE_TYPE_HID: + wait_random(); usb_hid_class_data_in(dev, &usb_ifaces[i].hid, ep_num); break; case USB_IFACE_TYPE_VCP: + wait_random(); usb_vcp_class_data_in(dev, &usb_ifaces[i].vcp, ep_num); break; case USB_IFACE_TYPE_WEBUSB: + wait_random(); usb_webusb_class_data_in(dev, &usb_ifaces[i].webusb, ep_num); break; default: @@ -492,16 +504,18 @@ static uint8_t usb_class_data_in(USBD_HandleTypeDef *dev, uint8_t ep_num) { } static uint8_t usb_class_data_out(USBD_HandleTypeDef *dev, uint8_t ep_num) { - wait_random(); for (int i = 0; i < USBD_MAX_NUM_INTERFACES; i++) { switch (usb_ifaces[i].type) { case USB_IFACE_TYPE_HID: + wait_random(); usb_hid_class_data_out(dev, &usb_ifaces[i].hid, ep_num); break; case USB_IFACE_TYPE_VCP: + wait_random(); usb_vcp_class_data_out(dev, &usb_ifaces[i].vcp, ep_num); break; case USB_IFACE_TYPE_WEBUSB: + wait_random(); usb_webusb_class_data_out(dev, &usb_ifaces[i].webusb, ep_num); break; default: @@ -512,10 +526,10 @@ static uint8_t usb_class_data_out(USBD_HandleTypeDef *dev, uint8_t ep_num) { } static uint8_t usb_class_sof(USBD_HandleTypeDef *dev) { - wait_random(); for (int i = 0; i < USBD_MAX_NUM_INTERFACES; i++) { switch (usb_ifaces[i].type) { case USB_IFACE_TYPE_VCP: + wait_random(); usb_vcp_class_sof(dev, &usb_ifaces[i].vcp); break; default: