mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-17 01:52:02 +00:00
Added support for TREZOR v1 protocol (acts as session 0 internally).
This commit is contained in:
parent
281070492d
commit
8a160becb9
@ -11,6 +11,10 @@ from .wire_dispatcher import dispatch_reports_by_session
|
||||
from .wire_codec import \
|
||||
decode_wire_stream, encode_wire_message, \
|
||||
encode_session_open_message, encode_session_close_message
|
||||
from .wire_codec_v1 import \
|
||||
SESSION_V1, \
|
||||
decode_wire_v1_stream, \
|
||||
encode_wire_v1_message
|
||||
|
||||
_session_handlers = {} # session id -> generator
|
||||
_workflow_genfuncs = {} # wire type -> (generator function, args)
|
||||
@ -28,8 +32,9 @@ def generate_session_id():
|
||||
return session_id
|
||||
|
||||
|
||||
def open_session():
|
||||
session_id = generate_session_id()
|
||||
def open_session(session_id=None):
|
||||
if session_id is None:
|
||||
session_id = generate_session_id()
|
||||
_opened_sessions.add(session_id)
|
||||
log.info(__name__, 'opened session %d: %s', session_id, _opened_sessions)
|
||||
return session_id
|
||||
@ -66,13 +71,17 @@ def setup():
|
||||
session_dispatcher.send(None)
|
||||
schedule_task(read_report_stream(session_dispatcher))
|
||||
|
||||
v1_handler = decode_wire_v1_stream(_handle_registered_type, SESSION_V1)
|
||||
v1_handler.send(None)
|
||||
open_session(SESSION_V1)
|
||||
register_session(SESSION_V1, v1_handler)
|
||||
|
||||
|
||||
async def read_message(session_id, *exp_types):
|
||||
log.info(__name__, 'reading message of types %s', exp_types)
|
||||
future = Future()
|
||||
wire_decoder = decode_wire_stream(
|
||||
_dispatch_and_build_protobuf, session_id, exp_types, future)
|
||||
wire_decoder.send(None)
|
||||
register_session(session_id, wire_decoder)
|
||||
return await future
|
||||
|
||||
@ -81,7 +90,11 @@ async def write_message(session_id, pbuf_message):
|
||||
log.info(__name__, 'writing message %s', pbuf_message)
|
||||
msg_data = await pbuf_message.dumps()
|
||||
msg_type = pbuf_message.message_type.wire_type
|
||||
encode_wire_message(msg_type, msg_data, session_id, report_writer)
|
||||
|
||||
if session_id == SESSION_V1:
|
||||
encode_wire_v1_message(msg_type, msg_data, report_writer)
|
||||
else:
|
||||
encode_wire_message(msg_type, msg_data, session_id, report_writer)
|
||||
|
||||
|
||||
async def reply_message(session_id, pbuf_message, *exp_types):
|
||||
@ -123,8 +136,12 @@ async def monitor_workflow(workflow, session_id):
|
||||
|
||||
finally:
|
||||
if session_id in _opened_sessions:
|
||||
wire_decoder = decode_wire_stream(
|
||||
_handle_registered_type, session_id)
|
||||
if session_id == SESSION_V1:
|
||||
wire_decoder = decode_wire_v1_stream(_handle_registered_type,
|
||||
SESSION_V1)
|
||||
else:
|
||||
wire_decoder = decode_wire_stream(
|
||||
_handle_registered_type, session_id)
|
||||
wire_decoder.send(None)
|
||||
register_session(session_id, wire_decoder)
|
||||
|
||||
|
@ -137,6 +137,13 @@ def encode_wire_message(msg_type, msg_data, session_id, target):
|
||||
msg_footer = None
|
||||
continue
|
||||
|
||||
# FIXME: Optimize speed
|
||||
x = 0
|
||||
to_fill = len(target_data)
|
||||
while x < to_fill:
|
||||
target_data[x] = 0
|
||||
x += 1
|
||||
|
||||
target.send(report)
|
||||
|
||||
if not source_data and not msg_footer:
|
||||
|
@ -1,5 +1,6 @@
|
||||
from trezor import log
|
||||
from .wire_codec import parse_report, REP_MARKER_OPEN, REP_MARKER_CLOSE
|
||||
from .wire_codec_v1 import detect_v1, parse_report_v1
|
||||
|
||||
|
||||
def dispatch_reports_by_session(handlers,
|
||||
@ -12,7 +13,12 @@ def dispatch_reports_by_session(handlers,
|
||||
'''
|
||||
|
||||
while True:
|
||||
marker, session_id, report_data = parse_report((yield))
|
||||
|
||||
data = (yield)
|
||||
if detect_v1(data):
|
||||
marker, session_id, report_data = parse_report_v1(data)
|
||||
else:
|
||||
marker, session_id, report_data = parse_report(data)
|
||||
|
||||
if marker == REP_MARKER_OPEN:
|
||||
log.debug(__name__, 'request for new session')
|
||||
|
Loading…
Reference in New Issue
Block a user