From 4f44c2577b7a1a7d2002917bc6ce87ed0b2732f7 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 2 Feb 2018 15:27:04 +0100 Subject: [PATCH] trezorhal: add option to programatically enable/disable WinUSB --- embed/bootloader/main.c | 1 + embed/extmod/modtrezorio/modtrezorio-usb.h | 7 ++++- embed/prodtest/main.c | 1 + embed/trezorhal/usb.c | 36 ++++++++++------------ embed/trezorhal/usb.h | 1 + 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/embed/bootloader/main.c b/embed/bootloader/main.c index 57d05a6e77..264dc97a64 100644 --- a/embed/bootloader/main.c +++ b/embed/bootloader/main.c @@ -41,6 +41,7 @@ static void usb_init_all(void) { .product = "TREZOR", .serial_number = "000000000000000000000000", .interface = "TREZOR Interface", + .winusb_enabled = sectrue, }; static uint8_t rx_buffer[USB_PACKET_SIZE]; diff --git a/embed/extmod/modtrezorio/modtrezorio-usb.h b/embed/extmod/modtrezorio/modtrezorio-usb.h index 7e9994f048..799ba767f5 100644 --- a/embed/extmod/modtrezorio/modtrezorio-usb.h +++ b/embed/extmod/modtrezorio/modtrezorio-usb.h @@ -40,7 +40,8 @@ static const char *get_0str(mp_obj_t o, size_t min_len, size_t max_len) { /// manufacturer: str='', /// product: str='', /// serial_number: str='', -/// interface: str='') -> None: +/// interface: str='', +/// winusb_enabled: bool=True) -> None: /// ''' /// ''' STATIC mp_obj_t mod_trezorio_USB_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { @@ -56,6 +57,7 @@ STATIC mp_obj_t mod_trezorio_USB_make_new(const mp_obj_type_t *type, size_t n_ar { MP_QSTR_product, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_empty_bytes} }, { MP_QSTR_serial_number, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_empty_bytes} }, { MP_QSTR_interface, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_empty_bytes} }, + { MP_QSTR_winusb_enabled, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} }, }; mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, args, MP_ARRAY_SIZE(allowed_args), allowed_args, vals); @@ -70,6 +72,7 @@ STATIC mp_obj_t mod_trezorio_USB_make_new(const mp_obj_type_t *type, size_t n_ar const char *product = get_0str(vals[7].u_obj, 0, 32); const char *serial_number = get_0str(vals[8].u_obj, 0, 32); const char *interface = get_0str(vals[9].u_obj, 0, 32); + const secbool winusb_enabled = vals[10].u_bool ? sectrue : secfalse; CHECK_PARAM_RANGE(device_class, 0, 255) CHECK_PARAM_RANGE(device_subclass, 0, 255) @@ -105,6 +108,8 @@ STATIC mp_obj_t mod_trezorio_USB_make_new(const mp_obj_type_t *type, size_t n_ar o->info.product = product; o->info.serial_number = serial_number; o->info.interface = interface; + o->info.winusb_enabled = winusb_enabled; + mp_obj_list_init(&o->ifaces, 0); return MP_OBJ_FROM_PTR(o); diff --git a/embed/prodtest/main.c b/embed/prodtest/main.c index ff85a21dbf..6445e18e41 100644 --- a/embed/prodtest/main.c +++ b/embed/prodtest/main.c @@ -96,6 +96,7 @@ static void usb_init_all(void) .product = "TREZOR", .serial_number = "000000000000", .interface = "TREZOR Interface", + .winusb_enabled = secfalse, }; static uint8_t tx_packet[VCP_PACKET_LEN]; diff --git a/embed/trezorhal/usb.c b/embed/trezorhal/usb.c index 5cc22e4eb5..561383042b 100644 --- a/embed/trezorhal/usb.c +++ b/embed/trezorhal/usb.c @@ -11,8 +11,6 @@ #include "usb.h" #include "usbd_core.h" -#define USE_WINUSB 1 - #define USB_MAX_CONFIG_DESC_SIZE 256 #define USB_MAX_STR_SIZE 62 #define USB_MAX_STR_DESC_SIZE (USB_MAX_STR_SIZE * 2 + 2) @@ -25,13 +23,11 @@ #error Unable to determine proper USB_PHY_ID to use #endif -#if USE_WINUSB #define USB_WINUSB_VENDOR_CODE '!' // arbitrary, but must be equivalent to the last character in extra string #define USB_WINUSB_EXTRA_STRING 'M', 0x00, 'S', 0x00, 'F', 0x00, 'T', 0x00, '1', 0x00, '0', 0x00, '0', 0x00, USB_WINUSB_VENDOR_CODE , 0x00 // MSFT100! #define USB_WINUSB_EXTRA_STRING_INDEX 0xEE #define USB_WINUSB_REQ_GET_COMPATIBLE_ID_FEATURE_DESCRIPTOR 0x04 #define USB_WINUSB_REQ_GET_EXTENDED_PROPERTIES_OS_FEATURE_DESCRIPTOR 0x05 -#endif #define UNCONST(X) ((uint8_t *)(X)) @@ -52,6 +48,8 @@ static USBD_HandleTypeDef usb_dev_handle; static const USBD_DescriptorsTypeDef usb_descriptors; static const USBD_ClassTypeDef usb_class; +static secbool usb_winusb_enabled = secfalse; + static secbool __wur check_desc_str(const char *s) { if (NULL == s) return secfalse; if (strlen(s) > USB_MAX_STR_SIZE) return secfalse; @@ -87,6 +85,9 @@ void usb_init(const usb_dev_info_t *dev_info) { usb_str_table.serial_number = dev_info->serial_number; usb_str_table.interface = dev_info->interface; + // enable/disable WinUSB + usb_winusb_enabled = dev_info->winusb_enabled; + // Configuration descriptor usb_config_desc->bLength = sizeof(usb_config_descriptor_t); usb_config_desc->bDescriptorType = USB_DESC_TYPE_CONFIGURATION; @@ -316,9 +317,8 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, USBD_SetupReqTypedef *re return USBD_FAIL; } } -#if USE_WINUSB else - if (req->bRequest == USB_WINUSB_VENDOR_CODE) { + if (sectrue == usb_winusb_enabled && req->bRequest == USB_WINUSB_VENDOR_CODE) { if (req->wIndex == USB_WINUSB_REQ_GET_COMPATIBLE_ID_FEATURE_DESCRIPTOR) { static const uint8_t winusb_wcid[] = { // header @@ -341,11 +341,9 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, USBD_SetupReqTypedef *re return USBD_FAIL; } } -#endif } -#if USE_WINUSB if ((req->bmRequest & USB_REQ_RECIPIENT_MASK) == USB_REQ_RECIPIENT_INTERFACE) { - if (req->bRequest == USB_WINUSB_VENDOR_CODE) { + if (sectrue == usb_winusb_enabled && req->bRequest == USB_WINUSB_VENDOR_CODE) { if (req->wIndex == USB_WINUSB_REQ_GET_EXTENDED_PROPERTIES_OS_FEATURE_DESCRIPTOR && (req->wValue & 0xFF) == 0) { // reply only if interface is 0 static const uint8_t winusb_guid[] = { @@ -370,7 +368,6 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, USBD_SetupReqTypedef *re } } } -#endif } else if (req->wIndex >= USBD_MAX_NUM_INTERFACES) { USBD_CtlError(dev, req); return USBD_FAIL; @@ -445,19 +442,18 @@ static uint8_t *usb_class_get_cfg_desc(uint16_t *length) { } static uint8_t *usb_class_get_usrstr_desc(USBD_HandleTypeDef *dev, uint8_t index, uint16_t *length) { -#if USE_WINUSB - static const uint8_t winusb_string_descriptor[] = { - 0x12, // bLength - USB_DESC_TYPE_STRING, // bDescriptorType - USB_WINUSB_EXTRA_STRING // wData - }; - if (index == USB_WINUSB_EXTRA_STRING_INDEX) { + if (sectrue == usb_winusb_enabled && index == USB_WINUSB_EXTRA_STRING_INDEX) { + static const uint8_t winusb_string_descriptor[] = { + 0x12, // bLength + USB_DESC_TYPE_STRING, // bDescriptorType + USB_WINUSB_EXTRA_STRING // wData + }; *length = sizeof(winusb_string_descriptor); return UNCONST(winusb_string_descriptor); + } else { + *length = 0; + return 0; } -#endif - *length = 0; - return 0; } static const USBD_ClassTypeDef usb_class = { diff --git a/embed/trezorhal/usb.h b/embed/trezorhal/usb.h index 1d75918265..3e46f9f1db 100644 --- a/embed/trezorhal/usb.h +++ b/embed/trezorhal/usb.h @@ -103,6 +103,7 @@ typedef struct { const char *product; const char *serial_number; const char *interface; + secbool winusb_enabled; } usb_dev_info_t; typedef enum {