import time import binascii import hashlib import unicodedata import mapping import json import tools import messages_pb2 as proto import types_pb2 as types import protobuf_json from trezorlib.debuglink import DebugLink from mnemonic import Mnemonic # monkeypatching: text formatting of protobuf messages tools.monkeypatch_google_protobuf_text_format() def get_buttonrequest_value(code): # Converts integer code to its string representation of ButtonRequestType return [ k for k, v in types.ButtonRequestType.items() if v == code][0] def pprint(msg): msg_class = msg.__class__.__name__ msg_size = msg.ByteSize() """ msg_ser = msg.SerializeToString() msg_id = mapping.get_type(msg) msg_json = json.dumps(protobuf_json.pb2json(msg)) """ if isinstance(msg, proto.FirmwareUpload): return "<%s> (%d bytes):\n" % (msg_class, msg_size)
import protobuf_json from trezorlib.debuglink import DebugLink from mnemonic import Mnemonic # try: # from PIL import Image # SCREENSHOT = True # except: # SCREENSHOT = False SCREENSHOT = False DEFAULT_CURVE = 'secp256k1' # monkeypatching: text formatting of protobuf messages tools.monkeypatch_google_protobuf_text_format() def get_buttonrequest_value(code): # Converts integer code to its string representation of ButtonRequestType return [k for k, v in types.ButtonRequestType.items() if v == code][0] def pprint(msg): msg_class = msg.__class__.__name__ msg_size = msg.ByteSize() """ msg_ser = msg.SerializeToString() msg_id = mapping.get_type(msg) msg_json = json.dumps(protobuf_json.pb2json(msg)) """
def main(args): monkeypatch_google_protobuf_text_format() # Initialize debuglink transport if args.debuglink: print "Starting debug connection on '%s'" % args.debuglink_path print "Debug connection is for unit tests only. NEVER use debug connection with real wallet!" debug_transport = get_transport(args.debuglink_transport, args.debuglink_path) else: debug_transport = get_transport('fake', None) # Initialize main transport transport = get_transport(args.transport, args.path) # Load persisted data. Create new wallet if file doesn't exist print "Loading wallet..." storage = Storage(args.wallet, bootloader_mode=args.bootloader_mode) # storage.struct.settings.label = 'Slushova penezenka' print storage.struct # Initialize hardware (screen, buttons) but = Buttons(hw=args.shield, stdin=not args.shield, pygame=not args.shield) buff = DisplayBuffer(DISPLAY_WIDTH, DISPLAY_HEIGHT) display = Display(buff, spi=args.shield, virtual=not args.shield) display.init() # Initialize layout driver layout = Layout(buff, display) # Process exponential backoff if there was unsuccesfull PIN attempts if storage.get_pin_delay(): delay = storage.get_pin_delay() print "Waiting %s seconds until boot up" % delay layout.show_pin_backoff_progress(delay) # Startup state machine and switch it to default state machine = StateMachine(storage, layout) display.refresh() # Main cycle while True: try: # Read button states button = but.read() except KeyboardInterrupt: # User requested to close the app break # Set is_active=True if device does something # False = device will sleep for a moment to prevent CPU load # Set button=None to use event only for rendering # and hide it against state machine (is_active, button) = layout.update(button) # Handle debug link connection msg = debug_transport.read() if msg is not None: print "Received debuglink", msg.__class__.__name__, msg if isinstance(msg, proto.DebugLinkDecision): # Press the button button = msg.yes_no else: resp = machine.process_debug_message(msg) if resp is not None: print "Sending debuglink", resp.__class__.__name__, resp debug_transport.write(resp) is_active = True if button is not None: print "Button", button is_active = True resp = machine.press_button(button) if resp is not None: print "Sending", resp transport.write(resp) # Handle main connection msg = transport.read() if msg is not None: print "Received", msg.__class__.__name__, msg resp = machine.process_message(msg) if resp is not None: print "Sending", resp.__class__.__name__, resp transport.write(resp) is_active = True if not is_active: # Nothing to do, sleep for a moment time.sleep(0.05) # Close transports transport.close() debug_transport.close()