mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-28 17:18:29 +00:00
feat(core): Ensure that WebAuthn runs on port 21326 by default for both production and debug emulator.
This commit is contained in:
parent
9ef26c347e
commit
a8c500bffd
@ -33,6 +33,7 @@ typedef struct _mp_obj_HID_t {
|
|||||||
/// iface_num: int,
|
/// iface_num: int,
|
||||||
/// ep_in: int,
|
/// ep_in: int,
|
||||||
/// ep_out: int,
|
/// ep_out: int,
|
||||||
|
/// emu_port: int,
|
||||||
/// report_desc: bytes,
|
/// report_desc: bytes,
|
||||||
/// subclass: int = 0,
|
/// subclass: int = 0,
|
||||||
/// protocol: int = 0,
|
/// protocol: int = 0,
|
||||||
@ -54,6 +55,9 @@ STATIC mp_obj_t mod_trezorio_HID_make_new(const mp_obj_type_t *type,
|
|||||||
{MP_QSTR_ep_out,
|
{MP_QSTR_ep_out,
|
||||||
MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_INT,
|
MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_INT,
|
||||||
{.u_int = 0}},
|
{.u_int = 0}},
|
||||||
|
{MP_QSTR_emu_port,
|
||||||
|
MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_INT,
|
||||||
|
{.u_int = 0}},
|
||||||
{MP_QSTR_subclass, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0}},
|
{MP_QSTR_subclass, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0}},
|
||||||
{MP_QSTR_protocol, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0}},
|
{MP_QSTR_protocol, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0}},
|
||||||
{MP_QSTR_polling_interval, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1}},
|
{MP_QSTR_polling_interval, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1}},
|
||||||
@ -69,12 +73,13 @@ STATIC mp_obj_t mod_trezorio_HID_make_new(const mp_obj_type_t *type,
|
|||||||
const mp_int_t iface_num = vals[0].u_int;
|
const mp_int_t iface_num = vals[0].u_int;
|
||||||
const mp_int_t ep_in = vals[1].u_int;
|
const mp_int_t ep_in = vals[1].u_int;
|
||||||
const mp_int_t ep_out = vals[2].u_int;
|
const mp_int_t ep_out = vals[2].u_int;
|
||||||
const mp_int_t subclass = vals[3].u_int;
|
const mp_int_t emu_port = vals[3].u_int;
|
||||||
const mp_int_t protocol = vals[4].u_int;
|
const mp_int_t subclass = vals[4].u_int;
|
||||||
const mp_int_t polling_interval = vals[5].u_int;
|
const mp_int_t protocol = vals[5].u_int;
|
||||||
const mp_int_t max_packet_len = vals[6].u_int;
|
const mp_int_t polling_interval = vals[6].u_int;
|
||||||
|
const mp_int_t max_packet_len = vals[7].u_int;
|
||||||
mp_buffer_info_t report_desc = {0};
|
mp_buffer_info_t report_desc = {0};
|
||||||
mp_get_buffer_raise(vals[7].u_obj, &report_desc, MP_BUFFER_READ);
|
mp_get_buffer_raise(vals[8].u_obj, &report_desc, MP_BUFFER_READ);
|
||||||
|
|
||||||
if (report_desc.buf == NULL || report_desc.len == 0 ||
|
if (report_desc.buf == NULL || report_desc.len == 0 ||
|
||||||
report_desc.len > 255) {
|
report_desc.len > 255) {
|
||||||
@ -83,6 +88,7 @@ STATIC mp_obj_t mod_trezorio_HID_make_new(const mp_obj_type_t *type,
|
|||||||
CHECK_PARAM_RANGE(iface_num, 0, 32)
|
CHECK_PARAM_RANGE(iface_num, 0, 32)
|
||||||
CHECK_PARAM_RANGE(ep_in, 0, 255)
|
CHECK_PARAM_RANGE(ep_in, 0, 255)
|
||||||
CHECK_PARAM_RANGE(ep_out, 0, 255)
|
CHECK_PARAM_RANGE(ep_out, 0, 255)
|
||||||
|
CHECK_PARAM_RANGE(emu_port, 0, 65535)
|
||||||
CHECK_PARAM_RANGE(subclass, 0, 255)
|
CHECK_PARAM_RANGE(subclass, 0, 255)
|
||||||
CHECK_PARAM_RANGE(protocol, 0, 255)
|
CHECK_PARAM_RANGE(protocol, 0, 255)
|
||||||
CHECK_PARAM_RANGE(polling_interval, 1, 255)
|
CHECK_PARAM_RANGE(polling_interval, 1, 255)
|
||||||
@ -94,8 +100,12 @@ STATIC mp_obj_t mod_trezorio_HID_make_new(const mp_obj_type_t *type,
|
|||||||
o->info.rx_buffer = m_new(uint8_t, max_packet_len);
|
o->info.rx_buffer = m_new(uint8_t, max_packet_len);
|
||||||
o->info.report_desc = report_desc.buf;
|
o->info.report_desc = report_desc.buf;
|
||||||
o->info.iface_num = (uint8_t)(iface_num);
|
o->info.iface_num = (uint8_t)(iface_num);
|
||||||
|
#ifdef TREZOR_EMULATOR
|
||||||
|
o->info.emu_port = (uint16_t)(emu_port);
|
||||||
|
#else
|
||||||
o->info.ep_in = (uint8_t)(ep_in);
|
o->info.ep_in = (uint8_t)(ep_in);
|
||||||
o->info.ep_out = (uint8_t)(ep_out);
|
o->info.ep_out = (uint8_t)(ep_out);
|
||||||
|
#endif
|
||||||
o->info.subclass = (uint8_t)(subclass);
|
o->info.subclass = (uint8_t)(subclass);
|
||||||
o->info.protocol = (uint8_t)(protocol);
|
o->info.protocol = (uint8_t)(protocol);
|
||||||
o->info.polling_interval = (uint8_t)(polling_interval);
|
o->info.polling_interval = (uint8_t)(polling_interval);
|
||||||
|
@ -37,6 +37,7 @@ typedef struct _mp_obj_VCP_t {
|
|||||||
/// ep_in: int,
|
/// ep_in: int,
|
||||||
/// ep_out: int,
|
/// ep_out: int,
|
||||||
/// ep_cmd: int,
|
/// ep_cmd: int,
|
||||||
|
/// emu_port: int,
|
||||||
/// ) -> None:
|
/// ) -> None:
|
||||||
/// """
|
/// """
|
||||||
/// """
|
/// """
|
||||||
@ -59,6 +60,9 @@ STATIC mp_obj_t mod_trezorio_VCP_make_new(const mp_obj_type_t *type,
|
|||||||
{MP_QSTR_ep_cmd,
|
{MP_QSTR_ep_cmd,
|
||||||
MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_INT,
|
MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_INT,
|
||||||
{.u_int = 0}},
|
{.u_int = 0}},
|
||||||
|
{MP_QSTR_emu_port,
|
||||||
|
MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_INT,
|
||||||
|
{.u_int = 0}},
|
||||||
};
|
};
|
||||||
mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)] = {0};
|
mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)] = {0};
|
||||||
mp_arg_parse_all_kw_array(n_args, n_kw, args, MP_ARRAY_SIZE(allowed_args),
|
mp_arg_parse_all_kw_array(n_args, n_kw, args, MP_ARRAY_SIZE(allowed_args),
|
||||||
@ -69,12 +73,14 @@ STATIC mp_obj_t mod_trezorio_VCP_make_new(const mp_obj_type_t *type,
|
|||||||
const mp_int_t ep_in = vals[2].u_int;
|
const mp_int_t ep_in = vals[2].u_int;
|
||||||
const mp_int_t ep_out = vals[3].u_int;
|
const mp_int_t ep_out = vals[3].u_int;
|
||||||
const mp_int_t ep_cmd = vals[4].u_int;
|
const mp_int_t ep_cmd = vals[4].u_int;
|
||||||
|
const mp_int_t emu_port = vals[5].u_int;
|
||||||
|
|
||||||
CHECK_PARAM_RANGE(iface_num, 0, 32)
|
CHECK_PARAM_RANGE(iface_num, 0, 32)
|
||||||
CHECK_PARAM_RANGE(data_iface_num, 0, 32)
|
CHECK_PARAM_RANGE(data_iface_num, 0, 32)
|
||||||
CHECK_PARAM_RANGE(ep_in, 0, 255)
|
CHECK_PARAM_RANGE(ep_in, 0, 255)
|
||||||
CHECK_PARAM_RANGE(ep_out, 0, 255)
|
CHECK_PARAM_RANGE(ep_out, 0, 255)
|
||||||
CHECK_PARAM_RANGE(ep_cmd, 0, 255)
|
CHECK_PARAM_RANGE(ep_cmd, 0, 255)
|
||||||
|
CHECK_PARAM_RANGE(emu_port, 0, 65535)
|
||||||
|
|
||||||
const size_t vcp_buffer_len = 1024;
|
const size_t vcp_buffer_len = 1024;
|
||||||
const size_t vcp_packet_len = 64;
|
const size_t vcp_packet_len = 64;
|
||||||
@ -92,9 +98,13 @@ STATIC mp_obj_t mod_trezorio_VCP_make_new(const mp_obj_type_t *type,
|
|||||||
o->info.rx_intr_byte = 3; // Ctrl-C
|
o->info.rx_intr_byte = 3; // Ctrl-C
|
||||||
o->info.iface_num = (uint8_t)(iface_num);
|
o->info.iface_num = (uint8_t)(iface_num);
|
||||||
o->info.data_iface_num = (uint8_t)(data_iface_num);
|
o->info.data_iface_num = (uint8_t)(data_iface_num);
|
||||||
|
#ifdef TREZOR_EMULATOR
|
||||||
|
o->info.emu_port = (uint16_t)(emu_port);
|
||||||
|
#else
|
||||||
o->info.ep_cmd = (uint8_t)(ep_cmd);
|
o->info.ep_cmd = (uint8_t)(ep_cmd);
|
||||||
o->info.ep_in = (uint8_t)(ep_in);
|
o->info.ep_in = (uint8_t)(ep_in);
|
||||||
o->info.ep_out = (uint8_t)(ep_out);
|
o->info.ep_out = (uint8_t)(ep_out);
|
||||||
|
#endif
|
||||||
o->info.polling_interval = 10;
|
o->info.polling_interval = 10;
|
||||||
o->info.max_packet_len = (uint8_t)(vcp_packet_len);
|
o->info.max_packet_len = (uint8_t)(vcp_packet_len);
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ typedef struct _mp_obj_WebUSB_t {
|
|||||||
/// iface_num: int,
|
/// iface_num: int,
|
||||||
/// ep_in: int,
|
/// ep_in: int,
|
||||||
/// ep_out: int,
|
/// ep_out: int,
|
||||||
|
/// emu_port: int,
|
||||||
/// subclass: int = 0,
|
/// subclass: int = 0,
|
||||||
/// protocol: int = 0,
|
/// protocol: int = 0,
|
||||||
/// polling_interval: int = 1,
|
/// polling_interval: int = 1,
|
||||||
@ -53,6 +54,9 @@ STATIC mp_obj_t mod_trezorio_WebUSB_make_new(const mp_obj_type_t *type,
|
|||||||
{MP_QSTR_ep_out,
|
{MP_QSTR_ep_out,
|
||||||
MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_INT,
|
MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_INT,
|
||||||
{.u_int = 0}},
|
{.u_int = 0}},
|
||||||
|
{MP_QSTR_emu_port,
|
||||||
|
MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_INT,
|
||||||
|
{.u_int = 0}},
|
||||||
{MP_QSTR_subclass, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0}},
|
{MP_QSTR_subclass, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0}},
|
||||||
{MP_QSTR_protocol, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0}},
|
{MP_QSTR_protocol, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0}},
|
||||||
{MP_QSTR_polling_interval, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1}},
|
{MP_QSTR_polling_interval, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1}},
|
||||||
@ -65,14 +69,16 @@ STATIC mp_obj_t mod_trezorio_WebUSB_make_new(const mp_obj_type_t *type,
|
|||||||
const mp_int_t iface_num = vals[0].u_int;
|
const mp_int_t iface_num = vals[0].u_int;
|
||||||
const mp_int_t ep_in = vals[1].u_int;
|
const mp_int_t ep_in = vals[1].u_int;
|
||||||
const mp_int_t ep_out = vals[2].u_int;
|
const mp_int_t ep_out = vals[2].u_int;
|
||||||
const mp_int_t subclass = vals[3].u_int;
|
const mp_int_t emu_port = vals[3].u_int;
|
||||||
const mp_int_t protocol = vals[4].u_int;
|
const mp_int_t subclass = vals[4].u_int;
|
||||||
const mp_int_t polling_interval = vals[5].u_int;
|
const mp_int_t protocol = vals[5].u_int;
|
||||||
const mp_int_t max_packet_len = vals[6].u_int;
|
const mp_int_t polling_interval = vals[6].u_int;
|
||||||
|
const mp_int_t max_packet_len = vals[7].u_int;
|
||||||
|
|
||||||
CHECK_PARAM_RANGE(iface_num, 0, 32)
|
CHECK_PARAM_RANGE(iface_num, 0, 32)
|
||||||
CHECK_PARAM_RANGE(ep_in, 0, 255)
|
CHECK_PARAM_RANGE(ep_in, 0, 255)
|
||||||
CHECK_PARAM_RANGE(ep_out, 0, 255)
|
CHECK_PARAM_RANGE(ep_out, 0, 255)
|
||||||
|
CHECK_PARAM_RANGE(emu_port, 0, 65535)
|
||||||
CHECK_PARAM_RANGE(subclass, 0, 255)
|
CHECK_PARAM_RANGE(subclass, 0, 255)
|
||||||
CHECK_PARAM_RANGE(protocol, 0, 255)
|
CHECK_PARAM_RANGE(protocol, 0, 255)
|
||||||
CHECK_PARAM_RANGE(polling_interval, 1, 255)
|
CHECK_PARAM_RANGE(polling_interval, 1, 255)
|
||||||
@ -83,8 +89,12 @@ STATIC mp_obj_t mod_trezorio_WebUSB_make_new(const mp_obj_type_t *type,
|
|||||||
|
|
||||||
o->info.rx_buffer = m_new(uint8_t, max_packet_len);
|
o->info.rx_buffer = m_new(uint8_t, max_packet_len);
|
||||||
o->info.iface_num = (uint8_t)(iface_num);
|
o->info.iface_num = (uint8_t)(iface_num);
|
||||||
|
#ifdef TREZOR_EMULATOR
|
||||||
|
o->info.emu_port = (uint16_t)(emu_port);
|
||||||
|
#else
|
||||||
o->info.ep_in = (uint8_t)(ep_in);
|
o->info.ep_in = (uint8_t)(ep_in);
|
||||||
o->info.ep_out = (uint8_t)(ep_out);
|
o->info.ep_out = (uint8_t)(ep_out);
|
||||||
|
#endif
|
||||||
o->info.subclass = (uint8_t)(subclass);
|
o->info.subclass = (uint8_t)(subclass);
|
||||||
o->info.protocol = (uint8_t)(protocol);
|
o->info.protocol = (uint8_t)(protocol);
|
||||||
o->info.polling_interval = (uint8_t)(polling_interval);
|
o->info.polling_interval = (uint8_t)(polling_interval);
|
||||||
|
@ -41,8 +41,12 @@ typedef struct {
|
|||||||
const uint8_t *report_desc; // With length of report_desc_len bytes
|
const uint8_t *report_desc; // With length of report_desc_len bytes
|
||||||
uint8_t *rx_buffer; // With length of max_packet_len bytes
|
uint8_t *rx_buffer; // With length of max_packet_len bytes
|
||||||
uint8_t iface_num; // Address of this HID interface
|
uint8_t iface_num; // Address of this HID interface
|
||||||
|
#ifdef TREZOR_EMULATOR
|
||||||
|
uint16_t emu_port; // UDP port of this interface in the emulator.
|
||||||
|
#else
|
||||||
uint8_t ep_in; // Address of IN endpoint (with the highest bit set)
|
uint8_t ep_in; // Address of IN endpoint (with the highest bit set)
|
||||||
uint8_t ep_out; // Address of OUT endpoint
|
uint8_t ep_out; // Address of OUT endpoint
|
||||||
|
#endif
|
||||||
uint8_t subclass; // usb_iface_subclass_t
|
uint8_t subclass; // usb_iface_subclass_t
|
||||||
uint8_t protocol; // usb_iface_protocol_t
|
uint8_t protocol; // usb_iface_protocol_t
|
||||||
uint8_t polling_interval; // In units of 1ms
|
uint8_t polling_interval; // In units of 1ms
|
||||||
|
@ -105,9 +105,13 @@ typedef struct {
|
|||||||
uint8_t iface_num; // Address of this VCP interface
|
uint8_t iface_num; // Address of this VCP interface
|
||||||
uint8_t data_iface_num; // Address of data interface of the VCP interface
|
uint8_t data_iface_num; // Address of data interface of the VCP interface
|
||||||
// association
|
// association
|
||||||
|
#ifdef TREZOR_EMULATOR
|
||||||
|
uint16_t emu_port; // UDP port of this interface in the emulator.
|
||||||
|
#else
|
||||||
uint8_t ep_cmd; // Address of IN CMD endpoint (with the highest bit set)
|
uint8_t ep_cmd; // Address of IN CMD endpoint (with the highest bit set)
|
||||||
uint8_t ep_in; // Address of IN endpoint (with the highest bit set)
|
uint8_t ep_in; // Address of IN endpoint (with the highest bit set)
|
||||||
uint8_t ep_out; // Address of OUT endpoint
|
uint8_t ep_out; // Address of OUT endpoint
|
||||||
|
#endif
|
||||||
uint8_t polling_interval; // In units of 1ms
|
uint8_t polling_interval; // In units of 1ms
|
||||||
uint8_t max_packet_len; // Length of the biggest packet, and of tx_packet and
|
uint8_t max_packet_len; // Length of the biggest packet, and of tx_packet and
|
||||||
// rx_packet
|
// rx_packet
|
||||||
|
@ -32,8 +32,12 @@ typedef struct __attribute__((packed)) {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t *rx_buffer; // With length of max_packet_len bytes
|
uint8_t *rx_buffer; // With length of max_packet_len bytes
|
||||||
uint8_t iface_num; // Address of this WebUSB interface
|
uint8_t iface_num; // Address of this WebUSB interface
|
||||||
|
#ifdef TREZOR_EMULATOR
|
||||||
|
uint16_t emu_port; // UDP port of this interface in the emulator.
|
||||||
|
#else
|
||||||
uint8_t ep_in; // Address of IN endpoint (with the highest bit set)
|
uint8_t ep_in; // Address of IN endpoint (with the highest bit set)
|
||||||
uint8_t ep_out; // Address of OUT endpoint
|
uint8_t ep_out; // Address of OUT endpoint
|
||||||
|
#endif
|
||||||
uint8_t subclass; // usb_iface_subclass_t
|
uint8_t subclass; // usb_iface_subclass_t
|
||||||
uint8_t protocol; // usb_iface_protocol_t
|
uint8_t protocol; // usb_iface_protocol_t
|
||||||
uint8_t polling_interval; // In units of 1ms
|
uint8_t polling_interval; // In units of 1ms
|
||||||
|
@ -49,6 +49,7 @@ __fatal_error(const char *expr, const char *msg, const char *file, int line,
|
|||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
usb_iface_type_t type;
|
usb_iface_type_t type;
|
||||||
|
uint16_t port;
|
||||||
int sock;
|
int sock;
|
||||||
struct sockaddr_in si_me, si_other;
|
struct sockaddr_in si_me, si_other;
|
||||||
socklen_t slen;
|
socklen_t slen;
|
||||||
@ -58,6 +59,7 @@ void usb_init(const usb_dev_info_t *dev_info) {
|
|||||||
(void)dev_info;
|
(void)dev_info;
|
||||||
for (int i = 0; i < USBD_MAX_NUM_INTERFACES; i++) {
|
for (int i = 0; i < USBD_MAX_NUM_INTERFACES; i++) {
|
||||||
usb_ifaces[i].type = USB_IFACE_TYPE_DISABLED;
|
usb_ifaces[i].type = USB_IFACE_TYPE_DISABLED;
|
||||||
|
usb_ifaces[i].port = 0;
|
||||||
usb_ifaces[i].sock = -1;
|
usb_ifaces[i].sock = -1;
|
||||||
memzero(&usb_ifaces[i].si_me, sizeof(struct sockaddr_in));
|
memzero(&usb_ifaces[i].si_me, sizeof(struct sockaddr_in));
|
||||||
memzero(&usb_ifaces[i].si_other, sizeof(struct sockaddr_in));
|
memzero(&usb_ifaces[i].si_other, sizeof(struct sockaddr_in));
|
||||||
@ -69,7 +71,6 @@ void usb_deinit(void) {}
|
|||||||
|
|
||||||
void usb_start(void) {
|
void usb_start(void) {
|
||||||
const char *ip = getenv("TREZOR_UDP_IP");
|
const char *ip = getenv("TREZOR_UDP_IP");
|
||||||
const char *port = getenv("TREZOR_UDP_PORT");
|
|
||||||
|
|
||||||
// iterate interfaces
|
// iterate interfaces
|
||||||
for (int i = 0; i < USBD_MAX_NUM_INTERFACES; i++) {
|
for (int i = 0; i < USBD_MAX_NUM_INTERFACES; i++) {
|
||||||
@ -90,11 +91,7 @@ void usb_start(void) {
|
|||||||
} else {
|
} else {
|
||||||
usb_ifaces[i].si_me.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
usb_ifaces[i].si_me.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
||||||
}
|
}
|
||||||
if (port) {
|
usb_ifaces[i].si_me.sin_port = htons(usb_ifaces[i].port);
|
||||||
usb_ifaces[i].si_me.sin_port = htons(atoi(port) + i);
|
|
||||||
} else {
|
|
||||||
usb_ifaces[i].si_me.sin_port = htons(TREZOR_UDP_PORT + i);
|
|
||||||
}
|
|
||||||
|
|
||||||
ensure(sectrue * (0 == bind(usb_ifaces[i].sock,
|
ensure(sectrue * (0 == bind(usb_ifaces[i].sock,
|
||||||
(struct sockaddr *)&usb_ifaces[i].si_me,
|
(struct sockaddr *)&usb_ifaces[i].si_me,
|
||||||
@ -109,6 +106,7 @@ secbool usb_hid_add(const usb_hid_info_t *info) {
|
|||||||
if (info->iface_num < USBD_MAX_NUM_INTERFACES &&
|
if (info->iface_num < USBD_MAX_NUM_INTERFACES &&
|
||||||
usb_ifaces[info->iface_num].type == USB_IFACE_TYPE_DISABLED) {
|
usb_ifaces[info->iface_num].type == USB_IFACE_TYPE_DISABLED) {
|
||||||
usb_ifaces[info->iface_num].type = USB_IFACE_TYPE_HID;
|
usb_ifaces[info->iface_num].type = USB_IFACE_TYPE_HID;
|
||||||
|
usb_ifaces[info->iface_num].port = info->emu_port;
|
||||||
}
|
}
|
||||||
return sectrue;
|
return sectrue;
|
||||||
}
|
}
|
||||||
@ -117,6 +115,7 @@ secbool usb_webusb_add(const usb_webusb_info_t *info) {
|
|||||||
if (info->iface_num < USBD_MAX_NUM_INTERFACES &&
|
if (info->iface_num < USBD_MAX_NUM_INTERFACES &&
|
||||||
usb_ifaces[info->iface_num].type == USB_IFACE_TYPE_DISABLED) {
|
usb_ifaces[info->iface_num].type == USB_IFACE_TYPE_DISABLED) {
|
||||||
usb_ifaces[info->iface_num].type = USB_IFACE_TYPE_WEBUSB;
|
usb_ifaces[info->iface_num].type = USB_IFACE_TYPE_WEBUSB;
|
||||||
|
usb_ifaces[info->iface_num].port = info->emu_port;
|
||||||
}
|
}
|
||||||
return sectrue;
|
return sectrue;
|
||||||
}
|
}
|
||||||
@ -125,6 +124,7 @@ secbool usb_vcp_add(const usb_vcp_info_t *info) {
|
|||||||
if (info->iface_num < USBD_MAX_NUM_INTERFACES &&
|
if (info->iface_num < USBD_MAX_NUM_INTERFACES &&
|
||||||
usb_ifaces[info->iface_num].type == USB_IFACE_TYPE_DISABLED) {
|
usb_ifaces[info->iface_num].type == USB_IFACE_TYPE_DISABLED) {
|
||||||
usb_ifaces[info->iface_num].type = USB_IFACE_TYPE_VCP;
|
usb_ifaces[info->iface_num].type = USB_IFACE_TYPE_VCP;
|
||||||
|
usb_ifaces[info->iface_num].port = info->emu_port;
|
||||||
}
|
}
|
||||||
return sectrue;
|
return sectrue;
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ class HID:
|
|||||||
iface_num: int,
|
iface_num: int,
|
||||||
ep_in: int,
|
ep_in: int,
|
||||||
ep_out: int,
|
ep_out: int,
|
||||||
|
emu_port: int,
|
||||||
report_desc: bytes,
|
report_desc: bytes,
|
||||||
subclass: int = 0,
|
subclass: int = 0,
|
||||||
protocol: int = 0,
|
protocol: int = 0,
|
||||||
@ -148,6 +149,7 @@ class VCP:
|
|||||||
ep_in: int,
|
ep_in: int,
|
||||||
ep_out: int,
|
ep_out: int,
|
||||||
ep_cmd: int,
|
ep_cmd: int,
|
||||||
|
emu_port: int,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
"""
|
"""
|
||||||
@ -169,6 +171,7 @@ class WebUSB:
|
|||||||
iface_num: int,
|
iface_num: int,
|
||||||
ep_in: int,
|
ep_in: int,
|
||||||
ep_out: int,
|
ep_out: int,
|
||||||
|
emu_port: int,
|
||||||
subclass: int = 0,
|
subclass: int = 0,
|
||||||
protocol: int = 0,
|
protocol: int = 0,
|
||||||
polling_interval: int = 1,
|
polling_interval: int = 1,
|
||||||
|
@ -1,6 +1,19 @@
|
|||||||
|
from micropython import const
|
||||||
|
|
||||||
from storage.device import get_device_id
|
from storage.device import get_device_id
|
||||||
from trezor import io, utils
|
from trezor import io, utils
|
||||||
|
|
||||||
|
UDP_PORT = 0
|
||||||
|
WIRE_PORT_OFFSET = const(0)
|
||||||
|
DEBUGLINK_PORT_OFFSET = const(1)
|
||||||
|
WEBAUTHN_PORT_OFFSET = const(2)
|
||||||
|
VCP_PORT_OFFSET = const(3)
|
||||||
|
|
||||||
|
if utils.EMULATOR:
|
||||||
|
import uos
|
||||||
|
|
||||||
|
UDP_PORT = int(uos.getenv("TREZOR_UDP_PORT") or "21324")
|
||||||
|
|
||||||
_iface_iter = iter(range(5))
|
_iface_iter = iter(range(5))
|
||||||
|
|
||||||
ENABLE_IFACE_DEBUG = __debug__
|
ENABLE_IFACE_DEBUG = __debug__
|
||||||
@ -23,6 +36,7 @@ iface_wire = io.WebUSB(
|
|||||||
iface_num=id_wire,
|
iface_num=id_wire,
|
||||||
ep_in=0x81 + id_wire,
|
ep_in=0x81 + id_wire,
|
||||||
ep_out=0x01 + id_wire,
|
ep_out=0x01 + id_wire,
|
||||||
|
emu_port=UDP_PORT + WIRE_PORT_OFFSET,
|
||||||
)
|
)
|
||||||
|
|
||||||
# XXXXXXXXXXXXXXXXXXX
|
# XXXXXXXXXXXXXXXXXXX
|
||||||
@ -43,6 +57,7 @@ if __debug__ and ENABLE_IFACE_DEBUG:
|
|||||||
iface_num=id_debug,
|
iface_num=id_debug,
|
||||||
ep_in=0x81 + id_debug,
|
ep_in=0x81 + id_debug,
|
||||||
ep_out=0x01 + id_debug,
|
ep_out=0x01 + id_debug,
|
||||||
|
emu_port=UDP_PORT + DEBUGLINK_PORT_OFFSET,
|
||||||
)
|
)
|
||||||
|
|
||||||
if not utils.BITCOIN_ONLY and ENABLE_IFACE_WEBAUTHN:
|
if not utils.BITCOIN_ONLY and ENABLE_IFACE_WEBAUTHN:
|
||||||
@ -52,6 +67,7 @@ if not utils.BITCOIN_ONLY and ENABLE_IFACE_WEBAUTHN:
|
|||||||
iface_num=id_webauthn,
|
iface_num=id_webauthn,
|
||||||
ep_in=0x81 + id_webauthn,
|
ep_in=0x81 + id_webauthn,
|
||||||
ep_out=0x01 + id_webauthn,
|
ep_out=0x01 + id_webauthn,
|
||||||
|
emu_port=UDP_PORT + WEBAUTHN_PORT_OFFSET,
|
||||||
# fmt: off
|
# fmt: off
|
||||||
report_desc=bytes([
|
report_desc=bytes([
|
||||||
0x06, 0xd0, 0xf1, # USAGE_PAGE (FIDO Alliance)
|
0x06, 0xd0, 0xf1, # USAGE_PAGE (FIDO Alliance)
|
||||||
@ -84,6 +100,7 @@ if __debug__ and ENABLE_IFACE_VCP:
|
|||||||
ep_in=0x81 + id_vcp,
|
ep_in=0x81 + id_vcp,
|
||||||
ep_out=0x01 + id_vcp,
|
ep_out=0x01 + id_vcp,
|
||||||
ep_cmd=0x81 + id_vcp_data,
|
ep_cmd=0x81 + id_vcp_data,
|
||||||
|
emu_port=UDP_PORT + VCP_PORT_OFFSET,
|
||||||
)
|
)
|
||||||
|
|
||||||
bus = io.USB(
|
bus = io.USB(
|
||||||
|
@ -11,10 +11,10 @@ import logger
|
|||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-e",
|
"-e",
|
||||||
default=21325,
|
default=21326,
|
||||||
metavar="port",
|
metavar="port",
|
||||||
type=int,
|
type=int,
|
||||||
help="UDP port the utility communicates with, 21325 by default.",
|
help="UDP port the utility communicates with, 21326 by default.",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-l",
|
"-l",
|
||||||
|
Loading…
Reference in New Issue
Block a user