From df273bf8367b4d0ebb2b323706758b0e31fd5098 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 9 Nov 2019 23:33:15 +0000 Subject: [PATCH] core/usb: reorder endpoints --- core/src/apps/webauthn/__init__.py | 7 ++- core/src/usb.py | 80 +++++++++++++++++------------- 2 files changed, 48 insertions(+), 39 deletions(-) diff --git a/core/src/apps/webauthn/__init__.py b/core/src/apps/webauthn/__init__.py index d86630175b..733a83d76d 100644 --- a/core/src/apps/webauthn/__init__.py +++ b/core/src/apps/webauthn/__init__.py @@ -1,4 +1,4 @@ -from trezor import loop, utils, wire +from trezor import loop, wire from trezor.messages import MessageType from apps.webauthn.fido2 import handle_reports @@ -18,7 +18,6 @@ def boot() -> None: __name__, "remove_resident_credential", ) - if not __debug__ or utils.EMULATOR: - import usb + import usb - loop.schedule(handle_reports(usb.iface_webauthn)) + loop.schedule(handle_reports(usb.iface_webauthn)) diff --git a/core/src/usb.py b/core/src/usb.py index 6e6da2ad3b..1f39e7c8db 100644 --- a/core/src/usb.py +++ b/core/src/usb.py @@ -4,42 +4,51 @@ from trezor import io, utils # interface used for trezor wire protocol iface_wire = io.WebUSB(iface_num=0, ep_in=0x81, ep_out=0x01) -# we cannot use simultaneously iface_webauthn and debug interfaces, -# as we have only limited number of endpoints if __debug__: # interface used for debug messages with trezor wire protocol iface_debug = io.WebUSB(iface_num=1, ep_in=0x82, ep_out=0x02) - # interface used for cdc/vcp console emulation (debug messages) - iface_vcp = io.VCP( - iface_num=2, data_iface_num=3, ep_in=0x83, ep_out=0x03, ep_cmd=0x84 - ) + if not utils.BITCOIN_ONLY: - if not __debug__ or utils.EMULATOR: - # interface used for FIDO/U2F and FIDO2/WebAuthn HID transport - iface_webauthn = io.HID( - iface_num=4 if __debug__ else 1, - ep_in=0x85 if __debug__ else 0x82, - ep_out=0x04 if __debug__ else 0x02, - # fmt: off - report_desc=bytes([ - 0x06, 0xd0, 0xf1, # USAGE_PAGE (FIDO Alliance) - 0x09, 0x01, # USAGE (U2F HID Authenticator Device) - 0xa1, 0x01, # COLLECTION (Application) - 0x09, 0x20, # USAGE (Input Report Data) - 0x15, 0x00, # LOGICAL_MINIMUM (0) - 0x26, 0xff, 0x00, # LOGICAL_MAXIMUM (255) - 0x75, 0x08, # REPORT_SIZE (8) - 0x95, 0x40, # REPORT_COUNT (64) - 0x81, 0x02, # INPUT (Data,Var,Abs) - 0x09, 0x21, # USAGE (Output Report Data) - 0x15, 0x00, # LOGICAL_MINIMUM (0) - 0x26, 0xff, 0x00, # LOGICAL_MAXIMUM (255) - 0x75, 0x08, # REPORT_SIZE (8) - 0x95, 0x40, # REPORT_COUNT (64) - 0x91, 0x02, # OUTPUT (Data,Var,Abs) - 0xc0, # END_COLLECTION - ]), - # fmt: on + # interface used for FIDO/U2F and FIDO2/WebAuthn HID transport + iface_webauthn = io.HID( + iface_num=2 if __debug__ else 1, + ep_in=0x83 if __debug__ else 0x82, + ep_out=0x03 if __debug__ else 0x02, + # fmt: off + report_desc=bytes([ + 0x06, 0xd0, 0xf1, # USAGE_PAGE (FIDO Alliance) + 0x09, 0x01, # USAGE (U2F HID Authenticator Device) + 0xa1, 0x01, # COLLECTION (Application) + 0x09, 0x20, # USAGE (Input Report Data) + 0x15, 0x00, # LOGICAL_MINIMUM (0) + 0x26, 0xff, 0x00, # LOGICAL_MAXIMUM (255) + 0x75, 0x08, # REPORT_SIZE (8) + 0x95, 0x40, # REPORT_COUNT (64) + 0x81, 0x02, # INPUT (Data,Var,Abs) + 0x09, 0x21, # USAGE (Output Report Data) + 0x15, 0x00, # LOGICAL_MINIMUM (0) + 0x26, 0xff, 0x00, # LOGICAL_MAXIMUM (255) + 0x75, 0x08, # REPORT_SIZE (8) + 0x95, 0x40, # REPORT_COUNT (64) + 0x91, 0x02, # OUTPUT (Data,Var,Abs) + 0xc0, # END_COLLECTION + ]), + # fmt: on + ) + +if __debug__: + # We cannot use this on real device simultaneously with the iface_webauthn + # interface, because we have only limited number of endpoints (10). + # We start this only for bitcoin-only firmware or for emulator. + ENABLE_VCP_IFACE = utils.EMULATOR or utils.BITCOIN_ONLY + if ENABLE_VCP_IFACE: + # interface used for cdc/vcp console emulation (debug messages) + iface_vcp = io.VCP( + iface_num=2 if utils.BITCOIN_ONLY else 3, + data_iface_num=3 if utils.BITCOIN_ONLY else 4, + ep_in=0x83 if utils.BITCOIN_ONLY else 0x84, + ep_out=0x03 if utils.BITCOIN_ONLY else 0x04, + ep_cmd=0x84 if utils.BITCOIN_ONLY else 0x85, ) bus = io.USB( @@ -54,7 +63,8 @@ bus = io.USB( bus.add(iface_wire) if __debug__: bus.add(iface_debug) - bus.add(iface_vcp) if not utils.BITCOIN_ONLY: - if not __debug__ or utils.EMULATOR: - bus.add(iface_webauthn) + bus.add(iface_webauthn) +if __debug__: + if ENABLE_VCP_IFACE: + bus.add(iface_vcp)